监控网络设备这事儿,圈子里这两年翻篇翻得特别快。还在抱着SNMP不放的兄弟,多少都有点“手握老年机还要硬扫码付款”的别扭感。SNMP不是不能用,而是面对现在的自动化运维和精细化监控需求,它那套“拉取+轮询”的老逻辑已经明显拖后腿了。这篇文章我就把自己从SNMP迁移到Telemetry的完整思考、架构选型、配置细节和踩坑记录都摆出来,想搞高速、稳定自动化监控的朋友,这篇可以直接当参考。
1. 为什么SNMP在自动化监控面前越来越力不从心
1.1 SNMP的拉取机制到底卡在哪里
先花点篇幅把SNMP的问题说透。SNMP走的是经典的Client-Server模式,监控端是Manager,被监控设备是Agent,数据交互靠的是“轮询”,也就是监控端定期发请求,设备再回包。打比方的话,SNMP就是你去门卫室问“今天来了多少人”,每个小时去问一次,门卫每次数一次给你报一次。这个模式在设备数量少、监控频率低的时候没什么问题,但放到数据中心成百上千台交换机、路由器、防火墙堆在一起的环境里,问题就非常明显。
第一是轮询频率上不去。你恨不得每秒钟都想看到设备的实时流量、CPU占用、丢包率,SNMP轮询真要按1秒一次去拉,监控端和被监控设备首先受不了。大量重复的请求报文直接把网络带宽和设备CPU给吃满,典型的监控数据还没收集到,监控行为本身先成了网络负担。所以传统SNMP监控普遍采用5分钟一次的轮询周期,这个周期决定了你只能看到“事后5分钟”的平均数据,峰值拥塞、突发丢包、瞬时CPU飙升这些关键事件根本抓不到。
第二是数据语义太弱。SNMP的数据点都是MIB里一串数字OID,比如1.3.6.1.2.1.1.5.0是设备名称,1.3.6.1.2.1.2.2.1.10是接口收到的字节数。这些OID跟实际业务语义完全脱节,你得自己维护一张OID到“含义”的映射表。不同厂商实现的MIB还有差异,思科和华为对同一个接口状态的描述可能就不一样,更不用说那些私有MIB了。这个映射维护本身就是无底洞,而且出了故障之后,抓着OID去反查“到底哪个端口断了”,时间全耗在查询上了。
第三是传输效率低。SNMP基于UDP,虽然轻量,但大量小报文在监控设备和被管设备之间飞来飞去,带宽损耗远高于实际有效数据量。
1.2 从MIB到YANG模型:数据描述方式的代际差异
SNMP依赖MIB文件来描述设备数据,MIB本质上是一棵纯数字编号的树,数据通过OID定位。树的结构在几十年前就定死了,后来为了扩展,不断往里面挂新的分支,整个体系越来越臃肿、难以维护。
Telemetry阵营用的是YANG模型。YANG是一种数据建模语言,它通过模块化的方式描述设备配置、状态、统计等信息,数据点不再是一串纯数字,而是有名字、有层级、有数据类型的结构化对象,比如/interfaces/interface/statistics/in-octets,光看路径就知道这代表接口的入方向字节数。这个变化非常关键,它把“监控数据”从“一堆需要靠外部映射去解释的数字”变成了“设备自身就能语义化输出的结构化信息”。
要知道,YANG模型本来是NETCONF时代推动起来的,现在被Telemetry继承并且发扬光大。基于YANG模型,监控系统拿到的数据本身就是“已经翻译好的完整句子”,而不是一堆待解码的单词。我总结过,从运维视角看,SNMP时代的监控是“看仪表盘读数”,Telemetry时代的监控是“让设备主动向控制台汇报它自己的状态”,同时附带了完整语义。这背后的工作量差异、可维护性差异以及自动化能力差异,是颠覆性的。
另外提一点,SNMP很多监控工具是“假自动化”,指标还是靠人工梳理和手动加到告警项里的。Telemetry因为数据模型自带语义,采集方式、数据解码、告警规则都可以基于模型自动生成。这才配得上“自动化监控”这四个字。
2. Telemetry的核心原理与架构选型
2.1 推送模型:从“你过来拿”到“我送过去”
Telemetry最核心的机制变化,就是数据由被管设备主动向监控端推送。设备在本地采集数据后,按订阅方约定的周期或事件条件,批量推送到采集器。
打个通俗的比方,你开了一家仓库,之前监控仓库用的是保安每两小时巡逻一次,看到什么异常记下来再汇报,这就是SNMP轮询。Telemetry相当于给仓库装了物联网传感器,温度、湿度、开门次数、人员流量这些数据每秒自动上报到中控室,异常情况还能即时触发报警立即上报,不需要中控室反复打电话让保安去查看。
这个“推送”带来的直接收益:
- 实时性:采样周期可以做到秒级、亚秒级。如果网卡硬件支持,毫秒级采样也能做到,这对抓瞬时拥塞、偶发丢包、路由震荡等场景非常有用。
- 扩展性:监控端无需等待设备响应,请求和响应的配对这个包袱被丢掉了,一台采集器可以同时接收大量设备的推送数据,扩展能力比SNMP强很多。
- 数据平滑度:SNMP轮询的高峰期数据集中到达,瞬时冲击大;Telemetry的推送是持续平滑的,数据处理压力更均匀。
实际工作中,要实现周期性的数据变化监测,Telemetry一般支持两种推送模式:周期性订阅(periodic)和事件触发(on-change)。理解这两者的区别很有用。周期性订阅就是设备每隔n秒推送一次当前快照,适合采集流量速率、CPU、内存、温度这些持续变化的量。事件触发则是配置、状态、接口启停等发生变化时才推送,适合敏感状态类的监控,比如BGP邻居状态从Up掉到Down,这种事件要用on-change,一触即发,不用等下一个周期。
2.2 编码与传输协议:gRPC/gNMI是如何成为事实标准的
Telemetry的数据从设备传到采集器,中间隔了编码和传输两个环节。
编码方面,早期的Telemetry实现用过JSON、XML这类文本格式,好处是直观可调试,坏处是体积大、解析慢。目前生产环境里主流使用的是GPB(Google Protocol Buffers),它是一种二进制编码,体积小、编解码速度快、占用设备CPU低。很多厂商(华为、思科、Juniper)在推送时都支持混合编码模式,比如packed GPB或者JSON,配置的时候按采集器的解析能力去选。
传输方面,目前最主流的两个方案是gRPC和gNMI,两者底层都基于gRPC框架、HTTP/2传输。
- gRPC:这是最早也是最普遍的Telemetry传输封装。设备作为gRPC Server,采集器作为gRPC Client。典型的配置方式是,在设备上启动telemetry的gRPC服务,采集器用gRPC客户端去订阅设备的数据列表,设备就按订阅周期把数据流式推给采集器。这种模式的接入方式叫Dial-in(采集器主动连设备)。
- gNMI:gNMI(gRPC Network Management Interface)是gRPC之上的一个网络管理协议,它定义了一套标准化的RPC接口,包括Capability、Get、Set、Subscribe等。Telemetry重点用它的Subscribe能力。gNMI最大的价值在于“标准化”:不管设备是哪家的,只要支持gNMI,你用同一套订阅逻辑、同一套YANG路径去订阅,方式基本一致。gNMI一般也是Dial-in模式,采集器主动连接设备的9339端口创建订阅。
除了Dial-in,还有Dial-out模式。Dial-out是设备主动把数据推送到远端接收器(TCP/UDP端口),设备充当客户端。华为设备的传统Telemetry采集器就是Dial-out这种模式,设备把数据编码成GPB或JSON推给外部采集器端口。Dial-out适合那种采集器数量多、设备不好被外部直接访问的运维环境。
我自己的习惯是,新环境首选gNMI,理由是它的统一性和开放性做得最好。如果设备是存量华为老款,再考虑gRPC Dial-out兼容。
2.3 监控数据链路的整体架构设计
一套完整的Telemetry监控系统,远不止“设备推送、采集器收”这么简单。数据从设备产生到最终展示成面板和告警,中间要经过完整的链路。
我推荐的生产级架构分层如下:
- 数据源层:网络设备、防火墙、无线控制器,开启Telemetry能力,通过gNMI/gRPC向外推送。
- 采集器层:负责接收Telemetry数据,做初步解析、格式转换和流量控制。开源方案里,Telegraf、Prometheus的gNMI插件、自研gNMI客户端都可以做采集器。商业方案如Cisco DCNM、SolarWinds等也有对应能力。
- 消息队列层:采集器解析后的数据写入Kafka或RabbitMQ,起到削峰填谷、解耦上下游的作用。这个层不是必须,但数据量大、下游系统多的情况下强烈建议加。
- 存储层:时序数据库(TSDB)是标准选择,InfluxDB、TimescaleDB、Prometheus(配合远程存储)、TDengine都常见。时序数据库专门处理带时间戳的高频写入,性能远超关系型。
- 可视化与告警层:Grafana面板 + AlertManager / 自定义告警规则,完成监控数据的最终触达。
这套链路里,每一层都有插件化的选型空间,而且技术上全部可以用开源方案搭起来,不用动辄几十万的商业软件费用。后面第四章我会给出一套可以直接上手的开源实现方案。
3. 从0到1搭建Telemetry自动化监控的完整过程
3.1 网络设备侧的Telemetry配置实战
我把设备侧配置拆成两部分来写,一部分走通用的gNMI订阅,另一部分以华为设备为例讲一下传统Dial-out订阅。
先看gNMI订阅。你需要在设备上开启gNMI服务,创建账号并授权,然后建立订阅。以思科设备为例,大致逻辑是这样(不同版本命令细节会有差异,以官方为准):
configure terminal gnmi transport grpc default ! 允许gRPC接入华为设备gNMI相关配置(V300R019以后版本比较完善):
system-view netconf source ip 10.0.0.1 grpc server enable grpc server transport grpc default port 9339 grpc server transport grpc default certificate-policy accept aaa local-user admin password irreversible-cipher Admin@123! local-user admin service-type grpc quit这里的重点:
grpc server enable是必须的,默认端口9339。- 需要提前规划好采集器IP能否直接访问设备,就是我们常说的Dial-in接入方向。
- 有防火墙的话要放通TCP 9339端口。
再以华为传统Telemetry Dial-out为例,组网是“设备主动向外发送数据”。一般你会在采集器服务器上监听一个端口,比如UDP 10101,设备把数据推到这里。设备侧主要操作是配置Telemetry的传感器和目的组:
华为风格的关键配置(内容和参数依版本有所区别,仅做参考):
system-view telemetry notification-server ipv4 192.168.1.100 port 10101 protocol udp sensor-group sgroup_interface sensor-path huawei-ifm:interfaces/interface/statistics sensor-path huawei-aaa:aaa/statistics quit subscription sub_interface sensor-group sgroup_interface sample-interval 10000 notification-server 192.168.1.100 port 10101 protocol udp quit这段配置的逻辑非常清楚:
sensor-group定义“要采什么数据”。路径huawei-ifm:interfaces/interface/statistics采集接口统计,huawei-aaa:aaa/statistics采集AAA认证统计。subscription定义“怎么采、送哪里”。sample-interval单位一般是毫秒,10000就是10秒上报一次;notification-server指采集器的IP、端口和协议。
Dial-out模式的配置重点是这个订阅周期,不建议上来就设1秒。需要先评估设备CPU和采集器性能,新手我建议从10秒开始,跑通了再逐步缩小。直接上1秒的订阅,设备CPU可能直接飙到60%以上,反倒把网络监控搞成了网络事故。
3.2 采集器端的标准配置流程
选Telegraf作为采集器来做示范。Telegraf对网络设备的支持非常丰富,而且物料社区成熟。
首先需要确认设备侧用的是gNMI还是Dial-out。如果是gNMI订阅,Telegraf有gnmi插件,配置如下:
[[inputs.gnmi]] ## 设备列表 [[inputs.gnmi.subscription]] name = "interface-statistics" origin = "openconfig" path = "/interfaces/interface/state/counters" subscription_mode = "sample" sample_interval = "10s"origin = "openconfig"是我们指定的数据模型来源,path是YANG路径。如果你设备用的是厂商自定义模型,origin需要相应修改。
如果是华为Dial-out UDP推送,Telegraf需要配合接收UDP包并解析GPB编码的处理器来工作,这个复杂度会上升一些。最稳妥的办法是让设备直接推送JSON编码格式,Telegraf拿JSON解析不用额外编译proto文件。
Telegraf启动后,数据输出到InfluxDB或者Prometheus。输出配置如下(以InfluxDB为例):
[[outputs.influxdb]] urls = ["http://127.0.0.1:8086"] database = "telemetry" username = "admin" password = "admin123"这里踩过一个坑:InfluxDB 2.x 和 1.x 的接口和鉴权方式不同,Telegraf的outputs.influxdb插件需要配合不同版本的URL写法。1.x用http://host:8086写database,2.x用http://host:8086/api/v2/write加上token和org。如果是新版InfluxDB,务必按官方2.x的对接方式配,否则数据写不进去还没报错提示,排查起来很头疼。
3.3 数据可视化与告警联动
Grafana配置数据源为InfluxDB或Prometheus,这一步没什么门槛。关键是要建合适的仪表盘模板,接口流量(in/out bps)、错误包数量、CPU利用率、内存水位、板卡温度这些核心指标一块板子就能看全。
用Prometheus + AlertManager方案来告警的话,告警规则会写成这样:
groups: - name: network-telemetry.rules rules: - alert: InterfaceInOctetsHigh expr: | sum(rate(interface_in_octets_total[1m])) by (interface) > 8000000000 for: 2m labels: severity: critical annotations: summary: "接口{{ $labels.interface }}入方向速率超过8Gbps"这套规则的判断逻辑是,1分钟内接口入方向速率均值超过8Gbps(换算一下,就是1秒1G字节),且持续2分钟触发告警。这个设计可以过滤瞬时抖动,避免告警风暴。
4. 数据链路中的几个关键细节,建议直接收藏
4.1 采样周期与性能的开销平衡
Telemetry采样不是越密越好。我见过有人把周期调到1秒,结果设备CPU占用从20%直接飙到75%,监控系统自己把业务搞崩了。采样性能和开销之间需要做一个精致平衡。
经验参考值:
- 接口统计、VRF路由表数量这种高频变化的量,5到10秒采集一次足够。
- CPU、内存、温度这种秒级变化不明显的量,30到60秒一次就好。
- BGP邻居状态、接口Up/Down这种事件型状态,用on-change事件推送,一发生就推,不用轮询。
设备CPU开销方面,一个核心经验是不要为同一个设备维护太多重复订阅。比如多个采集器都订阅同一组接口统计,设备就要重复采样、重复编码、重复推送,压力是线性叠加的。生产环境里尽量做到“一个指标只被订阅一次”,后端需要多份数据的消费,从Kafka里分发出去,而不要在设备侧重复取。
4.2 时钟同步与数据时戳:数据乱了全盘皆输
Telemetry数据带时间戳,时间戳可信的前提是设备时钟可信。如果用NTP校准得不及时,设备时钟偏移超过几秒,时序数据库里同一个指标的时间线就乱了,Grafana面板上的曲线会呈现锯齿状甚至错位,告警判断也会出现误报和漏报。
所以搭建Telemetry的第一步,不是配Telemetry本身,而是把全网设备的NTP校准做好。建议所有设备指向同一组高可用的NTP服务器,并且单独加监控项校验设备的时钟偏移值,比如偏移超过500ms就告警。这个基础不打好,Telemetry引入的亚秒级数据反而会成为噪声。
数据到达采集器之后同样要检查时戳。不同厂商设备对时戳的精度和时区处理不一样,有的送UTC,有的送本地时间,甚至有的只会送秒级时间戳。采集器解析时统一把时戳规范化为UTC,存储到TSDB再按面板时区展示。这个规范化逻辑一定要做,否则一旦跨时区网络设备混在一起,时间线错乱会搞到你怀疑人生。
4.3 数据去重和乱序处理
Telemetry推送机制下,设备可能因为网络拥塞或重传导致重复数据包,也可能不同路径到达采集器的时间顺序颠倒。时序数据库本身对乱序数据有容忍度,但乱序范围太大会导致查询性能下降。所以生产环境里,采集器要维护数据去重(按设备标识+指标ID+时间戳组合键),并且设置一个合理的乱序容忍窗口。比如InfluxDB默认乱序容忍窗口是5分钟,超过窗口的数据会被丢弃,这个参数要结合订阅周期来调整。
Kafka在这条链路里的价值也在这里体现,采集器写入Kafka时已经做了分区,消费者按分区顺序消费,乱序问题从源头被切断。
5. 常见问题与排查技巧实录
5.1 订阅创建了却收不到任何数据
这个是最常见的开局问题。排查路径我建议按这个顺序走:
先查网络连通性。设备能不能ping通采集器?TCP 9339(gNMI)或者配置的Dial-out端口是否被防火墙拦截?很多环境里设备位于隔离网段,采集器在管理网,中间策略没放行,连接根本建立不起来。
再查认证。gRPC/gNMI连接需要用户名密码,设备侧账户是否授权了对应模块的读写权限?有些设备默认账户权限很低,只给了基础查看权限,没有Telemetry相关权限,连接成功但订阅的操作可能被拒绝。
然后查订阅路径。YANG路径写错是另一大坑。比如华为设备接口统计的真实路径是huawei-ifm:interfaces/interface/statistics,你在网上复制一段思科的/interfaces/interface/state/counters路径,华为设备可能根本不认识。路径验证方法是在设备命令行先敲display telemetry sensor-path看当前设备支持哪些路径,对着支持列表去改。
最后抓包。在采集器上用tcpdump在对应端口抓包,看有没有来自设备的数据包到达。Dial-out模式下,抓包是最快定位设备是否真的在推送的手段。如果抓包有数据但Telegraf解析不到,多半是GPB proto定义不匹配或者编码格式选错,换成JSON编码先排除问题。
5.2 数据有时延且趋势线不平滑
Telemetry数据到了但延迟大,先看收集器负载。Telegraf单机接收上万条指标时CPU会明显上涨,如果采集器性能不够,解析速度跟不上设备推送速度,延迟就会累积。
第二个常见原因是订阅周期与采集器处理的匹配度差。比如设备侧设置5秒推送一次,但Telegraf的inputs.gnmi插件内部处理管道默认batch size太小,数据一直处于排队状态。解决办法是在Telegraf插件配置里调大batch_size和buffer_limit参数,这个优化立竿见影。
第三个原因是那个隐蔽的时钟问题。数据其实早已到达数据库,但Grafana查询时按本机时区和时间范围去匹配,看到的曲线就会显得滞后。先确认TSDB里的原始数据时戳到底是多少,再做判断,不要一上来就怀疑链路。
5.3 设备CPU突然飙升
设备CPU升高先看是不是Telemetry订阅周期太短,这是最常见的原因。把采样间隔放宽一档,比如5秒改成10秒,再观察CPU。如果下调后显著下降,说明设备处理能力确实在这个区间达到瓶颈。
还有一种情况是订阅的传感器路径覆盖范围太大。比如你直接对整棵interfaces/interface路径做订阅,设备需要把每个接口的详细信息编码、序列化、推送。而实际上你关心的可能只是其中三四个接口。针对性地订阅具体接口的统计,CPU压力会明显下降。
最后是采集器侧数据接收不及时导致设备侧TCP窗口收缩或者UDP包缓存堆积。这种情况设备会消耗额外内存和CPU去缓存数据。解决办法就是扩容采集器,或者调整订阅周期和推送目的端口,让设备的数据能够及时被消费掉。
5.4 配置变更后订阅失效
在实际运维里,订阅配置经常会在升级后失效。设备操作系统版本升级后,YANG模型路径可能变化,之前能用的订阅路径在新版本里被重命名或者废弃了。我自己的习惯是在每一次设备版本升级后,统一跑一遍配置校验脚本,对telemetry订阅逐条验证,看采集器侧是否依然能收到对应数据,不能收到就立即比对新版YANG模型更新路径。这个机制能避免监控系统在版本升级后悄然失明。
6. 从SNMP平滑迁移到Telemetry的几个实用建议
如果你是存量SNMP监控场景,想切换到Telemetry,我的建议是不要“休克式迁移”。
平滑过渡期可以采用双轨方式,SNMP和Telemetry并行跑一段时间,两边数据同时入库。以相同的时间范围对比两边的指标数据,一方面验证Telemetry数据的准确性,另一方面积累Telemetry数据基线,为后面告警阈值调整提供依据。
迁移的顺序上,建议先迁移关键接口流量、CPU内存这类高频核心指标,跑稳之后再扩展BGP会话状态、OSPF邻居、板卡温度等。不要第一步就把所有指标全部迁过去,一旦新链路出问题,监控带直接缺口一大片。
告警阈值也要重新校准。SNMP的5分钟平均数据和Telemetry的10秒采样数据天然不在一个量级上,直接用原来的阈值套用Telemetry,会出现大量的误报警或者漏报。我见过不少团队迁完Telemetry之后被告警风暴淹没的,原因就是阈值没有随着数据粒度变化同步调整。
这套东西我陆陆续续在好几套网络环境里搭过,最直观的体会是:Telemetry不是技术上比SNMP“更高级”,而是处理监控问题的思路完全不同。SNMP的核心假设是“监控系统主动来问”,Telemetry的核心假设是“设备应该主动汇报”。放到自动化运维的大背景下,后者显然更符合未来网络设备数量膨胀、监控精度要求提升的趋势。最后再分享一个个人经验:给Telemetry系统做数据质量校验是一件特别容易被忽略但特别重要的事,建议定期对比设备命令行查询的实际值和Telemetry上报的值,确保监控数据的真实性。数据不准,再快的采集管道也没有意义。