Abonnieren von Telemetriedaten mit gNMI
Das gNMI-Protokoll definiert den RPC für das Subscribe
Abonnieren von Telemetriedaten. Der Telemetriecollector verwendet diesen RPC, um Updates für Zustands- und Konfigurationsdaten vom Netzwerkgerät anzufordern.
Anforderungen für neue Abonnements werden in einer SubscribeRequest
Nachricht gekapselt, die einen oder mehrere Ressourcenpfade enthält. Die abonnierten Pfade beziehen sich auf bestimmte Dateninstanzen auf dem Zielnetzwerkgerät. Die Anforderung kann Pfade enthalten, die auf OpenConfig- oder nativen Junos-Schemas basieren.
Die Abonnementanforderung muss außerdem einen der folgenden Modi enthalten:
-
ONCE
- eine einmalige Datenanfrage. -
POLL
- Für den regelmäßigen Abruf von Daten auf Abruf. -
STREAM
- Ein langlebiges Abonnement, das Daten gemäß bestimmten Triggern streamt.
Abonnements im STREAM
Modus müssen einen der folgenden Untermodi angeben:
-
ON_CHANGE
- Datenaktualisierungen werden nur gesendet, wenn sich der Wert des Datenelements ändert. -
SAMPLE
- Datenaktualisierungen werden einmal pro Stichprobenintervall gesendet, basierend auf einem in der Abonnementanforderung angegebenen Intervallzeitraum. Das standardmäßige Abtastintervall beträgt 30 Sekunden. -
TARGET_DEFINED
- Das Netzwerkgerät, das die Abonnementanforderung empfängt, bestimmt die beste Art der Datenübermittlung pro Blatt. Wenn sich der in der Nachricht angegebene Pfad auf ereignisgesteuerte Daten bezieht, kann einON_CHANGE
Abonnement erstellt werden. Für Daten, die Zählerwerte darstellen, kann einSAMPLE
Abonnement erstellt werden.Anmerkung:Die
TARGET_DEFINED
Abonnementanforderungen für Konfigurationspfade werden nur alsON_CHANGE
Anforderungen behandelt.
Für ONCE
und ON_CHANGE
SAMPLE
Abonnements kann der Collector eine erste Aktualisierung anfordern, die den aktuellen Status der Pfade im Abonnement enthält. Dieses Update, das auch als erste Synchronisierung bezeichnet wird, ist aus folgenden Gründen wertvoll:
-
Der Kollektor hat einen vollständigen Überblick über den aktuellen Zustand jedes Feldes auf dem Gerät für diesen Sensorpfad.
-
Ereignisgesteuerte Daten (
ON_CHANGE
) werden vom Collector mindestens einmal empfangen, bevor das nächste Ereignis angezeigt wird. Auf diese Weise ist der Collector über den Datenstatus informiert, bevor das nächste Ereignis eintritt. -
Sensoren der Packet Forwarding Engine, die Null-Zählerwerte enthalten, die normalerweise aufgrund von Nullunterdrückung nicht in gestreamten Daten angezeigt werden, werden gesendet. Dadurch wird sichergestellt, dass alle Felder aus jeder Linecard dem Collector bekannt sind.
Das Zielgerät antwortet auf die Abonnementanforderung mit einer SubscribeResponse
Nachricht. Wenn die Abonnementanforderung eine erste Synchronisierung erfordert, sendet das Ziel die Daten, gefolgt von der Antwortnachricht, wobei das Flag sync_response
auf festgelegt ist true
. Nach der ersten Synchronisierung fährt das Zielgerät mit Updates für die Pfade entsprechend dem Abonnementmodus fort.
Die SubscribeRequest
Nachricht enthält ein Flag mit dem Namen updates_only
. Wenn dieses Flag auf true
gesetzt ist, sendet das Zielgerät keine erste Synchronisierung, sondern nur nachfolgende Aktualisierungen wie folgt:
-
Bei
STREAM
Abonnements imSAMPLE
Modus wird das Update im nächsten Beispielintervall gesendet. -
Bei
STREAM
Abonnements imON_CHANGE
Modus wird das Update bei der nächsten Wertänderung gesendet. -
Bei
ONCE
Abonnements wird nur dasSubscribeResponse
gesendet, wobeisync_response
auf gesetzt istfalse
, und das Abonnement wird geschlossen. -
TARGET_DEFINED
Abonnements werden wieON_CHANGE
Konfigurationspfade behandelt, und das Update wird bei der nächsten Wertänderung gesendet.
Der Inhalt der Meldungen und SubscribeResponse
wird in der SubscribeRequest
Datei gnmi.proto definiert. Weitere Informationen zu den Modi "RPC abonnieren" und "Abonnement" finden Sie in der gNMI-Spezifikation unter: gNEMI-Spezifikation: Abonnieren von Telemetrieupdates.
Für Konfigurationspfade gelten die folgenden Einschränkungen:
-
POLL
Abonnements werden nicht unterstützt. -
Präfixpfade sind in den Aktualisierungsmeldungen nicht enthalten.
-
Die gNMI-Antwort wird für Juniper-spezifische Metadatenoperationen wie
active/inactive
,insert before/after
,comment/annotate
undprotect/unprotect
. Diese werden möglicherweise in der Meldung angezeigt, sind aber ungültig. -
Nicht unterstützte Parameter in den
SubscribeRequest
includesuppress_redundant
-,allow_aggregation
heartbeat_level
-, undqos
. -
Es wird nur die PROTO-Codierung unterstützt.
-
Erweiterungen in
SubscribeRequest
Nachrichten werden nicht unterstützt -
Das Filtern der Abonnementpfade wird nur auf Schlüsselebene unterstützt.
Die folgenden Commit-Varianten werden für
ON_CHANGE
undTARGET_DEFINED
Abonnements nicht unterstützt:commit at
,commit prepare/activate
und Batch-Commits.Commits werden von der
edit dynamic
undedit private
Modi bearbeiten oder konfigurieren.-
Aktualisierungsmeldungen werden nicht für Anwesenheitscontainer gesendet.
-
Bei Abonnementlisten, bei denen der Bezeichner oder Schlüssel das einzige konfigurierte Leaf ist, wird möglicherweise keine Aktualisierungsmeldung angezeigt.
Beispiele
Die folgenden Beispiele zeigen Abonnementanforderungen und -antworten, die von einem gNMI-Client und einem Zielgerät im protobuf-Format gestellt werden.
Beispiel: ONCE-Modus
Das folgende Beispiel zeigt eine Abonnementanforderung, die von einem gNMI-Client im protobuf-Format gesendet wird. Der Abonnementmodus und ONCE
der OpenConfig-Ressourcenpfad lautet /system/aaa/authentication/users:
root@controller:~# /usr/local/bin/gnmic sub -a 10.225.0.0:32767 --mode once --path /system/aaa/authentication/users -u <username> -p <password> --format prototext
Das Ziel antwortet mit einer einmaligen Aktualisierung:
update: { timestamp: 1676294840 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "username" } } val: { string_val: "test1" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } val: { string_val: "$ABC123" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test2" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } }
Beispiel: ON_CHANGE
Das folgende Beispiel zeigt eine Abonnementanforderung im STREAM
Modus mit ON_CHANGE
Untermodus. Der OpenConfig-Ressourcenpfad lautet /system/aaa/authentication/users/user[username="test1"]:
root@controller:~# /usr/local/bin/gnmic sub -a 10.225.0.0:32767 --mode stream --stream-mode on-change --path /system/aaa/authentication/users -u <username> -p <password> --format prototext
Die OpenConfig-Konfiguration zum Zeitpunkt der Abonnementanforderung:
user@root> show configuration openconfig-system:system aaa authentication | display set set openconfig-system:system aaa authentication users user test1 config password $ABC123 set openconfig-system:system aaa authentication users user test1 config role superuser
Die Beispielantwortnachricht zeigt die Werte für die Konfigurationspfade und das sync_response
Flag auf true
:
update: { timestamp: 1676311979 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } val: { string_val: "$ABC123" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } } sync_response: true
Die folgenden Konfigurationsänderungen werden an den abonnierten Pfaden vorgenommen:
-
Fügen Sie einen Benutzernamen für
test1
hinzu. -
Passwort löschen für
test1
.
Das Zielgerät sendet als Antwort das folgende Update:
update: { timestamp: 1676312428 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "username" } } val: { string_val: "test1" } } delete: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } }
Beispiel: SAMPLE
Das folgende Beispiel zeigt eine Abonnementanforderung im STREAM
Modus und SAMPLE
im Untermodus. Der OpenConfig-Ressourcenpfad lautet /system/aaa/authentication/users/user[username="test1"]:
root@controller:~# /usr/local/bin/gnmic sub -a 10.225.0.0:32767 --mode stream --stream-mode sample --sample-interval 5s --path /system/aaa/authentication/users -u <username> -p <password> --format prototext
Die OpenConfig-Konfiguration zum Zeitpunkt der Abonnementanforderung:
user@root> show configuration openconfig-system:system aaa authentication | display set set openconfig-system:system aaa authentication users user test1 config username test1 set openconfig-system:system aaa authentication users user test1 config password "$ABC123" set openconfig-system:system aaa authentication users user test1 config role superuser
Die Beispielantwortnachrichten zeigen eine erste Aktualisierung, die mit dem Flag auf gesendet wird, true
und nachfolgende Aktualisierungen, die sync_response
in 5-Sekunden-Intervallen gesendet werden:
update: { timestamp: 1676295454 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "username" } } val: { string_val: "test1" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } val: { string_val: "$ABC123" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } } sync_response: true update: { timestamp: 1676295459 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "username" } } val: { string_val: "test1" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } val: { string_val: "$ABC123" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } } update: { timestamp: 1676295464 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "username" } } val: { string_val: "test1" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } val: { string_val: "$ABC123" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } }