Canal d'alerte Webhook

Découvrez comment envoyer des notifications d'alerte à l'aide d'un webhook.

Pour envoyer des notifications d'alerte via un webhook, créez un canal d'alerte webhook générique.

Créer un canal d'alerte Webhook

Pour créer un canal d'alerte Webhook générique, cliquez sur Paramètres > Paramètres généraux > Événements et alertes > Canaux d'alerte > Ajouter un canal d'alerte dans l'interface utilisateur d' Instana.

Figure 1. Canal d'alerte Webhook générique
Canal d'alerte Webhook générique

Le format Webhook URL est protocol://domainOrIPAddress:port/path

Exemples d'alertes

Les événements suivants de l' Webhook sont reçus sous forme d' HTTP s POST sur les URL configurées ( HTTP ou HTTPS ) :

Remarque : dans les exemples suivants, le format Instana Webhook est utilisé. Le format Instana Webhook n'est pas compatible avec les outils tiers qui nécessitent un format Incoming Webhook. Vous pouvez utiliser un adaptateur sur mesure ou If This Then That pour vous connecter à des outils tiers.

Concernant les problèmes en suspens ou les incidents

{
  "issue": {
    "id": "53650436-8e35-49a3-a610-56b442ae7620",
    "type": "issue",
    "state": "OPEN",
    "start": 1460537793322,
    "severity": 5,
    "text": "Garbage Collection Activity High (11%)",
    "suggestion": "Tune your Garbage Collector, reduce allocation rate through code changes",
    "link": "https://XXXXXXX/#/?snapshotId=rjhkZXdNzegliVVEswMScGNn0YY",
    "zone": "prod",
    "fqdn": "host1.demo.com",
    "entity": "jvm",
    "entityLabel": "Test jvm",
    "tags": "production, documents, elasticsearch",
    "container": "test-container"
  }
}
 

Concernant les problèmes ou incidents récents

{
  "issue": {
    "id": "53650436-8e35-49a3-a610-56b442ae7620",
    "type": "issue",
    "state": "CLOSED",
    "start": 1460537793322,
    "end": 1460538393322,
    "severity": 5,
    "text": "Garbage Collection Activity High (11%)",
    "suggestion": "Tune your Garbage Collector, reduce allocation rate through code changes",
    "link": "https://XXXXXXX/#/?snapshotId=rjhkZXdNzegliVVEswMScGNn0YY",
    "zone": "prod",
    "fqdn": "host1.demo.com",
    "entity": "jvm",
    "entityLabel": "Test jvm",
    "tags": "production, documents, elasticsearch",
    "container": "test-container"
  }
}
 

Lors d'événements de modification

{
    "issue": {
        "id": "G9KRvijARFw6vffuygCvl_Fyg",
        "type": "change",
        "start": 1743798954000,
        "text": "Change detected",
        "description": "The value has changed from X to Y.\n",
        "link": "https://X/#/events;eventId=G9KRvijARFw6vffuygCvl_Fyg?&snapshotId=mTraati8sdfl0H5qrEagmIRIBYoM4",
        "end": 1743798954000,
        "zone": "prod",
        "fqdn": "something.com",
        "entity": "Kubernetes Pod",
        "entityLabel": "Test",
        "tags": "docs",
        "container": "b-container"
        }
    }
}
 

Événements en présentiel et en ligne

{
  "issue": {
    "id": "53650436-8e35-49a3-a610-56b442ae7620",
    "type": "presence",
    "start": 1460537793322,
    "text": "online",
    "description": "Java virtual machine on Host host1.demo.com",
    "link": "https://XXXXXXX/#/?snapshotId=rjhkZXdNzegliVVEswMScGNn0YY",
    "zone": "prod",
    "fqdn": "host1.demo.com",
    "entity": "jvm",
    "entityLabel": "Test jvm",
    "tags": "production, documents, elasticsearch",
    "container": "test-container"
  }
}
 

Événements liés à la surveillance des agents

