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

    ef

主要展示设备的总体状态。包括设备运行时长,当前的流入/流出流量、出入流量总计、各个端口的实时流量信息、流量变化趋势等。

 

SNMP Interface Detail

展示各个端口工作详情。包括端口状态、端口是否连接、端口速率、MTU配置等,以及各种流量(单播、组播及多播等)的速率/包数量变化情况。

重要

在使用SNMP Interface Detail大盘前,需要您先在Variable中配置所需查看的DataSource。

              cr

(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  

 

posted @ 2024-08-26 16:46  郭大侠1  阅读(407)  评论(0编辑  收藏  举报