在之前博文Sensu初探中介绍了
本篇将从实战来介绍Sensu如何实现轻量级的监控。
[Sensu安装配置]
Sensu安装及其配置参见其官网文档 Sensu
Sensu-server依赖rabbitmq-server和redis-server,这里建议redis-server使用2.8版本以上的,主要是作者在部署的时候想用redis-sentinel做一个redis的监控,从而保证整套系统的高可用。低版本的redis也是够用的。
web界面使用uchiwa。
监控无非就是我们挑一个时间,针对一个地方上的一个对象,获取其执行的状态信息。我们更进一步希望能将这个信息捞出来,并通过一定途径传递出去。
为什么说Sensu轻量呢,一方面是因为Sensu代码轻量,另一方面Sensu更主要是做了一个框架的事情。
我们先理解Sensu是一个远程执行脚本的工具,这里的脚本不限形式,可以是shell,python或者是ruby等,任何一个脚本语言。为了做到监控,sensu引入了定时器功能,亦就是我们可以让客户端上某个脚本定时执行,类似cron任务一样。地点即是sensu-client所在的那台机器。那么怎么监控对象呢?那这个sensu就不管了,我们就需要使用自己写的一些脚本去获取该对象的一些状态信息,这样的好处是灵活,但若是一个服务并没有提供任何client和api,那这种情况是不适合使用sensu进行监控的。sensu对这个脚本开头没有什么规定,但对这个脚本结尾有规定。那就是脚本在退出时返回值限于(0,1,2,3)并且规定 0 : ok,即服务运行正常;1 : warning,即服务存在一定问题;2 : critical,即出现了严重的错误;3 : 自定义。这些规定并不是强约束的,只是sensu-server通过这些返回值可以选择触发handler(另一些脚本)。因此,我们可以根据自己的需要,重新定义这些返回值。那么handler就是我们传输这些错误信息的途径了,可以是SMS,email,etc..
上面一堆废话只是希望读者能大致对sensu实现监控有一个印象,请原谅作者当年上语文课时的放荡不羁。
[第一个check]
1.我们需要在 sensu-server 中定义check
很明显,定义是一个json格式。这里详细介绍一下各个参数意思。
有了这个check-define后,我们的sensu-server就会每60s推出一个命令至rabbitmq,sensu-client会监听rabbitmq ,消费感兴趣(subscriptions)的消息。
2.我们定义一个client
client定义非常简单,它只需要告知服务器自己的一些基本信息以及自己感兴趣的check。
3.编一个需要远程执行的脚本
脚本复杂与否,看自己的心情,注意的是就是要满足sensu的格式。
这是一个sh脚本
echo出的信息,sensu会通过返回的[output]字段返回。
exit 出的信息,sensu会通过[status]字段返回。
有了上述三步后,我们已经可以每60s在该节点上执行一个脚本,然后将信息返回至sensu-server。
接下来我们来完成最后一步,就是拿到返回状态后,我们做什么。
4.定义一个handler
5.实现一个email报警
我是使用python实现email报警的,这里相信大家可以轻松在网上找到实例。所以主要介绍一下我们拿到的返回值都有哪些,方便大家过滤出自己感兴趣的内容。
这是一个client执行完脚本后的返回值,在server端捕捉到的。
可以挑选一些自己关注的字段,用email传出。
至此我们实现了一个简单的监控。虽然简单,不过完整。
总体感觉对一些较为轻量的服务监控使用sensu还是蛮顺手的,比如监控rabbitmq队列情况,负载等。
sensu还提供了一些其他特性,例如事先不需要定义脚本,通过api将脚本内容直接传递至client,然后执行,或者是将所有节点返回结果汇合后发至server。这些其他特性可以进一步参见官网文档。