9 agent HTTP

Vue d'ensemble

Ce type d'élément permet la collecte de données via le protocole HTTP/HTTPS. Le trapping est également possible à l'aide de l'utilitaire Zabbix sender ou du protocole Zabbix sender (pour envoyer des données au serveur Zabbix ou au proxy), ou à l'aide de la méthode API history.push (pour envoyer des données au serveur Zabbix).

Les vérifications d'élément HTTP sont exécutées par le serveur Zabbix. Cependant, lorsque les hôtes sont surveillés par un proxy Zabbix, les vérifications d'élément HTTP sont exécutées par le proxy.

Les vérifications d'élément HTTP ne nécessitent aucun agent en cours d'exécution sur un hôte surveillé.

HTTP agent prend en charge HTTP et HTTPS. Zabbix suivra éventuellement les redirections (voir l'option Suivre les redirections ci-dessous). Le nombre maximal de redirections est codé en dur à 10 (en utilisant l'option cURL CURLOPT_MAXREDIRS).

Le serveur/proxy Zabbix doit être initialement configuré avec la prise en charge de cURL (libcurl).

Les vérifications HTTP sont exécutées de manière asynchrone - il n'est pas nécessaire de recevoir la réponse à une requête avant que d'autres vérifications ne soient lancées. La résolution DNS est également asynchrone.

La concurrence maximale des vérifications asynchrones est de 1000 (définie par MaxConcurrentChecksPerPoller).

Le nombre de pollers HTTP agent asynchrones est défini par le paramètre StartHTTPAgentPollers.

La fonctionnalité de connexions persistantes de cURL a été ajoutée aux vérifications HTTP agent depuis Zabbix 7.0.

Configuration

Pour configurer un élément HTTP :

  1. Accédez à Collecte de données > Hôtes.
  2. Cliquez sur Éléments dans la ligne de l’hôte.
  3. Cliquez sur Créer un élément.
  4. Saisissez les paramètres de l’élément dans le formulaire.

Tous les champs obligatoires sont signalés par un astérisque rouge.

Les champs qui nécessitent des informations spécifiques aux éléments HTTP sont les suivants :

