大家好,我是小斐,今天分享的这篇文章主要是看到阿里云在3月14日分享的一篇文章,文章链接如下:统一观测丨使用 Prometheus 监控 SNMP,我们该关注哪些指标?,阿里云太没有诚意,故自己分享一篇有诚意的文章,方便IT运维和网络领域的同行,推进Prometheus在SNMP领域的监控和报警实践。
SNMP通识
SNMP是什么:一种通用网络管理(监控)协议,用于管理和监视TCP/IP协议网络中的网络连接设备,如交换机、路由器、防火墙、服务器等等。
日常运维接触比较多的设备如:服务器管理口(戴尔iDrac SNMP)、交换机SNMP、路由器SNMP等等,其实日常运维接触的设备绝大部分都支持SNMP。
目前版本:SNMP v1、SNMP v2c、SNMP v3,主流使用v2c,如果有很高安全要求使用v3,不建议使用v1。
SNMP系统包括网络管理系统NMS(Network Management System)、代理进程Agent、被管对象Management object和管理信息库MIB(Management Information Base)四部分组成。

SNMP模型
以交换机为例说明SNMP模型构成:
- NMS:一般指支持下发和收集SNMP OID的集成软件,在Prometheus中相当于snmp-exporter
- Device:被管理或监控的对象,这里指交换机
- Agent:被管理或监控的对象中的代理进程,这里指交换机启用snmp agent进程
- MIB:可以理解为被管理或监控对象可以提供的信息,一般都是以txt或mib为后缀的文件的形式存在,这里一般都是各设备官方提供,有公有和私有之分
- Managed Object:一般是指管理对象或设备本身或者某个设备上的某个部件
OID说明:
Object ID,对象标识符,用于定位一个数据项。OID是一串数字,比如1.3.6.1.2.1.1表示system,数字是树形结构,左侧为根,右侧为叶,前面一截是由IANA分配的厂商标识符,后面就是各个厂商自定的,所以不同厂商设备的OID树差别很大。OID树结构参见下图。

OID树结构
Module:
SNMP可以监控的设备和厂商多种多样,故SNMP为了区别和分层级,根据不同的功能划分了很多module,比如网络设备的接口信息模块:if_mib。
数据采集
Prometheus是什么,PromQL如何写?在此就不说明,该篇主要说明如何部署和数据采集。
数据采集对象:
|
对象类型 |
具体对象 |
采集器 |
|
网络协议 |
HTTP、HTTPS、DNS、TCP、ICMP 和 gRPC等 |
blackbox_exporter |
|
网络设备 |
路由器、交换机等 |
snmp_exporter |
|
主机节点 |
虚拟主机、物理主机等 |
node_exporter |
|
应用 |
延迟、错误、QPS、内部状态等 |
Prometheus Client |
|
中间件 |
资源用量、服务状态等 |
Prometheus Client |
|
容器 |
资源用量、状态等 |
cAdvisor |
|
编排工具 |
集群资源用量、调度等 |
Kubernetes Components |
接下来我将围绕snmp_exporter部署采集交换机为例子,结合snmp_exporter如何使用以及Prometheus和Grafana的部署,搭建一套小型的采集网络设备相关的IT监控平台。
部署搭建
环境:
|
角色 |
系统版本 |
作用 |
|
服务端 |
CentOS 7.9 64位 |
部署Prometheus |
|
采集端 |
CentOS 7.9 64位 |
部署snmp_exporter |
|
设备端 |
华为S5720-36C-EI-AC |
启用snmp agent |
Tips:Ubuntu 18.04下默认的内核(5.4.xxx) 容易导致snmp_exporter运行一段时间假死,避免使用该内核,提的issue目前看还没有解决。
下面演示 Prometheus+Grafana搭建在同一台服务器上,本地存储,不启用远端存储,采集端搭建在单独服务器上,共两台,至于生产环境需要部署高可用或者多联邦集群自行摸索哦。 部署架构如下:

部署架构
服务端部署
采用二进制包安装和部署:服务端IP-172.17.40.51
# 新建程序运行文件夹
mkdir -p /opt/prometheus
cd /opt/prometheus
mkdir conf data deploy logs rules targets
# 系统初始化
yum update
# 更换源
minorver=6.10
sudo sed -e "s|^mirrorlist=|#mirrorlist=|g" \
-e "s|^#baseurl=http://mirror.centos.org/centos/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/$minorver|g" \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo
yum makecache
# 时间和时区
yum install ntpdate
# 设置时区
timedatectl set-timezone Asia/Shanghai
ntpdate ntp.aliyun.com
# 查看时间
date
安装部署Prometheus:
# *载下**prometheus的二进制运行文件包
wget -c -P /opt/prometheus/deploy https://github.com/prometheus/prometheus/releases/download/v2.37.6/prometheus-2.37.6.linux-amd64.tar.gz
# 解压包
tar -zxvf prometheus-2.37.6.linux-amd64.tar.gz
# 设置软链接
ln -s /opt/prometheus/deploy/prometheus-2.37.6.linux-amd64/ /opt/prometheus/current
设置系统服务:
# 设置为系统服务
vim /usr/lib/systemd/system/prometheus.service
# 服务文件信息
[Unit]
Description=Prometheus Server
Wants=network-online.target
After=network.target
[Service]
Type=simple
User=root
ExecStart=/opt/prometheus/current/prometheus --config.file=/opt/prometheus/conf/prometheus.yml --web.listen-address=:9090 --storage.tsdb.path=/opt/prometheus/data/ --storage.tsdb.retention=90d --web.enable-lifecycle --web.enable-admin-api
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
上面参数说明:
# prometheus启动配置文件 核心
--config.file=/opt/prometheus/conf/prometheus.yml
# TSDB数据库文件保存路径
--storage.tsdb.path=/opt/prometheus/data/
# TSDB数据保存周期90天
--storage.tsdb.retention=90d
# 开启配置文件热加载 指配置文件改动,不需要重启,直接调用API热加载即可
--web.enable-lifecle
# 开启API服务
--web.enable-admin-api
Prometheus配置文件编写,配置文件需要放到/opt/prometheus/conf/目录下,命名为: prometheus.yml ,并启动Prometheus服务:
# 全局配置文件
global:
scrape_interval: 15s # 设置数据采集间隔每次15s,默认1分钟
evaluation_interval: 15s # 评估规则每次15s,默认1分钟,该设置是针对告警规则rule_files
scrape_timeout: 10s # 采集超时,默认10s
external_labels:
monitor: "it-monitor"
# 告警插件配置
alerting:
alertmanagers:
- static_configs:
- targets:
# - 172.17.40.51:9093
# 按照设定参数进行扫描加载,用于自定义报警规则,其报警媒介和route路由由alertmanager插件实现
rule_files:
# - "/opt/prometheus/rules/*.yml"
# - "second_rules.yml"
# 设定采集对象,这里既有静态设置也有设置服务发现(服务发现用于后续target更改只需要进行规则修改即可,不需要进行prometheus守护进程重启)
scrape_configs:
- job_name: "prometheus"
metrics_path: /metrics
scheme: http
static_configs:
- targets: ["172.17.40.51:9090"]
relabel_configs:
- source_labels: [ '__address__' ]
target_label: 'instance'
regex: "(.*):(.*)"
replacement: $1
启动Prometheus服务:
systemctl deamon-reload
# 启动Prometheus
systemctl start prometheus
# 停止Prometheus
systemctl stop prometheus
# 重启Prometheus
systemctl restart prometheus
到此完成Prometheus的搭建和配置,接下来搭建snmp_exporter,并编写yml文件采集交换机数据。
采集器部署
采集端 IP-172.17.40.54,使用源码编译部署
# 系统初始化,时区时间,镜像源 看Prometheus部署案例
# 系统依赖*载下**
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
sudo cp /etc/yum.repos.d/elrepo.repo /etc/yum.repos.d/elrepo.repo.bak
# 然后编辑 /etc/yum.repos.d/elrepo.repo 文件,在 mirrorlist= 开头的行前面加 # 注释掉;并将 http://elrepo.org/linux 替换为
https://mirrors.tuna.tsinghua.edu.cn/elrepo
sudo yum makecache
# *载下**依赖软件
yum install -y wget tree net-snmp net-snmp-utils net-snmp-libs net-snmp-devel golang p7zip*
*载下**snmp_exporter源码包并编译:
# 测试机器获取OID信息
snmpwalk -v 2c -c 123456 172.18.48.5 1.3.6.1.4.1.2011.5.25.19.1.1.1
# git *载下**snmp_exporter 如系统没有git,直接yum安装
cd /opt
git clone https://github.com/prometheus/snmp_exporter.git
# 设置go国内代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
# go编译生成snmp_exporter
tar -zxvf snmp_exporter.git
go build
ls -al | grep snmp_exporter
# 查看目录树
tree
# 至此,可以看到snmp_exporter路径下有一个generator的目录,该目录下在编译前是没有generator文件和mibs文件夹的,编译,生成mibs文件夹后
cd opt/snmp_exporter/generator/
go build
make mibs
ls -al
# 可以看到/opt/snmp_exporter/generator目录下多了一个generator文件和mibs文件夹,然后我们可以去华为官网,把需要的对应版本交换机的mib文件全部*载下**下来,然后放到mibs文件夹里
export MIBDIRS=/opt/snmp_exporter/generator/mibs:/opt/snmp_exporter/generator/mibs/MIB-V200R019C10SPC500/MIBs:/opt/snmp_exporter/generator/mibs/MIB-V200R021C00SPC100/MIBs
# 生成snmp.yml文件,前提是需要编辑generator.yml文件,然后使用generator生成器根据generator.yml文件生成snmp.yml配置文件
./generator generate
上面通过go源码编译生成snmp_exporter二进制可执行文件,在目录/opt/snmp_exporter/snmp_exporter

