在 Telegram 中管理主机监控和警报信息
服务器监控的重要性不言而喻,之前在 搭建好了大内网 解决了服务器之间的跨地区传输数据的安全问题之后就搭建了一个 Grafana + InfluxDB + Telegraf 的栈用于对服务器的负载等信息进行监控,除了最近遇到一些自己配置上的小问题以外,工作一直良好。
Alert Pushing
由于自己的主机很少出问题,所以一直没有注意过警报推送的问题,之前默认都是通过邮件进行推送的,但是这样就会有一个问题:
你不能指望你的邮件服务器可以给你的邮件客户端及时推送,也不能指望你的邮件客户端可以保持常开
所以对于主机监控警报的推送来说,可能需要找一些第三方平台了,首先我们肯定不会去用 DingTalk/WeChat,毕竟:
你不能指望一个
(疯狂要权限|消息不加密|走国内平台|桌面版客户端几乎不可用|跨平台就别想了|运作逻辑不开放|接不上 IFTTT|还要实名认证)
的软件可以帮你做什么。
为了解决利用一个通讯工具在被要求交出手机前实现大一统消息推送和管理的需求,这里准备使用 Telegram 进行管理监控信息,实现思路如下:
- 在主机在线时:主机的各个性能方面警告(最简单的比如 CPU 占用率),通过 Grafana 统计得出,并直接推送到自己的 Telegram Bot 上。
- 当主机不慎掉线时:Uptimerobot 会通过 RSS 的方式发送,并且用 IFTTT 监控 RSS Feed 进行推送。
对于后者相信有 IFTTT 使用经验的人都会做,也就是点几下鼠标的事情,前者似乎才是有一定难度的地方,毕竟我在自己配置的过程中踩了一些坑。
Grafana + Telegram Bot
Create Telegram Bot
首先创建一个 Bot 并且把这个 Bot 邀请到自己的 Group 中。
创建一个 Bot 对于大家来说绝非难事,找到
@BotFather
然后发一个/newbot
就好了,很容易的。
创建好 Bot 之后会看到类似如下一段话:
Done! Congratulations on your new bot. You will find it at t.me/xxxyyyzzz_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.
Use this token to access the HTTP API:
931234567:MSDAJ3p8***jsW7fhj
Keep your token secure and store it safely, it can be used by anyone to control your bot.
For a description of the Bot API, see this page: https://core.telegram.org/bots/api
注意上文中数字加冒号的部分是 API 的 Token,如果你已经邀请好了你的 Bot,可以通过访问以下地址:
https://api.telegram.org/bot<TOKEN>/getUpdates
其中<TOKEN>
部分直接替换为那个 Token,例如:
https://api.telegram.org/bot931234567:MSDAJ3p8***jsW7fhj/getUpdates
可以得到类似如下 JSON 结果:
我们需要的是 chat 下的 id,也就是那个 -2421379 这样的值。
Define Grafana Alert Channels
在 Grafana 的 Notification Channels 中加入一个 Telegram 的 Channel 就好了。(什么,你找不到「Notification Channels」,在面板左侧那一条中)
这样我们已经写好了警报推送通道,现在就是定义警报触发条件了。
Grafana Alert Trigger
对于某一个 Dashboard 点 Edit 之后可以设置警报的触发条件,由于是对于生产环境服务器的警报,所以其实有很多的触发可能,最容易想到的可能就是 CPU 的长时间高负荷和高内存占用(考虑溢出的可能),当然在很多时候这个标准并不绝对,例如在 YunLoad 的一个业务中有一个关键功能就是会涉及到长达几分钟的高 CPU 占用,若设置不当容易误触警报让自己梦中惊醒。
如果你和我一样偷懒使用 5955 面板的话,在 Test 的时候很有可能会遇到:
tsdb.HandleRequest() error time: invalid duration $inter
这个时候看对应 Query 底下的 Min time interval 可以发现其中的值是 $inter
,也就导致了上述问题,为了避免这样的问题,我的解决方案是把 $inter
替换掉,顺带重写了一下 Query
的部分(默认的 query 叫 B,新建了一个 Query A),比如某一台机器的 CPU 信息可以如下写(当然,要创建一个 Query 并没有这么复杂,现在的 Grafana 其实有图形界面可以直接点点点啦~):
SELECT percentile("usage_user", 95) AS "HKG_CPU" FROM "cpu" WHERE ("cpu" = 'cpu-total' AND "host" = 'hkg-novanetwork') AND $timeFilter GROUP BY time($__interval) fill(null)
然后设置好条件就可以啦,还有一个坑在于 query 的时间间隔,如果太长的话容易导致数据接受延迟,太短的话,容易读不到数据。
接下来就是邀请所有 NOC 的同学进入你的 Group,完工~