Telegraf+SNMP+Grafana構(gòu)建企業(yè)級(jí)交換機(jī)監(jiān)控

1、架構(gòu)功能需求

筆者在最近的項(xiàng)目中遇到了需要將一個(gè)大型組織的全部交換機(jī)以及N7000核心交換機(jī)配置監(jiān)控架構(gòu)的需求。該需求主要有如下的條目:

  • N7000配置全端口的詳細(xì)上下行和監(jiān)控和報(bào)錯(cuò)計(jì)數(shù)。
  • 普通交換機(jī)配置Tel1/0/1和Tel1/0/2的上下行監(jiān)控和報(bào)錯(cuò)計(jì)數(shù)。
  • 所有交換機(jī)配置運(yùn)行時(shí)間uptime和CPU使用情況監(jiān)控。

在本次項(xiàng)目中所有交換機(jī)的型號(hào)都是思科C2960系列。

2、思路設(shè)計(jì)

由于是一個(gè)落地項(xiàng)目,且考慮到需求的數(shù)據(jù)更新頻率是5sec,因此整個(gè)框架的數(shù)據(jù)壓力并不是非常大,本著遷移方便和維護(hù)簡便的原則,把所有的框架全部配置到docker容器環(huán)境下。由于N7000需要分端口監(jiān)控,因此配置了兩個(gè)數(shù)據(jù)抓取容器,然后匯總到同一個(gè)數(shù)據(jù)庫,然后進(jìn)行可視化處理。

因此我想到了使用influxdata系列的開源數(shù)據(jù)工具,這套工具包含了InfluxDB,Telegraf,Chronograf,Kapacitor四項(xiàng),分別對(duì)應(yīng)了數(shù)據(jù)庫、數(shù)據(jù)收集、數(shù)據(jù)可視化呈現(xiàn)、自定義報(bào)警四個(gè)功能。俗稱TICK套餐。不過在本次案例中并不需要使用Chronograf和Kapacitor,原因是有更好的替代品:Grafana。

所有的工具都架設(shè)在同一個(gè)虛擬機(jī)上,這種中小型規(guī)模的數(shù)據(jù)流并不需要集群或者h(yuǎn)adoop之類的工具去跑,如果有數(shù)據(jù)安全的需求,在其他的物理機(jī)上對(duì)influxdb和telegraf的配置文件做一個(gè)動(dòng)態(tài)增量備份就行。

具體流程如下:


基本監(jiān)控流程

其中數(shù)據(jù)的抓取處理部分全部在容器中配置。

3、具體流程

① 創(chuàng)建一臺(tái)虛擬主機(jī)

通過VMware等工具在服務(wù)器上配置一臺(tái)4核以上的虛擬機(jī),這臺(tái)虛擬機(jī)將作為容器服務(wù)器來運(yùn)作。

② 安裝并配置Telegraf和Influxdb

首先在虛擬機(jī)上安裝telegraf和influxdb,并且配置/etc/influxdb/influxdb.conf/etc/telegraf/telegraf.conf。這一步的目的是為了之后起容器的時(shí)候能夠直接-v調(diào)用相關(guān)的配置文件,同時(shí)可以輕松的修改相關(guān)的配置文件。

  • 偷懶方法
    如果已經(jīng)在其他機(jī)器上配置過influxdb和telegraf,或者從官網(wǎng)獲取了原版的conf文件,則可以直接mkdir /etc/influxdb/mkdir /etc/telegraf/,在里面cp對(duì)應(yīng)的配置conf文件進(jìn)行配置編輯即可。
$ vim /etc/influxdb/influxdb.conf
$ vim /etc/telegraf/telegraf.conf
  • Telegraf安裝方法
Ubuntu:
$ wget https://dl.influxdata.com/telegraf/releases/telegraf_1.9.1-1_amd64.deb
$ sudo dpkg -i telegraf_1.9.1-1_amd64.deb

RedHat/CentOS:
$ wget https://dl.influxdata.com/telegraf/releases/telegraf-1.9.1-1.x86_64.rpm
$ sudo yum localinstall telegraf-1.9.1-1.x86_64.rpm
  • Influxdb安裝方法
Ubuntu:
$ wget https://dl.influxdata.com/influxdb/releases/influxdb_1.7.2_amd64.deb
$ sudo dpkg -i influxdb_1.7.2_amd64.deb

