Prometheus监控网络设备,基于SNMP Exporter采集器
今天主要基于普罗米修斯和Grafana,介绍如何监控交换机。今天的环境主要使用华为和华三的交换机实体作为采集对象,部署方式使用Docker Compose来部署普罗米修斯。当然也可以用二进制的方式,或者其他方式,如K8S等。
交换机的采集器主要使用SP的开源工具,业界也有其他选择,如Telegraph和国内开源的Categph,这些都可以作为SNMP协议的采集工具。不过需要注意的是,snmp_exporter 不支持SNMP TRAP(162端口的主动采集方式),SNMP是基于161端口的轮询方式,人为查询得到相关指标信息。接下来我们了解一下这三个组件之间的关系和原理。
从图中可以看出,Prometheus作为主要的数据存储库和指标的主动采集,它使用的是PULL方式。通过snmp_exporter采集器去获取交换机的指标。交换机需要开启SNMP协议,而SNMP依赖net-snmp。net-snmp 是 SNMP 协议的具体实现,很多发行版系统中都有提供,比如Ubuntu、CentOS,甚至Windows系统也有实现。它的作用是提供SNMP相关的采集指标工具,比如 snmpwalk,以及一些依赖的库文件。snmp_exporter 需要调用这些库文件去解析MIB文件,生成SNMP OID相关的配置。
第一步:开启交换机的SNMP协议
针对华为和华三的交换机,SNMP配置是相似的,思科的交换机配置也大同小异。由于交换机配置比较简单,这里不做过多介绍。
第二步:部署SNMP和Prometheus
我们将以源码的方式部署。关于如何使用Docker部署或者二进制部署,可以参考我的微信公众号,里面有详细介绍。这里我们使用Ubuntu 20.04.32作为系统环境,在该系统中部署snmp_exporter,并通过Docker Compose部署Prometheus和Grafana。
我们先通过源码安装snmp_exporter。由于我们这里使用的是Ubuntu 20.04,如果你使用的是7.9内核以上的版本,执行相关命令即可。我这里已经安装好了,查看一下snmp_exporter的版本,版本是2.34。接下来我们安装Go语言环境,因为我们需要源码编译snmp_exporter。snmp_exporter 是用Go语言编写的,所以需要安装Go语言环境。这里可以选择Go的最新版本,比如1.21.5版本。
安装Go语言后,需要设置Go的代理,因为国内环境的限制,必须设置一下代理。接下来我们拉取snmp_exporter的源码库,进入源码包后,我们需要构建SNMP Exporter的二进制文件。执行以下命令来构建二进制文件:
1 | go build |
我们还需要生成snmp_exporter的配置文件。snmp_exporter 提供了一个配置生成器,它的作用是生成采集交换机指标的配置文件。接下来我们进入配置生成器的目录,执行以下命令生成配置文件:
1 | go run generator.go generate config.yml |
这个配置文件生成器可以根据交换机的MIB文件生成对应的采集配置文件。MIB文件是交换机厂商提供的,里面包含了交换机的所有监控指标,比如CPU使用率、内存使用率等。通过OID可以直接查询到对应的信息。
第三步:配置SNMP Exporter
我们需要将生成的配置文件放到snmp_exporter的配置目录中。比如,对于华为和华三的交换机,我们可以为每个品牌创建一个合理的目录结构。上传MIB文件到对应的目录中,然后解压MIB文件。我们将MIB文件上传到华为的目录下,并将配置文件上传到snmp_exporter的配置目录中。接下来,我们执行以下命令生成采集配置文件:
1 | go run generator.go generate config.yml |
生成的采集配置文件会自动放到指定的目录中。生成的配置文件格式和官方提供的snmp.yml配置文件格式类似。我们可以通过SNMP OID读取交换机的相关指标。
第四步:验证配置文件
我们可以使用系统的snmpwalk命令来调试SNMP OID,查询交换机是否能够响应该指标。执行以下命令:
1 | snmpwalk -v2c -c public 192.168.1.1 |
其中-v2c表示使用SNMP v2版本,-c表示团体名,192.168.1.1是交换机的IP地址。通过这种方式可以验证交换机的SNMP配置是否正确。注意,这里需要指定MIB文件的路径,否则可能无法正确查询到私有MIB中的指标。
第五步:启动SNMP Exporter
现在我们可以启动snmp_exporter了。执行以下命令启动它:
1 | ./snmp_exporter |
我们可以通过以下命令查看snmp_exporter的状态:
1 | systemctl status snmp_exporter |
如果一切正常,访问localhost:9116,应该可以看到snmp_exporter的Web界面。接下来我们可以在Prometheus中配置采集任务,Prometheus会定期从snmp_exporter中拉取交换机的监控数据。
常见问题:
- Go源码依赖问题: 如果Go编译时遇到依赖包问题,可以尝试设置Go的环境变量,确保依赖包能够正确加载。
- 访问GitHub问题: 如果拉取源码时遇到访问GitHub的困难,可以尝试使用代理。
- 配置文件问题: 模块名要和配置文件中的模块名对应,注意认证模块和指标模块的正确配置。
整理后的内容如下:
还有一个最重要的问题:假如你有一个这样的文件,这个指标可能会多一点。假如有两个用户无限的,我再建一个新的文件,假如你还有一个类似的文件,它可能是针对不同类型的设备,比如无线设备。那么这里要特别注意,模块的名称必须全局唯一。你理解这个意思吗?必须全局唯一。也就是说,如果在两个配置文件里面同时有相同的模块名称,并且两个文件都生成了,然后一起放到了启动目录里面(即配置文件加载的目录),这时系统会同时加载这些采集配置文件,但如果全局有两个相同的认证模块名称,它就会报错。
如果你的指标是相同的,比如无线设备和交换机的团体名是一样的,有两种解决方法:
- 你可以直接将模块名称改掉,确保全局唯一。
- 或者你可以去掉其中一个不需要的模块,因为团体名相同,那么你只需要一个认证模块名称就可以了。
所以这里一定要注意,全局唯一这个问题很容易出错,否则会报错。
以上问题已经说明了,接下来我们部署一下Prometheus和Grafana。
大家好!今天我们主要来看一下如何使用Docker Compose来部署Grafana和Prometheus。我这里有一个Demo,已经写好了相关的YAML文件,大家可以参考一下。
首先说明一下,磁盘卷的映射问题:如果你需要将数据持久化到本地,你需要在本地创建相应的Prometheus目录,并进行挂载和映射。本地的几个目录需要手动创建好,我这边已经创建完成。同时,Prometheus的初始配置文件也需要编写好,包括时间的挂载等。端口映射的话,比如Grafana的3000端口,Prometheus的9090端口等,都需要正确配置。
接下来,我们执行Docker Compose命令:
1 | docker-compose -f <YAML文件路径> -p <项目名称> up -d |
这里的参数说明:
-f:指定要使用的YAML文件。-p:指定项目名称,结合服务容器名作为前缀。如果没有指定容器名,Docker Compose会自动生成一个名称,通常是项目名加服务名,再加序号。
执行完命令,我们访问localhost:3000(Grafana)和localhost:9090(Prometheus)来验证服务是否启动成功。
接下来,我们要说明使用Docker Compose时一个容易出错的地方:网络冲突问题。Docker会使用默认的网络桥,比如172.16.0.0/12。如果当前主机已经存在这个网段,Docker会自动选择下一个可用的网段,比如172.17.0.0/16,依此类推。因此,大家要注意避免网络冲突,特别是在多网络桥和Docker Compose网络桥的配置中。
接下来我们说明一下如何在Prometheus中发现华为的交换机设备。我们已经通过SNMP采集到了数据,那么如何将这些数据纳入到Prometheus中呢?
首先,我们需要在Prometheus的配置文件中添加相应的采集任务。比如,我们创建一个名为huawei_switch的采集任务,采集间隔设定为15秒。这是默认的采集时间(10秒),如果你不设置,它会默认使用这个时间。
Prometheus支持多种服务发现机制,这里我们使用文件服务发现机制,因为交换机在多场景下可能需要采集不同模块的指标。在/etc/prometheus/targets目录下,我们定义了一个交换机的指标配置文件,这个文件包含了目标设备的IP地址、认证模块和采集模块等信息。
需要注意的是,SNMP的认证模块和指标模块必须保持一致。虽然这些配置看起来比较复杂,但它们的作用是将设备的指标传递给Prometheus。
配置好采集任务后,我们重启Prometheus:
1 | docker-compose restart prometheus |
重启后,你可以在Prometheus的Web界面中查看到采集到的交换机指标。点击目标链接,你可以看到通过SNMP采集到的交换机配置和指标数据。
接下来我们说明如何在Grafana中展示这些指标。首先,我们需要将Prometheus作为数据源添加到Grafana中。添加数据源的方法可以参考我的微信公众号,这里不再赘述。
然后,我们导入一个Grafana模板。这个模板已经定义好了基础的指标展示,导入后,你可以看到交换机的相关信息,比如运行状态、堆叠状况等。通过筛选标签,你可以查看不同设备的指标。如果你有很多设备,筛选功能会非常有用。
Grafana支持通过PromQL查询Prometheus中的数据,你可以根据需求编写查询表达式,灵活展示不同的指标数据。
最后,简单说一下告警配置。Grafana支持高级告警配置,我们可以利用它来设置告警规则,比如设备运行异常时自动告警。由于时间关系,今天的演示就到这里,后续会有机会详细介绍告警配置。
总结一下,今天我们演示了如何使用SNMP、Prometheus和Grafana来监控交换机设备。虽然这里涉及很多细节,特别是针对新手来说,可能不太友好,但最重要的是掌握以下几点:
- 基本的Linux命令和Docker的使用。
- 理解Prometheus的服务发现机制和标签重置机制。
其他内容可以通过搜索引擎或AI工具自行查找和学习。希望大家在日常工作中能够学会善用这些工具,提升自己的技术水平。
好了,今天的演示就到这里。谢谢大家!
原文链接: https://dashen.tech/2018/09/07/Prometheus基于SNMP-Exporter监控网络设备/
版权声明: 转载请注明出处.