腾讯云Elasticsearch Watcher 功能之 Webhook实践
引言 __
Elasticsearch 的商业包 x-pack 给我们提供了很多高阶功能,其中有一个非常重要的用来检测日志是否异常并及时发送警报信息的功能,我们称这个功能为Watcher for alert.
由于该功能不免费使用,用户需要将您的ES集群升级或购买到白金版ES才能正常使用。腾讯云ES用户从2020年5月20号起购买的白金版ES集群支持通过Webhook的方式实现告警; 由于网络安全原因,云上集群暂不支持通过配置Outlook 邮件服务器的方式实现邮件告警。
一、背景信息之 Watcher
一个Watcher 由 5 部分组成,具体如下:
- Trigger -- 多久被触发一次 (如5分钟触发一次)
- Input -- 查询条件 (在所有日志索引中查看”error“ 相关)
- Condition -- 查询是否满足条件 (列如:大于1000条 返回)
- Actions -- 当条件发生时,执行的具体操作(列如:发送邮件、Webhook告警) Action类型有四种:EMail(邮件),Webhook(第三方对接),Index(索引),Logging(日志记录)。本文以配置Webhook Action为例。
二、背景信息之Webhook
webhook是一种web回调或者http的push API,是向APP或者其他应用提供实时信息的一种方式。Webhook在数据产生时立即发送数据,也就是你能实时收到数据。你可以把它想象成一个第三方接口,它能将收到的信息实时转发到你提前定制好的APP或者平台上。其工作流程大致如下:
注意: Webhook本身并不能自己独立使用,需要一个载体,同时使用一个webhook需要为webhook准备一个URL,用于webhook 发送请求。这些通常由后台页面和或者API完成。
三、WebHook 配置企业微信机器人接收X-Pack Watcher报警实践
前置条件:
1, 需要 ES 7.5.1 白金版 <注意: 创建时间必须在2020年5月20日以后>
2, 需要准备一台与该ES集群同网段的可以连接外网的CVM;
3, 下载并配置Nginx,步骤如下:
- 在已准备的CVM上安装Nginx。具体安装方法请参见Nginx安装配置;
- 配置nginx.conf文件。使用以下配置替换nginx.conf文件中 Server 部分的配置;
server {
listen 8099;
server_name localhost;
index index.html index.htm index.php;
root /usr/local/nginx/html;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~ .*\\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires 30d;
# access_log off;
}
location / {
proxy_pass //企业微信机器人的wehbook地址,外网地址;
}
location ~ .*\\.(js|css)?$
{
expires 15d;
# access_log off;
}
access_log off;
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
- Nginx服务的默认端口是80,如您需要更改其端口,则需要去腾讯云控制台,安全组,放行此端口;
- 加载修改后的配置文件并重启Nginx。参考如下:
/usr/local/webserver/nginx/sbin/nginx -s reload # 重新载入配置文件
/usr/local/webserver/nginx/sbin/nginx -s reopen # 重启Nginx
- Nginx正常启动后,展示界面如下:
注意:怎么样获取一个企业微信机器人Webhook地址?
首先,您需要创建一个企业微信群;
其次,选中该群,点击鼠标右键,选择添加群机器人
随后,选择”新创建一个机器人“,这样您就获得了一个可以外网访问得Webhook机器人地址,如下:
4,设置告警
- 登录对应腾讯云Elasticsearch实例的Kibana控制台。
- 在左侧菜单栏,单击Dev Tools(开发工具)以下示例以创建为例,每隔10s查询"logs"索引中是否出现"error"日志,如果出现0次以上则触发报警。如下:
PUT _xpack/watcher/watch/log_error_watch1
{
"trigger": {
"schedule": {
"interval": "10s"
}
},
"input": {
"search": {
"request": {
"indices": ["logs"],
"body": {
"query": {
"match": {
"message": "error"
//添加了一个自定义关键词:error,那么body中的message字段必须包含error,企业微信机器人才会推送报警信息。
}
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.hits.total": {
"gt": 0
}
}
},
"actions" : {
"test_issue" : {
"webhook" : {
"method" : "POST",
"url" : "http://《您的CVM内网IP》:8099",
"body" : "{\\"msgtype\\": \\"text\\", \\"text\\": { \\"content\\": \\"error 日志出现了,请尽快处理\\"}}"
}
}
}
}
5,创建成功后,我们可以加入一些测试语句,如下:
PUT logs/_doc/1
{
"message":"The email error,check the email sever pls."
}
PUT logs/_doc/2
{
"message":"The output error,check the email sever pls ASAP."
}
最后,我们可以在自己创建的企业微信群里接收到机器人发来的告警信息了,如下:
当然,上面的操作是API操作,我们也可以在Kibana - Management - Watcher 选项,进行图形化操作:
点击,右上角的“Create”,有两个选项,“Create threshold alert” 和 "Create advanced watch";
- “Create threshold alert”,是阈值告警设置。可以针对某索引的特定条件进行监控告警,比如:CPU使用率、文档个数等,可以在下面的Condition 选项作更细节的设置,参考如下:
随后,点击右下角的"Add action", 选择 “Wehhook”, 相关设置如下:
随后点击"Send request",并“点击创建alert即可。
- "Create advanced watch" 是高阶的API设置,大概如下图所示:
后续步骤
如果不再需要执行报警任务,请使用以下命令删除该报警任务。
DELETE _xpack/watcher/watch/log_error_watch1
四、 写在最后
Watcher中的Action指配置指定的预警动作,在满足触发条件且不节流的情况下执行。每个Action动作执行一次,Action之间相互独立。执行过程中,发生任何错误都会记录结果,可以在历史记录中查看。
本次我们以企业微信机器人webhook为场景,配置告警并接收成功,希望以此为介入点,提升用户在watcher这块的使用认知,其它Webhook机器人的配置均可以参照上面的思维进行调试配置,以满足企业实际的需求。更多信息,请参考 ES 官方链接