Paramètre Description
Type Sélectionnez HTTP agent ici.
Key Saisissez une clé d’élément unique.
URL URL à laquelle se connecter pour récupérer les données. Par exemple :
https://www.example.com
http://www.example.com/download
Les noms de domaine peuvent être spécifiés avec des caractères Unicode. Ils sont automatiquement convertis en punycode ASCII lors de l’exécution de la vérification HTTP.
Le bouton Parse peut être utilisé pour séparer les champs de requête facultatifs (tels que ?key=value&limit=10) de l’URL, en déplaçant les attributs et les valeurs vers Query fields pour un encodage automatique de l’URL.
Pour des raisons de sécurité, n’incluez pas de noms d’utilisateur ou de mots de passe réels dans les URL. Utilisez plutôt des macros utilisateur afin d’éviter d’exposer les identifiants.
Limité à 2048 caractères.
Macros prises en charge : {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, macros utilisateur, macros de découverte de bas niveau.
Cette option définit l’option cURL CURLOPT_URL.
Query fields Variables pour l’URL (voir ci-dessus).
Spécifiées sous forme de paires attribut-valeur.
Les valeurs sont automatiquement encodées pour les URL. Les valeurs issues de macros sont résolues, puis automatiquement encodées pour les URL.
Macros prises en charge : {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, macros utilisateur, macros de découverte de bas niveau.
Cette option définit l’option cURL CURLOPT_URL.
Request type Sélectionnez le type de méthode de requête : GET, POST, PUT ou HEAD.
Request body type Sélectionnez le type de corps de la requête :
Raw data - corps personnalisé de la requête HTTP ; les macros sont remplacées, mais aucun encodage n’est effectué
JSON data - corps de la requête HTTP au format JSON. Les macros peuvent être utilisées comme chaîne, nombre, true et false ; les macros utilisées comme chaînes doivent être placées entre guillemets doubles. Les valeurs issues de macros sont résolues, puis automatiquement échappées. Si « Content-Type » n’est pas spécifié dans les en-têtes, la valeur par défaut sera « Content-Type: application/json »
XML data - corps de la requête HTTP au format XML. Les macros peuvent être utilisées comme nœud de texte, attribut ou section CDATA. Les valeurs issues de macros sont résolues, puis automatiquement échappées dans un nœud de texte et un attribut. Si « Content-Type » n’est pas spécifié dans les en-têtes, la valeur par défaut sera « Content-Type: application/xml »
Notez que la sélection de XML data nécessite libxml2.
Request body Saisissez le corps de la requête.
Macros prises en charge : {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, macros utilisateur, macros de découverte de bas niveau.
Headers En-têtes HTTP personnalisés qui seront envoyés lors de l’exécution d’une requête.
Spécifiés sous forme de paires attribut-valeur.
Macros prises en charge : {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, macros utilisateur, macros de découverte de bas niveau.
Cette option définit l’option cURL CURLOPT_HTTPHEADER.
Required status codes Liste des codes d’état HTTP attendus. Si Zabbix reçoit un code qui ne figure pas dans la liste, l’élément devient non pris en charge. Si la liste est vide, aucune vérification n’est effectuée.
Par exemple : 200,201,210-299
Macros prises en charge dans la liste : macros utilisateur, macros de découverte de bas niveau.
Cette option utilise l’option cURL CURLINFO_RESPONSE_CODE.
Follow redirects Cochez la case pour suivre les redirections HTTP.
Cette option définit l’option cURL CURLOPT_FOLLOWLOCATION.
Retrieve mode Sélectionnez la partie de la réponse à récupérer :
Body - corps uniquement
Headers - en-têtes uniquement
Body and headers - corps et en-têtes.
Convert to JSON Les en-têtes sont enregistrés sous forme de paires attribut-valeur sous la clé « header » si Retrieve mode n’est pas défini sur Body.
Si « Content-Type: application/json » est détecté, le corps est enregistré comme un objet ; sinon, il est stocké comme une chaîne, par exemple :
HTTP proxy Vous pouvez spécifier un proxy HTTP à utiliser, au format [protocol://][username[:password]@]proxy.example.com[:port].
Le préfixe facultatif protocol:// peut être utilisé pour spécifier d’autres protocoles de proxy (par exemple https, socks4, socks5 ; voir la documentation ; 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 est traité comme un proxy HTTP. Si vous spécifiez un protocole incorrect, la connexion échouera et l’élément deviendra non pris en charge.
Par défaut, le port 1080 sera utilisé.
Si le proxy est spécifié, il remplacera les variables d’environnement liées au proxy, telles que http_proxy et HTTPS_PROXY. S’il n’est pas spécifié, il ne remplacera pas ces variables d’environnement. La valeur saisie est transmise « telle quelle », sans aucun contrôle de cohérence.
Notez que seule l’authentification simple est prise en charge avec un proxy HTTP.
Macros prises en charge : {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, macros utilisateur, macros de découverte de bas niveau.
Cette option définit l’option cURL CURLOPT_PROXY.
HTTP authentication Sélectionnez l’option d’authentification :
None - aucune authentification utilisée ;
Basic - authentification basique utilisée ;
NTLM - authentification NTLM (Windows NT LAN Manager) utilisée ;
Kerberos - authentification Kerberos utilisée (voir également : Configuration de Kerberos avec Zabbix) ;
Digest - authentification Digest utilisée.
Cette option définit l’option cURL CURLOPT_HTTPAUTH.
User name Saisissez le nom d’utilisateur (255 caractères maximum).
Ce champ est disponible si HTTP authentication est défini sur Basic, NTLM, Kerberos ou Digest. Les macros utilisateur et les macros de découverte de bas niveau sont prises en charge.
Password Saisissez le mot de passe utilisateur (255 caractères maximum).
Ce champ est disponible si HTTP authentication est défini sur Basic, NTLM, Kerberos ou Digest. Les macros utilisateur et les macros de découverte de bas niveau sont prises en charge.
SSL verify peer Cochez la case pour vérifier le certificat SSL du serveur web. Le certificat du serveur est vérifié par rapport aux certificats des autorités de certification (CA) approuvées situés dans l’emplacement système des CA. Vous pouvez remplacer l’emplacement des fichiers CA à l’aide du paramètre de configuration du serveur ou du proxy Zabbix SSLCALocation.
Cette option définit l’option cURL CURLOPT_SSL_VERIFYPEER.
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.
Cette option 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. Si le fichier de certificat contient également la clé privée, laissez le champ SSL key file vide. Si la clé est chiffrée, spécifiez 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 du serveur ou du proxy Zabbix SSLCertLocation.
Macros prises en charge : {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, macros utilisateur, macros de découverte de bas niveau.
Cette option définit l’option cURL CURLOPT_SSLCERT.
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. Le répertoire contenant ce fichier est spécifié par le paramètre de configuration du serveur ou du proxy Zabbix SSLKeyLocation.
Macros prises en charge : {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, macros utilisateur, macros de découverte de bas niveau.
Cette option définit l’option cURL CURLOPT_SSLKEY.
SSL key password Mot de passe du fichier de clé privée SSL.
Macros prises en charge : macros utilisateur, macros de découverte de bas niveau.
Cette option définit l’option cURL CURLOPT_KEYPASSWD.
Timeout Zabbix ne consacrera pas plus de temps que la durée définie au traitement de l’URL (1 à 600 secondes). En réalité, ce paramètre définit la durée maximale pour établir une connexion à l’URL et la durée maximale pour effectuer une requête HTTP. Par conséquent, Zabbix ne consacrera pas plus de 2 x Timeout secondes à une vérification.
Cette option définit l’option cURL CURLOPT_TIMEOUT.
Pour plus d’informations sur le paramètre Timeout, consultez les attributs généraux des éléments.
Enable trapping Lorsque cette case est cochée, l’élément fonctionne également comme un élément trapper et accepte les données envoyées au serveur ou au proxy Zabbix à l’aide de l’utilitaire Zabbix sender ou du protocole Zabbix sender, ou accepte les données envoyées au serveur Zabbix à l’aide de la méthode API history.push. Pour plus d’informations sur l’envoi de données, consultez : Éléments trapper.
Allowed hosts Visible uniquement si la case Enable trapping est cochée.
Liste d’adresses IP séparées par des virgules, éventuellement au format CIDR, ou de noms DNS.
Si cette option est spécifiée, les connexions entrantes seront acceptées uniquement depuis les hôtes répertoriés ici.
Si la prise en charge d’IPv6 est activée, 127.0.0.1, ::127.0.0.1 et ::ffff:127.0.0.1 sont traités de la même manière, et ::/0 autorise toute adresse IPv4 ou IPv6.
0.0.0.0/0 peut être utilisé pour autoriser toute adresse IPv4.
Notez que les « adresses IPv6 compatibles IPv4 » (préfixe 0000::/96) sont prises en charge, mais déconseillées par la RFC4291.
Exemple : 127.0.0.1, 192.168.1.0/24, 192.168.3.1-255, 192.168.1-10.1-255, ::1,2001:db8::/32, mysqlserver1, zabbix.example.com, {HOST.HOST}
Les espaces et les macros utilisateur sont autorisés dans ce champ.
Macros d’hôte : {HOST.HOST}, {HOST.NAME}, {HOST.IP}, {HOST.DNS}, {HOST.CONN} sont autorisées dans ce champ.

Si le champ HTTP proxy est laissé vide, une autre méthode pour utiliser un proxy HTTP consiste à définir des variables d’environnement liées au proxy.

Pour HTTP - définissez la variable d’environnement http_proxy pour l’utilisateur du serveur Zabbix. Par exemple :
http_proxy=http://proxy_ip:proxy_port.

Pour HTTPS - définissez la variable d’environnement HTTPS_PROXY. Par exemple :
HTTPS_PROXY=http://proxy_ip:proxy_port. Pour plus de détails, exécutez la commande shell suivante : # man curl.

[1] Zabbix prend uniquement en charge les fichiers de certificat et de clé privée au format PEM. Si les données de votre certificat et de votre clé privée se trouvent dans un fichier au format PKCS #12 (généralement avec l’extension *.p12 ou *.pfx), vous pouvez générer le fichier PEM à partir de celui-ci à l’aide des commandes suivantes :

openssl pkcs12 -in ssl-cert.p12 -clcerts -nokeys -out ssl-cert.pem
openssl pkcs12 -in ssl-cert.p12 -nocerts -nodes  -out ssl-cert.key

Exemples

Exemple 1

Envoyez de simples requêtes GET pour récupérer des données depuis des services tels que Elasticsearch :

  • Créez un élément GET avec l'URL : localhost:9200/?pretty
  • Observez la réponse :
    {
      "name" : "YQ2VAY-",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "kH4CYqh5QfqgeTsjh2F9zg",
      "version" : {
        "number" : "6.1.3",
        "build_hash" : "af51318",
        "build_date" : "2018-01-26T18:22:55.523Z",
        "build_snapshot" : false,
        "lucene_version" : "7.1.0",
        "minimum_wire_compatibility_version" : "5.6.0",
        "minimum_index_compatibility_version" : "5.0.0"
      },
      "tagline" : "You know, for search"
    }
  • Extrayez maintenant le numéro de version à l'aide d'une étape de prétraitement JSONPath : $.version.number
Exemple 2

Envoyez de simples requêtes POST pour récupérer des données depuis des services tels que Elasticsearch :

  • Créez un élément POST avec l'URL : http://localhost:9200/str/values/_search?scroll=10s
  • Configurez le corps POST suivant pour obtenir la charge du processeur (moyenne sur 1 minute par cœur)
    {
        "query": {
            "bool": {
                "must": [{
                    "match": {
                        "itemid": 28275
                    }
                }],
                "filter": [{
                    "range": {
                        "clock": {
                            "gt": 1517565836,
                            "lte": 1517566137
                        }
                    }
                }]
            }
        }
    }
  • Reçu :
    {
        "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAAkFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAJRZZUTJWQVktVFNacU5nRHhlcEI0QUxRAAAAAAAAACYWWVEyVkFZLVRTWnFOZ0R4ZXBCNEFMUQAAAAAAAAAnFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAKBZZUTJWQVktVFNacU5nRHhlcEI0QUxR",
        "took": 18,
        "timed_out": false,
        "_shards": {
            "total": 5,
            "successful": 5,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": 1,
            "max_score": 1.0,
            "hits": [{
                "_index": "dbl",
                "_type": "values",
                "_id": "dqX9VWEBV6sEKSMyk6sw",
                "_score": 1.0,
                "_source": {
                    "itemid": 28275,
                    "value": "0.138750",
                    "clock": 1517566136,
                    "ns": 25388713,
                    "ttl": 604800
                }
            }]
        }
    }
  • Utilisez maintenant une étape de prétraitement JSONPath pour obtenir la valeur de l'élément : $.hits.hits[0]._source.value
Exemple 3

Vérification que l'API Zabbix est active, en utilisant apiinfo.version.

  • Configuration de l'élément :

Notez l'utilisation de la méthode POST avec des données JSON, la définition des en-têtes de requête et la demande de ne renvoyer que les en-têtes :

  • Prétraitement de la valeur de l'élément avec une expression régulière pour obtenir le code HTTP :

  • Vérification du résultat dans Latest data :

Exemple 4

Récupération d'informations météorologiques en se connectant au service public Openweathermap.

  • Configurez un élément maître pour la collecte de données en masse dans un seul JSON :

Notez l'utilisation de macros dans les champs de requête. Consultez l'API Openweathermap pour savoir comment les renseigner.

Exemple de JSON renvoyé en réponse par l'agent HTTP :

{
    "body": {
        "coord": {
            "lon": 40.01,
            "lat": 56.11
        },
        "weather": [{
            "id": 801,
            "main": "Clouds",
            "description": "few clouds",
            "icon": "02n"
        }],
        "base": "stations",
        "main": {
            "temp": 15.14,
            "pressure": 1012.6,
            "humidity": 66,
            "temp_min": 15.14,
            "temp_max": 15.14,
            "sea_level": 1030.91,
            "grnd_level": 1012.6
        },
        "wind": {
            "speed": 1.86,
            "deg": 246.001
        },
        "clouds": {
            "all": 20
        },
        "dt": 1526509427,
        "sys": {
            "message": 0.0035,
            "country": "RU",
            "sunrise": 1526432608,
            "sunset": 1526491828
        },
        "id": 487837,
        "name": "Stavrovo",
        "cod": 200
    }
}

L'étape suivante consiste à configurer des éléments dépendants qui extraient les données du JSON.

  • Configurez un exemple d'élément dépendant pour l'humidité :

D'autres métriques météorologiques, telles que « Température », sont ajoutées de la même manière.

  • Exemple de prétraitement de la valeur d'un élément dépendant avec JSONPath :

  • Vérifiez le résultat des données météorologiques dans Dernières données :

Exemple 5

Connexion à la page d'état de Nginx et récupération de ses métriques en masse.

  • Configurez Nginx en suivant le guide officiel.
  • Configurez un élément maître pour la collecte de données en masse :

Exemple de sortie du stub status de Nginx :

Active connections: 1 Active connections:
server accepts handled requests
 52 52 52 
Reading: 0 Writing: 1 Waiting: 0

La tâche suivante consiste à configurer des éléments dépendants qui extraient les données.

  • Configurez un exemple d'élément dépendant pour les requêtes par seconde :

  • Exemple de prétraitement de la valeur d'un élément dépendant avec l'expression régulière server accepts handled requests\s+([0-9]+) ([0-9]+) ([0-9]+) :

  • Vérifiez le résultat complet du module stub dans Dernières données :