目录信息
同时需要snmp.yml的配置文件生成器generator来生成我们需要的配置信息。
故还需要在目录/opt/snmp_exporter/generator/执行./generator generate生产snmp.yml配置文件,但是生成snmp.yml配置文件需要编辑generator.yml配置文件,在这个文件中自定义我们需要的监控参数和数据,主要是SNMP的OID信息。
比如常见的交换机接口OID信息:

常见OID信息
generator.yml配置文件结构说明:
modules:
HUAWEI:
walk:
- 1.3.6.1.2.1.2.2.1.1 #ifIndex - 接口索引
- 1.3.6.1.2.1.2.2.1.2 #IfDescr - 描述接口的字符串
- 1.3.6.1.2.1.2.2.1.3 #ifType - 接口类型
......
max_repetitions: 25
retries: 3
timeout: 5s
version: 2
auth:
community: xxxxxx
lookups:
- source_indexes: [ifIndex]
lookup: ifAlias
#drop_source_indexes: false
overrides:
ifAlias:
ignore: true # 查找的指标在snmp_exporter输出控制台直接删除该指标
#regex_extracts: # 根据正则表达式和指标值创建新指标
# Temp:
# - regex: '(.*)' # 正则表达式从返回的 SNMP walks 值中提取一个值
# value: '$1' # 结果将被解析为 float64,默认为 $1
# Status:
# - regex: '.*Example'
# value: '1' # 正则表达式匹配且值解析的第一个条目获胜
# - regex: '.*'
# value: '0'
#type: DisplayString
HUAWEI是我自定义的模块名称,walk下, 找到需要监控对象对应的OID写入即可,version是指交换机SNMP使用的版本是v2c,auth下的community是指交换机上启用snmp agent设置的字符串。lookups和overrides相关参数,第二篇展开说明。
目前已完成华为交换机、深信服AD、AF、AC、戴尔iDrac等SNMP配置文件,需要generator.yml配置文件的可以关注采集,后续打算开源出来。
# 把配置好的generator.yml文件上传到/opt/snmp_exporter/generator
# 相关交换机或者设备的mib文件需要先*载下**放到mibs目录中(可自定义目录)
# 进入目录生成snmp.yml配置文件,并移动到snmp_exporter目录中
cd /opt/snmp_exporter/generator
./generator generate
mv snmp.yml ../
注册snmp_exporter系统服务管理:
# vim /usr/lib/systemd/system/snmp_exporter.service
# 系统服务信息
[Unit]
Description=snmp_exporter
After=network.target
[Service]
ExecStart=/root/snmp_exporter/snmp_exporter --config.file=/root/snmp_exporter/snmp.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动:
# 启动服务
systemctl deamon-reload
systemctl start snmp_exporter.service
systemctl stop snmp_exporter.service
systemctl restart snmp_exporter.service
如我生成的snmp.yml文件数据展示:浏览器打开snmp_exporter服务,查看采集的数据情况,日常数据采集调试,需要经常用到,默认端口是9116:

示例
Target是指设备对象的IP地址,Module是指generator.yml配置文件中自定义的模块名称,其中Target需要开启snmp agent服务,这里是华为交换机开启命令:
snmp-agent
snmp-agent community read cipher xxx
snmp-agent sys-info version v2c v3
#########trap是否需要开启,看个人需求
# snmp-agent target-host trap address udp-domain 192.168.1.200 params securityname cipher xxx
# snmp-agent trap enable
#########
snmp-agent protocol source-status all-interface
snmp-agent packet contextengineid-check enable
undo snmp-agent protocol source-status ipv6 all-interface
当我提交,snmp_exporter就会获取交换机信息,至于是啥信息,就是你在generator.yml配置文件中填写的OID信息(也可以是对象名称),如下图所示(部分)。

