告警通知

NotifyChannels是个数组,可以写多个,告警规则配置页面,展示的通知媒介,就是读取的这个配置文件的内容。

ContactKeys也是个数组,用于控制用户的联系方式的配置,在个人中心编辑用户信息的时候,除了手机号、邮箱,还可以为用户配置多种联系方式,多种联系方式也是可以自定义的,就是通过上面的配置来控制。

基于上面的配置,我们可以为某个告警规则指定通知媒介了,也可以为告警接收人配置手机号、邮箱、相关的机器人Token了,具体做发送的时候就不是webapi来处理了,是server模块来处理,所以下面我们再来看server的配置。

server.conf

  1. Host = "smtp.163.com"
  2. Port = 994
  3. User = "username"
  4. Pass = "password"
  5. From = "username@163.com"
  6. InsecureSkipVerify = true
  7. Batch = 5
  8. [Alerting]
  9. TemplatesDir = "./etc/template"
  10. NotifyConcurrency = 10
  11. # use builtin go code notify
  12. NotifyBuiltinChannels = ["email", "dingtalk", "wecom", "feishu"]
  13. [Alerting.CallScript]
  14. # so, no need enable script sender
  15. Enable = false
  16. ScriptPath = "./etc/script/notify.py"
  17. Enable = false
  18. # use a plugin via `go build -buildmode=plugin -o notify.so`
  19. PluginPath = "./etc/script/notify.so"
  20. # The first letter must be capitalized to be exported
  21. Caller = "N9eCaller"
  22. [Alerting.RedisPub]
  23. Enable = false
  24. # complete redis key: ${ChannelPrefix} + ${Cluster}
  25. ChannelPrefix = "/alerts/"
  26. [Alerting.Webhook]
  27. Enable = false
  28. Url = "http://a.com/n9e/callback"
  29. BasicAuthUser = ""
  30. BasicAuthPass = ""
  31. Headers = ["Content-Type", "application/json", "X-From", "N9E"]
  • TemplatesDir指定模板文件的目录,这个目录下有多个模板文件,遵从Go Template语法,可以控制告警发送的消息的格式
  • NotifyConcurrency 表示并发度,可以维持默认,处理不过来了,有事件堆积(事件是否堆积可以查看n9e-server的这个指标:n9e_server_alert_queue_size,通过 /metrics 接口暴露的)了再调大
  • NotifyBuiltinChannels 是配置Go代码内置的通知媒介,默认4个通知媒介都让Go代码来做,如果某些通知媒介想做一些自定义,可以从这个数组中删除对应的通知媒介,Go代码就不处理那个通知媒介了,自定义的通知媒介可以在后面介绍的脚本里自行处理,灵活自定义
  1. [Alerting.CallScript]
  2. # so, no need enable script sender
  3. Enable = false
  4. ScriptPath = "./etc/script/notify.py"

CallScript是配置告警通知脚本的,如果没有自定义的需求,Go内置的4种发送通道 ["email", "dingtalk", "wecom", "feishu"] 完全可以满足需求,这个CallScript是无需关注的,所以默认Enable=false

如果内置的发送逻辑搞不定了,比如想支持短信、电话等通知方式,就可以启用CallScript,夜莺发现这里的Enable=true且指定了一个脚本,就会去执行这个脚本,把告警事件的内容发给这个脚本,由这个脚本做后续处理。

告警事件是怎么发给这个脚本的呢?系统会把告警事件的内容encode成json,然后通过stdin的方式传给notify.py。notify.py的脚本里有这么几行,大家可以看一下:

notify.py的同级目录,还有一个notify.bak.py,很多逻辑可以参考这个脚本。因为夜莺刚开始的版本发送告警只能通过脚本来做,后来才内置到go代码中的,所以,notify.bak.py里备份了很多老的逻辑,大家可以参考。

  1. [Alerting.CallPlugin]
  2. Enable = false
  3. # use a plugin via `go build -buildmode=plugin -o notify.so`
  4. PluginPath = "./etc/script/notify.so"
  5. # The first letter must be capitalized to be exported
  6. Caller = "N9eCaller"

CallPlugin是动态链接库的方式加载外部逻辑,有个小文档可以参考: 非Go玩家,就不建议了解了,Go玩家,我就不用讲你也应该会了。

这个配置如果开启,n9e-server会把生成的告警事件publish给redis,如果用户有自定义的逻辑,可以去subscribe,然后自行处理。

  1. [Alerting.Webhook]
  2. Enable = false
  3. Url = "http://a.com/n9e/callback"
  4. BasicAuthUser = ""
  5. BasicAuthPass = ""