夜莺和自定义告警通知脚本如何联动?

要添加自定义的告警通知的媒介,首先需要在页面菜单系统设置-通知设置-通知媒介中添加自定义的通知媒介,例如添加短信,标识设置为sms,状态为不隐藏。添加配置后再去告警规则配置页面就能够看到新增的媒介了。

其次,自定义通知媒介需要执行自定义的脚本,这个脚本需要在系统配置-通知设置-通知脚本里设置。设置通知脚本状态为启用,设置合理超时时间,最重要的就是设置脚本,有两种方式:

  1. 使用脚本,直接粘贴Python脚本内容
  2. 使用路径,设置脚本存放的路径

不过建议是使用脚本,直接粘贴脚本内容,因为存放路径方式在集群部署时相对麻烦一些,需要在每个n9e/n9e-alert所在机器上放置脚本文件。

脚本文件可以参考etc/script/notify.py来改写。上例中,新增的告警媒介标识是sms,所以脚本文件里我们要自定义一个send_sms方法来发送对应的告警通知。

  1. class Sender(object):
  2. ...
  3. @classmethod
  4. def send_sms(cls, payload):# 自定义短信通知媒介方法
  5. users = payload.get('event').get("notify_users_obj") # 获取所有接收通知的用户
  6. phones = {}
  7. for u in users:# 遍历用户获取手机号
  8. if u.get("phone"):
  9. phones[u.get("phone")] = 1
  10. if phones:
  11. # 核心是改写这个逻辑,调用自己公司的短信发送接口
  12. print("send_sms not implemented, phones: {}".format(phones.keys()))
  13. def main():
  14. # 获取标准输入的json数据
  15. # 脚本要能发送告警消息,得先拿到告警事件详情,夜莺会把告警事件 encoding 成 json 字符串,通过 stdin 的方式传给脚本
  16. payload = json.load(sys.stdin)
  17. # 为了方便调试,可以把告警事件的内容写到文件里,这样我们就知道夜莺通过 stdin 传过来的 json 是什么样的
  18. with open(".payload", 'w') as f:
  19. f.write(json.dumps(payload, indent=4))
  20. # json 包含两个属性,其中 tpls 属性就是通知内容,可以在通知模版(系统设置-通知模板)中自行修改
  21. # event 属性包含了这条告警的完整信息,可以从 notify_channels 看到要发送的通知媒介,notify_users_obj 看到接收告警的所有用户信息等等
  22. for ch in payload.get('event').get('notify_channels'): # 遍历告警设置的通知媒介名称
  23. send_func_name = "send_{}".format(ch.strip()) # 拼接通知媒介在脚本中方法名
  24. if not hasattr(Sender, send_func_name): # 查看 Sender 中是否存在对应方法
  25. print("function: {} not found", send_func_name) # 没有方法名继续下一个
  26. continue
  27. send_func = getattr(Sender, send_func_name) # 存在匹配方法名称
  28. send_func(payload) # 调用对应方法,发送告警通知,比如 send_sms send_dingtalk send_wechat 等等
  29. if __name__ == "__main__":
  30. if len(sys.argv) == 1:
  31. main()
  32. elif sys.argv[1] == "hello":
  33. hello()
  34. else:
  35. print("I am confused")

夜莺内置了邮件、企微机器人、钉钉机器人、飞书机器人等通知方式,如果用户在告警规则配置中设置了这些通知方式,夜莺内置就会调用对应的通知方式完成消息推送,如果用户设置了自定义的通知方式,夜莺没有内置对应的通知方法,就会在日志中打印 ’no sender channel: xxx’,这个时候就需要用户在脚本里实现通知方法了。

夜莺的 etc/script/notify.py 脚本中,也有 send_email send_dingtalk send_wechat send_feishu 等方法,但都是空实现,写了 pass,这是因为这些通知逻辑在夜莺的 go 代码中已经内置了,脚本中就不需要重复发送了。

夜莺调用通知脚本的时候,会把告警事件详情序列化为 json 传给脚本,通过 stdin 的方式。脚本从告警事件中可以拿到告警接收人的手机号、邮箱等联系方式,进而调用自己公司的通道接口来发送即可。发送的时候,具体要发送什么内容?理应是从告警事件中获取一些字段来拼接,比如告警标题、告警备注、告警级别等等,但有的时候我们希望发送的内容格式比较多样,此时就需要引入模板机制了,通过模板定义发送消息的内容格式会更为方便。

夜莺支持自定义通知模板,在 etc/template 下内置了一些模板文件,我们可以在这个目录下创建自己的模板文件,之后就可以在页面上(系统设置-通知模板)来做二次修改。模板文件的格式是 go template,具体语法可以参考 go template 的文档。

自定义通知脚本,涉及到二次开发,如果您不想自己开发,也可以使用夜莺专业版,我们可以帮您完成通知媒介的对接,当然,专业版还有更多功能,您可以查阅这个链接了解详情:夜莺专业版

本文介绍的内容,也提供了视频演示,可以扫码观看:

设置自定义告警通知脚本 - 图1