本文介绍使用自定义Webhook的常见问题。
如何设置内容模板
当通过自定义Webhook进行告警通知时,建议设置通知内容为JSON格式,即最终渲染的内容需为合法的JSON格式。
例如为如下的告警消息配置内容模板,由于alert.annotations.message字段值中包含双引号(""),因此您在内容模板中直接使用{{ alert.annotations.message }}
,会导致渲染结果不是合法的JSON,从而导致发送告警通知失败。
您需要使用内置模板函数quote(value)对数据进行引用,避免因为特殊字符导致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 | quote }} }
渲染结果示例
{ "project": "test-alert", "service": "signin", "message": "user \"xxx\" signin failed, error is: userNotFound" }
如何选择网络
日志服务告警中的Webhook通知仅支持公网访问。如果是内部系统,且不希望对外开启访问功能时,可以通过公网代理方式解决。参考架构如下图所示。
如何设置访问权限校验
您可以通过设置IP白名单或设置HTTPHeader的方式来进行权限校验。
为您的Webhook服务设置访问IP白名单。IP地址为120.76.47.88、119.23.150.175。
通过设置HTTPHeader的方式来进行权限校验。
使用自定义Token:在Header中添加
Authorization: Bearer token
,其中token需替换为您自定义的Token。使用Basic Auth:在Header中添加
Authorization: Basic $(base64_encode(username:password))
,其中username、password需替换为实际的用户名和密码。
例如您的Webhook服务使用了Nginx反向代理,则您可以在Nginx中设置Basic Auth,从而实现访问权限校验。
在Nginx中设置Basic Auth。
在密码文件中添加用户。
重要如果不存在conf/passwd文件,需先手动创建。
例如用户名为admin,密码为foobar。
htpasswd -b conf/passwd admin foobar
在Nginx中添加auth_basic和auth_basic_user_file配置,开启Basic Auth。
location / { auth_basic on; auth_basic_user_file conf/passwd; root html; index index.html index.htm; }
重启Nginx。
在行动策略中设置自定义Webhook。
echo -n admin:foobar | base64
的结果为YWRtaW46Zm9vYmFy
,因此在设置自定义Webhook时,您可以直接使用Authorization: Basic YWRtaW46Zm9vYmFy
Header。具体操作,请参见Webhook-自定义。