{
    "issue": {
        "id": "ah7cCh99TjGqnZJ4UL-uZHA",
        "type": "monitoringIssue",
        "state": "OPEN",
        "start": 1743798151988,
        "severity": 5,
        "text": "Monitoring issue: nodejs_collector_not_installed",
        "suggestion": "Our Agent observed a problem with monitoring the linked process.",
        "link": "https://XX/#/events;eventId=ah7cCh99TjGqnZJ4UL-uZHA?&snapshotId=UhgAKBptVGeu04DsagNGU",
        "zone": "ava",
        "fqdn": "cool.fyre.ibm.com",
        "entity": "Process",
        "entityLabel": "node  (7532267)",
        "tags": "proc",
        "container": "c-container"
    }
}
 

OAuth 2.0 autorisation

Pour intégrer la transmission des webhooks à des services nécessitant une autorisation via OAuth 2.0, vous pouvez configurer un profil OAuth pour les canaux d'alerte par webhook dans Instana. Une fois le canal Webhook configuré avec l'option « OAuth » activée, Instana gère automatiquement le cycle de vie du jeton d'accès : il se charge de l'obtention du jeton, des opérations de rafraîchissement et de l'ajout sécurisé du jeton aux requêtes sortantes sous la forme d'un jeton Bearer.

Configuration d'OAuth

Pour configurer OAuth pour un canal Webhook, procédez comme suit :

  1. Go dans l'interface utilisateur d' Instana, accédez à Paramètres > Paramètres généraux > Événements et alertes > Canaux d'alerte > Ajouter un canal d'alerte.
  2. Réglez l'option « Enable OAuth » sur « On » pour activer la prise en charge d' OAuth pour le canal webhook.
  3. Entrez vos identifiants pour OAuth :
    • ID client : identifiant public attribué à votre application par le serveur d'autorisation.
    • Clé secrète du client : une clé confidentielle connue uniquement de l'application et du serveur d'autorisation.
    • URL de jeton d'accès : le point de terminaison vers lequel votre application envoie une requête afin d'échanger les informations d'identification du client contre un jeton d'accès.
    • Destinataire (facultatif) : indique le destinataire prévu du jeton d'accès, généralement l'identifiant du serveur de ressources (par exemple, le point de terminaison API ). Utilisé dans certains flux d' OAuth s pour garantir la validité des jetons pour des ressources spécifiques.
    • Portée (facultatif) : définit les autorisations ou le niveau d'accès demandés par le client (par exemple, « lecture », « écriture »).

En-têtes de demande HTTP

Fourniture d'en-têtes de demande HTTP personnalisés

Certaines intégrations d' Webhook s nécessitent la définition d'en-têtes supplémentaires, qui peuvent être ajoutés dans cette section. Par exemple, l'ajout d'un jeton d'API pour AWS API Gateway.

Webhook URL authentification de base

Au lieu de saisir manuellement l'en-tête de requête « AuthorizationHTTP », vous pouvez utiliser l'authentification de base HTTP via le webhook URL. En ajoutant username et password au début du nom d'hôte, par exemple https://username:password@webhookurl.com, les informations d'identification sont automatiquement Base64-encoded et fournies sous la forme de la valeur d'en-tête HTTP suivante :

Authorization: Basic <base64 encoded credentials>
 

Transformation de données avec JSONata

Vous pouvez transformer les données de charge utile des webhooks à l'aide d'expressions JSONata lors de la création de canaux d'alerte de webhook via l'interface de programmation d'applications ( API ). Cette fonctionnalité n'est actuellement disponible que via la configuration de API et non via l'interface utilisateur de Instana. Cela vous permet de personnaliser la structure de la charge utile du webhook afin de faciliter l'intégration avec des systèmes tiers.

Limites et bonnes pratiques

L'expression de transformation s'applique de manière globale au niveau du canal d'alerte et concerne toutes les alertes envoyées via ce canal. Tenez compte des instructions suivantes :

  • Transformations spécifiques aux alertes : si vous avez besoin de transformations différentes pour différentes alertes, créez plusieurs canaux d'alerte Webhook, chacun avec sa propre expression de transformation.
  • Gestion des erreurs : des expressions JSONata non valides peuvent entraîner des échecs dans la transmission des alertes. Assurez-vous que vos expressions sont valides et gérez correctement les valeurs nulles ou manquantes éventuelles en utilisant le bouton « Test Channel » avant de créer votre configuration.

