9 agent HTTP

Vue d'ensemble

Ce type d'élément permet l'interrogation des données à l'aide du protocole HTTP/HTTPS. La réception 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 des éléments HTTP sont exécutées par le serveur Zabbix. Cependant, lorsque les hôtes sont surveillés par un proxy Zabbix, les vérifications des éléments HTTP sont exécutées par le proxy.

Les vérifications des éléments 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 (à l'aide de l'option cURL CURLOPT_MAXREDIRS).

Le serveur/proxy Zabbix doit être configuré initialement 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 le paramètre 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 à Data collection > Hosts.
  2. Cliquez sur Items dans la ligne de l'hôte.
  3. Cliquez sur Create item.
  4. Saisissez les paramètres de l'élément dans le formulaire.

Tous les champs obligatoires sont marqués d'un astérisque rouge.

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

Parameter Description
Type Sélectionnez HTTP agent ici.
Key Saisissez une clé d'élément unique.
URL URL à laquelle se connecter et à partir de laquelle 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 vers 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 (comme ?name=Admin&password=mypassword) de l'URL, en déplaçant les attributs et les valeurs dans Query fields pour un encodage automatique de l'URL.
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 bas niveau.
Cela définit l'option cURL CURLOPT_URL.
Query fields Variables pour l'URL (voir ci-dessus).
Spécifiés sous forme de paires attribut-valeur.
Les valeurs sont encodées automatiquement dans l'URL. Les valeurs issues des macros sont résolues puis encodées automatiquement dans l'URL.
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 bas niveau.
Cela 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 requête :
Raw data - corps de requête HTTP personnalisé, les macros sont substituées mais aucun encodage n'est effectué
JSON data - corps de 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 des macros sont résolues puis échappées automatiquement. 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 requête HTTP au format XML. Les macros peuvent être utilisées comme nœud de texte, attribut ou section CDATA. Les valeurs issues des macros sont résolues puis échappées automatiquement 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"
Note 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}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, macros utilisateur, macros de découverte 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}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, macros utilisateur, macros de découverte bas niveau.
Cela définit l'option cURL CURLOPT_HTTPHEADER.
Required status codes Liste des codes d'état HTTP attendus. Si Zabbix obtient un code qui ne figure pas dans la liste, l'élément deviendra non pris en charge. Si ce champ 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 bas niveau.
Cela utilise l'option cURL CURLINFO_RESPONSE_CODE.
Follow redirects Cochez la case pour suivre les redirections HTTP.
Cela 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 rencontré, 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). Sans protocole spécifié, le proxy sera traité comme un proxy HTTP. Si vous spécifiez le mauvais protocole, la connexion échouera et l'élément deviendra non pris en charge.
Par défaut, le port 1080 sera utilisé.
Si spécifié, le proxy remplacera les variables d'environnement liées au proxy, comme http_proxy, HTTPS_PROXY. Si non spécifié, le proxy ne remplacera pas les variables d'environnement liées au proxy. La valeur saisie est transmise telle quelle, sans vérification de cohérence.
Note que seule l'authentification simple est prise en charge avec le proxy HTTP.
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 bas niveau.
Cela définit l'option cURL CURLOPT_PROXY.
HTTP authentication Sélectionnez l'option d'authentification :
None - aucune authentification utilisée ;
Basic - authentification de base utilisée ;
NTLM - authentification NTLM (Windows NT LAN Manager) utilisée ;
Kerberos - authentification Kerberos utilisée (voir aussi : Configuration de Kerberos avec Zabbix) ;
Digest - authentification Digest utilisée.
Cela définit l'option cURL CURLOPT_HTTPAUTH.
User name Saisissez le nom d'utilisateur (jusqu'à 255 caractères).
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 bas niveau sont prises en charge.
Password Saisissez le mot de passe de l'utilisateur (jusqu'à 255 caractères).
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 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 sera automatiquement pris depuis l'emplacement de l'autorité de certification (CA) défini à l'échelle du système. Vous pouvez remplacer l'emplacement des fichiers CA à l'aide du paramètre de configuration SSLCALocation du serveur Zabbix ou du proxy.
Cela 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.
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. Si le fichier de certificat contient également la clé privée, laissez le champ du fichier de clé SSL vide. Si la clé est chiffrée, spécifiez le mot de passe dans le champ du mot de passe de la clé SSL. Le répertoire contenant ce fichier est spécifié par le paramètre de configuration SSLCertLocation du serveur Zabbix ou du proxy.
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 bas niveau.
Cela 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 SSLKeyLocation du serveur Zabbix ou du proxy.
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 bas niveau.
Cela 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 bas niveau.
Cela définit l'option cURL CURLOPT_KEYPASSWD.
Timeout Zabbix ne consacrera pas plus que la durée définie au traitement de l'URL (1-600 secondes). En réalité, ce paramètre définit le temps maximal pour établir une connexion à l'URL et le temps maximal pour effectuer une requête HTTP. Par conséquent, Zabbix ne consacrera pas plus de 2 x Timeout secondes à une vérification.
Cela définit l'option cURL CURLOPT_TIMEOUT.
Pour plus d'informations sur le paramètre Timeout, voir les attributs généraux de l'élément.
Enable trapping Lorsque cette case est cochée, l'élément fonctionnera également comme un élément trapper et acceptera les données envoyées au serveur Zabbix ou au proxy à l'aide de l'utilitaire Zabbix sender ou du protocole Zabbix sender, ou acceptera 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, voir : É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 en notation CIDR, ou de noms DNS.
Si spécifié, les connexions entrantes ne seront acceptées que depuis les hôtes listés ici.
Si la prise en charge d'IPv6 est activée, alors '127.0.0.1', '::127.0.0.1', '::ffff:127.0.0.1' sont traités de la même manière et '::/0' autorisera 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.
Les 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 façon d'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. Plus de détails sont disponibles en exécutant une commande shell : # man curl.

[1] Zabbix prend en charge les fichiers de certificat et de clé privée au format PEM uniquement. Si votre certificat et vos données de clé privée sont dans un fichier au format PKCS #12 (généralement avec l'extension *.p12 ou *.pfx), vous pouvez en générer le fichier PEM à 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 des requêtes POST simples 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
    }
}

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

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

D'autres métriques météorologiques, telles que « Temperature », 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 Nginx et récupération de ses métriques en lot.

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

Exemple de sortie du statut stub 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 :