采集信息
至此就完成了snmp_exporter的搭建和采集交换机的数据了。
联动
完成基础的搭建工作和数据采集工作,那么就需要进行数据收集到Prometheus并持久化以及数据的展示,可以看上面画的架构图,完成Prometheus targets搭建和Prometheus Server的搭建,但还没有完成pull metrics和PromQL的动作,以及Gafana的搭建配置工作。
如何pull metrics呢,关于snmp_exporter的pull metrics,可以修改prometheus.yml的配置文件:在Prometheus部署中可看原始配置,在原始配置的 scrape_configs: 下添加一个job,如下所示:
# 采集交换机信息
- job_name: "SNMP"
scrape_interval: 30s # 针对SNMP采集节点 覆盖全局配置15s
scrape_timeout: 20s
file_sd_configs:
- files:
- /opt/prometheus/targets/network-*.yml
refresh_interval: 2m
metrics_path: /snmp
relabel_configs:
- source_labels: ["__address__"]
target_label: __param_target
- source_labels: ["__param_target"]
target_label: instance
# prometheus采集目标直接修改为snmp_exporter 服务IP地址
- target_label: __address__
replacement: 172.17.40.54:9116 # snmp_exporter 服务IP地址
- source_labels: ["mib"] # 从自定义的目标标签获取MIB模块名称
target_label: __param_module
上文中启动文件服务发现,在目录/opt/prometheus/targets/新建目录yml文件,示例如下:新建network-switch.yml
- labels:
mib: HUAWEI
brand: Huawei
hostname: HZ-XS-AG
model: S5720-36C-EI-AC
targets:
- 172.18.48.2
- labels:
mib: HUAWEI
brand: Huawei
hostname: HZ-XS-Access
model: S5720S-52P-LI-AC
targets:
- 172.18.48.5
- labels:
mib: HUAWEI
brand: Huawei
hostname: HZ-XS-POE
model: S5720S-28P-PWR-LI-AC
targets:
- 172.18.48.6
其他标签可以忽略,也可以自己添加自定义标签,mib(我自定义的)需要加上,targets必须填写被管理或监控的设备IP。
# 重启prometheus
systemctl restart prometheus
# 或在Prometheus服务器上热加载配置文件
curl -X POST localhost:9090/-/reload
打开Prometheus Web UI,就可以看到数据,到此就完成pull metrics动作,如下图所示: 打开 172.17.40.51:9090

首页

target
可看到配置文件中对应的targets都是UP状态,并点击对应数据url也是正常返回我定义的数据。
Grafana的搭建和配置:在172.17.40.51上搭建,端口号默认3000
# grafana搭建 CentOS
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.3-1.x86_64.rpm
sudo yum install grafana-enterprise-9.4.3-1.x86_64.rpm
# 官方文档
https://grafana.com/grafana/download?pg=get&plcmt=selfmanaged-box1-cta1
打开Grafana,配置数据源为Prometheus,并编写数据展示模版,过于简单就不做介绍,主要是模版和编写查询PromQL,我这边已完成华为交换机,华为无线AC/AP,深信服AD、AF、AC和戴尔iDrac的模版,Linux主机节点是利用了StarsL.cn分享的ID为:16098 模版,然后自己自定义了一部分;Windows服务器节点也是利用StarsL.cn分享的ID为:10467 模版。后续完全完善测试后,计划分享到官方网站,欢迎各位参与测试, 需要模版和generator.yml文件的直接关注私信 。

AD模版

无线模版

Linux主机模版
总结
到此就完成了简单的SNMP的监控,关于文中很多细节,后续文章分享;比如Prometheus基本参数的说明,snmp_exporter采集自数据,数据出现乱码怎么处理,数据格式如何转换,generator.yml配置如何编写,如何打造适合自己自定义的配置文件。
目前只是说明服务搭建配置和数据采集,万里长征踏出第一步,后续接入报警,报警规则如何编写,报警媒介方式(邮箱、钉钉、飞书),如何编写PromQL实现精美的大屏面板,以及远端存储和其他类型数据采集。
知乎专栏更多精彩:网络小斐
微信公号:网络小斐