4 Erkennung von SNMP-OIDs
Übersicht
In diesem Abschnitt führen wir eine Low-Level-Discovery auf einem SNMP-Gerät durch.
Diese Erkennungsmethode für SNMP-OIDs wird seit Zabbix Server/Proxy 6.4 unterstützt.
Beispielkonfiguration
1. Erstellen Sie einen SNMP-Agent-Datenpunkt mit einem Schlüssel wie:
walk[.1.3.6.1.4.1.9999.1.1.1.1]

Dieser Datenpunkt führt einen einzelnen SNMP-Tabellen-Walk durch und gibt alle Tabelleneinträge in einer Anfrage zurück, und zwar in einem Format, das der Ausgabe des Dienstprogramms snmpwalk mit den Formatierungsoptionen -Oe -Ot -On entspricht.
Er gibt den folgenden mehrzeiligen Textwert zurück:
.1.3.6.1.4.1.9999.1.1.1.1.1.1 = STRING: "Temperature Sensor"
.1.3.6.1.4.1.9999.1.1.1.1.2.1 = STRING: "temp"
.1.3.6.1.4.1.9999.1.1.1.1.3.1 = 100
.1.3.6.1.4.1.9999.1.1.1.1.1.2 = STRING: "Humidity Sensor"
.1.3.6.1.4.1.9999.1.1.1.1.2.2 = STRING: "humidity"
.1.3.6.1.4.1.9999.1.1.1.1.3.2 = 200
2. Erstellen Sie eine Discovery-Regel:
- Geben Sie im Feld Name einen beschreibenden Namen für die Discovery-Regel ein (z. B. „Sensoren erkennen“).
- Wählen Sie im Feld Type die Option „Dependent item“ aus.
- Geben Sie im Feld Key einen beschreibenden Schlüssel ein (z. B. „net.if.discovery“).
- Wählen Sie im Feld Master item den „SNMP walk item“ aus.

