> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks

> Utilisez les webhooks pour intégrer AppSignal avec d'autres tiers ou votre propre système.

AppSignal peut envoyer des notifications de nouveaux incidents à plusieurs services, consultez notre liste complète sur la page des [intégrations](/application/integrations). Nous proposons également des webhooks pour ces notifications afin que vous puissiez gérer les nouveaux incidents dans votre propre système.

Pour recevoir un webhook, accédez à l'onglet « Notifications » dans la barre latérale du site, cliquez sur « Add integration » et renseignez l'URL où vous souhaitez recevoir vos données de webhook.

<img src="https://mintcdn.com/appsignal-715f5a51/nF8c1Rwq1cS7b5hg/assets/images/screenshots/app_webhook.png?fit=max&auto=format&n=nF8c1Rwq1cS7b5hg&q=85&s=7d0bfa4afbbcf93a4e3241b53fdc06c3" alt="Webhook" width="1400" height="934" data-path="assets/images/screenshots/app_webhook.png" />

Plusieurs webhooks sont disponibles. Les charges utiles que le webhook reçoit peuvent être configurées dans le formulaire de configuration du webhook comme vu dans la capture d'écran ci-dessus.

## Vérification des requêtes webhook AppSignal

Pour assurer la sécurité de votre application, vous pouvez vérifier que les requêtes webhook entrantes proviennent réellement d'AppSignal. La vérification est effectuée en utilisant un jeton de vérification de webhook pour valider la signature de la requête.

### Localisation de votre jeton de vérification de webhook

1. Accédez à **App settings > Integrations** dans votre tableau de bord AppSignal.
2. Configurez l'intégration webhook que vous souhaitez vérifier.
3. Vous y trouverez le **Webhook verification token** de l'intégration.

Ce jeton est utilisé pour valider que la requête webhook provient d'AppSignal.

### Vérification d'une requête

Lorsque AppSignal envoie une requête webhook, elle inclut une signature dans l'en-tête `X-Appsignal-Signature`. Vous pouvez valider la requête comme suit :

1. Concaténez le jeton de vérification de webhook AppSignal avec le corps brut de la requête.
2. Générez un hachage SHA256 de la chaîne concaténée.
3. Comparez le hachage généré à la valeur dans l'en-tête `X-Appsignal-Signature`.

Si les hachages correspondent, la requête peut être vérifiée comme provenant d'AppSignal.

### Exemples d'implémentations

Voici quelques exemples de la façon dont vous pouvez vérifier qu'une requête provient d'AppSignal en Ruby, Elixir, Node.js et Python.

**Remarque :** Les exemples ci-dessous sont illustratifs, vous devrez peut-être les adapter en fonction des frameworks, intégrations et dépendances que votre application utilise.

<CodeGroup>
  ```ruby Ruby theme={null}
      token = Rails.application.credentials.appsignal_webhook_token
      request_signature = request.headers["X-Appsignal-Signature"]

      message = request.raw_post
      signature = OpenSSL::Digest::SHA256.hexdigest(token + message.to_s)

      if signature == request_signature
        # logic here
      end
  ```

  ```elixir Elixir theme={null}
    token = Application.get_env(:my_app, :appsignal_webhook_token)
    request_signature = List.first(get_req_header(conn, "x-appsignal-signature"))

    {:ok, raw_body} = read_body(conn)

    message = token <> raw_body
    signature = Base.encode16(:crypto.hash(:sha256, message), case: :lower)

    if signature == request_signature do
      # logic here
    end
  ```

  ```js JavaScript theme={null}
  const crypto = require("crypto");

  const token = process.env.APPSIGNAL_WEBHOOK_TOKEN;
  const requestSignature = req.headers["x-appsignal-signature"];

  let rawBody = req.rawBody;

  const message = token + rawBody;

  const signature = crypto.createHash("sha256").update(message).digest("hex");

  if (signature === requestSignature) {
    // logic here
  }
  ```

  ```python Python theme={null}
    import hashlib
    import os

    token = os.getenv('APPSIGNAL_WEBHOOK_TOKEN')
    request_signature = request.headers['X-Appsignal-Signature']

    raw_body = request.get_data(as_text=True)

    message = token + raw_body

    signature = hashlib.sha256(message.encode()).hexdigest()

    if signature == request_signature:
      # logic here
  ```
</CodeGroup>

## Marqueurs de déploiement

