Dekodieren von Junos Telemetry Interface-Daten mit UNIX-Dienstprogrammen
Sie können UNIX-Dienstprogramme verwenden, um Junos Telemetry Interface-Daten auf einem Server oder Collector zu decodieren, der Daten von einem Gerät von Juniper Networks streamt. Das Beispiel in diesem Abschnitt zeigt, wie Sie ein einzelnes Paket mit gestreamten Daten decodieren.
Vorbereiten des Kollektors zum Dekodieren von Daten
Für dieses Beispiel ist Folgendes erforderlich:
UNIX-Betriebssystem mit dem Dienstprogramm Netcat (nc).
Protokollpuffer-Compiler.
Das Junos Telemetry Interface-Protokoll puffert Dateien.
In diesem Verfahren wird gezeigt, wie der Kollektor für die Decodierung von Daten mit dem Ubuntu-Betriebssystem vorbereitet wird.
Installieren Sie das Netcat-Dienstprogramm.
sudo apt-get install netcat
Installieren Sie den Protokollpuffer-Compiler.
sudo apt-get install protobuf-compiler
Installieren Sie die Entwicklerbibliothek für Protokollpuffer.
sudo apt-get install libprotobuf-dev
Vergewissern Sie sich, dass die Bibliotheksdateien installiert sind.
ls /usr/include/google/protobuf/descriptor.proto /usr/include/google/protobuf/descriptor.proto
Laden Sie die neueste Version der Protokollpufferdateien der Junos Telemetry-Schnittstelle herunter und installieren Sie sie.
Navigieren Sie in einem Webbrowser auf der Juniper Networks Seite zur Download-URL für alle Junos-Plattformen: https://www.juniper.net/support/downloads/. Nachdem Sie den Namen der Junos OS-Plattform und die Versionsnummer ausgewählt haben, wechseln Sie zum Abschnitt "Tools ", und laden Sie das Paket "Junos Telemetry Interface Data Model Files " herunter.
tar –xvzf junos-telemetry-interface-15.1F6.9.tgz junos-telemetry-interface/telemetry_top.proto junos-telemetry-interface/logical_port.proto junos-telemetry-interface/lsp_mon.proto junos-telemetry-interface/firewall.proto junos-telemetry-interface/lsp_stats.proto junos-telemetry-interface/port.proto junos-telemetry-interface/NOTICE junos-telemetry-interface/license.txt
Anmerkung:Notieren Sie sich den Speicherort der extrahierten Dateien.
Dekodieren von Daten auf dem Kollektor
In diesem Verfahren wird gezeigt, wie Sie Daten erfassen, Rohdaten decodieren und die Protokollpufferdateien zum Decodieren von Daten verwenden.
So decodieren Sie Daten:
Erfassen Sie die Daten.
Führen Sie netcat auf einem Ziel-Streamingtelemetrieserver oder -collector im UDP-Listenermodus aus, um alle eingehenden Datagramme in einer Datei zu speichern. Verwenden Sie die Zielportnummer, die Sie im Streaming-Server-Profil auf Ihrem Juniper Networks-Gerät konfiguriert haben.
nc -ul 0.0.0.0 20000 > data.gpb
Anmerkung:Mit diesem Befehl werden Datagramme in einer Datei mit dem Namen
data.gpbgespeichert. Führen Sie dieses Programm aus, um Daten zu erfassen. Wenn Sie den Empfang von Daten beenden möchten, stoppen Sie mit dem Programm, indem Sie das Unterbrechungssignal (Control + C) sendenDekodieren Sie Rohdaten.
Anmerkung:Dieser Schritt ist optional. Sie ist nicht erforderlich, wenn Sie den codierten Nachrichtentyp der Daten kennen.
Decodieren Sie die Nachricht aus der
data.gpbDatei.protoc --decode_raw < ../data.gpb 1: "hillrock:160.1.1.25" 2: 0 4: "S1:/junos/system/linecard/interface/logical/usage/:/junos/system/linecard/interface/logical/usage/:PFE" 5: 65265 6: 1477686534474 7: 1 8: 1 101 { 2636 { 7 { 1 { 1: "et-0/0/4:2.32767" 2: 1477642750 3: 813 4 { 12: 0x37363732332e3165 } . . .Die nächste verschachtelte Struktur unter
2636identifiziert den Sensortyp. Der numerische Wert2636identifiziert die Nachricht, dieJuniperNetworksSensorin dertelemetry_top.protoDatei definiert ist. In diesem Beispiel entspricht die numerische Kennung7derLogicalPortin derlogical_port.protoDatei definierten Nachricht. Verwenden Sie diese Informationen im nächsten Schritt, um eine detailliertere Ausgabe zu generieren.Decodieren Sie die Nachricht, um Feldnamen einzuschließen.
Führen Sie den Protokollpuffer-Compiler mit der decode-Option aus. Geben Sie außerdem den Nachrichtentyp der obersten Ebene (
TelemetryStream) und die Datei mit der Nachrichtendefinition an.logical_port.protoSie müssen auch die Goggle Protocol Buffers (gpb)-Bibliothek einschließen.protoc --decode TelemetryStream logical_port.proto -I /usr/include -I . < data.gpb system_id: "hillrock:160.1.1.25" component_id: 0 sensor_name: "S1:/junos/system/linecard/interface/logical/usage/:/junos/system/linecard/interface/logical/usage/:PFE" sequence_number: 65268 timestamp: 1477686536484 version_major: 1 version_minor: 1 enterprise { [juniperNetworks] { [jnprLogicalInterfaceExt] { interface_info { if_name: "et-0/0/4:2.32767" init_time: 1477642750 snmp_if_index: 813 parent_ae_name: "ae1.32767" ingress_stats { if_packets: 0 if_octets: 0 } egress_stats { if_packets: 0 if_octets: 0 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/7:3.0" init_time: 1477642750 snmp_if_index: 520 parent_ae_name: "ae0.0" ingress_stats { if_packets: 61203309 if_octets: 6487548454 } egress_stats { if_packets: 87416547 if_octets: 9266153982 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.0" init_time: 1477642750 snmp_if_index: 2512 ingress_stats { if_packets: 26266247 if_octets: 2784214806 } egress_stats { if_packets: 26247215 if_octets: 2781829290 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.1" init_time: 1477642750 snmp_if_index: 2522 ingress_stats { if_packets: 26266249 if_octets: 2784214972 } egress_stats { if_packets: 26249115 if_octets: 2781935590 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.2" init_time: 1477642750 snmp_if_index: 2523 ingress_stats { if_packets: 26266248 if_octets: 2784214912 } egress_stats { if_packets: 26249106 if_octets: 2781935086 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.3" init_time: 1477642750 snmp_if_index: 2524 ingress_stats { if_packets: 26266248 if_octets: 2784214820 } egress_stats { if_packets: 26248520 if_octets: 2781902320 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.4" init_time: 1477642750 snmp_if_index: 2525 ingress_stats { if_packets: 26266247 if_octets: 2784214760 } egress_stats { if_packets: 26247302 if_octets: 2781834112 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.5" init_time: 1477642750 snmp_if_index: 2526 ingress_stats { if_packets: 26266247 if_octets: 2784214760 } egress_stats { if_packets: 26247209 if_octets: 2781828904 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.6" init_time: 1477642750 snmp_if_index: 2527 ingress_stats { if_packets: 26266248 if_octets: 2784214820 } egress_stats { if_packets: 26247196 if_octets: 2781828226 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.7" init_time: 1477642750 snmp_if_index: 2528 ingress_stats { if_packets: 26266247 if_octets: 2784214760 } egress_stats { if_packets: 26247203 if_octets: 2781828618 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.8" init_time: 1477642750 snmp_if_index: 2529 ingress_stats { if_packets: 26266247 if_octets: 2784214760 } egress_stats { if_packets: 26247225 if_octets: 2781829850 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.9" init_time: 1477642750 snmp_if_index: 2530 ingress_stats { if_packets: 26266247 if_octets: 2784214760 } egress_stats { if_packets: 26247209 if_octets: 2781828954 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.32767" init_time: 1477642750 snmp_if_index: 648 ingress_stats { if_packets: 4 if_octets: 240 } egress_stats { if_packets: 0 if_octets: 0 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/4:2.32767" init_time: 1477642750 snmp_if_index: 813 parent_ae_name: "ae1.32767" ingress_stats { if_packets: 0 if_octets: 0 } egress_stats { if_packets: 0 if_octets: 0 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/7:3.0" init_time: 1477642750 snmp_if_index: 520 parent_ae_name: "ae0.0" ingress_stats { if_packets: 61206122 if_octets: 6487846632 } egress_stats { if_packets: 87420567 if_octets: 9266580102 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.0" init_time: 1477642750 snmp_if_index: 2512 ingress_stats { if_packets: 26267458 if_octets: 2784343172 } egress_stats { if_packets: 26248420 if_octets: 2781957020 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.1" init_time: 1477642750 snmp_if_index: 2522 ingress_stats { if_packets: 26267460 if_octets: 2784343338 } egress_stats { if_packets: 26250320 if_octets: 2782063320 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.2" init_time: 1477642750 snmp_if_index: 2523 ingress_stats { if_packets: 26267459 if_octets: 2784343278 } egress_stats { if_packets: 26250311 if_octets: 2782062816 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.3" init_time: 1477642750 snmp_if_index: 2524 ingress_stats { if_packets: 26267460 if_octets: 2784343292 } egress_stats { if_packets: 26249725 if_octets: 2782030050 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.4" init_time: 1477642750 snmp_if_index: 2525 ingress_stats { if_packets: 26267459 if_octets: 2784343232 } egress_stats { if_packets: 26248507 if_octets: 2781961842 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.5" init_time: 1477642750 snmp_if_index: 2526 ingress_stats { if_packets: 26267459 if_octets: 2784343232 } egress_stats { if_packets: 26248414 if_octets: 2781956634 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.6" init_time: 1477642750 snmp_if_index: 2527 ingress_stats { if_packets: 26267460 if_octets: 2784343292 } egress_stats { if_packets: 26248401 if_octets: 2781955956 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.7" init_time: 1477642750 snmp_if_index: 2528 ingress_stats { if_packets: 26267459 if_octets: 2784343232 } egress_stats { if_packets: 26248408 if_octets: 2781956348 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.8" init_time: 1477642750 snmp_if_index: 2529 ingress_stats { if_packets: 26267459 if_octets: 2784343232 } egress_stats { if_packets: 26248430 if_octets: 2781957580 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.9" init_time: 1477642750 snmp_if_index: 2530 ingress_stats { if_packets: 26267459 if_octets: 2784343232 } egress_stats { if_packets: 26248414 if_octets: 2781956684 } op_state { operational_status: "up" } } interface_info { if_name: "et-0/0/13:0.32767" init_time: 1477642750 snmp_if_index: 648 ingress_stats { if_packets: 4 if_octets: 240 } egress_stats { if_packets: 0 if_octets: 0 } op_state { operational_status: "up" } } } } }
Dekodierung von UDP-Daten der Junos Telemetry Interface am Kollektor
Der Collector muss einen Listener auf der Remoteadresse oder Portkombination starten, um die eingehenden Daten zu lesen. Die eingehenden Daten können mit Hilfe der telemetry_top.proto- und der Sensor-proto-Dateien dekodiert werden.
Um das Dekodierungsverfahren zu vereinfachen, können die Collectors alle Proto-Dateien laden, die als Teil des Telemetriesoftwarepakets ausgeliefert werden, um die eingehenden Daten zu dekodieren.
- Überprüfen Sie Streaming-Daten sowohl auf Management- als auch auf WAN-Schnittstellen. Geben Sie die entsprechende Adresse im Streamingserverprofil an.
- Enumerationen und Gleitkommazahlen werden als Zeichenfolgen für das UDP-Streaming gestreamt. Enumerationen werden als Zeichenfolgen beibehalten, da gNMI das gleiche Format verwendet.
- Die Behandlung des Gleitkomma-Datentyps ist für eine zukünftige Version vorgesehen.
Wenn Telemetriedaten über UDP gestreamt werden, stellen Sie sicher, dass die Daten korrekt decodiert werden und unbekannte Felder nicht am Kollektor decodiert werden.
Im Folgenden sind einige Probleme aufgeführt, die beim Streamen von Telemetriedaten über UDP beobachtet werden:
- Falsche Decodierung: Eine falsche Decodierung bedeutet, dass Telemetriedaten nicht korrekt über UDP gestreamt werden. Im folgenden Beispiel geben die fett hervorgehobenen Daten an, dass die Daten nicht ordnungsgemäß decodiert wurden. Dieses Verhalten ist entweder auf eine falsche Codierung oder eine falsche Paketierung der Proto-Datei zurückzuführen.
system_id: "r02.dtw01.icn" component_id: 65535 sensor_name: "mpls:/network-instances/network-instance/mpls:/network-instances/network-instance/mpls:rpd" sequence_number: 2421 timestamp: 1715024560793 version_major: 1 version_minor: 0 enterprise: { [juniperNetworks]: { [jnpr_network_instances_rsvp_ext]: { network_instance: { name: "master" mpls: { 153 { 151 { 152{ 151{ 51: "r02.dtw01.icn-r01.bos02.icn-01" 152{ 151{ 51: "AUTO" 52: 0 53: 12873154 } 152{ 151{ 51:1 52:200000 53: 0 54: 300 55: 1 61: 1549061 } 152 {Nachfolgend sehen Sie ein Beispiel für die korrekte Dekodierung der Daten:
system_id: "r0-RE0" component_id: 65535 sub_component_id: 0 sensor_name: "test_chassisd:/network-instances/:/network-instances/:rpd" sequence_number: 0 timestamp: 1719126223900 version_major: 1 version_minor: 0 enterprise { [juniperNetworks] { [jnpr_network_instances_ni_226_ext] { network_instance { name: "DEFAULT" protocols { protocol { identifier: "STATIC" name: "DEFAULT" static_routes { static { prefix: "10.0.0.0/8" state { prefix: "10.0.0.0/8" set_tag: "0" } next_hops { next_hop { index: "1" state { index: "1" next_hop: "10.220.127.254" metric: 0 recurse: false } interface_ref { state { interface: "re0:mgmt-0" subinterface: 0 } } } } } - Unvollständiges Datenstreaming: Das Streaming unvollständiger Daten muss durch Datenvalidierung in der Ausgabedatei überprüft werden.