prometheus監控系統之snmp-exporter部署來監控交換機端口流量


一、背景:實驗使用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&amp;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端口實時刷新的出/入流量圖。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM