2 Diffusion en continu vers des systèmes externes

Aperçu

Il est possible de diffuser en continu les valeurs des éléments et les événements de Zabbix vers des systèmes externes via HTTP (voir les détails du protocole).

Le filtre de tags peut être utilisé pour diffuser en continu des sous-ensembles de valeurs d’éléments ou d’événements.

Deux processus du serveur Zabbix sont responsables de la diffusion des données : connector manager et connector worker. Un élément interne Zabbix zabbix[connector_queue] permet de surveiller le nombre de valeurs mises en file d’attente dans la file du connecteur.

Configuration

Les étapes suivantes sont nécessaires pour configurer le streaming de données vers un système externe :

1. Disposer d’un système distant configuré pour recevoir les données de Zabbix. À cette fin, les outils suivants sont disponibles :

  • Un exemple de récepteur simple qui consigne les informations reçues dans les fichiers events.ndjson et history.ndjson.
  • Connecteur Kafka pour Zabbix server - un serveur léger écrit en Go, conçu pour transférer les valeurs d’éléments et les événements d’un Zabbix server vers un broker Kafka.

2. Définissez le nombre requis de workers de connecteur dans Zabbix en ajustant le paramètre StartConnectors dans zabbix_server.conf. Le nombre de workers de connecteur doit correspondre (ou être supérieur si le nombre de sessions simultanées est supérieur à 1) au nombre de connecteurs configuré dans le frontend Zabbix. Redémarrez ensuite Zabbix server.

3. Configurez un nouveau connecteur dans le frontend Zabbix (Administration > General > Connectors) et rechargez le cache du serveur avec la commande zabbix_server -R config_cache_reload.

Les champs obligatoires sont marqués d’un astérisque.

Parameter Description
Name Saisissez le nom du connecteur.
Data type Sélectionnez le type de données à diffuser :
Item values - diffuser les valeurs d’éléments de Zabbix vers des systèmes externes ;
Events - diffuser les événements de Zabbix vers des systèmes externes.
URL Saisissez l’URL du récepteur. Les macros utilisateur sont prises en charge.
Tag filter Exportez uniquement les valeurs d’éléments ou les événements correspondant au filtre de tags. S’il n’est pas défini, tout est exporté.
Il est possible d’inclure ou d’exclure des tags et des valeurs de tag spécifiques. Plusieurs conditions peuvent être définies. La correspondance des noms de tag est toujours sensible à la casse.

Plusieurs opérateurs sont disponibles pour chaque condition :
Exists - inclure les noms de tag spécifiés ;
Equals - inclure les noms de tag et les valeurs spécifiés (sensible à la casse) ;
Contains - inclure les noms de tag spécifiés lorsque les valeurs de tag contiennent la chaîne saisie (correspondance de sous-chaîne, insensible à la casse) ;
Does not exist - exclure les noms de tag spécifiés ;
Does not equal - exclure les noms de tag et les valeurs spécifiés (sensible à la casse) ;
Does not contain - exclure les noms de tag spécifiés lorsque les valeurs de tag contiennent la chaîne saisie (correspondance de sous-chaîne, insensible à la casse).

