Passer au contenu principal
AppSignal peut envoyer des notifications de nouveaux incidents à plusieurs services, consultez notre liste complète sur la page des intégrations. 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. Webhook 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.
    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

Marqueurs de déploiement

{
  "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"
  }
}

Champs

ChampTypeDescription
markerHash<String, Any>La charge utile du webhook concerne un incident de marqueur.

Sous-champs du marqueur de déploiement

ChampTypeDescription
timeStringHorodatage auquel le marqueur de déploiement a été créé.
marker_idStringID interne du marqueur AppSignal pour le marqueur de déploiement.
siteStringNom de l’application tel qu’affiché sur AppSignal.com. Utilisation du champ site au lieu de app pour des raisons historiques.
environmentStringEnvironnement de l’application tel qu’affiché sur AppSignal.com.
revisionStringLe nom de la révision du marqueur de déploiement.
userStringL’utilisateur qui a créé le marqueur.
repositoryStringURL du dépôt tel que configuré pour l’application sur AppSignal.com.
urlStringURL de l’application sur AppSignal.com qui a déclenché le webhook.

Incidents d’exception

{
  "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"
    }
  }
}

Champs

ChampTypeDescription
exceptionHash<String, Any>La charge utile du webhook concerne un incident d’exception.

Sous-champs de l’exception

ChampTypeDescription
timeStringHorodatage auquel l’exception s’est produite.
numberIntegerID de l’incident tel qu’affiché sur AppSignal.com.
siteStringNom de l’application tel qu’affiché sur AppSignal.com. Utilisation du champ site au lieu de app pour des raisons historiques.
environmentStringEnvironnement de l’application tel qu’affiché sur AppSignal.com.
app_urlStringURL de l’application sur AppSignal.com qui a déclenché le webhook.
urlStringURL de l’échantillon spécifique pour l’incident sur AppSignal.com qui a déclenché ce webhook.
revisionStringLe nom de la révision du marqueur de déploiement.
userStringL’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.
namespaceStringL’espace de noms dans lequel cette exception s’est produite.
exceptionStringLe type d’exception qui a été enregistré par AppSignal.
messageStringLe message d’exception avec plus de détails sur l’exception.
app_backtraceArray<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_lineStringLa première ligne de backtrace du champ app_backtrace.
actionStringL’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.
pathStringLe 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.
hostnameStringLe nom d’hôte de l’hôte sur lequel cette exception s’est produite.
action_labelStringUne é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.
metadataHash<String, String>Cela inclut les métadonnées définies par l’utilisateur (voir la fonctionnalité de tagging).

Champs de métadonnées

Vous pouvez ajouter vos propres métadonnées en taguant les échantillons.
ChampTypeDescription
demo_sampleStringDé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 / Elixir). Non défini pour tous les autres échantillons.
methodStringLa méthode de requête utilisée pour effectuer une requête. Disponible uniquement pour les requêtes (web).
pathStringLe 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

{
  "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"
    }
  }
}

Champs

ChampTypeDescription
performanceHash<String, Any>La charge utile du webhook concerne un incident de performance.

Sous-champs de performance

ChampTypeDescription
timeStringHorodatage auquel l’incident de performance s’est produit.
numberIntegerID de l’incident tel qu’affiché sur AppSignal.com.
siteStringNom de l’application tel qu’affiché sur AppSignal.com. Utilisation du champ site au lieu de app pour des raisons historiques.
environmentStringEnvironnement de l’application tel qu’affiché sur AppSignal.com.
app_urlStringURL de l’application sur AppSignal.com qui a déclenché le webhook.
urlStringURL de l’échantillon spécifique pour l’incident sur AppSignal.com qui a déclenché ce webhook.
revisionStringLe nom de la révision du marqueur de déploiement.
userStringL’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.
namespaceStringL’espace de noms dans lequel cet incident de performance s’est produit.
durationFloatLe temps en millisecondes mesuré que la requête/le job/l’action a pris pour se terminer.
actionStringL’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.
pathStringLe 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.
hostnameStringLe nom d’hôte de l’hôte sur lequel cet incident de performance s’est produit.
action_labelStringUne é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.
metadataHash<String, String>Cela inclut les métadonnées définies par l’utilisateur, voir métadonnées.

Champs de métadonnées

Vous pouvez ajouter vos propres métadonnées en taguant les échantillons.
ChampTypeDescription
demo_sampleStringDé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 / Elixir). Non défini pour tous les autres échantillons.
methodStringLa méthode de requête utilisée pour effectuer une requête. Disponible uniquement pour les requêtes (web).
pathStringLe 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

{
  "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}"
}
ChampTypeDescription
alert_idStringID interne AppSignal de l’alerte.
stateStringÉtat de l’alerte.
siteStringLe nom de l’application à laquelle appartient l’alerte.
environmentStringLe nom de l’environnement de l’application auquel l’alerte appartient.
tagsArrayEspace de noms associé à l’alerte.
human_tagsArrayEspace de noms personnalisé associé à l’alerte.
metric_nameStringNom de la métrique pour laquelle l’alerte a été créée.
fieldStringNom du champ de l’alerte.
trigger_labelStringNom du déclencheur.
trigger_descriptionStringDescription du déclencheur.
last_valueStringDernière valeur enregistrée pour l’alerte.
peak_valueStringValeur la plus élevée enregistrée pour l’alerte
mean_valueStringMoyenne de toutes les valeurs pour l’alerte.
comparison_operatorStringOpérateur de comparaison défini par l’utilisateur sur la base duquel l’alerte sera déclenchée.
comparison_valueStringValeur de comparaison de la métrique définie par l’utilisateur sur la base de laquelle l’alerte sera déclenchée.
human_last_valueStringDernière valeur de métrique enregistrée pour l’alerte depuis son ouverture dans un format plus lisible.
human_peak_valueStringValeur la plus élevée de la valeur de métrique enregistrée pour l’alerte pendant qu’elle était ouverte.
human_mean_valueStringValeur moyenne de la valeur de métrique pour l’alerte pendant qu’elle était ouverte dans un format plus lisible.
human_comparison_valueStringValeur 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_atStringHorodatage auquel l’alerte a été créée.
opened_atStringHorodatage (ISO8601) auquel l’alerte a été ouverte.
resolved_atStringHorodatage (ISO8601) auquel l’alerte a été résolue.
closed_atStringHorodatage (ISO8601) auquel l’alerte a été fermée.
warmup_durationStringTemps en minutes pendant lequel AppSignal attend avant d’ouvrir une alerte.
cooldown_durationStringTemps en minutes pendant lequel AppSignal attend avant de fermer une alerte.
alert_urlStringURL de l’alerte pour que l’utilisateur puisse la consulter sur AppSignal.
edit_trigger_urlStringURL de l’alerte pour que l’utilisateur puisse la modifier sur AppSignal.

Liste des intégrations