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全端口监控面板
相关文章
相关标签/搜索