3. 流式遥测数据模型与编码

在 Juniper Telemetry 体系中,数据模型与编码格式决定了“设备发出什么、采集器如何解析、后端如何存储与查询”。很多团队在部署初期只关注“能不能收到数据”,忽略了编码选择对带宽、CPU、Schema 演进和查询效率的长期影响。本节围绕 GPB、JSON、KV 三种主流编码,讲清它们的结构差异、适用场景,以及如何根据业务需求做出可落地的选择。

一、三种编码的本质差异

Juniper 的流式遥测(Streaming Telemetry)通过 gRPC 或 UDP 推送数据,编码格式决定了 payload 的形态:

  • GPB(gRPC Protocol Buffers):基于 .proto 定义的二进制编码,字段以 tag 编号标识,体积最小、解析最快,适合高频、大规模采集。Juniper 提供大量预定义 .proto 文件(如 telemetry.proto、jnpr_interface_ext.proto),采集端需加载对应 schema 才能解码。
  • JSON:文本编码,字段名自描述,可读性强,调试方便,但体积通常是 GPB 的 3~10 倍,解析开销大,适合低频、调试或与现有 JSON 生态对接的场景。
  • KV(Key-Value):以“路径—值”对形式组织,如 /interfaces/interface[name=ge-0/0/0]/state/counters/in-octets = 123456,结构扁平、易于映射到时序数据库的标签体系,适合指标类数据的快速入库与查询。

三者的核心区别可以归纳为:GPB 重“紧凑与性能”,JSON 重“可读与通用”,KV 重“扁平与可索引”。选择哪一种,取决于采集频率、数据量、后端存储模型和团队运维能力。

流式遥测编码选择:从设备到后端的信号链 Juniper 设备 Sensor / Path gRPC / UDP 推送 GPB 编码 二进制 / tag 编号 体积最小 · 解析最快 需 .proto schema JSON 编码 文本 / 字段名自描述 可读性强 · 体积大 适合调试与低频 KV 编码 路径—值对 / 扁平结构 易映射标签体系 适合指标入库 采集器 / Collector 解码 · 转换 · 路由 gRPC / Kafka / UDP 时序数据库 / TSDB 标签索引 · 压缩存储 Prometheus / InfluxDB 可视化 / 告警 Grafana · 规则引擎 查询 · 面板 · 通知 选择依据:采集频率 · 数据量 · Schema 演进 · 后端存储模型 · 团队运维能力

二、Schema 与 Path:数据模型的骨架

无论使用哪种编码,数据都来源于设备上的 Sensor Path。Path 是 YANG 模型中的节点路径,例如:

/interfaces/interface[name=ge-0/0/0]/state/counters/in-octets
/interfaces/interface[name=ge-0/0/0]/state/oper-status
/system/cpu/memory/used

Path 决定了采集的粒度和范围。粒度越细,单条数据越小,但采集条目越多;粒度越粗,单条数据越大,但解析和存储的字段更复杂。实际部署中,建议按业务域拆分 Path,例如接口流量、CPU/内存、路由协议状态分别订阅,便于独立调整频率和编码。

Schema 则是 Path 对应的结构定义。GPB 依赖 .proto 文件,字段以编号和类型描述;JSON 和 KV 虽然自描述,但在后端入库时仍需映射到统一的标签和字段模型。Schema 演进时,GPB 需要同步更新 .proto 并重新编译采集端,JSON/KV 则相对灵活,但容易因字段名变化导致解析失败。因此,Schema 版本管理是流式遥测工程化的重要环节。

三、Key-Value 结构与标签映射

KV 编码的典型形态是“路径 + 值”,采集端通常将其转换为时序数据库的标签(label)和指标(metric)。例如:

Path: /interfaces/interface[name=ge-0/0/0]/state/counters/in-octets
Value: 123456789
映射为:
metric: interface_in_octets
labels: {device="r1", interface="ge-0/0/0"}
value: 123456789

这种映射的关键在于:Path 中的 [name=...] 部分应提取为标签,而不是拼进指标名。否则标签基数会爆炸,查询性能急剧下降。对于 GPB,同样需要在采集端将字段映射为标签和指标;对于 JSON,则需解析嵌套结构后扁平化。三种编码最终都要落到同一套标签模型上,才能保证后端查询的一致性。

四、如何根据业务需求选择编码

选择编码时,可以从以下四个维度判断:

维度 GPB JSON KV
采集频率 高频(1s~10s) 低频(30s以上) 中高频(10s~30s)
带宽占用 最低 最高 中等
解析复杂度 需 .proto,较高 低,直接解析 低,路径拆分
Schema 演进 需同步更新 灵活但易失控 较灵活
典型场景 大规模核心采集 调试、对接现有系统 指标入库、标签查询

实际工程中,常见做法是混合使用:核心高频指标用 GPB,保证性能和带宽;调试或临时采集用 JSON,快速验证 Path 和字段;需要快速入库和标签查询的指标用 KV。关键是保持后端标签模型统一,避免同一指标在不同编码下产生不同的标签结构。

实践建议:在正式大规模部署前,先用 JSON 验证 Path 和字段是否符合预期,再切换到 GPB 或 KV 进行压测。切换时重点观察采集端 CPU、网络带宽和后端写入延迟三个指标,确保编码选择与采集频率、数据量匹配。
注意:GPB 的 .proto 文件版本必须与设备 Junos 版本匹配。版本不一致可能导致字段解析错位或数据丢失。升级 Junos 时,应同步更新采集端的 .proto 文件并重新编译。

总结来说,GPB、JSON、KV 不是互斥的“三选一”,而是面向不同采集目标和后端模型的工具。理解 Path 与 Schema 的关系、掌握 KV 到标签的映射方法、根据频率和数据量选择编码,才能让流式遥测在可观测性体系中真正发挥价值。