前言:
还记得在去年的笔记中提到过使用python的pysnmp模块,配合Influxdb,Grafana收集Cisco设备指标。链接如下:https://blog.csdn.net/tushanpeipei/article/details/117329794 。在该实例中,我们通过python编写脚本收集设备信息,并将收集的信息格式化后发送到Influxdb进行存储,最后Grfana从Influxdb中读取数据做可视化呈现。总的来说,这种方式需要自己编写python的脚本,虽然灵活性很高,但是相对来说比较麻烦,并且需要一定的代码能力。
前段时间为了进一步提升监控套件的安全性和好用性,对之前的部署方案进行调整。使用Telegraf代替python实现了对设备信息的收集,并且进一步实现了Https加密,AD域用户和告警功能的集成。通过Telegraf-Influxdb-Grafana完成指标监控的这套解决方案也被称为TIG。借着这次机会,我也重新梳理了一下其中各个套件的用处以及与其他特性的集成的方式。
一、认识TIG套件
TIG套件是当下流行的一套设备指标监控解决方案,它由Telegraf-Influxdb-Grafana三个组件组合而成,它们的关系如图1所示:
图1:TIG组件
首先,Telegraf 是一个基于服务器的代理,用于从数据库、系统和物联网传感器收集和发送所有指标和事件。此外,Telegraf 是用 Go 编写的,可以编译成一个没有外部依赖项的二进制文件,并且需要非常小的内存占用。进一步说,Telegraf的组件如图2所示:
图2:Telegraf 组成
上图显示,Telegraf从有四种基本插件类型:Input、processor、aggregator 和 Output 。其中功能如下:
- Input:Telegraf 输入插件从系统、服务和第三方 API 收集指标。
- Processor:处理器插件在发送指标之前转换、修饰和过滤指标,允许收集的数据在数据到达时进行清理。
- Aggregator:聚合器插件创建聚合指标,例如收集和处理的指标的平均值、最小值和最大值。
- Output:输出插件写入各种数据存储、服务和消息队列,如 InfluxDB、Graphite、OpenTSDB、Datadog、Kafka、MQTT、NSQ 等。
首先是Input插件(详情请参考:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/snmp),Telegraf支持多多种Input插件,例如inputs.snmp。此外,Telegraf可以通过2种方式获取目标设备的指标信息,一种是Pull,另外一种则是Push (Traps)。以SNMP插件为例子,在Pull模型中,监控代理会定期向目标设备上运行的 SNMP 代理发送 SNMP 请求。设备上的 SNMP 代理使用特定请求的指标进行响应。在Push模式下,通信从另一端开始。受监控设备(通过 SNMP 代理)将状态消息(Traps)发送到监控系统的Traps接收器。这种模式下没有周期性调度,Traps消息在生成时发送,提供系统和网络性能问题的实时视图。当Telegraf收集到信息后,通过Processor和Aggregator对输入信息进行处理和聚会,并将最终的数据通过Output插件(详情请参考:https://github.com/influxdata/telegraf/tree/master/plugins/outputs)输出到存储端,例如常见与之配套使用的Influxdb数据库。
第二个组件是Influxdb。Influxdb 类似于 SQL 数据库,但在许多方面有所不同。进一步说,Influxdb 专为时间序列数据而构建的高性能数据库。关系数据库可以处理时间序列数据,但并未针对常见的时间序列工作负载进行优化。Influxdb 旨在存储大量时间序列数据并快速对该数据进行实时分析。具体来说,Influxdb会为在每次收集数据时记录对应的时间戳,其记录的数据通常如图3:
图3:Influxdb数据
参数解释如下:
- InfluxDB 测量 ( foodships) 类似于 SQL 数据库表。
- InfluxDB 标签(park_id和planet)就像 SQL 数据库中的索引列。
- InfluxDB 字段 ( #_foodships) 就像 SQL 数据库中的未索引列。
- InfluxDB 点(例如,2015-04-16T12:00:00Z 5)类似于 SQL 行。
补充:与Influxdb相似的时序性监控系统叫做Prometheus(普罗米修斯)。它们有一些不同之处。简而言之,这两个产品都是优秀的时间序列数据库。它们的默认模式不同(InfluxDB 为推送,Prometheus 为拉取)。有些人认为 PromQL,Prometheus 的语言,比 InfluxDB 使用的语言更简单,但总而言之,使用一种工具或另一种工具的决定可能取决于具体的用例。如果监控是我们最感兴趣的,那么 Prometheus 是最安全的选择,因为它具有许多集成和可扩展模型。如果我们更有可能将时间序列数据库用于 IoT、传感器或分析,那么我们可能希望选择 InfluxDB。具体请参考:https://logz.io/blog/prometheus-influxdb/#:~:text=InfluxDB is a push-based,and Prometheus fetches them periodically.
最后一个插件是Grafana,Grafana可谓时当下最受欢迎的开源交互式数据可视化平台,由Grafana Labs 开发,它允许用户通过统一到一个仪表板(或多个仪表板)中的图表和图形来查看他们的数据,以便于解释和理解。仪表盘示例如图4所示:
图4:Grafana Dashboard
此外,Grafana还可以设置告警,一旦设置的告警规则被触发,Grafana则可以发送报警给运维人员。需要注意的是,Grafana仅仅作为数据呈现端,它需要连接数据库并从中提取数据。例如,Influxdb,Prometheus都可以作为Grafana的数据存储端。
二、TIG容器化部署
实验目的:
通过TIG收集Cisco设备的指标信息,并存放在Influxdb数据库中,最后通过Grafana的Dashboard做呈现。此外,考虑到安全性和好用性,本次实验中集成了Https、AD域以及告警功能。
提前准备:
- 搭建AD服务器。
- 搭建CA服务器。
- 搭建SMTP服务器。
- 在Cisco ASA设备上开启SNMP v2c。
TIG套件代码分析:
图5:TIG套件代码
图5展示了TIG容器化部署所需要的代码和文件。首先是三个json的模板,这三个模板其实是通过json文件编写的针对于Cisco设备指标呈现的Dashboard。Dashboard可以自己编写,或者在网上搜索别人共享的文件。接下来Docker-compose.yml,该文件是TIG套件容器化的配置文件。然后是grafana.ini和ldap.toml文件,它们分别是Grafana的配置和AD域集成文件。下一个重要的文件是telegraf.conf文件,我们可以通过配置该文件,从目标设备中获取各种指标信息。最后的2文件个则与Https的证书相关,分别是Grafana Web页面的证书和私钥。接下来是对一些重要文件的解读:
telegraf.conf:
该文件记录了对Telegraf组件的配置信息,其中值得注意的配置有input和output插件。在本次实验中,通过inputs.snmp插件,主动拉取目标设备的指标,如图6所示:
图6:Telegraf inputs.snmp 插件代码
图6中的配置显示了Telegraf通过snmpv2,对IP地址为10.1.102.254的ASA设备的内存,CPU,接口速率等信息进行采集。具体的参数和采集指标可以自行调整。第二个需要配置的是Output插件,由于最终输出的目标是influxdb,所以最终使用的是outputs.influxdb。代码如图7所示:
图7:Telegraf outputs.infuxdb 插件代码
我们需要在此处定义连接的influxdb数据库地址以及登录该数据库的账号密码。
接下来,我们需要对Grafana进行三个配置,分别是配置Https,AD域以及告警。首先是Grafana Web界面的Https的配置。配置Https需要两个关键文件,分别是Grafana Web的证书和私钥。具体来说,私钥和证书都可以通过openssl工具生成,或者通过openssl生成私钥和证书请求文件,再由现有的CA机构签发证书。获得2个文件后,就可以在grafana.ini中开启https并加载上述两个文件,如图8所示:
图8:Grafana https 代码
第二步则是配置集成AD域,首先创建文件ldap.toml定义连接AD域的各种参数,如图9所示:
图9:Grafana AD域参数
由上图可只,集成AD域的参数包含AD服务器地址,端口号,绑定的DN等配置。具体的配置可以根据自己的AD域配置进行修改。紧接着,我们需要将grafana.ini文件中加载AD域配置,如图10所示:
图10:Grafana AD域加载
最后,我们还需要在Grafana中集成告警信息的发送者。该操作同样在grafana.ini文件中进行配置即可,如图11所示。这个SMTP服务器可以是知名的邮件服务商,也可以是自己环境中所搭建的。
图11:Grafana smtp 配置
到此位置,我们将TIG套件的配置已经完成。接下来,需要将其容器化,相关配置在docker-compose.yml文件中进行完成。该文件配置如图12所示:
图12:TIG docker-compose文件
具体来说,在该文件中定义了三个套件所用的容器image,influxdb的数据库名称,数据库管理员账户,端口映射,以及将三个套件的配置文件等信息通过卷挂载的形式映射到了容器中。此外,TIG三个套件还需要通过定义的TIG_net桥接网络进行通信。
完成上述配置后,仅需要在进入docker-compose.yml文件所在目录,输入命令:docker-compose up -d 即可容器化部署TIG。
代码下载地址: https://github.com/Prin-Meng/telegraf_influxdb_grafana
三、TIG套件应用示例
首先,我们可以使用https://IP地址:3000登录Grafana的Web界面,如图13所示:
图13:Grafana登录界面
接下来,在Grafana的Data Source界面添加influxdb,如图14所示。其中需要配置的是influxdb的url,以及连接该数据库管理员的账号密码。
图14:Grafana连接Influxdb数据库
添加成功后,我们导入监控设备的Dashboard文件。本次实验的目的是收集Cisco ASA的指标,则只需要在图15的界面导入准备好的ASA SNMP monitor.json文件即可即可:
图15:Grafana导入Dashboard
完成上述步骤后,即可等待Telegraf收集数据并通过Grafana做呈现了,如图16所示,可以看到目前收集到的Cisco ASA的内存利用率,CPU利用率,接口速率等信息。
图16:TIG 监控 Cisco ASA
最后,我们需要在Grafana的alert界面配置Grafana 的告警信息,配置页面如图17所示。
图17:Grafana告警配置
需要注意的是,Grafana 8以后的告警界面和之前的Grafana有较大的区别,功能更新强大但相对复杂。我们需要设置的内容包括:告警的规则,告警信息的内容,告警的联系方式,管理员联系地址,通知策略等。进一步说,告警示意图架构如图18所示:
图18:Grafana告警架构
具体的告警配置步骤可以参考:
https://www.youtube.com/watch?v=UtmmhLraSnE,https://grafana.com/docs/grafana/latest/alerting/
参考资料
SNMP 代理协议监控: https://www.influxdata.com/integration/snmp/
比较 InfluxDB 和 SQL 数据库: https://docs.influxdata.com/influxdb/v1.8/concepts/crosswalk/
Prometheus 与 InfluxDB:监控比较:https://logz.io/blog/prometheus-influxdb/#:~:text=InfluxDB is a push-based,and Prometheus fetches them periodically.
乾颐堂现任明教教主教主技术进化论 2020第21期.InfluxDB Python实战: https://www.bilibili.com/video/BV1SV41127HU?from=search&seid=13988085653859648559