UNIX ユーティリティによる Junos Telemetry Interface データのデコード
UNIXユーティリティを使用して、ジュニパーネットワークスデバイスからのストリーミングデータであるサーバーまたはコレクター上のJunos Telemetry Interfaceデータをデコードできます。このセクションの例では、ストリーミング データの 1 つのパケットをデコードする方法を示します。
データをデコードするためのコレクターの準備
この例では、次のものが必要です。
UNIX OS と Netcat (nc) ユーティリティー。
プロトコルバッファコンパイラ。
Junos Telemetry Interface プロトコル バッファ ファイル。
この手順では、Ubuntu OS を使用してデータをデコードするようにコレクターを準備する方法を示します。
Netcatユーティリティをインストールします。
sudo apt-get install netcat
プロトコル バッファー コンパイラをインストールします。
sudo apt-get install protobuf-compiler
プロトコルバッファ開発者ライブラリをインストールします。
sudo apt-get install libprotobuf-dev
ライブラリ ファイルがインストールされていることを確認します。
ls /usr/include/google/protobuf/descriptor.proto /usr/include/google/protobuf/descriptor.proto
最新バージョンのJunos Telemetryインターフェイスプロトコルバッファファイルをダウンロードしてインストールします。
Web ブラウザから、ジュニパーネットワークス ページの [すべての Junos プラットフォーム] ソフトウェアのダウンロード URL に移動します。 https://www.juniper.net/support/downloads/。Junos OS プラットフォームの名前とリリース番号を選択したら、[ ツール ] セクションに移動して Junos Telemetry Interface データ モデル ファイル パッケージをダウンロードします。
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
手記:抽出したファイルの場所を必ずメモしてください。
コレクターでのデータのデコード
この手順では、データをキャプチャする方法、生データをデコードする方法、およびプロトコル バッファー ファイルを使用してデータをデコードする方法を示します。
データをデコードするには、次のようにします。
データをキャプチャします。
宛先ストリーミングテレメトリサーバーまたはコレクターで netcat を UDP リスナーモードで実行して、すべての受信データグラムをファイルに格納します。ジュニパーネットワークスデバイスのstreaming-serverプロファイルで構成された宛先ポート番号を使用します。
nc -ul 0.0.0.0 20000 > data.gpb
手記:このコマンドは、データグラムを
data.gpbという名前のファイルに格納します。このプログラムを実行してデータをキャプチャします。データの受信を停止したい場合は、ブレーク信号(Control + C)を送信してプログラムで停止してください生データをデコードします。
手記:この手順は省略可能です。データのエンコードされたメッセージタイプがわかっている場合は、必須ではありません。
data.gpbファイルからメッセージをデコードします。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 } . . .2636の下の次の入れ子構造は、センサーの種類を識別します。2636数値は、telemetry_top.protoファイルで定義されているJuniperNetworksSensorメッセージを識別します。この例では、数値識別子7、logical_port.protoファイルで定義されたLogicalPortメッセージに対応しています。次のステップでこの情報を使用して、より詳細な出力を生成します。メッセージをデコードしてフィールド名を含めます。
プロトコル バッファー コンパイラを decode オプション付きで実行します。さらに、最上位のメッセージ・タイプ (
TelemetryStream) と、メッセージ定義logical_port.protoを持つファイルを指定します。また、Goggle protocol buffers (gpb) ライブラリを含める必要があります。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" } } } } }
コレクターでのJunos Telemetry Interface UDPデータのデコード
コレクターは、受信データを読み取るために、リモートアドレスまたはポートの組み合わせでリスナーを開始する必要があります。受信データは、 telemetry_top.proto ファイルとセンサー proto ファイルを使用してデコードできます。
デコード手順を簡略化するために、コレクターはテレメトリソフトウェアパッケージの一部として出荷されたすべてのプロトファイルをロードして、受信データをデコードできます。
- 管理インターフェイスとWANインターフェイスの両方でストリーミングデータを検証します。ストリーミングサーバープロファイルに適切なアドレスを指定します。
- 列挙型と浮動小数点数は、UDP ストリーミングの文字列としてストリーミングされます。gNMI は同じ形式を使用するため、列挙型は文字列として保持されます。
- float データ型の処理は、将来のリリースを対象としています。
テレメトリ データが UDP 経由でストリーミングされる場合は、データが正しくデコードされ、不明なフィールドがコレクターでデコードされないことを確認します。
以下は、UDP 経由でテレメトリ データをストリーミングしているときに発生するいくつかの問題です。
- 誤ったデコード: 誤ったデコードは、テレメトリ データが UDP 経由で正しくストリーミングされていないことを意味します。次の例では、太字で強調表示されているデータは、データが正しくデコードされなかったことを示しています。この動作は、エンコードが正しくないか、proto ファイルのパッケージが間違っていることが原因です。
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 {以下は、データが正しくデコードされた例です。
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 } } } } } - 不完全なデータ ストリーミング: 不完全なデータのストリーミングは、出力ファイルのデータ検証によって検証する必要があります。