写在前面

监控系统这个话题很大。
但一个基本的监控系统归纳起来,无非也就是数据采集、传输、存储、查询这么几个部分。
本文尝试从宏观上分析这几个模块在实践上遇到的一些问题,在我司的最佳实践解法,及本人对各个模块在实践中的一些思考。

采集

可以说,凡采集必定有一个(多个)采集agent在后台工作。
而采集从数据来源上分类,分为2种:

  1. 预定义指标
  2. 自定义指标

预定义指标

凡是预置在采集agent内部的,例如cpu、mem、io等基础资源,都可归于预定义指标。

预定义指标有2个重要的特点:

  1. 数量可控
  2. 增加预定义指标相对较贵

数量可控是指,无论是cpu.idleio.util这些固定数量的指标,还是disk.used{mount=/}cpu.idle.core{core=1}这些变化范围有限的指标, 都是有限数量的指标。

还有一类指标,虽然来源是用户自定义,但反映在指标量上,也应该归于预定义指标的范畴。例如端口监控、进程监控等。每增加一个端口监控,那么只会多产出一个指标。每增加一个进程监控,也只会多出有限的几个指标,例如proc1.cpu、proc1.mem.used等。

预定义指标的增加,因为是预置在采集agent中的采集,所以预定义指标的增加就相对麻烦一些。
例如原来有cpu.idle、cpu.user、cpu.sys了,但现在推进虚拟化,需要增加cpu.steal,而面对已经在线上几万、甚至是几十万台已经部署好了的agent,在存在网络分区、差异化配置等场景下的升级,就成为了一个问题。
这个升级的动作在我司曾进行了几个月之久,原因就是业务线对监控对依赖太重了,重到有任何的风吹草动,都可能引起业务恐慌

一个解决方案是,如果有配置化采集目标的手段,这个痛就可以大大缓解了。当然这也只是一个脑洞,目前还未看到有类似此类解法的实现。

自定义指标

说完了预定义指标,再来说自定义指标。

相对预定义指标,自定义指标的一大特点也是令人头疼的特点就是,自定义指标的数量完全不受控

例如在我司,可以看到各种令人哭笑不得的指标:

  • 带有session id、订单id及各种id的指标。这种指标往往一个tag key中就有几十万、上百万的tag value
  • 带有tcp source端临时端口的指标
  • 带有公网上尝试sql注入、尝试寻找管理后台入口的url的指标
  • 将响应时间作为tag value的指标

我司的指标量曾有几千万增长/天的记录。对于整个监控系统尤其时序数据库和监控开发同学来说,都是灾难。

可以说,对于现有的任何时序数据库来讲,上述的几种指标,都是令人头疼和难以处理的。

如何应对这种低质量指标(我们定义为垃圾指标)数量的快速增长。回顾我司的监控系统发展,大概经历了这么几个阶段:

  1. 重启存储模块
  2. 黑名单机制
  3. 拦截机制
  4. quota机制
  5. 智能拦截

在我司还是使用influxdb作为存储模块的时代,存储很容易被这种突然增长的指标搞挂掉,那么解决办法是什么,重启influxdb...,除了重启存储模块, 面对这种垃圾指标上报,我们当时可以说没有有效的办法。

随着监控系统的重构、升级,在完成基于open-falcon存储的监控系统重构后,我们随之也建设了一套黑名单机制,在传输链路中插入了一个过滤逻辑。在基于增量统计的统计模块发现垃圾指标后,我们手工配置在黑名单系统中,这样对应的指标就不能再上报。

但黑名单机制仍然需要人工介入,所以有了接下来的拦截机制,即发现了垃圾指标后,对这个指标自动进行随机丢弃

但这种方式是有问题的,指标量仍然在缓慢的增长,而且对用户来说也非常不友好。
此时,quota机制成为我们治理垃圾指标的另一个选择。
quota机制很简单,甚至说是粗暴。即在某个维度上,只能上报指定数量的指标
大于这个数量的新增指标,那么直接被丢弃。而原来未触发上限的指标,仍可继续上报。

quota机制一方面可以减轻监控系统的压力,另一方面,也能push用户自己提高上报的监控指标的质量。

智能拦截这个方向,是我们一直努力但又由于种种原因而未施行的方向。其难度与反爬虫和接入层的waf都是相当的。

可以看出,整个对于垃圾指标的拦截、治理总结起来有2点:

  1. 拦截的动作,越靠近采集层越好。当垃圾数据已经走遍奇经八脉到了存储了,治理这个话题差不多就成为一个伪话题了。做系统的一定要把风险扼杀于萌芽状态
  2. 人是不靠谱的。不管是忙于业务还是其他什么原因,用户从来都不会主动提升监控指标的质量。
    对于这些用户来讲,监控系统和casual sexual behavior很像,从来都不会考虑与其稳定发展,而在需要的时候又希望其能给自己带来惊喜。
    我想,很多的基础组件/服务,都会受到用户如此的看待吧。sigh…

篇尾语

本文是<监控系统构建实践>系列的第一篇,以后还会有传输篇、存储篇、查询篇、报警篇等系列文章,敬请期待 。

-EOF-