一、背景:實驗使用prometheus系統來監控交換機端口流量
二、環境:
1、主機1:192.168.0.208,centos7.6,已安裝prometheus服務,擬安裝snmp-exporter。
2、主機2:GNS3網絡仿真系統,已配置交換機提供snmp信息服務,通過getif軟件成功讀取了交換機的snmp信息。
三、步驟
1、安裝go語言環境
[root@ELK prometheus]# yum install go #這種方式比較簡單,也可參考https://golang.org/doc/install,通過下載go語言安裝包進行安裝。
2、編譯生成generator,並由generator和generator.yml制作snmp.yml
(1)安裝配套軟件包
[root@ELK prometheus]# yum install gcc gcc-g++ make net-snmp net-snmp-utils net-snmp-libs net-snmp-devel
(2)獲取snmp-exporter源碼包,包括generator源碼包。
[root@ELK prometheus]# go get github.com/prometheus/snmp_exporter/generator
[root@ELK prometheus]# echo ${GOPATH-$HOME}
/root
安裝go語言環境時,變量${GOPATH-$HOME}被配置為/root目錄,因此,獲取的snmp-exporter和gererator源碼包在/root目錄下。
[root@ELK prometheus]# cd ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator
[root@ELK generator]# ls
config.go FORMAT.md main.go net_snmp.go tree.go
Dockerfile generator.yml Makefile README.md tree_test.go
[root@ELK generator]# pwd
/root/go/src/github.com/prometheus/snmp_exporter/generator
(3)編譯generator
[root@ELK generator]# go build
go: golang.org/x/sys@v0.0.0-20200212091648-12a6c2dcc1e4: unrecognized import path "golang.org/x/sys" (https fetch: Get https://golang.org/x/sys?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
上述錯誤是網站無法訪問導致,需設置代理進行解決
啟用 Go Modules功能: 參考https://www.cnblogs.com/sage-blog/p/10640947.html
[root@ELK generator]# export GO111MODULE=on
配置GOPROXY環境變量:
[root@ELK generator]# export GOPROXY=https://goproxy.io
再進行編譯:
[root@ELK generator]# go build
go: downloading gopkg.in/alecthomas/kingpin.v2 v2.2.6
go: downloading github.com/prometheus/common v0.9.1
go: downloading gopkg.in/yaml.v2 v2.2.8
go: downloading github.com/go-kit/kit v0.9.0
go: downloading github.com/soniah/gosnmp v1.23.1-0.20200214014533-6d3944030084
go: extracting gopkg.in/yaml.v2 v2.2.8
go: extracting gopkg.in/alecthomas/kingpin.v2 v2.2.6
go: downloading github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
go: downloading github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d
go: extracting github.com/go-kit/kit v0.9.0
go: extracting github.com/prometheus/common v0.9.1
go: extracting github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
go: extracting github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d
go: downloading github.com/go-logfmt/logfmt v0.5.0
go: downloading github.com/pkg/errors v0.9.1
go: extracting github.com/pkg/errors v0.9.1
go: extracting github.com/go-logfmt/logfmt v0.5.0
go: extracting github.com/soniah/gosnmp v1.23.1-0.20200214014533-6d3944030084
go: finding github.com/go-kit/kit v0.9.0
go: finding github.com/prometheus/common v0.9.1
go: finding gopkg.in/alecthomas/kingpin.v2 v2.2.6
go: finding gopkg.in/yaml.v2 v2.2.8
go: finding github.com/soniah/gosnmp v1.23.1-0.20200214014533-6d3944030084
go: finding github.com/pkg/errors v0.9.1
go: finding github.com/go-logfmt/logfmt v0.5.0
go: finding github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
go: finding github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d
編譯完成,生成generator執行程序。
(4)生成mibs
[root@ELK generator]# make mibs
mkdir: 已創建目錄 "mibs"
>> Downloading apc-powernet-mib
>> Downloading ARISTA-ENTITY-SENSOR-MIB
>> Downloading ARISTA-SMI-MIB
>> Downloading ARISTA-SW-IP-FORWARDING-MIB
>> Downloading cisco_v2
make: *** [mibs/.cisco_v2] 錯誤 56 #這里有錯,可暫時忽略
(5)制作generator.yml配置文件
新建generator.yml文件 (#原generator.yml改名備份為generator.yml.bak):
[root@ELK generator]# vi generator.yml #配置模板參考/root/go/src/github.com/prometheus/snmp_exporter/generator目錄下的README.md文檔
內容如下:
modules:
# Default IF-MIB interfaces table with ifIndex.
if_mib:
walk:
- 1.3.6.1.2.1.2 # OID of "interfaces"
version: 2
auth:
community: ccl123
lookups:
- source_indexes: [ifIndex]
lookup: ifAlias
- source_indexes: [ifIndex]
lookup: ifDescr
- source_indexes: [ifIndex]
lookup: ifName
overrides:
ifAlias:
ignore: true # Lookup metric
ifDescr:
ignore: true # Lookup metric
ifName:
ignore: true # Lookup metric
ifType:
type: EnumAsInfo
(6)運行generator以產生snmp.yml
[root@ELK generator]# export MIBDIRS=mibs
[root@ELK generator]# ./generator generate
level=info ts=2020-06-01T13:28:40.885Z caller=net_snmp.go:142 msg="Loading MIBs" from=$HOME/.snmp/mibs:/usr/share/snmp/mibs
level=info ts=2020-06-01T13:28:40.937Z caller=main.go:52 msg="Generating config for module" module=if_mib
level=info ts=2020-06-01T13:28:40.941Z caller=main.go:67 msg="Generated metrics" module=if_mib metrics=40
level=info ts=2020-06-01T13:28:40.958Z caller=main.go:92 msg="Config written" file=/root/go/src/github.com/prometheus/snmp_exporter/generator/snmp.yml
3、編譯生成snmp_exporter服務運行程序:
[root@ELK snmp_exporter]# pwd
/root/go/src/github.com/prometheus/snmp_exporter
[root@ELK snmp_exporter]# go build
go: downloading github.com/prometheus/client_golang v1.4.1
go: extracting github.com/prometheus/client_golang v1.4.1
go: downloading github.com/golang/protobuf v1.3.3
go: downloading github.com/cespare/xxhash/v2 v2.1.1
go: downloading github.com/prometheus/client_model v0.2.0
go: downloading github.com/beorn7/perks v1.0.1
go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1
go: downloading github.com/prometheus/procfs v0.0.8
go: extracting github.com/beorn7/perks v1.0.1
go: extracting github.com/prometheus/client_model v0.2.0
go: extracting github.com/cespare/xxhash/v2 v2.1.1
go: extracting github.com/matttproud/golang_protobuf_extensions v1.0.1
go: extracting github.com/prometheus/procfs v0.0.8
go: extracting github.com/golang/protobuf v1.3.3
go: finding github.com/prometheus/client_golang v1.4.1
go: finding github.com/beorn7/perks v1.0.1
go: finding github.com/cespare/xxhash/v2 v2.1.1
go: finding github.com/prometheus/client_model v0.2.0
go: finding github.com/golang/protobuf v1.3.3
go: finding github.com/matttproud/golang_protobuf_extensions v1.0.1
go: finding github.com/prometheus/procfs v0.0.8
編譯完成,生成snmp_exporter服務執行程序
4、把generator目錄下新生成的snmp.yml拷貝到snmp_exporter服務程序所在目錄(這一步也可省略,由snmp_exporter執行程序指定snmp.yml,方法:在/root/go/src/github.com/prometheus/snmp_exporter目錄下,運行命令: ./snmp_exporter --config.file="generator/snmp.yml")
[root@ELK snmp_exporter]# pwd
/root/go/src/github.com/prometheus/snmp_exporter
[root@ELK snmp_exporter]# cp generator/snmp.yml .
5、運行snmp_exporter服務
[root@ELK snmp_exporter]# ./snmp_exporter #命令加載本目錄下的snmp.yml文件,也可通過--config.file="目錄/snmp.yml"參數指定其他位置的snmp.yml
level=info ts=2020-06-01T13:46:32.453Z caller=main.go:149 msg="Starting snmp_exporter" version="(version=, branch=, revision=)"
level=info ts=2020-06-01T13:46:32.453Z caller=main.go:150 build_context="(go=go1.13.6, user=, date=)"
level=info ts=2020-06-01T13:46:32.460Z caller=main.go:243 msg="Listening on address" address=:9116
6、測試
[root@ELK generator]# snmpwalk -v 2c 192.168.18.5 -c ccl123 ifDescr #測試是否能從交換機獲取數據
IF-MIB::ifDescr.1 = STRING: FastEthernet0/0
IF-MIB::ifDescr.2 = STRING: FastEthernet1/0
IF-MIB::ifDescr.3 = STRING: FastEthernet1/1
IF-MIB::ifDescr.4 = STRING: GigabitEthernet2/0
IF-MIB::ifDescr.5 = STRING: Null0
[root@ELK generator]# curl http://192.168.0.208:9116/snmp?target=192.168.18.5
# HELP ifAdminStatus The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
# TYPE ifAdminStatus gauge
ifAdminStatus{ifAlias="",ifDescr="FastEthernet0/0",ifIndex="1",ifName="Fa0/0"} 1
ifAdminStatus{ifAlias="",ifDescr="FastEthernet1/0",ifIndex="2",ifName="Fa1/0"} 1
ifAdminStatus{ifAlias="",ifDescr="FastEthernet1/1",ifIndex="3",ifName="Fa1/1"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet2/0",ifIndex="4",ifName="Gi2/0"} 1
ifAdminStatus{ifAlias="",ifDescr="Null0",ifIndex="5",ifName="Nu0"} 1
...
也可web頁訪問:http://192.168.0.208:9116
填入交換機地址后,點擊Submit按鈕,顯示有鍵值對信息,就表明獲取交換機信息成功。
7、prometheus服務添加對snmp_exporter的監控
(1)修改prometheus.yml
[root@ELK ~]# cd prometheus
[root@ELK prometheus]# vi prometheus.yml #配置模板參考/root/go/src/github.com/prometheus/snmp_exporter目錄下的README.md文檔
...
- job_name: 'snmp'
scrape_interval: 1s
static_configs:
- targets:
- 192.168.18.5 #SNMP device.
metrics_path: /snmp
params:
module: [if_mib]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.0.208:9116 #snmp_exporter
(2)修改完成后重啟服務:docker restart prometheus
(3)web登錄prometheus查看targets:http://192.168.0.208:9090/targets
或者終端中輸入:curl http://192.168.0.208:9090/targets
顯示有如下信息即表明配置成功。
...
<td class="endpoint">
<a href="http://192.168.0.208:9116/snmp?module=if_mib&target=192.168.18.5">http://192.168.0.208:9116/snmp</a><br>
<span class="badge badge-primary">module="if_mib"</span>
<span class="badge badge-primary">target="192.168.18.5"</span>
</td>
8、使用方法(參考:https://cloud.tencent.com/developer/article/1602923):
(1)查看各接口1分鍾內入口流量變化,單位為Mbps(ifInOctets單位為Bytes)。
(rate(ifInOctets[1m])*8)/(1024*1024)
(2)查看接口FastEthernet0/0在20秒內入口流量的變化。
(rate(ifInOctets{ifDescr="FastEthernet0/0"}[20s])*8)/(1024*1024)
9、grafana配置監控端口流量
在一個圖中添加兩個查詢:
(rate(ifOutOctets{ifDescr="FastEthernet0/0"}[5s])*8)/(1024*1024)
(rate(ifInOctets{ifDescr="FastEthernet0/0"}[5s])*8)/(1024*1024)
刷新時間設為1s,即可看到Fa0/0端口實時刷新的出/入流量圖。