Telegraf+SNMP+Grafana構建企業級交換機監控

一、架構功能需求

筆者在最近的項目中遇到了須要將一個大型組織的所有交換機以及N7000核心交換機配置監控架構的需求。該需求主要有以下的條目:python

  • N7000配置全端口的詳細上下行和監控和報錯計數。
  • 普通交換機配置Tel1/0/1和Tel1/0/2的上下行監控和報錯計數。
  • 全部交換機配置運行時間uptime和CPU使用狀況監控。

在本次項目中全部交換機的型號都是思科C2960系列。docker

二、思路設計

因爲是一個落地項目,且考慮到需求的數據更新頻率是5sec,所以整個框架的數據壓力並非很是大,本着遷移方便和維護簡便的原則,把全部的框架所有配置到docker容器環境下。因爲N7000須要分端口監控,所以配置了兩個數據抓取容器,而後彙總到同一個數據庫,而後進行可視化處理。數據庫

所以我想到了使用influxdata系列的開源數據工具,這套工具包含了InfluxDB,Telegraf,Chronograf,Kapacitor四項,分別對應了數據庫、數據收集、數據可視化呈現、自定義報警四個功能。俗稱TICK套餐。不過在本次案例中並不須要使用Chronograf和Kapacitor,緣由是有更好的替代品:Grafana。json

全部的工具都架設在同一個虛擬機上,這種中小型規模的數據流並不須要集羣或者hadoop之類的工具去跑,若是有數據安全的需求,在其餘的物理機上對influxdb和telegraf的配置文件作一個動態增量備份就行。vim

具體流程以下: api

基本監控流程

其中數據的抓取處理部分所有在容器中配置。安全

三、具體流程

① 建立一臺虛擬主機

經過VMware等工具在服務器上配置一臺4核以上的虛擬機,這臺虛擬機將做爲容器服務器來運做。bash

② 安裝並配置Telegraf和Influxdb

首先在虛擬機上安裝telegraf和influxdb,而且配置/etc/influxdb/influxdb.conf/etc/telegraf/telegraf.conf。這一步的目的是爲了以後起容器的時候可以直接-v調用相關的配置文件,同時能夠輕鬆的修改相關的配置文件。服務器

  • 偷懶方法 若是已經在其餘機器上配置過influxdb和telegraf,或者從官網獲取了原版的conf文件,則能夠直接mkdir /etc/influxdb/mkdir /etc/telegraf/,在裏面cp對應的配置conf文件進行配置編輯便可。
$ 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等網站查看基礎配置的設定,根據自身的需求來設置。網絡

③ 配置容器環境

配置完conf文件以後咱們來啓動telegraf和influxdb的容器進程,這個過程當中系統會自動拉取docker.o雲端的程序包。請耐心等待。咱們也能夠經過下面的指令手動拉取:

$ docker pull telegraf
$ docker pull influxdb
複製代碼

或者直接啓動容器進程:

  • 啓動influxdb docker,設置端口8086,固然你也能夠設定成你須要的端口。
$ 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
複製代碼
  • 啓動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
複製代碼
  • 啓動telegraf docker
$ docker run -d \
--name telegraf \
--network host \
-v /etc/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf \
docker.io/telegraf
複製代碼

這裏須要注意的是,咱們因爲須要監控N7000和交換機,且這兩種機器的需求、OID映射都徹底不一樣,所以強烈建議配置兩個不一樣的telegraf.conf文件,起兩個不一樣的容器進行數據收集,這樣能夠避免大量無效的空條目產生。

至此,本監控框架的基本容器環境配置已經完成,以後開始進行SNMP數據抓取的配置。咱們能夠經過以下網址進入Grafana圖形化監控總檯:

http://localhost:3000/
複製代碼

以後的設置會在下面介紹。

④ SNMP交換機數據抓取

SNMP技術是簡單網絡管理協議(Simple Network Management Protocol)的簡稱,也就是一種簡化的網絡管理工具,能夠提供管理、數據收集、發包控制等等的簡單網絡功能,其利用的oid系統對於中小規模的數據抓取需求簡直是完美適配。而咱們此次選擇的telegraf配置工具對於snmp的支持也是很是的完美。

首先經過$ vim /etc/telegraf/telegraf.conf進入telegraf配置文件的編輯模式。在指令模式下/inputs.snmp來到snmp配置部分(telegraf支持的工具超超超多,因此配置文件幾千行),以後根據配置文件中的提示來進行配置便可。

其中在oid寫入部分通常推薦使用[[inputs.snmp.field]]類的抓取方案。關於oid,是用來對應交換機等硬件的詳細狀態信息的動態api接口名稱,全稱Object Identifier。一個可用的案例以下:

[[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的對照表,咱們就能夠精確抓到相關交換機硬件軟件的動態數據信息。經過,snmp還提供相關的工具幫咱們直接驗證oid的可用性。咱們能夠安裝snmpwalk檢測工具,以CentOS爲例:

$ yum install -y net-snmp
$ yum install -y net-snmp-utils
複製代碼

而後能夠用下面的指令格式查詢oid的有效性。同時有個注意點,在telegraf的inputs.snmp部分寫入的oid,必須是oid樹結構的末梢,若是飛末梢會致使讀到的是數據表而非單一值,而沒法寫入influxdb中。

$ snmpwalk -v 2 -c YourCommunity <IP/URL> <oid>
複製代碼

在肯定全部的oid可用的狀況下,就能夠編輯telegraf.conf並保存,而後從新起一個telegraf docker容器開始進行數據的收集了,順利的話數據會馬上被寫入到influxdb中對應的database裏面。而後咱們就能夠前往Grafana平臺進行使用了。

⑤ 思科C2960經常使用oid表

考慮到思科官網oid查詢系統的反人類程度,以及大多數人並不會特意去官網下載oid對照映射手冊,下面會列出思科C2960系列最經常使用的一些oid對照表。至於N7000系列的端口對照表仍是請動手下載官方手冊進行查詢,由於那是一個無序表,連接爲:思科設備OID對照查詢工具

# 獲取端口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地址對應的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

# 獲取內存當前使用狀況(bytes)
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.4.1.9.9.48.1.1.1.5

# 獲取內存當前空閒多少(bytes)
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.4.1.9.9.48.1.1.1.6

# 獲取設備序列號
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

# 獲取設備名稱
snmpwalk -v 2c -c Public 192.168.232.25 1.3.6.1.2.1.1.5.0
複製代碼

⑥ Grafana圖形化監控平臺配置

在咱們佈置完多個telegraf數據收集容器和對應的snmp設置+influxdb容器+grafana容器以後,咱們終於能夠前往grafana網頁圖形化監控平臺進行設置了。

  • 導入數據庫 首先咱們須要導入對應的數據庫,前往Grafana的設置界面,點擊Add Database:

    添加數據庫
    咱們須要輸入自定義名稱Name,數據庫所在對應的地址和端口(默認http://localhost:8086),而後設置須要抓取的database的名稱和對應的帳號密碼。以後Save&Test就添加完畢了。

  • 設置dashboard/設置變量 在添加了數據庫以後,咱們就須要開始自定義圖形表,咱們首先須要建立一個面板,而後在面板中設定各類panel,具體的設置方法能夠查看Grafana官方Docs,對於Panel的設定有詳細的介紹。 這裏咱們要主要介紹的技巧是Grafana的$Variable功能,這個功能對於數據庫有重要的價值,咱們能夠設置數據庫tag或者field的篩選條件來產生一個變量組,這個變量組或多個變量組會如下拉表單的形式出如今整個dashboard的最上方,做爲一個篩選條件來進行使用。有了這些變量,咱們面對大量多爲的數據存儲結構的時候,能夠用極少的面板完成對海量數據的呈現。具體方法以下: Query表明了數據庫的篩選語句,用來得到tag或者field的全值;Regex是正規表示法篩選,能夠篩選出須要的全部變量,不支持並集

    Dashboard變量設置
    變量表單效果

  • 批量化panel生成 Grafana之因此成爲咱們監控架構圖形化的選擇,除了開源工具這個屬性以外,更重要的緣由是Grafana支持Json編輯模式,也就是能夠直接經過json腳本代碼來生成相關的面板,對於幾十到幾百量級的面板,用python腳本直接生成json是最合適的。 咱們能夠製做一個【面板組】,這個表明了一個最小的面單組合單位,而後前往Dashboard設置面板,能夠在JSON Model下看到整個面板的徹底腳本代碼。這個代碼是高度規律的,因此咱們動手直接擼一個腳原本作循環輸出就行。大體思路介紹以下,直接在panel[]結構裏得到面板組代碼集,而後用循環直接去作關鍵詞替換而後重複堆疊架構就好了,這種批量生成空間複雜度很是低,哪怕數萬行也是秒出:

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()
複製代碼

這部分有兩個注意點,1、注意每一個面板的左上定位點(x,y)的位置和麪板尺寸的關係,作好自動演進。 2、單個面板以','結尾,最後一個面板無需','結尾。 最後將生成的panel JSON(可能有數萬甚至數十萬)集放到Dashboard的panel[]中便可。不過通常在panel數量多於400的狀況下,就不推薦單一面板堆放了。由於Grafana的優化並非很是出色,在多面板情境下的反饋速度會變得很慢。 關於Grafana的panel JSON構造,我會在以後的更新中詳細介紹。

  • 最終呈現 最後呈現的就是一個很是密集可讀的監控面板,如圖:
    N7000全端口監控面板
相關文章
相關標籤/搜索