Deux types de calcul sont disponibles pour les conditions :
And/Or - toutes les conditions doivent être remplies ; les conditions ayant le même nom de tag seront regroupées par la condition Or ;
Or - il suffit qu’une seule condition soit remplie.
Type of information Sélectionnez le type d’information (numeric (unsigned), numeric (float), character, etc.) permettant de filtrer les valeurs d’éléments que le connecteur doit diffuser.
Ce champ est disponible si Data type est défini sur "Item values".
HTTP authentication Sélectionnez l’option d’authentification :
None - aucune authentification n’est utilisée ;
Basic - l’authentification de base est utilisée ;
NTLM - l’authentification NTLM (Windows NT LAN Manager) est utilisée ;
Kerberos - l’authentification Kerberos est utilisée (voir aussi : Configuration de Kerberos avec Zabbix) ;
Digest - l’authentification Digest est utilisée ;
Bearer - l’authentification Bearer est utilisée.
Username Saisissez le nom d’utilisateur (jusqu’à 255 caractères). Les macros utilisateur sont prises en charge.
Ce champ est disponible si HTTP authentication est défini sur "Basic", "NTLM", "Kerberos" ou "Digest".
Password Saisissez le mot de passe de l’utilisateur (jusqu’à 255 caractères). Les macros utilisateur sont prises en charge.
Ce champ est disponible si HTTP authentication est défini sur "Basic", "NTLM", "Kerberos" ou "Digest".
Bearer token Saisissez le jeton Bearer. Les macros utilisateur sont prises en charge.
Ce champ est disponible et obligatoire si HTTP authentication est défini sur "Bearer".
Advanced configuration Cliquez sur le libellé Advanced configuration pour afficher les options de configuration avancée (voir ci-dessous).
Max records per message Spécifiez le nombre maximal de valeurs ou d’événements pouvant être diffusés dans un seul message.
Concurrent sessions Sélectionnez le nombre de processus d’envoi à exécuter pour ce connecteur. Jusqu’à 100 sessions peuvent être spécifiées ; la valeur par défaut est "1".
Attempts Nombre de tentatives de diffusion des données. Jusqu’à 5 tentatives peuvent être spécifiées ; la valeur par défaut est "1".
Attempt interval Spécifiez combien de temps le connecteur doit attendre après une tentative infructueuse de diffusion des données. Jusqu’à 10s peuvent être spécifiées ; la valeur par défaut est "5s".
Ce champ est disponible si Attempts est défini sur "2" ou plus.
Les tentatives infructueuses sont celles où l’établissement d’une connexion a échoué, ou lorsque le code de réponse HTTP n’est pas 200, 201, 202, 203, 204. Les nouvelles tentatives sont déclenchées en cas d’erreurs de communication ou lorsque le code de réponse HTTP n’est pas 200, 201, 202, 203, 204, 400, 401, 403, 404, 405, 415, 422. Les redirections sont suivies ; ainsi, 302 -> 200 est une réponse positive, tandis que 302 -> 503 déclenchera une nouvelle tentative.
Timeout Spécifiez le délai d’expiration du message (1 à 60 secondes, valeur par défaut : 5 secondes).
Les suffixes de temps sont pris en charge, par exemple 30s, 1m. Les macros utilisateur sont prises en charge.
HTTP proxy Vous pouvez spécifier un proxy HTTP à utiliser au format suivant :
[protocol://][username[:password]@]proxy.example.com[:port]
Les macros utilisateur sont prises en charge.

Le préfixe facultatif protocol:// peut être utilisé pour spécifier d’autres protocoles de proxy (la prise en charge du préfixe de protocole a été ajoutée dans cURL 7.21.7). Si aucun protocole n’est spécifié, le proxy sera traité comme un proxy HTTP. Par défaut, le port 1080 sera utilisé.

Si HTTP proxy est spécifié, le proxy remplacera les variables d’environnement liées au proxy telles que http_proxy, HTTPS_PROXY. S’il n’est pas spécifié, le proxy ne remplacera pas les variables d’environnement liées au proxy. La valeur saisie est transmise telle quelle, sans aucun contrôle de validité.
Vous pouvez également saisir l’adresse d’un proxy SOCKS. Si vous spécifiez un protocole incorrect, la connexion échouera et l’élément deviendra non pris en charge.

Notez que seule l’authentification simple est prise en charge avec le proxy HTTP.
SSL verify peer Cochez la case pour vérifier le certificat SSL du serveur web.
Le certificat du serveur sera automatiquement pris à partir de l’emplacement système des autorités de certification (CA). Vous pouvez remplacer l’emplacement des fichiers CA à l’aide du paramètre de configuration Zabbix server ou proxy SSLCALocation.
SSL verify host Cochez la case pour vérifier que le champ Common Name ou le champ Subject Alternate Name du certificat du serveur web correspond.
Cela définit l’option cURL CURLOPT_SSL_VERIFYHOST.
SSL certificate file Nom du fichier de certificat SSL utilisé pour l’authentification du client. Le fichier de certificat doit être au format PEM1. Les macros utilisateur sont prises en charge.
Si le fichier de certificat contient également la clé privée, laissez le champ SSL key file vide. Si la clé est chiffrée, indiquez le mot de passe dans le champ SSL key password. Le répertoire contenant ce fichier est spécifié par le paramètre de configuration Zabbix server ou proxy SSLCertLocation.
SSL key file Nom du fichier de clé privée SSL utilisé pour l’authentification du client. Le fichier de clé privée doit être au format PEM1. Les macros utilisateur sont prises en charge.
Le répertoire contenant ce fichier est spécifié par le paramètre de configuration Zabbix server ou proxy SSLKeyLocation.
SSL key password Mot de passe du fichier de clé privée SSL. Les macros utilisateur sont prises en charge.
Description Saisissez la description du connecteur.
Enabled Cochez la case pour activer le connecteur.

Lorsque le connecteur Kafka est configuré avec une liste d’adresses de brokers bootstrap séparées par des virgules (par exemple Kafka.URL=kafka1.example.com:9093,kafka2.example.com:9093), le client Kafka se connecte au(x) broker(s) qui répond(ent) en premier et utilise leurs métadonnées de cluster. Si la liste contient des adresses provenant de différents clusters Kafka, seul le cluster répondant le plus rapidement sera utilisé et les autres adresses seront consignées comme indisponibles ; par conséquent, des avertissements au démarrage tels que le suivant peuvent apparaître même si le connecteur est connecté :

kafka cluster connected, but broker(s) "kafka1.example.com:9093, kafka2.example.com:9093" unavailable; will retry on message send if active brokers fail 

Dans certains environnements (réseaux privés, réseaux de conteneurs ou configurations DNS/hosts non standard), les noms d’hôte ou les IP peuvent être résolus vers des adresses de bouclage (par exemple 127.0.0.1/localhost) ou être normalisés par le client, ce qui peut rendre ces avertissements trompeurs. Pour réduire toute confusion, assurez-vous que toutes les adresses Kafka.URL appartiennent au même cluster Kafka, vérifiez la résolution DNS depuis l’hôte du connecteur ainsi que les advertised.listeners des brokers, et privilégiez les adresses qui se résolvent vers l’adresse annoncée du broker.

Protocole

La communication entre le serveur et le récepteur s’effectue via HTTP en utilisant l’API REST, NDJSON, « Content-Type: application/x-ndjson ».

Pour plus de détails, voir Protocole d’export JSON délimité par des sauts de ligne.

Requête du serveur

Exemple de diffusion en continu des valeurs d'élément :

POST /v1/history HTTP/1.1
Host: localhost:8080
Accept: */*
Accept-Encoding: deflate, gzip, br, zstd
Content-Length: 628
Content-Type: application/x-ndjson

{"host":{"host":"Zabbix server","name":"Zabbix server"},"groups":["Zabbix servers"],"item_tags":[{"tag":"foo","value":"test"}],"itemid":44457,"name":"foo","clock":1673454303,"ns":800155804,"value":0,"type":3}
{"host":{"host":"Zabbix server","name":"Zabbix server"},"groups":["Zabbix servers"],"item_tags":[{"tag":"foo","value":"test"}],"itemid":44457,"name":"foo","clock":1673454303,"ns":832290669,"value":1,"type":3}
{"host":{"host":"Zabbix server","name":"Zabbix server"},"groups":["Zabbix servers"],"item_tags":[{"tag":"bar","value":"test"}],"itemid":44458,"name":"bar","clock":1673454303,"ns":867770366,"value":123,"type":3}

Exemple de diffusion en continu des événements :

POST /v1/events HTTP/1.1
Host: localhost:8080
Accept: */*
Accept-Encoding: deflate, gzip, br, zstd
Content-Length: 333
Content-Type: application/x-ndjson

{"clock":1673454303,"ns":800155804,"value":1,"eventid":5,"name":"trigger for foo being 0","severity":0,"hosts":[{"host":"Zabbix server","name":"Zabbix server"}],"groups":["Zabbix servers"],"tags":[{"tag":"foo_trig","value":"test"},{"tag":"foo","value":"test"}]}
{"clock":1673454303,"ns":832290669,"value":0,"eventid":6,"p_eventid":5}
Réponse du récepteur

La réponse se compose du code d'état de la réponse HTTP et de la charge utile JSON. Le code d'état de la réponse HTTP doit être "200", "201", "202", "203" ou "204" pour les requêtes traitées avec succès, toute autre valeur indiquant des requêtes en échec.

Exemple de réussite :

localhost:8080/v1/history": HTTP/1.1 200 OK
Date: Wed, 11 Jan 2023 16:40:30 GMT
Content-Length: 0

Exemple avec des erreurs :

localhost:8080/v1/history": HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
Date: Wed, 11 Jan 2023 17:07:36 GMT
Content-Length: 55

{"error":"invalid character '{' after top-level value"}