Nova Kwok's Awesome Blog

在 Telegram 中管理主机监控和警报信息

服务器监控的重要性不言而喻,之前在 搭建好了大内网 解决了服务器之间的跨地区传输数据的安全问题之后就搭建了一个 Grafana + InfluxDB + Telegraf 的栈用于对服务器的负载等信息进行监控,除了最近遇到一些自己配置上的小问题以外,工作一直良好。

Alert Pushing

由于自己的主机很少出问题,所以一直没有注意过警报推送的问题,之前默认都是通过邮件进行推送的,但是这样就会有一个问题:

你不能指望你的邮件服务器可以给你的邮件客户端及时推送,也不能指望你的邮件客户端可以保持常开

所以对于主机监控警报的推送来说,可能需要找一些第三方平台了,首先我们肯定不会去用 DingTalk/WeChat,毕竟:

你不能指望一个 (疯狂要权限|消息不加密|走国内平台|桌面版客户端几乎不可用|跨平台就别想了|运作逻辑不开放|接不上 IFTTT|还要实名认证) 的软件可以帮你做什么。

为了解决利用一个通讯工具在被要求交出手机前实现大一统消息推送和管理的需求,这里准备使用 Telegram 进行管理监控信息,实现思路如下:

对于后者相信有 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,完工~

References

  1. Telegram Alert Channel configuration - Configuration - Grafana Community
  2. Alerting Notifications | Grafana Documentation

#Chinese #Grafana #Telegram