SLS告警通知对接了常用的各种 IM 系统,例如钉钉、企业微信、飞书、Slack。SLS对这些系统的 Webhook 进行了包装,用户无需关心各个通知渠道的具体消息格式,只需要配置希望通知的内容即可。
除此之外,还有其它的一些场景,需要使用通用Webhook(自定义 Webhook),本文主要介绍通用 Webhook 使用过程中常见的一些问题和最佳实践。
Webhook请求
Webhook 调用本质上就是一次 HTTP 请求调用,SLS告警支持 GET、POST、PUT、DELETE 等多种方法。但是从应用广泛性上来讲,建议如下:
- 如无特殊必要,建议使用 POST 方法,因为该方法在各个 Web 框架中支持程度最好
- 请求体建议一律使用 JSON 格式,默认情况下也会加上
Content-Type: application/json
这个 header - Webhook 处理正常的话返回值需要返回 200,不然会认为请求失败,有可能重复调用
内容模板
上文提到,Webhook的通知内容建议是JSON格式,因此在配置内容模板的时候需要注意,最后的渲染内容需要是合法的JSON。例如告警结构如下:
{ "project": "test-alert", "region": "cn-hangzhou", "labels": { "service": "signin", "env": "prod" }, "annotations": { "message": "user \"xxx\" signin failed, error is: userNotFound" } }
假如我们配置的内容模板如下:
{ "project": "{{ alert.project }}", "service": "{{ alert.labels.service }}", "message": "{{ alert.annotations.message }}"}
那么最终渲染的结果是:
{ "project": "test-alert", "service": "signin", "message": "user "xxx" signin failed, error is: userNotFound"}
由于 alert.annotations.message 本身包含双引号,因此会导致最终的渲染结果不是合法JSON,从而导致发送失败。
在此情况下,可以使用内置模板函数 quote 来对数据进行引用,从而避免特殊字符导致的 JSON 格式异常,例如模板配置如下:
{ "project": "{{ alert.project }}", "service": "{{ alert.labels.service }}", "message": {{ alert.annotations.message|quote }} }
那么最终渲染的结果就是合法的 JSON,内容如下:
{ "project": "test-alert", "service": "signin", "message": "user \"xxx\" signin failed, error is: userNotFound"}
网络问题
告警的Webhook通知仅支持公网访问,因此某些场景下,如果为内部系统,不希望对外开启访问的时候,可以通过一个公网代理的方式来解决。架构参考如下:
IP 白名单
告警的 Webhook 通知使用的是动态代理,因此不固定 IP 地址,无法通过配置 IP 白名单的方式限制访问。此时建议通过 HTTP Header 校验的方式来避免被恶意调用。例如:
- 自定义 Token:Header 添加
Authorization: Bearer xxxxx
,其中 xxxxx 为自定义 Token - 使用 BasicAuth,Header 添加
Authorization: Basic $(base64_encode({username}:{password}))
下面示例为 Nginx 的 BasicAuth 配置,作为参考:
- 在密码文件中添加用户,用户名为 admin,密码为 foobar。
注意:如果没有 conf/passwd 文件,可以先手动创建
htpasswd -b conf/passwd admin foobar
- 配置 Nginx,添加 auth_basic 和 auth_basic_user_file 配置,开启 BasicAuth。
location / { auth_basic on; auth_basic_user_file conf/passwd; root html; index index.html index.htm; }
- 重启 Nginx 或者重新加载 Nginx 配置。
由于 echo -n admin:foobar | base64
结果为 YWRtaW46Zm9vYmFy
,因此在配置 Webhook 的时候,添加自定义 Header Authorization: Basic YWRtaW46Zm9vYmFy
即可。
进一步参考
更多相关信息,可以参考:
对我们工作感兴趣的,可以通过如下方式了解更多,谢谢关注!
- SLS首页:https://www.aliyun.com/product/sls
- 知乎:https://zhuanlan.zhihu.com/aliyunlog
- 微信公众号:日志服务 or LogAnalytics
- 哔哩哔哩:https://space.bilibili.com/630680534