通过为阿里云Elasticsearch添加X-Pack Watcher,可以实现当满足某些条件时执行某些操作。例如当logs索引中出现error日志时,触发系统自动发送报警邮件或机器人消息。可以简单地理解为X-Pack Watcher是一个基于Elasticsearch实现的监控报警服务。本文介绍如何配置企业微信机器人接收X-Pack Watcher报警。

背景信息

X-Pack Watcher功能主要由Trigger、Input、Condition和Actions组成:
  • Trigger

    确定何时检查,在配置Watcher时必须设置。支持多种调度触发器,详情请参见Schedule Trigger

  • Input

    需要对监控的索引执行的筛选条件,详情请参见Inputs

  • Condition

    执行Actions的条件。

  • Actions

    当条件发生时,执行的具体操作。本文以配置Webhook Action为例。

前提条件

  • 创建单可用区的阿里云Elasticsearch实例。
    具体操作,请参见创建阿里云Elasticsearch实例
    说明 旧网络架构下X-Pack Watcher功能仅支持单可用区Elasticsearch实例,不支持多可用区实例,新网络架构下没有限制。
  • 开启Elasticsearch实例的X-Pack Watcher功能(默认关闭)。

    具体操作,请参见配置YML参数

  • 在用户VPC下创建ECS服务,并部署相关应用。

    具体操作,请参见使用向导创建实例

    说明
    • ECS服务器即后端服务器,主要接收通过负载均衡实例所转发的请求,没有可用区的限制,但是在创建时需要与负载均衡实例部署在同一地域且同一VPC下。
    • 阿里云Elasticsearch的X-Pack Watcher功能不支持直接与公网通讯,需要基于实例的内网地址通讯(专有网络VPC环境),因此您需要对VPC网络下的ECS配置SNAT或弹性公网IP,作为代理去转发请求。

注意事项

自2020年10月起,阿里云Elasticsearch对不同地域进行了网络架构的调整,对创建的实例有以下影响:

  • 2020年10月之前创建的实例均在旧网络架构下,即Elasticsearch实例处于用户VPC下,如果需要访问公网,可以直接使用SNAT代理服务或自建Nginx代理。
  • 2020年10月及之后创建的实例均在新网络架构下,X-Pack Watcher功能受到网络限制,为解决此问题,需要通过PrivateLink打通VPC网络,具体配置请参见配置实例私网连接。如果需要访问公网,可以配置Nginx代理进行请求转发。

操作步骤

  1. 配置实例私网连接,获取终端节点域名作为访问外部服务的网络连接。
    具体操作,请参见配置实例私网连接
    说明 旧网络架构下创建的实例,无需配置私网连接;新网络架构下创建的实例,需要配置私网连接。
  2. 配置ECS安全组。
    1. 登录阿里云ECS控制台
    2. 在左侧导航栏,单击实例
    3. 在实例列表页面,选择目标实例右侧操作列下的更多 > 网络和安全组 > 安全组配置
    4. 安全组列表页签下,单击目标安全组右侧操作列下的配置规则
    5. 入方向页签,单击手动添加
    6. 填写相关参数。
      添加安全组规则
      参数 说明
      授权策略 选择允许
      优先级 保持默认。
      协议类型 选择自定义TCP
      端口范围 填写您常用的端口(配置Nginx时需要用到,本文以8080为例)。
      授权对象 添加您购买的阿里云Elasticsearch实例所有节点的IP地址。
      说明 参见查看节点的基本信息,获取Elasticsearch实例中所有节点的IP地址。
      描述 输入对规则的描述。
    7. 单击保存
  3. 配置Nginx代理。
    1. 在ECS上安装Nginx。
      具体安装方法请参见Nginx安装配置
    2. 配置nginx代理转发。
      使用以下配置替换nginx.conf文件中server部分的配置。
      server {
              listen 8080;
              server_name _;
              root /usr/share/nginx/html;
              # Load configuration files for the default server block.
              include /etc/nginx/default.d/*.conf;
      
                location / {
                  proxy_pass <企业微信机器人Webhook地址>;
                }
              error_page 404 /404.html;
                  location = /40x.html {
              }
              error_page 500 502 503 504 /50x.html;
                  location = /50x.html {
              }
          }

      <企业微信机器人Webhook地址>:请替换为接收报警消息的企业微信机器人的Webhook地址。

    3. 加载修改后的配置文件并重启Nginx。
      /usr/local/webserver/nginx/sbin/nginx -s reload            # 重新载入配置文件
      /usr/local/webserver/nginx/sbin/nginx -s reopen            # 重启Nginx
  4. 设置X-Pack Watcher报警规则。
    1. 登录对应阿里云Elasticsearch实例的Kibana控制台。
      具体操作,请参见登录Kibana控制台
    2. 在左侧菜单栏,单击Dev Tools(开发工具)。
    3. Console中,执行如下命令创建一个报警文档。
      以下示例以创建developer_count_watch为例,每隔10s查询zl-testgaes索引中是否出现developer字段,如果出现158974次以上则触发报警。
      PUT _xpack/watcher/watch/developer_count_watch
      {
        "trigger": {
          "schedule": {
            "interval": "10s"
          }
        },
        "input": {
          "search": {
            "request": {
              "indices": ["zl-testgaes"],
              "body": {
                "query": {
          "bool": {
            "must": [
              {"match": 
               {
                 "developer" : "Nintendo"    
              }
              },
              {
              "range": {
                "year_of_release": {
                  "gte": "2011-09-20T16:00:00.000Z",
                  "lte": "2011-12-31T16:00:00.000Z"
                        }
                    }
              }
            ]
          } 
        }
              }
            }
          }
        },
        "condition": {
          "compare": {
            "ctx.payload.hits.total": {
              "gt": 158974
            }
          }
        },
        "actions" : {
        "test_issue" : {
          "webhook" : {
            "method" : "POST",
            "url" : "http://<yourAddress>:8080",
            "body" : "{\"msgtype\": \"text\", \"text\": { \"content\": \"developer is Nintendo,More than 158974\"}}"
          }
        }
      }
      }
      表 1. 关键参数说明
      参数 网络类型 配置对象 说明
      <yourAddress> 新网络 终端节点域名地址 新网络架构下,即通过配置实例私网连接进行网络打通,通过终端节点域名实现请求转发。
      注意 此处需要配置为终端节点域名,而非服务域名。获取终端节点域名的具体操作,请参见查看终端节点域名
      旧网络 Nginx代理IP地址 通过同VPC下Nginx代理经公网进行请求转发。
      企业微信机器人Webhook地址 需要开启SNAT网关,为VPC中无公网IP的ECS实例提供访问互联网的代理服务。
      注意
      • 如果在执行以上命令时,出现No handler found for uri [/_xpack/watcher/watch/log_error_watch_2] and method [PUT]异常,表示您购买的阿里云Elasticsearch实例未开启X-Pack Watcher功能,请开启后再执行以上命令。具体步骤,请参见配置YML参数
      • 在创建企业微信机器人时,必须进行安全设置。以上代码中的body参数需要根据安全设置配置,详细信息,请参见安全设置。例如本文选择安全设置方式为自定义关键词,且添加了一个自定义关键词:error,那么body中的content字段必须包含error,企业微信机器人才会推送报警信息。
      触发报警后,企业微信机器人将收到如下报警。企业微信机器人报警配置