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 diesem:

walk[.1.3.6.1.4.1.9999.1.1.1.1]

Dieser Datenpunkt führt einen einzelnen SNMP-Tabellen-Walk aus und gibt alle Tabelleneinträge in einer Anfrage zurück, 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 aussagekräftigen Namen für die Discovery-Regel ein (z. B. „Sensoren erkennen“).
  • Wählen Sie im Feld Type „Dependent item“ aus.
  • Geben Sie im Feld Key einen aussagekräftigen Schlüssel ein (z. B. „net.if.discovery“).
  • Wählen Sie im Feld Master item „SNMP walk item“ aus.

3. Fügen Sie auf der Registerkarte Preprocessing einen Vorverarbeitungsschritt mit „SNMP walk to JSON“ in der Dropdown-Liste Name mit 3 Parametern hinzu:

  • 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 von Makrosätzen zurück.

Zum Beispiel:

[
    {
        "{#SNMPINDEX}": "1",
        "{#SENSORNAME}": "Temperature Sensor",
        "{#SENSORTYPE}": "temp",
        "{#SENSORVALUE}": "100"
    },
    {
        "{#SNMPINDEX}": "2",
        "{#SENSORNAME}": "Humidity Sensor",
        "{#SENSORTYPE}": "humidity",
        "{#SENSORVALUE}": "200"
    }
]

Jedes Objekt repräsentiert einen erkannten Sensor 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 ist (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).

Zum Beispiel ein abhängiger Datenpunkt für den Sensorwert:

  • Geben Sie im Feld Name „Sensor {#SNMPINDEX}: {#SENSORNAME}“ ein.
  • Wählen Sie im Feld Type „Dependent item“ aus.
  • Geben Sie im Feld Key „sensor.value[{#SNMPINDEX}]“ ein.
  • Wählen Sie im Feld Master item „SNMP walk item“ aus.

Fügen Sie auf der Registerkarte Preprocessing einen Vorverarbeitungsschritt mit dem Namen „SNMP walk value“ hinzu, mit der OID „.1.3.6.1.4.1.9999.1.1.1.1.3.{#SNMPINDEX}“ im Feld Parameter. 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], sensor.value[2] erstellt.

Jeder abhängige Datenpunkt extrahiert seinen Wert per Vorverarbeitung aus dem SNMP-Walk-Ergebnis des Master-Datenpunkts, ohne selbst separate SNMP-Anfragen auszuführen.

5. Referenzieren Sie abhängige Datenpunkt-Prototypen in Auslöser-Prototypen unter Verwendung derselben Makros aus der Discovery-Regel. Beispiel:

{Template_Sensor:sensor.value[{#SNMPINDEX}].last()} > 75

Dadurch wird für jeden erkannten Sensor ein Auslöser erzeugt (zum Beispiel sensor.value[1], sensor.value[2]) und ausgelöst, wenn der letzte Wert (Temperatur oder Luftfeuchtigkeit) 75 überschreitet.

6. Schließen Sie abhängige Datenpunkte für jede erkannte Entität ein. Beispiel für einen Diagramm-Datenpunktschlüssel:

sensor.value[{#SNMPINDEX}]

Für jedes {#SNMPINDEX} wird ein Diagramm erstellt, das Temperatur und Luftfeuchtigkeit im Zeitverlauf darstellt.

Diese Konfiguration führt pro Abfragezyklus nur eine einzige SNMP-Walk-Anfrage aus, unabhängig von der Anzahl der erkannten Datenpunkte. Alle abhängigen Datenpunkte extrahieren ihre Werte per Vorverarbeitung aus dem SNMP-Walk-Ergebnis des Masters, 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.