用 snmp-exporter 在 Grafana 中监控 RouterOS

在有了 Grafana 之后,总得监控些什么吧,那就让我们来监控 RouterOS 吧

配置 snmp-exporter

我刚开始被指点的就是使用 snmp_exporter ,让我们看看具体怎么做来监控一些支持 SNMP 协议的设备

可以下载该仓库 releases 中的最新版对应你机器类型的包,放在工作目录中来运行,有很多方式,比如直接在 Linux 环境中运行,用 docker 运行,在 k8s 中运行,都可以

然后就是配置 Prometheus 了

1
vi /prometheus-configmap.yaml

在 scrape_configs 后面加上 其中 为你运行 snmp-exporter 的机器IP地址

targets 后面加上你要监控的主机地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
scrape_configs:
- job_name: 'snmp'
static_configs:
- targets:
- 192.168.1.100 #SNMP device
metrics_path: /snmp
params:
module: [mikrotik]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: <your-address>:9116 # The SNMP exporter's real hostname:port.

注意这里 module 是 mikrotik,是用来监控 mikrotik 家的 ROS 的,如果需要监控别的东西,可以再加一条 job,配置 module 为其他的类型例如 synology(只要snmp.yaml 中有这个类型就可以)

完事之后更新一下 prometheus-configmap 就可以了

热加载: 为 Prometheus 服务的端口

1
curl -XPOST http://<your-address>:<port>/-/reload

加载完之后就可以在 Prometheus 的 targets 中看到 snmp 了

然后就可以在 Grafana 中配置仪表盘了

当然我得先会写 PromQL 才行

我们也可以自己生成 snmp.yml

这里安利大家使用 CloudShell 进行编译,比较方便,当然自己有环境更好啦

安装环境和依赖

1
sudo apt update
1
sudo apt install unzip build-essential libsnmp-dev p7zip-full -y

装上 gcc-g++

1
apt install golang-go -y

检查一下装上 go 了没有

1
go version

下载 snmp_exporter

1
go get github.com/prometheus/snmp_exporter/generator

cd 到该库的目录下

1
cd ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator

看看对不对

1
ls -lh

没问题就编译它

1
go build

然后下载各种厂商的 mibs

1
make mibs

导出 mibs 文件夹的目录以便于程序指向它

1
export MIBDIRS=mibs

可以开始生成 snmp.yml 了

1
./generator generate

然后就生成出来了

然后想办法传到你要运行 snmp_exporter 的机子上,放在相同目录下替换掉原来的就 ok

可能遇到的问题

=> Prometheus 的服务容器没有连通要监控的路由器,那么在我们需要 prometheus-deploy.yaml 中加上这条:hostNetwork: true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
namespace: kube-system
labels:
app: prometheus
spec:
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
#就下面这一行
hostNetwork: true
serviceAccountName: prometheus
containers:
- image: prom/prometheus:v2.4.3