基于Telegraf和InfluxDB的url监控方案

概述

url监控功能需求

  • 面向用户提供一个表单,提交要监控的url
  • 支持GET、POST以及Header参数
  • 支持多种匹配规则(状态码、匹配字符串、响应时间)
  • 用户定义监控频率

基于zabbix的web scenarios实现过一种url监控,优点是zabbix的触发器功能很好用,缺点是:

  • 和其他系统的结合有些不够方便灵活
  • item名称长度有限制,不能显示完整的url
  • 无法记录请求失败时的网页内容(只告诉你匹配失败了)
  • 多节点监控不好做

目前使用Telegraf+InfluxDB+Kapacitor的方案。influxdb支持push任意tags和fields(指标),因此可以很方便的记录url,url归属的app,失败时的返回数据,甚至阈值匹配结果。多节点支持也比较方便,直接部署多个Telegraf节点就可以了,需要解决的就是配置文件分发的问题,即让Telegraf知道哪些配置文件是需要监控的。

整体架构图如下

监控核心

核心监控程序是Telegraf的一个url_monitor插件,根据Telegraf官方插件http_response修改而来,配置文件样例:

Measurements & Fields:

  • url_monitor
  • response_time (float, seconds)
  • http_code (int) #The code received
  • data_match
  • time_match
  • code_match
  • require_code
  • require_str
  • require_time

注意三个形如 *_match 的fields,此处是直接通过url_monitor插件来检查url是否匹配 require_*定义的内容,匹配则为1,不匹配为0,这样做的目的是报警脚本方便处理。

Tags:

  • app
  • cmdbid
  • url
  • method

输出样例:

生产环境使用InfluxDB存储Telegraf监控数据

多节点监控

telegraf-url-client,此项目提供初始化监控节点的脚本:

启动Telegraf

telegraf-url-client中包含一个脚本telegraf-cron.shinit.sh脚本会自动配置cron,该脚本会定期从Gitlab pull最新配置,并检查自己节点的配置是否有更新,如有,则reload Telegraf。

Gitlab存储监控配置

根据上一节,gitlab存储配置的时候结构:

即以节点名称作为目录名称。

以此基础编写urlmon.py脚本,设置定时任务,监控iTop中Url类的更新,转换成Telegraf配置文件,然后提交到Gitlab。

报警

使用Kapacitor,参考http://www.annhe.net/article-3580.html

tickscript样例

由第一小节(监控核心)可知,每个url都有一个叫app的tag,app的联系人存储在CMDB中,zabbix-alert是针对zabbix写的一个报警脚本,支持通过特定字段从CMDB取联系人,以及简单的报警合并。k2zabbix.py将Kapacitor产生的报警转换成zabbix-alert能够处理的格式,zabbix-alert通过app标签来确定报警该发给谁,并且会合并某段时间(比如1分钟内)某app所有报警的url,防止报警风暴。

Alerta展示报警

用户界面

在iTop中定义了一个Url类作为用户操作url监控界面,并做了权限限定,用户能对自己名下app的url做增、删(下线)、改、上线、暂停监控操作。

展示

使用Grafana,并且在iTop的Url类中新增一个tab,将Grafana页面嵌入iTop。

存在的问题

目前存在的问题有

  • Kapacitor不方便做类似 zabbix count(#3,1)这样的触发器,即连续3个点等于某个值。以滑动窗口中异常值的比例来触发报警,会因为监控频率的不同,导致失败次数的阈值也不同,比如窗口是3分钟,某些url监控频率是2分钟,那么一个窗口中只能落入一个点,这个点故障了,那窗口异常值比例就是100%,就触发报警了
  • 节点区分还比较粗放,一个url只对应一个监控点,只能简单的区分地区,减少了异国(地区)监控因网络问题导致的误报。理想情况是一个url能选择多个监控点,这样就能分运营商做监控
  • 节点扩容尚未考虑。目前的运行情况来看,普通4核8G虚拟机跑个几千url还是不成问题的。后续在考虑扩容问题

附录

由于此方案很杂乱,各种脚本拼凑。这里列出用到的程序及链接


4 thoughts on “基于Telegraf和InfluxDB的url监控方案

  1. telegraf 使用 inputs.logparser.grok,patterns = ["%{COMBINED_LOG_FORMAT}"],custom_patterns 自定义匹配,怎们指定这里面的匹配为 tag 呢?

  2. 最近准备用kapacitor,不过不确定性能。。想问下楼主有没有对kapacitor做过性能测试一类的工作?还有总体觉得好用吗?

回复 annhe 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注