RedHat/CentOS:
$ wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.2.x86_64.rpm
$ sudo yum localinstall influxdb-1.7.2.x86_64.rpm
  • Grafana安裝方法
    直接起docker容器即可,不需要在本地再次安裝。

至于/etc/influxdb/influxdb.conf/etc/telegraf/telegraf.conf的配置的話,可以去Stack Overflow等網(wǎng)站查看基礎(chǔ)配置的設(shè)定,根據(jù)自身的需求來設(shè)置。

③ 配置容器環(huán)境

配置完conf文件之后我們來啟動(dòng)telegraf和influxdb的容器進(jìn)程,這個(gè)過程中系統(tǒng)會(huì)自動(dòng)拉取docker.o云端的程序包。請(qǐng)耐心等待。我們也可以通過下面的指令手動(dòng)拉取:

$ docker pull telegraf
$ docker pull influxdb

或者直接啟動(dòng)容器進(jìn)程:

  • 啟動(dòng)influxdb docker,設(shè)置端口8086,當(dāng)然你也可以設(shè)定成你需要的端口。
$ docker run -d \
--name influxdb \
-p 8086:8086 \
-v /etc/influxdb/influxdb.conf:/etc/influxdb/influxdb.conf \
-v /var/lib/influxdb:/var/lib/influxdb \
docker.io/influxdb
  • 啟動(dòng)grafana docker
$ docker run \
  -d \
  -p 3000:3000 \
  --name=grafana \
  -e "GF_SERVER_ROOT_URL=http://grafana.server.name" \
  -e "GF_SECURITY_ADMIN_PASSWORD=secret" \
  grafana/grafana
  • 啟動(dòng)telegraf docker
$ docker run -d \
--name telegraf \
--network host \
-v /etc/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf \
docker.io/telegraf

這里需要注意的是,我們由于需要監(jiān)控N7000和交換機(jī),且這兩種機(jī)器的需求、OID映射都完全不同,因此強(qiáng)烈建議配置兩個(gè)不同的telegraf.conf文件,起兩個(gè)不同的容器進(jìn)行數(shù)據(jù)收集,這樣可以避免大量無效的空條目產(chǎn)生。

至此,本監(jiān)控框架的基本容器環(huán)境配置已經(jīng)完成,之后開始進(jìn)行SNMP數(shù)據(jù)抓取的配置。我們可以通過如下網(wǎng)址進(jìn)入Grafana圖形化監(jiān)控總臺(tái):

http://localhost:3000/

之后的設(shè)置會(huì)在下面介紹。

④ SNMP交換機(jī)數(shù)據(jù)抓取

SNMP技術(shù)是簡單網(wǎng)絡(luò)管理協(xié)議(Simple Network Management Protocol)的簡稱,也就是一種簡化的網(wǎng)絡(luò)管理工具,可以提供管理、數(shù)據(jù)收集、發(fā)包控制等等的簡單網(wǎng)絡(luò)功能,其利用的oid系統(tǒng)對(duì)于中小規(guī)模的數(shù)據(jù)抓取需求簡直是完美適配。而我們這次選擇的telegraf配置工具對(duì)于snmp的支持也是非常的完美。

首先通過$ vim /etc/telegraf/telegraf.conf進(jìn)入telegraf配置文件的編輯模式。在指令模式下/inputs.snmp來到snmp配置部分(telegraf支持的工具超超超多,所以配置文件幾千行),之后根據(jù)配置文件中的提示來進(jìn)行配置即可。

其中在oid寫入部分一般推薦使用[[inputs.snmp.field]]類的抓取方案。關(guān)于oid,是用來對(duì)應(yīng)交換機(jī)等硬件的詳細(xì)狀態(tài)信息的動(dòng)態(tài)api接口名稱,全稱Object Identifier。一個(gè)可用的案例如下:

[[inputs.snmp]]
   agents = ["192.268.0.1"]
   ## Timeout for each SNMP query.
   timeout = "5s"
   ## Number of retries to attempt within timeout.
   retries = 2
   ## SNMP version, values can be 1, 2, or 3
   version = 2

   ## SNMP community string.
   community = "YourCommunity"
   ## The GETBULK max-repetitions parameter
   max_repetitions = 30

   ## measurement name
   name="snmpd"
   [[inputs.snmp.field]]
     name="sysuptime"
     oid="1.3.6.1.2.1.1.3.0"
   [[inputs.snmp.field]]
     name="cpu5sec"
     oid=".1.3.6.1.4.1.9.9.109.1.1.1.1.6.1"
   [[inputs.snmp.field]]
     name="cpu1min"
     oid=".1.3.6.1.4.1.9.9.109.1.1.1.1.7.1"
   [[inputs.snmp.field]]
     name="cpu5min"
     oid=".1.3.6.1.4.1.9.9.109.1.1.1.1.8.1"

有了oid的對(duì)照表,我們就可以精確抓到相關(guān)交換機(jī)硬件軟件的動(dòng)態(tài)數(shù)據(jù)信息。通過,snmp還提供相關(guān)的工具幫我們直接驗(yàn)證oid的可用性。我們可以安裝snmpwalk檢測工具,以CentOS為例:

$ yum install -y net-snmp
$ yum install -y net-snmp-utils

然后可以用下面的指令格式查詢oid的有效性。同時(shí)有個(gè)注意點(diǎn),在telegraf的inputs.snmp部分寫入的oid,必須是oid樹結(jié)構(gòu)的末梢,如果飛末梢會(huì)導(dǎo)致讀到的是數(shù)據(jù)表而非單一值,而無法寫入influxdb中。

$ snmpwalk -v 2 -c YourCommunity <IP/URL> <oid>

在確定所有的oid可用的情況下,就可以編輯telegraf.conf并保存,然后重新起一個(gè)telegraf docker容器開始進(jìn)行數(shù)據(jù)的收集了,順利的話數(shù)據(jù)會(huì)立刻被寫入到influxdb中對(duì)應(yīng)的database里面。然后我們就可以前往Grafana平臺(tái)進(jìn)行使用了。

⑤ 思科C2960常用oid表

考慮到思科官網(wǎng)oid查詢系統(tǒng)的反人類程度,以及大多數(shù)人并不會(huì)特地去官網(wǎng)下載oid對(duì)照映射手冊(cè),下面會(huì)列出思科C2960系列最常用的一些oid對(duì)照表。至于N7000系列的端口對(duì)照表還是請(qǐng)動(dòng)手下載官方手冊(cè)進(jìn)行查詢,因?yàn)槟鞘且粋€(gè)無序表,鏈接為:思科設(shè)備OID對(duì)照查詢工具。

# 獲取端口Index
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.2.1.2.2.1.1

# 獲取端口列表及其描述
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.2.1.2.2.1.2

# 獲取端口Mac地址
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.2.1.2.2.1.6

# 獲取IP地址對(duì)應(yīng)的Index
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.2.1.4.20.1.2

# 獲取端口的Up/Down情況
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.2.1.2.2.1.8

# 獲取端口入流量(Bytes)
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.2.1.2.2.1.10

# 獲取端口出流量(Bytes)
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.2.1.2.2.1.16

# 獲取過去5秒的CPU load (cpu繁忙的百分比)
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.4.1.9.2.1.56.0

# 獲取過去1分鐘的CPU load (cpu繁忙的百分比)
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.4.1.9.2.1.57.0

# 獲取過去5分鐘的CPU load (cpu繁忙的百分比)
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.4.1.9.2.1.58.0

# 獲取內(nèi)存當(dāng)前使用情況(bytes)
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.4.1.9.9.48.1.1.1.5

# 獲取內(nèi)存當(dāng)前空閑多少(bytes)
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.4.1.9.9.48.1.1.1.6

# 獲取設(shè)備序列號(hào)
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.2.1.47.1.1.1.1.11.1
或
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.4.1.9.3.6.3.0

# 獲取設(shè)備名稱
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.2.1.1.5.0

⑥ Grafana圖形化監(jiān)控平臺(tái)配置

