Telemetry关键技术
对于Telemetry设备侧:Telemetry=原始数据+数据模型+编码格式+传输协议;对于Telemetry网管侧:Telemetry=收集系统+存储系统+应用分析系统。
本文档仅描述Telemetry设备侧相关的关键技术。
原始数据
Telemetry采样的原始数据可来自网络设备的转发面、控制面和管理面,目前支持采集设备的接口流量统计、CPU或内存数据等信息。
数据模型
Telemetry基于YANG模型组织采集数据。
YANG是一种数据建模语言,用于设计可以作为各种传输协议操作的配置数据模型、状态数据模型、远程调用模型和通知机制等。
更多信息请参见YANG模型介绍。
编码格式
支持GPB(Google Protocol Buffer)编码格式
GPB编码格式,是一种与语言无关、平台无关、扩展性好的用于通信协议、数据存储的序列化结构数据格式。
Telemetry利用GPB编码格式(GPB编码格式的文件名后缀为.proto),提供一种灵活、高效、自动序列化结构数据的机制,GPB属于二进制编码,性能好、效率高。
GPB通过“.proto”文件描述编码使用的字典,即数据结构描述。用户可以利用Protoc等工具软件(例如protoc-3.0.2-windows-x86_64.exe文件)根据“.proto”文件自动生成代码(例如java代码),然后用户基于自动生成的代码进行二次开发,对GPB进行编码和解码,从而实现与设备的对接。GPB编码解析前后的对比如表6-2所示。
GPB编码解析前 |
GPB编码解析后 |
---|---|
{
1:"HUAWEI"
2:"s4"
3:"huawei-ifm:ifm/interfaces/interface"
4:46
5:1515727243419
6:1515727243514
7{
1[{
1: 1515727243419
2 {
5{
1[{
5:1
16:2
25:"Eth-Trunk1"
}]
}
}
}]
}
8:1515727243419
9:10000
10:"OK"
11:"NE40E"
12:0
}
|
{
"node_id_str":"HUAWEI",
"subscription_id_str":"s4",
"sensor_path":"huawei-ifm:ifm/interfaces/interface",
"collection_id":46,
"collection_start_time":"2018/1/12 11:20:43.419",
"msg_timestamp":"2018/1/12 11:20:43.514",
"data_gpb":{
"row":[{
"timestamp":"2018/1/12 11:20:43.419",
"content":{
"interfaces":{
"interface":[{
"ifAdminStatus":1,
"ifIndex":2,
"ifName":"Eth-Trunk1"
}]
}
}
}]
},
"collection_end_time":"2018/1/12 11:20:43.419",
"current_period":10000,
"except_desc":"OK",
"product_name":"NE40E",
"encoding":Encoding_GPB
}
|
支持JSON(JavaScript Object Notation)编码格式
JSON是一种轻量级的数据交换格式。它是基于ECMAScript(欧洲计算机协会制订的JS规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据,层次结构简洁清晰,既易于人阅读和编写,同时也易于机器解析和生成。JSON编码如表6-3所示。
JSON编码格式 |
---|
{
"node_id_str":"HUAWEI",
"subscription_id_str":"s4",
"sensor_path":"huawei-ifm:ifm/interfaces/interface",
"collection_id":46,
"collection_start_time":"2018/1/12 11:20:43.419",
"msg_timestamp":"2018/1/12 11:20:43.514",
"collection_end_time":"2018/1/12 11:20:43.419",
"current_period":10000,
"except_desc":"OK",
"product_name":"NE40E",
"encoding":Encoding_JSON,
"data_str":{
"row":[{
"timestamp":"2018/1/12 11:20:43.419",
"content":{
"interfaces":{
"interface":[{
"ifAdminStatus":1,
"ifIndex":2,
"ifName":"Eth-Trunk1"
}]
}
}
}]
}
}
|
在设备和采集器之间传输数据时,采用GPB编码格式传输的数据比其他编码格式(JSON或XML)的数据具有更高的信息负载能力,保证了Telemetry业务的数据吞吐能力,同时降低了CPU占用率和带宽。
Telemetry采用JSON编码格式时,实际上送的数据报文中不包括回车或空格等排版字符,以便减少JSON编码的规模。
传输协议
支持GRPC协议(Google Remote Procedure Call Protocol)
GRPC协议是谷歌发布的一个基于HTTP2协议承载的高性能、通用的RPC开源软件框架。通信双方都基于该框架进行二次开发,从而使得通信双方聚焦在业务,无需关注由GRPC软件框架实现的底层通信。
Telemetry通过GRPC协议将经过编码格式封装的数据上报给采集器进行接收和存储。
GRPC协议可以用于Telemetry静态订阅或动态订阅。
GRPC协议栈分层如图6-3所示。
各层详细说明如表6-4所示。
层次 |
说明 |
|
---|---|---|
TCP层 |
底层通信协议,基于TCP连接。 |
|
TLS层 |
该层是可选的,基于TLS 1.2加密通道和双向证书认证等。 |
|
HTTP2层 |
GRPC承载在HTTP2协议上,利用了HTTP2的双向流、流控、头部压缩、单连接上的多路复用请求等特性。 |
|
GRPC层 |
远程过程调用,定义了远程过程调用的协议交互格式。 |
|
数据模型层 说明:
数据模型层分为三层,分别在不同的“.proto”文件中定义。采集器和网络设备之间通过GRPC协议建立连接时,需要使用这几类“.proto”文件进行对接,且两边的“.proto”文件要保持一致,便于解码。 |
RPC层 |
|
Telemetry层 |
|
|
业务数据层 |
|
huawei-grpc-dialout.proto文件是RPC头文件。设备作为客户端对外推送数据时,该文件定义了RPC接口,其内容及含义如下表所示。
huawei-grpc-dialout.proto
syntax = "proto3"; //proto版本定义为v3版本。 package huawei_dialout; //本包名称为huawei_dialout。 service gRPCDataservice { //服务名称为gRPCDataservice。 rpc dataPublish(stream serviceArgs) returns(stream serviceArgs) {}; //方法为dataPublish,双向流,提供数据推送方法。入参是serviceArgs数据流。 } message serviceArgs { //消息格式描述。 int64 ReqId = 1; //请求ID,GPB编码时编号为1。 oneof MessageData { bytes data = 2; //表示承载GPB编码格式的采样数据。 string data_json = 4; //表示承载JSON编码格式的采样数据。 } string errors = 3; //产生错误时的描述信息,GPB编码时编号为3。 }
huawei-grpc-dialin.proto文件是RPC头文件。设备作为服务端对外推送数据时,该文件定义了RPC接口,其内容及含义如下表所示。
huawei-grpc-dialin.proto
syntax = "proto3"; //proto版本定义为v3版本。 package huawei_dialin; //本包名称为huawei_dialin。 service gRPCConfigOper { //服务名称为gRPCConfigOper。 rpc Subscribe(SubsArgs) returns(stream SubsReply) {}; //方法为Subscribe,服务端流模式,提供动态订阅方法。入参SubsArgs包含订阅的参数。 rpc Cancel(CancelArgs) returns(CancelReply) {}; //方法为Cancel,一问一答模式,提供取消动态订阅方法。入参CancelArgs包含取消订阅的参数。 } message Path { //Path消息结构。 string path = 1; //订阅的sensor-path。 } message SubsArgs { //订阅请求参数。 uint64 request_id = 1; //请求ID,由调用者传入。 uint32 encoding = 2; //编码类型。0:GPB编码;1:JSON编码。 repeated Path path = 5; //订阅的path结构。 uint64 sample_interval = 6; //采样周期。 uint64 heartbeat_interval = 7; //冗余抑制的抑制周期,当suppress_redundant为1时才生效。 bool suppress_redundant = 8; //冗余抑制,当数据内容不变时,抑制采样数据上报。0:不启用;1:启用。 } message SubsReply { //订阅响应参数。 uint32 subscription_id = 1; //成功返回订阅ID,失败返回0。 uint64 request_id = 2; //带回对应订阅请求的request_id。 string response_code = 3; //返回码,成功为200。 oneof MessageData { bytes message = 4; //表示承载GPB编码格式的采样数据。 string message_json = 5; //表示承载JSON编码格式的采样数据。 } } message CancelArgs { //取消订阅请求参数。 uint64 request_id = 1; //请求ID,由调用者传入。 uint32 subscription_id = 2; //需要取消的订阅ID。 } message CancelReply { //取消订阅响应参数。 uint64 request_id = 1; //请求ID,由调用者传入。 string response_code = 2; //返回码,成功为200。 string message = 3; //错误描述。 }
huawei-telemetry.proto文件是Telemetry头文件,定义了Telemetry采样数据上送时的数据头,包括采样路径,采样时间戳等重要信息。该文件的内容及含义如下表所示。
huawei-telemetry.proto
syntax = "proto3"; //proto版本定义为v3版本。 package telemetry; //本包名称为telemetry。 message Telemetry { //Telemetry消息结构定义。 string node_id_str = 1; //设备名称。 string subscription_id_str = 2; //订阅名称,静态配置订阅时的订阅名称,GPB编码时编码为2。 string sensor_path = 3; //订阅路径,GPB编码时编码为3。 string proto_path = 13; //采样路径path对应在proto文件中的message路径。 uint64 collection_id = 4; //标识采样轮次,GPB编码时编码为4。 uint64 collection_start_time = 5;//标识采样轮次开始时间,GPB编码时编码为5。 uint64 msg_timestamp = 6; //生成本消息的时间戳,GPB编码时编码为6。 TelemetryGPBTable data_gpb = 7; //承载的数据由TelemetryGPBTable定义,GPB编码时编码为7。 uint64 collection_end_time = 8; //标识采样轮次结束时间,GPB编码时编码为8。 uint32 current_period = 9; //采样精度,单位是毫秒,GPB编码时编码为9。 string except_desc = 10; //异常描述信息,采样异常时用于上报异常信息,GPB编码时编码为10。 string product_name = 11; //产品名称。 enum Encoding { Encoding_GPB = 0; //表示GPB数据编码格式。 Encoding_JSON = 1; //表示JSON数据编码格式。 }; Encoding encoding =12; //数据编码格式。为GPB时,data_gpb字段有效,否则data_str字段有效。 string data_str = 14; //数据编码非GPB时有效,否则为空。 } message TelemetryGPBTable { //TelemetryGPBTable消息结构定义。 repeated TelemetryRowGPB row = 1; //数组定义,标识数据是TelemetryRowGPB结构的重复,GPB编码时编码为1。 } message TelemetryRowGPB { uint64 timestamp = 1; //采样当前实例的时间戳,GPB编码时编码为1。 bytes content = 11; //承载的采样实例数据,GPB编码时编码为11,需要结合sensor_path字段,才可以判断此处会以哪个proto文件编码。 } message TelemetrySelfDefinedEvent { string path = 1; //触发自定义事件的采样路径,描述content的解析方法。 string proto_path = 13; //采样路径path对应在proto文件中的message路径。 uint32 level = 2; //自定义事件的级别。 string description = 3; //自定义事件的描述信息。 string fieldName = 4; //触发自定义事件的字段名称。 uint32 fieldValue = 5; //触发自定义事件时该字段的取值。 TelemetrySelfDefineThresTable data_threshold = 6; //触发自定义事件时阈值过滤条件。 enum ThresholdRelation { ThresholdRelation_INVALID = 0; //未配置多个阈值条件间关系。 ThresholdRelation_AND = 1; //阈值间关系为与。 ThresholdRelation_OR = 2; //阈值间关系为或。 } ThresholdRelation thresholdRelation = 7; //触发自定义事件时多个阈值过滤条件间关系。 bytes content = 8; //触发自定义事件的采样数据内容。 } message TelemetrySelfDefineThresTable { repeated TelemetryThreshold row = 1; //包含多个阈值条件。 } message TelemetryThreshold { uint32 thresholdValue = 1; //配置下发的阈值。 enum ThresholdOpType { ThresholdOpType_EQ = 0; //上送数据的实际值等于配置数据阈值。 ThresholdOpType_GT = 1; //上送数据的实际值大于配置数据阈值。 ThresholdOpType_GE = 2; //上送数据的实际值大于等于配置数据阈值。 ThresholdOpType_LT = 3; //上送数据的实际值小于配置数据阈值。 ThresholdOpType_LE = 4; //上送数据的实际值小于等于配置数据阈值。 } ThresholdOpType thresholdOpType = 2; //表示设备上的阈值条件。 }
- 业务数据的文件:描述具体的业务数据格式。
支持UDP协议(User Datagram Protocol)
UDP协议是一个简单的面向数据报的传输层协议,不为IP提供可靠性、流控或差错恢复功能。UDP适合可靠性要求低、传输经济的网络应用。
Telemetry通过UDP协议将经过编码格式封装的数据上报给采集器进行接收和存储。
UDP协议可以用于Telemetry静态订阅。
UDP协议栈分层如图6-4所示。
各层详细说明如表6-5所示。
层次 |
说明 |
|
---|---|---|
UDP层 |
基于UDP连接的通信协议。 |
|
数据模型层 说明:
数据模型层分为三层,除消息头层,其他两层分别在不同的“.proto”文件中定义。采集器和网络设备之间通过UDP协议建立连接时,需要使用这几类“.proto”文件进行对接,且两边的“.proto”文件要保持一致,便于解码。这几类“.proto”文件的介绍,请参见上方GRPC协议部分的内容。 |
消息头层 |
消息头层的结构定义请参见:UDP based Publication Channel for Streaming Telemetry |
Telemetry层 |
|
|
业务数据层 |
|
基于Telemetry静态订阅的自定义事件上报
在Telemetry监控资源对象的性能指标超过自定义阈值时,用户可配置Telemetry的自定义事件,及时上报给采集器,用于业务策略判断。