2 Streaming an externe Systeme

Übersicht

Es ist möglich, Datenpunkt-Werte und Ereignisse von Zabbix über HTTP an externe Systeme zu streamen (siehe Protokolldetails).

Der Tag-Filter kann verwendet werden, um Teilmengen von Datenpunkt-Werten oder Ereignissen zu streamen.

Zwei Zabbix-Serverprozesse sind für das Daten-Streaming verantwortlich: connector manager und connector worker. Ein interner Zabbix-Datenpunkt zabbix[connector_queue] ermöglicht die Überwachung der Anzahl der in die Connector-Warteschlange eingereihten Werte.

Konfiguration

Die folgenden Schritte sind erforderlich, um das Daten-Streaming zu einem externen System zu konfigurieren:

1. Richten Sie ein entferntes System für den Empfang von Daten aus Zabbix ein. Zu diesem Zweck stehen die folgenden Werkzeuge zur Verfügung:

  • Ein Beispiel für einen einfachen receiver, der die empfangenen Informationen in den Dateien events.ndjson und history.ndjson protokolliert.
  • Kafka connector for Zabbix server - ein leichtgewichtiger, in Go geschriebener Server, der dafür ausgelegt ist, Datenpunkt-Werte und Ereignisse von einem Zabbix Server an einen Kafka-Broker weiterzuleiten.

2. Legen Sie die erforderliche Anzahl von Connector-Workern in Zabbix fest, indem Sie den Parameter StartConnectors in zabbix_server.conf anpassen. Die Anzahl der Connector-Worker sollte mit der im Zabbix Frontend konfigurierten Anzahl von Connectors übereinstimmen (oder diese überschreiten, wenn mehr als 1 gleichzeitige Sitzung verwendet wird). Starten Sie anschließend den Zabbix Server neu.

3. Konfigurieren Sie einen neuen Connector im Zabbix Frontend (Administration > General > Connectors) und laden Sie den Server-Cache mit dem Befehl zabbix_server -R config_cache_reload neu.

Pflichtfelder sind mit einem Sternchen markiert.

Parameter Beschreibung
Name Geben Sie den Namen des Connectors ein.
Data type Wählen Sie den zu streamenden Datentyp aus:
Item values - Datenpunkt-Werte von Zabbix an externe Systeme streamen;
Events - Ereignisse von Zabbix an externe Systeme streamen.
URL Geben Sie die URL des Empfängers ein. Benutzermakros werden unterstützt.
Tag filter Exportieren Sie nur Datenpunkt-Werte oder Ereignisse, die dem Tag-Filter entsprechen. Wenn nichts festgelegt ist, wird alles exportiert.
Es ist möglich, bestimmte Tags und Tag-Werte sowohl einzuschließen als auch auszuschließen. Es können mehrere Bedingungen festgelegt werden. Der Abgleich von Tag-Namen ist immer groß-/kleinschreibungssensitiv.

Für jede Bedingung stehen mehrere Operatoren zur Verfügung:
Exists - die angegebenen Tag-Namen einschließen;
Equals - die angegebenen Tag-Namen und Werte einschließen (groß-/kleinschreibungssensitiv);
Contains - die angegebenen Tag-Namen einschließen, bei denen die Tag-Werte die eingegebene Zeichenfolge enthalten (Teilstring-Abgleich, nicht groß-/kleinschreibungssensitiv);
Does not exist - die angegebenen Tag-Namen ausschließen;
Does not equal - die angegebenen Tag-Namen und Werte ausschließen (groß-/kleinschreibungssensitiv);
Does not contain - die angegebenen Tag-Namen ausschließen, bei denen die Tag-Werte die eingegebene Zeichenfolge enthalten (Teilstring-Abgleich, nicht groß-/kleinschreibungssensitiv).

