SLS告警最佳实践——Webhook通知最佳实践

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通知仅支持公网访问,因此某些场景下,如果为内部系统,不希望对外开启访问的时候,可以通过一个公网代理的方式来解决。架构参考如下:

SLS告警最佳实践——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告警最佳实践——Webhook通知最佳实践

上一篇:SLS新版本告警入门——用户、用户组及值班组


下一篇:SLS告警重磅更新——让你的告警通知一目了然