JSONata est un langage de requête et de transformation simple des données JSON. Pour plus d'informations sur la syntaxe de JSONata, consultez la documentation de JSONata.

Création d'un webhook avec transformation de la charge utile

Pour créer un canal d'alerte Webhook avec transformation, incluez le champ transformationExpression facultatif dans votre requête API adressée au POST /api/events/settings/alertingChannels point de terminaison. Le transformationExpression champ doit respecter la syntaxe JSONata, comme le montre l'exemple suivant. Pour plus de détails sur l' API, consultez la page Instana OpenAPI.

{
    "transformationExpression": "{\"issue\": $merge([issue, {\"metricNames\": issue.text}])}",
    "headers": [],
    "rbacTags": [],
    "webhookUrls": [
        "https://webhook.example.com/endpoint"
    ],
    "kind": "WEB_HOOK",
    "name": "Transformed Webhook",
    "oauthEnabled": false
}
 

Exemples de transformation

Exemple : association du titre de l'alerte à metricNames

Une exigence courante consiste par exemple à remplir le metricNames champ avec le titre de l'alerte (enregistré dans issue.text) :

Expression de la transformation :

{
  "issue": $merge([issue, {"metricNames": issue.text}])
}
 

Avant la transformation :

{
  "issue": {
    "id": "<event-id>",
    "type": "issue",
    "state": "OPEN",
    "start": 1749498047273,
    "severity": 5,
    "text": "<issue-title>",
    "suggestion": "<issue-description>",
    "link": "<issue-link>",
    "entityType": "Host",
    "customZone": "<custom-zone>",
    "availabilityZone": "<availability-zone>",
    "zone": "<zone>",
    "fqdn": "<host-fqdn>",
    "entity": "Host",
    "entityLabel": "<entity-label>",
    "tags": "<tag1>, <tag2>",
    "container": "<container-name>",
    "service": "not available",
    "containerNames": [],
    "metricNames": [
      "cpu.used"
    ],
    "customPayloads": {
      "custom:stringKey": [
        "<string-value>"
      ],
      "custom:stringSetSingleton": [
        "<singleton-value>"
      ],
      "custom:stringSet": [
        "<item-1>",
        "<item-2>",
        "<item-3>",
        "<item-4>",
        "<item-5>"
      ]
    }
  }
}
 

Après la transformation :

{
  "issue": {
    "id": "<event-id>",
    "type": "issue",
    "state": "OPEN",
    "start": 1749498047273,
    "severity": 5,
    "text": "<issue-title>",
    "suggestion": "<issue-description>",
    "link": "<issue-link>",
    "entityType": "Host",
    "customZone": "<custom-zone>",
    "availabilityZone": "<availability-zone>",
    "zone": "<zone>",
    "fqdn": "<host-fqdn>",
    "entity": "Host",
    "entityLabel": "<entity-label>",
    "tags": "<tag1>, <tag2>",
    "container": "<container-name>",
    "service": "not available",
    "containerNames": [],
    "metricNames": "<issue-title>",
    "customPayloads": {
      "custom:stringKey": [
        "<string-value>"
      ],
      "custom:stringSetSingleton": [
        "<singleton-value>"
      ],
      "custom:stringSet": [
        "<item-1>",
        "<item-2>",
        "<item-3>",
        "<item-4>",
        "<item-5>"
      ]
    }
  }
}
 

Questions fréquentes

Comment puis-je m'assurer que le serveur de base de données Instana peut établir une connexion via TCP / TLS?

Les serveurs backend de l' Instana, émettent des requêtes à partir des serveurs AWS / Google Cloud. Il est donc important que les fichiers d' JavaScript s et de cartes sources soient généralement accessibles sur Internet. Veillez également à ce que votre backend dispose d'une configuration TLS opérationnelle avec une chaîne de certificats complète. Vous pouvez vérifier s'il existe des problèmes liés à l' TLS e en utilisant le test gratuit « SSL » proposé par SSL Labs/Qualys ou en exécutant la commande suivante :

openssl s_client -showcerts -connect {{YOUR_DOMAIN_HERE}}:443