prometheus snmp监控硬件设备、网络设备
【1】概述
(1)什么是SNMP?
随着网络技术飞速发展,网络设备数量成几何级数增加,使得网络管理员对设备的管理变得越来越困难;同时,网络作为复杂的分布式系统,其覆盖地域不断扩大,也使得对这些设备进行实时监控和故障排查变得极为困难。网络设备种类多种多样,不同设备厂商提供的管理接口(如命令行接口)各不相同,这使得网络管理变得愈发复杂。
为了应对这一场景,SNMP应用而生。作为广泛应用于TCP/IP网络的网络管理标准协议,SNMP支持网络管理系统,以监测连接到网络上的设备是否有需要运维关注的情况。同时,SNMP采用轮询机制,提供最基本的功能集,适合小型、快速、低价格的环境使用,而且SNMP以用户数据报协议(UDP)报文为承载,因而受到绝大多数设备的支持,同时保证管理信息在任意两点传送,便于管理员在网络上的任何节点检索信息,进行故障排查。
随着技术演进,SNMP协议相继衍生出三个版本:SNMPv1、SNMPv2c和SNMPv3。
-
SNMPv1
作为SNMP协议的最初版本,提供最小限度的网络管理功能。SNMPv1基于团体名认证,安全性较差,且返回报文的错误码也较少。
-
SNMPv2c
采用团体名(community)认证,在SNMPv1版本的基础上引入了GetBulk和Inform操作,支持更多的标准错误码信息,支持更多的数据类型(Counter64、Counter32)。
-
SNMPv3
在安全性方面进行增强,提供了基于USM(User Security Module)的认证加密和基于VACM(View-based Access Control Model)的访问控制。SNMPv3版本支持的操作和SNMPv2c版本支持的操作一样。
目前,v1版本使用较少,一般使用v2c版本,如果对安全认证有需求,可以使用v3版本。
SNMP基本组件包括网络管理系统NMS(Network Management System)、代理进程(Agent)、被管对象(Managed Object)和管理信息库MIB(Management Information Base)。
它们共同构成SNMP的管理模型,在SNMP的体系结构中都起着至关重要的作用,以下为SNMP组件中的一些基本概念解释。
-
NMS:全称Network Management System,即网络管理系统。一般是各种网管软件,可以向Agent查询或者修改各种信息,也可以接受Agent的主动推送,在可观测监控 Prometheus 版的场景中,就是SNMP Exporter,仅对Agent做信息查询。
-
Agent:被管理设备上的一个代理进程,收集被管理设备的信息并汇报给NMS。
-
MIB:全称Management Information Base,是一个数据库。列出了被管理设备可以提供的各项数据,每项数据都对应一个唯一的OID。可以理解为被管理或监控对象可以提供的信息,一般都是以txt或mib为后缀的文件的形式存在,这里一般都是各设备官方提供,有公有和私有之分。
-
Device:即设备,指实际的网络设备。包括交换机、路由器、防火墙、UPS、AP、软路由等,只要支持SNMP,都可以视为一个网络设备。
-
Managed Object:被管理对象,一个设备至少包含一个被管理对象,可能是设备本身,也可能是某个硬件(例如一个网口),也可能是一些参数合集。
-
OID:全称Object ID,即对象标识符,用于定位一个数据项。OID是一串数字,比如1.3.6.1.2.1.1表示System,数字是树形结构,左侧为根,右侧为叶,前面一截是由IANA分配的厂商标识符,后面就是各个厂商自定的,因此不同厂商设备的OID树差别很大。
-
-
MODULE:因为SNMP可以监控的设备和厂商多种多样,因此SNMP Exporter中划分了很多Module,比如网络设备的if_mib,软路由的ddwrt、paloalto_fw防火墙等,总共有十几种,其中最常用的就是if_mib。
以交换机为例说明SNMP模型构成:
- NMS:一般指支持下发和收集SNMP OID的集成软件,在Prometheus中相当于snmp-exporter
- Device:被管理或监控的对象,这里指交换机
- Agent:被管理或监控的对象中的代理进程,这里指交换机启用snmp agent进程
- MIB:可以理解为被管理或监控对象可以提供的信息,一般都是以txt或mib为后缀的文件的形式存在,这里一般都是各设备官方提供,有公有和私有之分
- Managed Object:一般是指管理对象或设备本身或者某个设备上的某个部件
(2)SNMP Exporter
使用官网:https://prometheus.io/docs/introduction/overview/
下载官网:https://github.com/prometheus/snmp_exporter/
简介
SNMP协议中用不同的OID区分不同的状态数据,因此SNMP中的OID与Prometheus中的指标概念极其类似。
SNMP Exporter通过从Agent查询指定的OID数据,同时将数据映射到可读的指标上,实现SNMP数据到Prometheus指标的转换。
同时SNMP Exporter默认提供了非常丰富的转换配置,大部分场景下您无需进行额外配置即可将OID转换为可读的指标数据。
snmp_exporter是一个开源软件,用于收集支持SNMP(Simple Network Management Protocol,简单网络管理协议)的设备指标。
它充当Prometheus监控系统与SNMP设备之间的桥梁,定期从设备获取数据并将其转换为Prometheus可读的指标数据。
功能
数据采集:snmp_exporter能够定期向SNMP设备(如路由器、交换机、防火墙等)发送SNMP请求,获取特定的OID(Object Identifier)值。
数据转换:将采集到的SNMP数据转换为Prometheus可以理解和处理的时间序列数据。
指标暴露:通过HTTP或HTTPS端点暴露转换后的指标数据,供Prometheus服务器获取。
配置灵活性:snmp_exporter支持通过YAML配置文件自定义要查询的MIB对象和OIDs,甚至设置定时任务,实现定制化的数据采集。
SNMP版本支持:支持SNMP v1、v2c和v3三种版本,以适应不同安全需求和环境。
应用场景
网络设备监控:用于监控路由器、交换机、防火墙等网络设备的状态和性能指标,如接口流量、CPU利用率、内存使用情况等。这有助于管理员及时了解设备运行状态,预防潜在问题。
服务器硬件监控:跟踪服务器硬件的健康状况,包括硬盘空间、电源状态等。通过监控这些关键指标,可以确保服务器稳定运行并及时发现潜在故障。
应用性能监控:实时查看应用的I/O性能,如数据库、存储系统的性能指标。这有助于评估和优化应用的运行效率。
自动触发警报:当特定设备或服务出现异常时,snmp_exporter可以配合Prometheus的警报机制及时通知运维团队,以便快速响应和解决问题。
(3)SNMP 检测与验证
snmpwalk -v 2c -c public snmp_dev_ip system # ip 和 OID 字段,替换为实际设备的IP,和想要确认的指标对应的OID ,或者写 system # -v 表示snmp版本 # -c 表示community, 默认是public # 可以使用snmp_dev_ip:port 来指定非默认端口,默认端口是116
# 防火墙一般默认为 161
【2】SNMP Metric监控参考模型
(1)SNMP Metric采集
SNMP可以帮助运维人员以极为简单而有效的方式管理网络。首先,SNMP帮助运维人员收集网络上不同设备带宽使用量的信息,在进行故障排除的同时,更加快速找出网络性能趋势或问题。SNMP采集到的数据都是来自设备提供,不同厂商的设备可以提供的数据不尽一致,SNMP Exporter尽可能多的提供兼容,默认配置中已经包含了常见的各个厂商的OID映射,涵盖了市面上主要的厂家及其网络产品,能够满足绝大多数场景需求,详情请参见Prometheus开源社区相关文档。在当前版本中,我们支持if_mib
module的指标数据采集。
这里以常见的思科16口交换机为例,列举SNMP的主要指标:
指标名称 |
指标描述 |
OID |
ifAdminStatus |
接口状态 |
1.3.6.1.2.1.2.2.1.7 |
ifHCOutOctets |
接口发出的字节数总计 |
1.3.6.1.2.1.31.1.1.1.10 |
ifInBroadcastPkts |
接口收到的广播包数量统计 |
1.3.6.1.2.1.31.1.1.1.3 |
ifInErrors |
流入流量异常数统计 |
1.3.6.1.2.1.2.2.1.14 |
ifSpeed |
接口速率,单位为bits per second |
1.3.6.1.2.1.2.2.1.5 |
ifMtu |
MTU配置值 |
1.3.6.1.2.1.2.2.1.4 |
ifOutDiscards |
出方向流量丢包总计 |
1.3.6.1.2.1.2.2.1.19 |
ifHCInOctets |
接口收到的字节数总计 |
1.3.6.1.2.1.31.1.1.1.6 |
ifHighSpeed |
接口背板带宽,单位为M bits per second |
1.3.6.1.2.1.31.1.1.1.15 |
ifInDiscards |
接口流入流量丢包数总计 |
1.3.6.1.2.1.2.2.1.13 |
ifInMulticastPkts |
接口收到的多播包统计 |
1.3.6.1.2.1.31.1.1.1.2 |
ifInUnknownProtos |
接口收到的未知协议包数总计 |
1.3.6.1.2.1.2.2.1.15 |
ifOutMulticastPkts |
发出多播包统计 |
1.3.6.1.2.1.31.1.1.1.4 |
sysUpTime |
系统最近一次re-initialized后的时间 |
无 |
(2)SNMP监控大盘
可观测监控 Prometheus 版默认提供了SNMP Status和SNMP Interface Detail两个大盘,主要针对if_mib场景,监控网络流量等信息。
SNMP Status
主要展示设备的总体状态。包括设备运行时长,当前的流入/流出流量、出入流量总计、各个端口的实时流量信息、流量变化趋势等。
SNMP Interface Detail
展示各个端口工作详情。包括端口状态、端口是否连接、端口速率、MTU配置等,以及各种流量(单播、组播及多播等)的速率/包数量变化情况。
在使用SNMP Interface Detail大盘前,需要您先在Variable中配置所需查看的DataSource。
(3)SNMP告警规则
根据上述介绍的SNMP的主要指标,您可以针对SNMP配置以下告警项:
-
Interface Throughput达到Speed的80%。
-
出方向的丢包/Error数大于阈值、入方向的丢包/Error数大于阈值。
-
出方向的Queue长度大于阈值。
-
Interface数量发生变化。
【3】snmp 下载与安装
(1)下载与安装
下载:官网 github https://github.com/prometheus/snmp_exporter
安装(二进制):
# 安装依赖 sudo yum install gcc gcc-g++ make net-snmp net-snmp-utils net-snmp-libs net-snmp-devel # 解压 tar -zxf snmp_exporter-0.26.0.linux-amd64.tar.gz # 直接运行 snmp_exporter 软件即可
[root@bogon snmp_exporter-0.26.0.linux-amd64]# nohup ./snmp_exporter &
(2)配置文件 snmp.yml
里面默认3W多行,建议自行修改。
auths: public_v1: #使用版本 community: public #自定义的团体名称 security_level: noAuthNoPriv # 是否使用安全协议 auth_protocol: MD5 # 使用MD5登录安全协议,但会优先根据 security_level判断,但在noAuthNoPriv下不会被使用 priv_protocol: DES # 使用DES权限协议,但在noAuthNoPriv 下不会被使用 version: 1 public_v2: community: public security_level: noAuthNoPriv auth_protocol: MD5 priv_protocol: DES version: 2 modules: apcups: # 一个自定义的模块名称,代表 APC UPS 设备 walk: # 一个 OID 列表,snmp_exporter 会遍历这些 OID 并收集它们的信息。这些 OID 通常对应于 SNMP MIB 中的表或组 - 1.3.6.1.4.1.318.1.1.1.12 - 1.3.6.1.4.1.318.1.1.1.2 - 1.3.6.1.4.1.318.1.1.1.3 - 1.3.6.1.4.1.318.1.1.1.4 - 1.3.6.1.4.1.318.1.1.1.7.2 - 1.3.6.1.4.1.318.1.1.10.2.3.2 - 1.3.6.1.4.1.318.1.1.26.10.2.2 - 1.3.6.1.4.1.318.1.1.26.4.3 - 1.3.6.1.4.1.318.1.1.26.6.3 - 1.3.6.1.4.1.318.1.1.26.8.3 get: #一个 OID 列表,snmp_exporter 会直接获取这些 OID 的值,而不是遍历。这些 OID 通常对应于单个值,而不是表 - 1.3.6.1.4.1.318.1.1.1.8.1.0 metrics: #定义如何从收集的 SNMP 数据中生成 Prometheus 指标 - name: upsOutletGroupStatusTableSize # 监控的指标名称 oid: 1.3.6.1.4.1.318.1.1.1.12.1.1 # 对于的snmp oid type: gauge help: The number of outlet groups for the UPS. - 1.3.6.1.4.1.318.1.1.1.12.1.1 - name: upsOutletGroupStatusIndex oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.1 type: gauge help: The index to the outlet group entry. - 1.3.6.1.4.1.318.1.1.1.12.1.2.1.1 indexes: - labelname: upsOutletGroupStatusIndex type: gauge lookups: #用于从其他 OID 查找额外的标签值。每个查找包含一个或多个 labels(用于查找的 OID),一个 labelname(生成的标签名称),一个 oid(查找的 OID),和一个类型(如 DisplayString) - labels: - upsOutletGroupStatusIndex labelname: upsOutletGroupStatusName oid: 1.3.6.1.4.1.318.1.1.1.12.1.2.1.2 type: DisplayString - labels: [] labelname: upsOutletGroupStatusIndex ......
(3)snmp_exporter 运行参数
snmp_exporter.service
- -[no-]snmp.wrap-large-counters
控制是否将大计数器(如接口流量计数器)的值进行“包装”处理,以防止计数器溢出。当启用时,如果计数器的值达到其数据类型的最大值并回绕到零,snmp_exporter 会尝试正确处理这种情况,以便在 Prometheus 中得到连续增长的计数器值。加上 no- 前缀会禁用这个功能
- -snmp.source-address=“”
设置 SNMP 请求的源 IP 地址。在某些网络环境中很有用,特别是当 SNMP 设备需要基于源地址进行访问控制时。留空则表示使用默认的网络接口地址
- -config.file=snmp.yml
指定包含 SNMP 设备和模块配置的文件路径。这个文件定义了要监控的设备列表、使用的 SNMP 模块以及其他相关配置
- -[no-]dry-run
启用这个选项后,snmp_exporter 会加载配置并验证其有效性,但不会实际执行任何 SNMP 请求或暴露指标。主要用于测试配置文件的正确性。加上 no- 前缀会禁用这个功能
- -snmp.module-concurrency=1
设置同时执行的 SNMP 请求的并发数。这个值可以根据你的系统和网络条件进行调整,以提高数据采集的效率。但是过高的并发数可能会导致资源消耗过多或网络拥塞
- -web.telemetry-path=“/metrics”
指定暴露 Prometheus 指标的 HTTP 路径。默认情况下,这个路径是 /metrics
- -[no-]web.systemd-socket
当这个选项启用时,snmp_exporter 会使用 systemd 提供的 socket 激活功能来监听网络请求。通常用于与 systemd 的服务管理集成。加上 no- 前缀会禁用这个功能,使得 snmp_exporter 直接监听指定的网络地址和端口。
- -web.listen-address=:9116
设置 snmp_exporter 监听的 IP 地址和端口。:9116 表示监听所有可用的网络接口上的 9116 端口。可以根据需要更改这个地址和端口
- -web.config.file=“”
用于指定 web 服务器的配置文件,在 snmp_exporter 的上下文中不常用。留空表示不使用额外的 web 配置。
(4)封装成服务参考
cat > /etc/systemd/system/snmp_exporter.service <<EOF [Unit] Description=Snmp Exporter After=network.target [Service] Type=simple User=deploy Group=deploy ExecStart=/home/deploy/snmp_exporter/snmp_exporter \ --config.file=/home/deploy/snmp_exporter/snmp.yml \ --web.listen-address=:9116 ExecReload=/bin/kill -HUP Restart=on-failure [Install] WantedBy=multi-user.target EOF
(5)验证
访问IP+端口:一般是snmp所在IP+默认的9116端口
最终结果:成功获取到了该设备的信息
(6)整合 prometheus
- job_name: 'test_snmp' static_configs: - targets: ['x.x.x.x'] #网络设备ip metrics_path: /snmp params: module: [fortint] relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: xx.xx.xx.xx:9116 #启动snmp_exporter 服务器ip
【参考文档】
相关参考:https://blog.csdn.net/weixin_41004518?type=blog