在我們布置完多個(gè)telegraf數(shù)據(jù)收集容器和對(duì)應(yīng)的snmp設(shè)置+influxdb容器+grafana容器之后,我們終于可以前往grafana網(wǎng)頁圖形化監(jiān)控平臺(tái)進(jìn)行設(shè)置了。

  • 導(dǎo)入數(shù)據(jù)庫
    首先我們需要導(dǎo)入對(duì)應(yīng)的數(shù)據(jù)庫,前往Grafana的設(shè)置界面,點(diǎn)擊Add Database:

    添加數(shù)據(jù)庫

    我們需要輸入自定義名稱Name,數(shù)據(jù)庫所在對(duì)應(yīng)的地址和端口(默認(rèn)http://localhost:8086),然后設(shè)置需要抓取的database的名稱和對(duì)應(yīng)的賬號(hào)密碼。之后Save&Test就添加完畢了。

  • 設(shè)置dashboard/設(shè)置變量
    在添加了數(shù)據(jù)庫之后,我們就需要開始自定義圖形表,我們首先需要?jiǎng)?chuàng)建一個(gè)面板,然后在面板中設(shè)定各種panel,具體的設(shè)置方法可以查看Grafana官方Docs,對(duì)于Panel的設(shè)定有詳細(xì)的介紹。
    這里我們要主要介紹的技巧是Grafana的$Variable功能,這個(gè)功能對(duì)于數(shù)據(jù)庫有重要的價(jià)值,我們可以設(shè)置數(shù)據(jù)庫tag或者field的篩選條件來產(chǎn)生一個(gè)變量組,這個(gè)變量組或多個(gè)變量組會(huì)以下拉表單的形式出現(xiàn)在整個(gè)dashboard的最上方,作為一個(gè)篩選條件來進(jìn)行使用。有了這些變量,我們面對(duì)大量多為的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的時(shí)候,可以用極少的面板完成對(duì)海量數(shù)據(jù)的呈現(xiàn)。具體方法如下:
    Query代表了數(shù)據(jù)庫的篩選語句,用來獲得tag或者field的全值;Regex是正規(guī)表示法篩選,可以篩選出需要的所有變量,不支持并集

    Dashboard變量設(shè)置

    變量表單效果

  • 批量化panel生成
    Grafana之所以成為我們監(jiān)控架構(gòu)圖形化的選擇,除了開源工具這個(gè)屬性之外,更重要的原因是Grafana支持Json編輯模式,也就是可以直接通過json腳本代碼來生成相關(guān)的面板,對(duì)于幾十到幾百量級(jí)的面板,用python腳本直接生成json是最合適的。
    我們可以制作一個(gè)【面板組】,這個(gè)代表了一個(gè)最小的面單組合單位,然后前往Dashboard設(shè)置面板,可以在JSON Model下看到整個(gè)面板的完全腳本代碼。這個(gè)代碼是高度規(guī)律的,所以我們動(dòng)手直接擼一個(gè)腳本來做循環(huán)輸出就行。大致思路介紹如下,直接在panel[]結(jié)構(gòu)里獲得面板組代碼集,然后用循環(huán)直接去做關(guān)鍵詞替換然后重復(fù)堆疊架構(gòu)就行了,這種批量生成空間復(fù)雜度非常低,哪怕數(shù)萬行也是秒出:
def SwhFuckingNum(i):
    with open('./file2','r+') as d1:
        infos=d1.readlines()
        d1.seek(0,0)
        for line in infos:
            yaxe = (i-1)*5
            line=line.replace('thefuckingport',str(i))
            d1.write(line)
        d1.close()

這部分有兩個(gè)注意點(diǎn),一、注意每個(gè)面板的左上定位點(diǎn)(x,y)的位置和面板尺寸的關(guān)系,做好自動(dòng)演進(jìn)。 二、單個(gè)面板以','結(jié)尾,最后一個(gè)面板無需','結(jié)尾
最后將生成的panel JSON(可能有數(shù)萬甚至數(shù)十萬)集放到Dashboard的panel[]中即可。不過一般在panel數(shù)量多于400的情況下,就不推薦單一面板堆放了。因?yàn)镚rafana的優(yōu)化并不是非常出色,在多面板情境下的反饋速度會(huì)變得很慢。
關(guān)于Grafana的panel JSON構(gòu)造,我會(huì)在之后的更新中詳細(xì)介紹。

  • 最終呈現(xiàn)
    最后呈現(xiàn)的就是一個(gè)非常密集可讀的監(jiān)控面板,如圖:


    N7000全端口監(jiān)控面板
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容