<CodeGroup>
  ```json JSON theme={null}
  {
    "marker": {
      "time": "2019-01-10 10:45:41 +0100",
      "marker_id": "5c3714455ac13f7df09437f0",
      "site": "My test app",
      "environment": "development",
      "revision": "abc123",
      "user": "tom",
      "repository": "https://github.com/my_org/my_repo",
      "url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b/dashboard"
    }
  }
  ```
</CodeGroup>

### Champs

| Champ    | Type                | Description                                                  |
| -------- | ------------------- | ------------------------------------------------------------ |
| `marker` | `Hash<String, Any>` | La charge utile du webhook concerne un incident de marqueur. |

#### Sous-champs du marqueur de déploiement

| Champ         | Type     | Description                                                                                                                       |
| ------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `time`        | `String` | Horodatage auquel le marqueur de déploiement a été créé.                                                                          |
| `marker_id`   | `String` | ID interne du marqueur AppSignal pour le marqueur de déploiement.                                                                 |
| `site`        | `String` | Nom de l'application tel qu'affiché sur AppSignal.com. Utilisation du champ `site` au lieu de `app` pour des raisons historiques. |
| `environment` | `String` | Environnement de l'application tel qu'affiché sur AppSignal.com.                                                                  |
| `revision`    | `String` | Le nom de la révision du [marqueur de déploiement](/application/markers/deploy-markers){" "}.                                     |
| `user`        | `String` | L'utilisateur qui a créé le marqueur.                                                                                             |
| `repository`  | `String` | URL du dépôt tel que configuré pour l'application sur AppSignal.com.                                                              |
| `url`         | `String` | URL de l'application sur AppSignal.com qui a déclenché le webhook.                                                                |

## Incidents d'exception

<CodeGroup>
  ```json JSON theme={null}
  {
    "exception": {
      "time": "2019-01-09 09:03:57 UTC",
      "number": 3,
      "site": "My test app",
      "environment": "development",
      "app_url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b",
      "url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b/incidents/3?timestamp=2019-01-09T09%3A03%3A57Z",
      "revision": "abc123",
      "user": "tom",
      "namespace": "web",
      "exception": "Appsignal::Demo::TestError",
      "message": "Hello world! This is an error used for demonstration purposes.",
      "app_backtrace": [
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/demo.rb:49:in `create_example_error_request'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/demo.rb:35:in `transmit'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/cli/demo.rb:53:in `run'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/cli.rb:31:in `run'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/bin/appsignal:7:in `<top (required)>'",
        "/Users/tombruijn/.gem/ruby/2.5.3/bin/appsignal:23:in `load'",
        "/Users/tombruijn/.gem/ruby/2.5.3/bin/appsignal:23:in `<top (required)>'",
        "/Users/tombruijn/.gem/ruby/2.5.3/bin/bundle:23:in `<main>'"
      ],
      "first_backtrace_line": "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/demo.rb:49:in `create_example_error_request'",
      "action": "DemoController#hello",
      "path": "/hello",
      "hostname": "Toms-MacBook-Pro.local",
      "action_label": "request",
      "metadata": {
        "demo_sample": "true",
        "method": "GET",
        "path": "/hello"
      }
    }
  }
  ```
</CodeGroup>

### Champs

| Champ       | Type                | Description                                                  |
| ----------- | ------------------- | ------------------------------------------------------------ |
| `exception` | `Hash<String, Any>` | La charge utile du webhook concerne un incident d'exception. |

#### Sous-champs de l'exception

| Champ                  | Type                   | Description                                                                                                                                                                                                                                      |
| ---------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `time`                 | `String`               | Horodatage auquel l'exception s'est produite.                                                                                                                                                                                                    |
| `number`               | `Integer`              | ID de l'incident tel qu'affiché sur AppSignal.com.                                                                                                                                                                                               |
| `site`                 | `String`               | Nom de l'application tel qu'affiché sur AppSignal.com. Utilisation du champ `site` au lieu de `app` pour des raisons historiques.                                                                                                                |
| `environment`          | `String`               | Environnement de l'application tel qu'affiché sur AppSignal.com.                                                                                                                                                                                 |
| `app_url`              | `String`               | URL de l'application sur AppSignal.com qui a déclenché le webhook.                                                                                                                                                                               |
| `url`                  | `String`               | URL de l'échantillon spécifique pour l'incident sur AppSignal.com qui a déclenché ce webhook.                                                                                                                                                    |
| `revision`             | `String`               | Le nom de la révision du [marqueur de déploiement](/application/markers/deploy-markers).                                                                                                                                                         |
| `user`                 | `String`               | L'utilisateur qui a créé le marqueur. La valeur de l'utilisateur peut également être {" "} `null` si elle n'est pas définie pour une révision de marqueur de déploiement.                                                                        |
| `namespace`            | `String`               | L'espace de noms dans lequel cette exception s'est produite.                                                                                                                                                                                     |
| `exception`            | `String`               | Le type d'exception qui a été enregistré par AppSignal.                                                                                                                                                                                          |
| `message`              | `String`               | Le message d'exception avec plus de détails sur l'exception.                                                                                                                                                                                     |
| `app_backtrace`        | `Array<String>`        | Les lignes du backtrace concernant l'application d'où elles proviennent. Cela exclut toutes les lignes de backtrace des bibliothèques incluses dans l'application.                                                                               |
| `first_backtrace_line` | `String`               | La première ligne de backtrace du champ `app_backtrace`.                                                                                                                                                                                         |
| `action`               | `String`               | L'action dans laquelle cette exception s'est produite. Soit une action de contrôleur, un worker en arrière-plan ou une action définie manuellement.                                                                                              |
| `path`                 | `String`               | Le chemin de la requête sur lequel l'exception s'est produite. Ceci n'est défini que pour les requêtes web. Il s'agit de métadonnées définies par défaut par l'intégration AppSignal et également incluses dans le champ `metadata`.             |
| `hostname`             | `String`               | Le nom d'hôte de l'hôte sur lequel cette exception s'est produite.                                                                                                                                                                               |
| `action_label`         | `String`               | Une étiquette conviviale pour le type d'action sur laquelle cette exception s'est produite. Utilise `request` pour l'espace de noms `web` et {" "} `job` pour l'espace de noms `background`. Tous les autres espaces de noms utilisent `action`. |
| `metadata`             | `Hash<String, String>` | Cela inclut les métadonnées définies par l'utilisateur (voir [la fonctionnalité de tagging](/guides/tagging)).                                                                                                                                   |

#### Champs de métadonnées {/* id: exception-metadata-fields */}

Vous pouvez ajouter vos propres métadonnées en [taguant les échantillons](/guides/tagging).

| Champ         | Type     | Description                                                                                                                                                                                                                                                                 |
| ------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `demo_sample` | `String` | Défini par l'intégration AppSignal pour les échantillons de démonstration envoyés à l'aide de notre outil en ligne de commande de démonstration ([Ruby](/ruby/command-line/demo) /{" "} [Elixir](/elixir/command-line/demo)). Non défini pour tous les autres échantillons. |
| `method`      | `String` | La méthode de requête utilisée pour effectuer une requête. Disponible uniquement pour les requêtes (web).                                                                                                                                                                   |
| `path`        | `String` | Le chemin de la requête sur lequel l'exception s'est produite. Ceci n'est défini que pour les requêtes web. Contient la même valeur que le champ `path`.                                                                                                                    |

## Incidents de performance

<CodeGroup>
  ```json JSON theme={null}
  {
    "performance": {
      "time": "2019-01-10 09:38:08 UTC",
      "number": 1,
      "site": "My test app",
      "environment": "development",
      "app_url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b",
      "url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b/incidents/1?timestamp=2019-01-10T09%3A38%3A08Z",
      "revision": "abc123",
      "user": "tom",
      "namespace": "web",
      "duration": 2004.904052734375,
      "action": "DemoController#hello",
      "path": "/hello",
      "hostname": "Toms-MacBook-Pro.local",
      "action_label": "request",
      "metadata": {
        "demo_sample": "true",
        "method": "GET",
        "path": "/hello"
      }
    }
  }
  ```
</CodeGroup>

### Champs

| Champ         | Type                | Description                                                     |
| ------------- | ------------------- | --------------------------------------------------------------- |
| `performance` | `Hash<String, Any>` | La charge utile du webhook concerne un incident de performance. |

#### Sous-champs de performance

| Champ          | Type                   | Description                                                                                                                                                                                                                                                     |
| -------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `time`         | `String`               | Horodatage auquel l'incident de performance s'est produit.                                                                                                                                                                                                      |
| `number`       | `Integer`              | ID de l'incident tel qu'affiché sur AppSignal.com.                                                                                                                                                                                                              |
| `site`         | `String`               | Nom de l'application tel qu'affiché sur AppSignal.com. Utilisation du champ `site` au lieu de `app` pour des raisons historiques.                                                                                                                               |
| `environment`  | `String`               | Environnement de l'application tel qu'affiché sur AppSignal.com.                                                                                                                                                                                                |
| `app_url`      | `String`               | URL de l'application sur AppSignal.com qui a déclenché le webhook.                                                                                                                                                                                              |
| `url`          | `String`               | URL de l'échantillon spécifique pour l'incident sur AppSignal.com qui a déclenché ce webhook.                                                                                                                                                                   |
| `revision`     | `String`               | Le nom de la révision du [marqueur de déploiement](/application/markers/deploy-markers).                                                                                                                                                                        |
| `user`         | `String`               | L'utilisateur qui a créé le marqueur. La valeur de l'utilisateur peut également être {" "} `null` si elle n'est pas définie pour une révision de marqueur de déploiement.                                                                                       |
| `namespace`    | `String`               | L'espace de noms dans lequel cet incident de performance s'est produit.                                                                                                                                                                                         |
| `duration`     | `Float`                | Le temps en millisecondes mesuré que la requête/le job/l'action a pris pour se terminer.                                                                                                                                                                        |
| `action`       | `String`               | L'action dans laquelle cet incident de performance s'est produit. Soit une action de contrôleur, un worker en arrière-plan ou une action définie manuellement.                                                                                                  |
| `path`         | `String`               | Le chemin de la requête sur lequel l'incident de performance s'est produit. Ceci n'est défini que pour les requêtes web. Il s'agit de métadonnées définies par défaut par l'intégration AppSignal et également incluses dans le champ `metadata`{" "}.          |
| `hostname`     | `String`               | Le nom d'hôte de l'hôte sur lequel cet incident de performance s'est produit.                                                                                                                                                                                   |
| `action_label` | `String`               | Une étiquette conviviale pour le type d'action sur laquelle cet incident de performance s'est produit. Utilise `request` pour l'espace de noms `web`{" "} et `job` pour l'espace de noms `background`{" "}. Tous les autres espaces de noms utilisent `action`. |
| `metadata`     | `Hash<String, String>` | Cela inclut les métadonnées définies par l'utilisateur, voir{" "} [métadonnées](/guides/tagging).                                                                                                                                                               |

#### Champs de métadonnées {/* id: performance-metadata-fields */}

Vous pouvez ajouter vos propres métadonnées en [taguant les échantillons](/guides/tagging).

| Champ         | Type     | Description                                                                                                                                                                                                                                                                 |
| ------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `demo_sample` | `String` | Défini par l'intégration AppSignal pour les échantillons de démonstration envoyés à l'aide de notre outil en ligne de commande de démonstration ([Ruby](/ruby/command-line/demo) /{" "} [Elixir](/elixir/command-line/demo)). Non défini pour tous les autres échantillons. |
| `method`      | `String` | La méthode de requête utilisée pour effectuer une requête. Disponible uniquement pour les requêtes (web).                                                                                                                                                                   |
| `path`        | `String` | Le chemin de la requête sur lequel l'incident de performance s'est produit. Ceci n'est défini que pour les requêtes web. Contient la même valeur que le champ{" "} `path`.                                                                                                  |

## Détection d'anomalies

<CodeGroup>
  ```json JSON theme={null}
  {
    "alert_id": "5bdb1fb301925b0c4b6c7017",
    "state": "closed",
    "site": "google",
    "environment": "production",
    "tags": {
      "namespace": "web"
    },
    "human_tags": ["namespace: web"],
    "metric_name": "transaction_exception_rate",
    "field": "gauge",
    "trigger_label": "Exception rate",
    "trigger_description": "This is a description",
    "last_value": 12.0,
    "peak_value": 20.0,
    "mean_value": 11.0,
    "comparison_operator": "<",
    "comparison_value": 21.0,
    "human_last_value": "12 %",
    "human_peak_value": "20 %",
    "human_mean_value": "11 %",
    "human_comparison_value": "21 %",
    "created_at": "2017-08-01T10:00:00Z",
    "opened_at": "2017-08-01T10:05:00Z",
    "resolved_at": "2017-08-01T12:00:00Z",
    "closed_at": "2017-08-01T13:43:00Z",
    "warmup_duration": 10,
    "cooldown_duration": 20,
    "alert_url": "http://example.com/#{site.account.slug}/sites/#{site.id}/alerts/#{alert.id}",
    "edit_trigger_url": "http://example.com/#{site.account.slug}/sites/#{site.id}/triggers?overlay=triggerForm&triggerId=#{alert.trigger.id}"
  }
  ```
</CodeGroup>

| Champ                    | Type     | Description                                                                                                                                        |
| ------------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `alert_id`               | `String` | ID interne AppSignal de l'alerte.                                                                                                                  |
| `state`                  | `String` | [État](/anomaly-detection/#alert-states) de l'alerte.                                                                                              |
| `site`                   | `String` | Le nom de l'application à laquelle appartient l'alerte.                                                                                            |
| `environment`            | `String` | Le nom de l'environnement de l'application auquel l'alerte appartient.                                                                             |
| `tags`                   | `Array`  | Espace de noms associé à l'alerte.                                                                                                                 |
| `human_tags`             | `Array`  | Espace de noms personnalisé associé à l'alerte.                                                                                                    |
| `metric_name`            | `String` | Nom de la métrique pour laquelle l'alerte a été créée.                                                                                             |
| `field`                  | `String` | Nom du champ de l'alerte.                                                                                                                          |
| `trigger_label`          | `String` | Nom du déclencheur.                                                                                                                                |
| `trigger_description`    | `String` | Description du déclencheur.                                                                                                                        |
| `last_value`             | `String` | Dernière valeur enregistrée pour l'alerte.                                                                                                         |
| `peak_value`             | `String` | Valeur la plus élevée enregistrée pour l'alerte                                                                                                    |
| `mean_value`             | `String` | Moyenne de toutes les valeurs pour l'alerte.                                                                                                       |
| `comparison_operator`    | `String` | Opérateur de comparaison défini par l'utilisateur sur la base duquel l'alerte sera déclenchée.                                                     |
| `comparison_value`       | `String` | Valeur de comparaison de la métrique définie par l'utilisateur sur la base de laquelle l'alerte sera déclenchée.                                   |
| `human_last_value`       | `String` | Dernière valeur de métrique enregistrée pour l'alerte depuis son ouverture dans un format plus lisible.                                            |
| `human_peak_value`       | `String` | Valeur la plus élevée de la valeur de métrique enregistrée pour l'alerte pendant qu'elle était ouverte.                                            |
| `human_mean_value`       | `String` | Valeur moyenne de la valeur de métrique pour l'alerte pendant qu'elle était ouverte dans un format plus lisible.                                   |
| `human_comparison_value` | `String` | Valeur de comparaison pour la métrique d'alerte définie par l'utilisateur sur la base de laquelle l'alerte sera déclenchée dans un format lisible. |
| `created_at`             | `String` | Horodatage auquel l'alerte a été créée.                                                                                                            |
| `opened_at`              | `String` | Horodatage (ISO8601) auquel l'alerte a été ouverte.                                                                                                |
| `resolved_at`            | `String` | Horodatage (ISO8601) auquel l'alerte a été résolue.                                                                                                |
| `closed_at`              | `String` | Horodatage (ISO8601) auquel l'alerte a été fermée.                                                                                                 |
| `warmup_duration`        | `String` | Temps en minutes pendant lequel AppSignal attend avant d'ouvrir une alerte.                                                                        |
| `cooldown_duration`      | `String` | Temps en minutes pendant lequel AppSignal attend avant de fermer une alerte.                                                                       |
| `alert_url`              | `String` | URL de l'alerte pour que l'utilisateur puisse la consulter sur AppSignal.                                                                          |
| `edit_trigger_url`       | `String` | URL de l'alerte pour que l'utilisateur puisse la modifier sur AppSignal.                                                                           |

<hr />

### Liste des intégrations

* [Asana](/application/integrations/asana)
* [Discord](/application/integrations/discord)
* [Geckoboard](/application/integrations/geckoboard)
* [GitLab](/application/integrations/gitlab)
* [Google Hangouts Chat](/application/integrations/hangouts)
* [Jira](/application/integrations/jira)
* [Linear](/application/integrations/linear)
* [Microsoft Teams](/application/integrations/teams)
* [OpsGenie](/application/integrations/opsgenie)
* [PagerDuty](/application/integrations/pagerduty)
* [Shortcut](/application/integrations/shortcut)
* [Slack](/application/integrations/slack)
* [Squadcast](/application/integrations/squadcast)
* [Trello](/application/integrations/trello)
* [Webhooks](/application/integrations/webhooks)
