UNIX 유틸리티를 사용하여 Junos Telemetry Interface 데이터 디코딩
UNIX 유틸리티를 사용하여 주니퍼 네트웍스 디바이스에서 데이터를 스트리밍하는 서버 또는 컬렉터에서 Junos Telemetry Interface 데이터를 디코딩할 수 있습니다. 이 섹션의 예제에서는 스트리밍된 데이터의 단일 패킷을 디코딩하는 방법을 보여 줍니다.
데이터 디코딩을 위한 수집기 준비
이 예에는 다음이 필요합니다.
Netcat(nc) 유틸리티가 있는 UNIX OS.
프로토콜 버퍼 컴파일러.
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 Interface 프로토콜 버퍼 파일을 다운로드하여 설치합니다.
웹 브라우저에서 주니퍼 네트웍스 페이지의 All Junos Platforms software download 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
메모:추출된 파일의 위치를 기록해 두십시오.
수집기에서 데이터 디코딩
이 절차에서는 데이터를 캡처하고, 원시 데이터를 디코딩하고, 프로토콜 버퍼 파일을 사용하여 데이터를 디코딩하는 방법을 보여줍니다.
데이터를 디코딩하려면 다음을 수행합니다.
데이터를 캡처합니다.
UDP 수신기 모드의 대상 스트리밍 텔레메트리 서버 또는 수집기에서 netcat을 실행하여 들어오는 모든 데이터그램을 파일에 저장합니다. 주니퍼 네트웍스 디바이스의 스트리밍 서버 프로필에 구성된 대상 포트 번호를 사용합니다.
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는 파일에 정의된 메시지에 해당LogicalPort합니다logical_port.proto. 다음 단계에서 이 정보를 사용하여 더 자세한 출력을 생성합니다.필드 이름을 포함하도록 메시지를 디코딩합니다.
프로토콜 버퍼 컴파일러를 디코딩 옵션으로 실행합니다. 또한 최상위 메시지 유형(
TelemetryStream) 및 메시지 정의logical_port.proto가 있는 파일을 지정합니다. 고글 프로토콜 버퍼(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 및 sensor proto 파일을 사용하여 디코딩할 수 있습니다.
디코딩 절차를 단순화하기 위해 수집기는 Telemetry Software 패키지의 일부로 제공된 모든 proto 파일을 로드하여 수신 데이터를 디코딩할 수 있습니다.
- 관리 인터페이스와 WAN 인터페이스 모두에서 스트리밍 데이터를 확인합니다. 스트리밍 서버 프로파일에서 적절한 주소를 지정합니다.
- 열거형과 float는 UDP 스트리밍을 위한 문자열로 스트리밍됩니다. 열거형은 gNMI가 동일한 형식을 사용하므로 문자열로 유지됩니다.
- float 데이터 형식의 처리는 향후 릴리스에 맞게 범위가 지정됩니다.
원격 분석 데이터가 UDP를 통해 스트리밍되는 경우 데이터가 올바르게 디코딩되고 알 수 없는 필드가 수집기에서 디코딩되지 않는지 확인합니다.
다음은 UDP를 통해 텔레메트리 데이터를 스트리밍하는 동안 관찰된 몇 가지 문제입니다.
- 잘못된 디코딩: 잘못된 디코딩은 원격 분석 데이터가 UDP를 통해 올바르게 스트리밍되지 않음을 의미합니다. 다음 예제에서 굵게 강조 표시된 데이터는 데이터가 올바르게 디코딩되지 않았음을 나타냅니다. 이 동작은 잘못된 인코딩 또는 잘못된 프로토 파일 패키징 때문입니다.
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 } } } } } - 불완전한 데이터 스트리밍: 불완전한 데이터의 스트리밍은 출력 파일의 데이터 유효성 검사를 통해 확인해야 합니다.