建立拨出遥测连接
使用此过程建立拨出遥测连接。根据要从 Junos 设备收集的传感器信息,配置 gRPC 服务、流服务器配置文件、传感器配置文件、导出配置文件和数据收集器。
在拨出模式下,瞻博网络设备启动与外部遥测收集器的连接,并流式传输遥测数据。当需要集中管理遥测数据时,此方法是首选,因为设备将数据推送到收集器,而不需要收集器启动连接。
-
确保瞻博网络设备运行的兼容 Junos OS 版本支持 Junos 遥测。
-
设置与所选传输协议(UDP 或 TCP)兼容的遥测收集器(例如,瞻博网络遥测收集器、Prometheus 或 InfluxDB)。
-
确保瞻博网络设备与收集器之间的网络连接(例如,用于 gRPC 的 TCP 端口 50051 或用于 UDP 的自定义端口)。
-
如果将 TLS 与 gRPC 配合使用,请为设备和收集器准备证书。
注意:在 Junos OS 25.4R1 版本之前,TLS 选项是在层次结构下edit system services extension-service request-response grpc ssl配置的。从 Junos OS 25.4R1 版开始,使用公钥基础架构 (PKI) 命令加载本地证书和证书颁发机构 (证书颁发机构) 配置文件,请参阅 配置流式传输服务器配置文件。 -
有关支持的传感器,请参阅 Junos YANG 数据模型浏览器 (在 Junos OS 23.2R2-S2 版中引入)或 Junos 遥测传感器浏览器 (适用于 20.2R1 至 23.1R1 版)。
-
对于通过 TCP 连接拨出,请配置 IP 地址和路由实例,请参阅 为通过 TCP 连接拨出配置 gRPC 服务。
-
拨出遥测的类型:
Junos 遥测支持三种类型的拨出连接。每种连接类型使用不同的消息格式,并具有特定的解码要求。要配置
dialout-type,请参阅 配置导出配置文件。表 1:拨出遥测的类型 拨出类型 使用 CLI 选项进行配置 消息格式 数据模型 解码要求 传输协议 订阅类型 通过 UDP 拨出(Protobuf 紧凑格式,瞻博网络专用) native-udp-compactprotobuf (.gpb) 格式的传感器数据。Protobuf 消息采用紧凑形式。 Junos 原生和 OpenConfig 模型。 使用 Junos 特定实用程序、 遥测_top.proto 和传感器原型文件进行解码。 UDP 流 通过 UDP 拨出(Protobuf 结构化格式) native-udp-gpbProtobuf 消息采用结构化的自描述键值对。 所有数据模型 消息包含完整的键名和值对信息,因此收集器不需要数据模型来处理或使用遥测数据。消息结构在 jnx_gnmi_over_udp.proto 文件中定义。 UDP 带 SAMPLE 模式的流 通过 TCP 拨出(Protobuf 结构化格式) native-grpc-gpbProtobuf 消息采用结构化通用键/值格式。 所有数据模型 使用 gnmi.proto 和 GnmiJuniperTelemetryHeader.proto 进行解码。 TCP 流 注意:从版本 25.4 开始,层次结构下的[edit services analytics export-profile name]和formattransportoptions 将被弃用。-
Protobuf 紧凑格式:
此格式被视为“紧凑”格式,因为它不包含详细的键值表示形式。但是,您必须下载最新版本的 protobuf 文件才能解码遥测数据。
-
Protobuf 结构化格式:
这种格式在 Protobuf 消息中使用自描述的键值对。每条消息都包含完整的传感器数据名称和值,即使没有数据模型文件,罐头收集器也可以处理传感器数据。
-
配置传感器以监视特定的系统资源。每个传感器配置需要三个主要组件:
-
流服务器配置文件 — 指定用于收集数据和相关参数的服务器,包括目标 IP 地址和端口号。开始之前,配置从瞻博网络设备到使用带内管理接口的服务器的连接。
-
传感器配置文件 — 允许监控系统资源,并使您能够设置相关参数,例如用于接收数据的目标服务器。
-
导出配置文件 - 指定用于导出收集数据的属性。
建议在配置传感器配置文件之前,至少配置一个导出配置文件和至少一个流式处理服务器。然后,可以将导出配置文件和流式处理服务器与传感器配置文件配置相关联。
要启用统计信息导出,请在 [] 层次结构级别包括 export-profile and sensoredit services analytics语句。传感器配置必须包括收集器的名称、导出配置文件的名称和资源路径。
资源路径示例:/interfaces/interface[name='fxp0']。
为通过 UDP 拨出配置导出配置文件时,导出配置文件参数(如 {'dscp'、'forwarding-class'、'payload-size'})不适用。配置这些选项中的任何一个都会产生错误。
请按照下面列出的过程建立拨出遥测连接:
配置流式处理服务器配置文件
服务器配置文件定义收集导出遥测数据的服务器的参数。您可以定义多个服务器配置文件。您还可以将同一服务器配置文件与多个传感器配置文件相关联。您可以将多个服务器与特定传感器相关联。
通过 UDP 流遥测数据的准则:
- 遥测数据通过 UDP 直接从源应用流传输到收集器。配置取决于与收集器的连接类型。收集器必须能够通过管理接口或 WAN 接口访问。
- 对于线卡传感器,如果可通过 WAN 接口访问远程地址,则线卡可以将数据直接导出到收集器。如果必须通过线卡传感器的管理接口导出遥测数据,请将数据路由到路由引擎,然后将其发送到收集器。
要定义流式处理服务器的配置文件以收集导出的遥测数据,请执行以下操作:
配置传感器配置文件
传感器配置文件定义用于监视和流式传输数据的系统资源的参数。您只能为每个传感器配置文件启用一个系统资源进行监控。为要监控的每个系统资源配置不同的传感器配置文件。但是,您可以配置多个传感器来监视同一系统资源。例如,请考虑配置不同的参数以从同一系统资源导出数据。
要配置传感器配置文件:
配置导出配置文件
导出配置文件定义通过 Junos 遥测机制生成的数据的导出过程参数。您必须至少配置一个导出配置文件,也可以配置多个导出配置文件。每个导出配置文件都可以与多个传感器配置文件相关联。但是,您只能将一个导出配置文件与特定传感器配置文件相关联。
特定于平台的 导出配置文件 行为
使用 功能资源管理器 确认平台和版本对特定功能的支持。
使用下表查看平台的特定于平台的行为:
| 平台 |
差异 |
|---|---|
| MX 系列 |
在 MX 系列路由器上,您可以为导出配置文件指定丢包优先级。因此,您可以为每个传感器应用适当的丢包优先级。丢失优先级设置有助于确定在拥塞期间从网络中丢弃哪些数据包。以前,您只能在导出配置文件中指定转发类和 DSCP 值。支持以下数据包丢弃优先级设置: |
要配置导出配置文件:
配置数据收集器
验证 Junos 遥测接口传感器配置
选择传感器路径
传感器浏览器和传感器路径选择指南
使用瞻博网络 Junos YANG 数据模型浏览器 查看所有受支持的资源路径、它们的相应分叶以及支持这些资源的设备平台。
若要搜索和查看其他遥测传感器以及有关某些旧传感器的特定信息,请参阅 旧传感器路径。
有关配置传感器路径的指南和最佳实践的信息,请参阅 浏览传感器路径。
使用 UNIX 公用事业解码 Junos 遥测接口数据
您可以使用 UNIX 实用程序对服务器或收集器上的Junos 遥测接口数据进行解码,该服务器或收集器正在从 瞻博网络 设备流式传输数据。本部分中的示例说明如何解码单个流数据包。
准备收集器以解码数据
此示例需要以下内容:
-
带有 Netcat (nc) 实用程序的 UNIX 操作系统。
-
协议缓冲区编译器。
-
Junos 遥测接口协议缓冲区文件。
此过程说明如何准备收集器以使用 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 遥测接口协议缓冲区文件。
从 Web 浏览器中,导航到瞻博网络页面上的所有Junos平台软件下载 URL: https://www.juniper.net/support/downloads/。选择 Junos OS 平台的名称和版本号后,请转至 工具 部分,下载 Junos 遥测接口数据模型文件 包。
注意:瞻博网络发布了适用于 Junos 设备的 YANG 模块,这些模块可从 瞻博网络 GitHub 存储库下载。从 23.4 版开始,配置和遥测 YANG 模型将合并并发布在 瞻博网络 GitHub 存储库中。其中包含配置、RPC 和遥测模型的 YANG 定义。注意:确保记下提取文件的位置。
在收集器上解码数据
此过程说明如何捕获数据、解码原始数据以及使用协议缓冲区文件解码数据。
要解码数据:
捕获数据。
在 UDP 侦听器模式下在目标流式遥测服务器或收集器上运行 netcat,将所有传入数据报存储到文件中。使用在瞻博网络设备上的流式传输服务器配置文件中配置的目标端口号。
nc -ul 0.0.0.0 20000 > data.gpb
注意:此命令将数据报存储到名为
data.gpb的文件中。运行此程序以捕获数据。当您想要停止接收数据时,请通过发送中断信号 (Control + C) 来停止程序解码原始数据。
注意:此步骤可选。如果您知道数据的编码消息类型,则不需要这样做。
解码要求因配置
dial-out的类型而异。通过 UDP 拨出(Protobuf 紧凑格式,瞻博网络专有):使用 Junos 特定的实用程序、 遥测_top.proto 和传感器原型文件进行解码。
通过 UDP 拨出(Protobuf 结构化格式):消息包含完整的键名和值对信息,因此收集器不需要数据模型来处理或使用遥测数据。消息结构在 jnx_gnmi_over_udp.proto 文件中定义。
通过 TCP 拨出(Protobuf 结构化格式):使用 gnmi.proto 和 GnmiJuniperTelemetryHeader.proto 文件进行解码。
以下示例描述如何解码文件中的
data.gpb消息,以便通过 UDP(Protobuf 紧凑格式,瞻博网络专用)连接进行拨出: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标识JuniperNetworksSensor在文件中telemetry_top.proto定义的消息。在此示例中,数字标识符7对应于文件中logical_port.proto定义的LogicalPort消息。在下一步中使用此信息生成更详细的输出。对消息进行解码以包含字段名称。
使用解码选项运行协议缓冲区编译器。此外,指定顶级消息类型 (
TelemetryStream) 和带有消息定义logical_port.proto的文件 。还必须包括 Goggle 协议缓冲区 (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 遥测接口 UDP 数据
收集器必须在远程地址或端口组合上启动侦听器才能读取传入数据。对于通过 UDP(Protobuf 紧凑格式,瞻博网络专用)连接拨出,可以使用 遥测_top.proto 和传感器原型文件对传入数据进行解码。对于通过 UDP(Protobuf 结构化格式)连接拨出,消息包含完整的键名和值对信息,因此收集器不需要数据模型来处理或使用遥测数据。消息结构在 jnx_gnmi_over_udp.proto 文件中定义。
为了简化解码过程,收集器可以加载作为遥测软件包的一部分提供的所有原型文件来解码传入的数据。
- 验证管理和 WAN 接口上的流数据。在流式处理服务器配置文件中指定适当的地址。
- 枚举和浮点数作为 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 } } } } } - 不完整数据流:不完整数据流必须通过输出文件中的数据验证来验证。
变更历史表
是否支持某项功能取决于您使用的平台和版本。使用 功能资源管理器 确定您的平台是否支持某个功能。
export-profile引入了 CLI 选项
dialout-type来配置传输协议和遥测消息格式。和
format
transport选项已弃用。