Für Bedingungen gibt es zwei Berechnungstypen:
And/Or - alle Bedingungen müssen erfüllt sein; Bedingungen mit demselben Tag-Namen werden durch die Oder-Bedingung gruppiert;
Or - es genügt, wenn eine Bedingung erfüllt ist.
Type of information Wählen Sie den Informationstyp (numeric (unsigned), numeric (float), character usw.) aus, nach dem die Datenpunkt-Werte gefiltert werden sollen, die der Connector streamen soll.
Dieses Feld ist verfügbar, wenn Data type auf "Item values" gesetzt ist.
HTTP authentication Wählen Sie die Authentifizierungsoption aus:
None - es wird keine Authentifizierung verwendet;
Basic - Basic-Authentifizierung wird verwendet;
NTLM - NTLM-Authentifizierung (Windows NT LAN Manager) wird verwendet;
Kerberos - Kerberos-Authentifizierung wird verwendet (siehe auch: Configuring Kerberos with Zabbix);
Digest - Digest-Authentifizierung wird verwendet;
Bearer - Bearer-Authentifizierung wird verwendet.
Username Geben Sie den Benutzernamen ein (bis zu 255 Zeichen). Benutzermakros werden unterstützt.
Dieses Feld ist verfügbar, wenn HTTP authentication auf "Basic", "NTLM", "Kerberos" oder "Digest" gesetzt ist.
Password Geben Sie das Benutzerpasswort ein (bis zu 255 Zeichen). Benutzermakros werden unterstützt.
Dieses Feld ist verfügbar, wenn HTTP authentication auf "Basic", "NTLM", "Kerberos" oder "Digest" gesetzt ist.
Bearer token Geben Sie das Bearer-Token ein. Benutzermakros werden unterstützt.
Dieses Feld ist verfügbar und erforderlich, wenn HTTP authentication auf "Bearer" gesetzt ist.
Advanced configuration Klicken Sie auf die Bezeichnung Advanced configuration, um erweiterte Konfigurationsoptionen anzuzeigen (siehe unten).
Max records per message Geben Sie die maximale Anzahl von Werten oder Ereignissen an, die innerhalb einer Nachricht gestreamt werden können.
Concurrent sessions Wählen Sie die Anzahl der Sender-Prozesse aus, die für diesen Connector ausgeführt werden sollen. Es können bis zu 100 Sitzungen angegeben werden; der Standardwert ist "1".
Attempts Anzahl der Versuche zum Streamen von Daten. Es können bis zu 5 Versuche angegeben werden; der Standardwert ist "1".
Attempt interval Geben Sie an, wie lange der Connector nach einem erfolglosen Versuch, Daten zu streamen, warten soll. Es können bis zu 10s angegeben werden; der Standardwert ist "5s".
Dieses Feld ist verfügbar, wenn Attempts auf "2" oder höher gesetzt ist.
Erfolglose Versuche sind solche, bei denen der Verbindungsaufbau fehlgeschlagen ist oder bei denen der HTTP-Antwortcode nicht 200, 201, 202, 203 oder 204 ist. Wiederholungsversuche werden ausgelöst, wenn Kommunikationsfehler auftreten oder wenn der HTTP-Antwortcode nicht 200, 201, 202, 203, 204, 400, 401, 403, 404, 405 oder 415, 422 ist. Weiterleitungen werden verfolgt, daher ist 302 -> 200 eine positive Antwort; 302 -> 503 hingegen löst einen Wiederholungsversuch aus.
Timeout Geben Sie das Nachrichten-Timeout an (1-60 Sekunden, Standard - 5 Sekunden).
Zeitsuffixe werden unterstützt, z. B. 30s, 1m. Benutzermakros werden unterstützt.
HTTP proxy Sie können einen HTTP-Proxy im folgenden Format angeben:
[protocol://][username[:password]@]proxy.example.com[:port]
Benutzermakros werden unterstützt.

Das optionale Präfix protocol:// kann verwendet werden, um alternative Proxy-Protokolle anzugeben (die Unterstützung für Protokollpräfixe wurde in cURL 7.21.7 hinzugefügt). Wenn kein Protokoll angegeben ist, wird der Proxy als HTTP-Proxy behandelt. Standardmäßig wird Port 1080 verwendet.

Wenn HTTP proxy angegeben ist, überschreibt der Proxy proxy-bezogene Umgebungsvariablen wie http_proxy, HTTPS_PROXY. Wenn nichts angegeben ist, überschreibt der Proxy keine proxy-bezogenen Umgebungsvariablen. Der eingegebene Wert wird unverändert weitergegeben; es findet keine Plausibilitätsprüfung statt.
Sie können auch eine SOCKS-Proxy-Adresse eingeben. Wenn Sie das falsche Protokoll angeben, schlägt die Verbindung fehl und der Datenpunkt wird nicht unterstützt.

Beachten Sie, dass mit HTTP-Proxy nur einfache Authentifizierung unterstützt wird.
SSL verify peer Aktivieren Sie das Kontrollkästchen, um das SSL-Zertifikat des Webservers zu überprüfen.
Das Serverzertifikat wird automatisch aus dem systemweiten Speicherort der Zertifizierungsstelle (CA) übernommen. Sie können den Speicherort der CA-Dateien mit dem Konfigurationsparameter SSLCALocation von Zabbix Server oder Proxy überschreiben.
SSL verify host Aktivieren Sie das Kontrollkästchen, um zu überprüfen, ob das Feld Common Name oder das Feld Subject Alternate Name des Webserver-Zertifikats übereinstimmt.
Dadurch wird die cURL-Option CURLOPT_SSL_VERIFYHOST gesetzt.
SSL certificate file Name der SSL-Zertifikatsdatei, die für die Client-Authentifizierung verwendet wird. Die Zertifikatsdatei muss im PEM1-Format vorliegen. Benutzermakros werden unterstützt.
Wenn die Zertifikatsdatei auch den privaten Schlüssel enthält, lassen Sie das Feld SSL key file leer. Wenn der Schlüssel verschlüsselt ist, geben Sie das Passwort im Feld SSL key password an. Das Verzeichnis, das diese Datei enthält, wird durch den Konfigurationsparameter SSLCertLocation von Zabbix Server oder Proxy angegeben.
SSL key file Name der SSL-Datei mit dem privaten Schlüssel, die für die Client-Authentifizierung verwendet wird. Die Datei mit dem privaten Schlüssel muss im PEM1-Format vorliegen. Benutzermakros werden unterstützt.
Das Verzeichnis, das diese Datei enthält, wird durch den Konfigurationsparameter SSLKeyLocation von Zabbix Server oder Proxy angegeben.
SSL key password Passwort der Datei mit dem privaten SSL-Schlüssel. Benutzermakros werden unterstützt.
Description Geben Sie die Beschreibung des Connectors ein.
Enabled Aktivieren Sie das Kontrollkästchen, um den Connector zu aktivieren.

Wenn der Kafka-Connector mit einer durch Kommas getrennten Liste von Bootstrap-Broker-Adressen konfiguriert ist (zum Beispiel Kafka.URL=kafka1.example.com:9093,kafka2.example.com:9093), verbindet sich der Kafka-Client mit dem/den Broker(n), die zuerst antworten, und verwendet deren Cluster-Metadaten. Wenn die Liste Adressen aus verschiedenen Kafka-Clustern enthält, wird nur das Cluster mit der schnellsten Antwort verwendet, und andere Adressen werden als nicht verfügbar protokolliert; infolgedessen können beim Start Warnungen wie die folgende erscheinen, obwohl der Connector verbunden ist:

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

In einigen Umgebungen (private Netzwerke, Container-Netzwerke oder nicht standardmäßige DNS-/Hosts-Konfigurationen) können Hostnamen oder IPs zu Loopback-Adressen (zum Beispiel 127.0.0.1/localhost) aufgelöst oder vom Client normalisiert werden, was solche Warnungen irreführend machen kann. Um Verwirrung zu vermeiden, stellen Sie sicher, dass alle Kafka.URL-Adressen zum selben Kafka-Cluster gehören, überprüfen Sie die DNS-Auflösung vom Connector-Host sowie die advertised.listeners der Broker und bevorzugen Sie Adressen, die zur von den Brokern angekündigten Adresse aufgelöst werden.

Protokoll

Die Kommunikation zwischen dem Server und dem Empfänger erfolgt über HTTP unter Verwendung der REST-API, NDJSON, „Content-Type: application/x-ndjson“.

Weitere Einzelheiten finden Sie unter Newline-delimited JSON export protocol.

Server-Anfrage

Beispiel für das Streamen von Datenpunkt-Werten:

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}

Beispiel für das Streamen von Ereignissen:

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}
Antwort des Empfängers

Die Antwort besteht aus dem HTTP-Antwortstatuscode und der JSON-Nutzlast. Der HTTP-Antwortstatuscode muss für erfolgreich verarbeitete Anfragen "200", "201", "202", "203" oder "204" sein, andere Codes stehen für fehlgeschlagene Anfragen.

Beispiel für einen Erfolg:

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

Beispiel mit Fehlern:

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