3. Fügen Sie auf der Registerkarte Preprocessing einen Vorverarbeitungsschritt hinzu. Wählen Sie im Dropdown-Feld Name die Option „SNMP walk to JSON“ mit 3 Parametern aus:
- Field name: „{#SENSORNAME}“; OID prefix: „.1.3.6.1.4.1.9999.1.1.1.1.1“; Format: „Unchanged“.
- Field name: „{#SENSORTYPE}“; OID prefix: „.1.3.6.1.4.1.9999.1.1.1.1.2“; Format: „Unchanged“.
- Field name: „{#SENSORVALUE}“; OID prefix: „.1.3.6.1.4.1.9999.1.1.1.1.3“; Format: „Unchanged“.
Nach der Vorverarbeitung gibt die Discovery-Regel ein JSON-Array mit Makrosätzen zurück.
Beispiel:
[
{
"{#SNMPINDEX}": "1",
"{#SENSORNAME}": "Temperature Sensor",
"{#SENSORTYPE}": "temp",
"{#SENSORVALUE}": "100"
},
{
"{#SNMPINDEX}": "2",
"{#SENSORNAME}": "Humidity Sensor",
"{#SENSORTYPE}": "humidity",
"{#SENSORVALUE}": "200"
}
]
Jedes Objekt stellt einen erkannten Sensor dar und stellt Makros wie {#SNMPINDEX}, {#SENSORNAME}, {#SENSORTYPE} und {#SENSORVALUE} bereit.
Sie werden nach dem SNMP-Index gruppiert, der das numerische Suffix am Ende jeder OID darstellt (z. B. .1, .2). Dieser Index identifiziert jede Zeile in der SNMP-Tabelle eindeutig und wird automatisch als {#SNMPINDEX} extrahiert.
4. Erstellen Sie unter der Discovery-Regel einen oder mehrere Datenpunkt-Prototypen (mit der Discovery-Regel als Master-Datenpunkt).
Beispiel für einen abhängigen Datenpunkt für den Sensorwert:
- Geben Sie im Feld Name „Sensor {#SNMPINDEX}: {#SENSORNAME}“ ein.
- Wählen Sie im Feld Type die Option „Dependent item“ aus.
- Geben Sie im Feld Key „sensor.value[{#SNMPINDEX}]“ ein.
- Wählen Sie im Feld Master item den „SNMP walk item“ aus.

Fügen Sie auf der Registerkarte Preprocessing einen Vorverarbeitungsschritt mit dem Namen „SNMP walk value“ hinzu. Geben Sie im Feld Parameter die OID „.1.3.6.1.4.1.9999.1.1.1.1.3.{#SNMPINDEX}“ ein.
Format: „Unchanged“.
Die folgenden Datenpunkte werden erkannt:
| Name | Key | OID, aus der der Wert extrahiert wird | Datenpunktwert |
|---|---|---|---|
| Sensor 1: Temperature Sensor | sensor.value[1] | .1.3.6.1.4.1.9999.1.1.1.1.3.1 | 100 |
| Sensor 2: Humidity Sensor | sensor.value[2] | .1.3.6.1.4.1.9999.1.1.1.1.3.2 | 200 |
Wenn die Discovery-Regel ausgeführt wird, werden Datenpunkte wie sensor.value[1] und sensor.value[2] erstellt.
Jeder abhängige Datenpunkt extrahiert seinen Wert mithilfe der Vorverarbeitung aus dem SNMP-Walk-Ergebnis des Master-Datenpunkts, ohne selbst separate SNMP-Anfragen durchzuführen.
5. Referenzieren Sie abhängige Datenpunkt-Prototypen in Auslöser-Prototypen und verwenden Sie dabei dieselben Makros aus der Discovery-Regel.
Beispiel:
{Template_Sensor:sensor.value[{#SNMPINDEX}].last()} > 75
Dadurch wird für jeden erkannten Sensor ein Auslöser erstellt (z. B. sensor.value[1], sensor.value[2]), der ausgelöst wird, wenn der aktuelle Wert (Temperatur oder Luftfeuchtigkeit) 75 überschreitet.
6. Fügen Sie abhängige Datenpunkte für jede erkannte Entität ein.
Beispiel für einen Diagramm-Datenschlüssel:
sensor.value[{#SNMPINDEX}]
Für jeden {#SNMPINDEX} wird ein Diagramm erstellt, in dem Temperatur und Luftfeuchtigkeit über die Zeit dargestellt werden.
Diese Konfiguration führt pro Abfragezyklus unabhängig von der Anzahl der erkannten Datenpunkte nur eine einzige SNMP-Walk-Anfrage durch.
Alle abhängigen Datenpunkte extrahieren ihre Werte mithilfe der Vorverarbeitung aus dem Master-SNMP-Walk-Ergebnis, wodurch SNMP-Datenverkehr und Last erheblich reduziert werden.
Dynamische Indizes mit walk[]
Dynamische Indizes (zum Beispiel Schnittstellenindizes) können sich ändern, wenn Hardware neu konfiguriert wird. Um dieses Verhalten zu berücksichtigen, wird eine Master-SNMP-Walk-Erkennungsregel mit einem Schlüssel wie diesem erstellt:
walk[1.3.6.1.2.1.2.2.1.10]
Nach der Vorverarbeitung „SNMP walk to JSON“ könnte das Ergebnis wie folgt aussehen:
[
{
"{#SNMPINDEX}": "2",
"{#VALUE}": "123456"
},
{
"{#SNMPINDEX}": "3",
"{#VALUE}": "654321"
}
]
Ein Prototyp für einen abhängigen Datenpunkt verwendet das Makro {#SNMPINDEX}, um den Schlüssel zu erstellen:
net.if.in[{#SNMPINDEX}]
Die Vorverarbeitung für diesen Prototyp umfasst den Namen „SNMP walk value“ mit der OID „1.3.6.1.2.1.2.2.1.10.{#SNMPINDEX}“ im Feld Parameter. Format: „Unchanged“.
Zur Laufzeit werden tatsächliche Datenpunkte wie net.if.in[2] und net.if.in[3] erstellt.
Wenn sich ein bestimmter Schnittstellenindex ändert (zum Beispiel wenn der Index 2 in der SNMP-Tabelle durch 5 ersetzt wird), dann gilt beim nächsten Lauf der Erkennungsregel:
- Der alte abhängige Datenpunkt net.if.in[2] wird als „lost“ markiert oder entfernt, und für diesen Datenpunkt werden keine neuen Daten mehr erfasst.
- Ein neuer abhängiger Datenpunkt net.if.in[5] wird erstellt und beginnt mit einer leeren Historie.
- Verlaufsdaten von net.if.in[2] werden nicht automatisch nach net.if.in[5] verschoben.
Beispiel für einen Auslöser-Prototyp:
{Template_Interface:net.if.in[{#SNMPINDEX}].last()} > 1000000000
Ein Beispiel für einen Graph-Prototyp enthält folgende Datenpunkte:
net.if.in[{#SNMPINDEX}]
net.if.out[{#SNMPINDEX}]
Diese Konfiguration gewährleistet eine zuverlässige Überwachung von Tabellen mit dynamischen Indizes und minimiert gleichzeitig den SNMP-Datenverkehr — pro Abfragezyklus ist nur ein einziger SNMP-Walk erforderlich, wobei die Prototypen abhängiger Datenpunkte die benötigten Werte extrahieren.
Erkannte Entitäten
Wenn der Server läuft, erstellt er reale abhängige Datenpunkte, Auslöser und Diagramme basierend auf den Werten, die die SNMP-Erkennungsregel zurückgibt.