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

注意事项

因阿里云Elasticsearch网络架构调整,2020年10月起创建的实例暂时不支持Watcher、LDAP认证、跨集群Reindex、跨集群搜索、实例网络互通功能,待后期功能上线后开放,请耐心等待。

前提条件

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

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

  • 购买ECS实例。
    ECS实例要与Elasticsearch实例在同一个区域和专有网络下,并且能够访问公网。具体操作,请参见步骤一:创建ECS实例
    说明 阿里云Elasticsearch的X-Pack Watcher功能不支持直接与公网通讯,需要基于实例的内网地址通讯(专有网络VPC环境),因此您需要购买一台能同时访问公网和Elasticsearch实例的ECS实例,作为代理去执行Actions。

背景信息

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

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

  • Input

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

  • Condition

    执行Actions的条件。

  • Actions

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

操作步骤

  1. 配置ECS安全组。
    1. 登录阿里云ECS控制台,在左侧导航栏,单击实例
    2. 实例列表页面,选择对应实例右侧操作列下的更多 > 网络和安全组 > 安全组配置
    3. 安全组列表页签右侧的操作列下,单击配置规则
    4. 入方向页签,单击手动添加
    5. 填写相关参数。
      添加安全组规则
      参数 说明
      授权策略 选择允许
      优先级 保持默认。
      协议类型 选择自定义TCP
      端口范围 填写您常用的端口(配置Nginx时需要用到,本文以8080为例)。
      授权对象 添加您购买的阿里云Elasticsearch实例所有节点的IP地址。
      说明 参见查看节点的基本信息,获取Elasticsearch实例中所有节点的IP地址。
      描述 输入对规则的描述。
    6. 单击保存
  2. 配置Nginx代理。
    1. 在ECS上安装Nginx。
    2. 配置nginx.conf文件。
      使用以下配置替换nginx.conf文件中server部分的配置。 nginx.conf的server部分配置
      server
        {
          listen 8080;#监听端口
          server_name localhost;#域名
          index index.html index.htm index.php;
          root /usr/local/webserver/nginx/html;#站点目录
            location ~ .*\.(php|php5)?$
          {
            #fastcgi_pass unix:/tmp/php-cgi.sock;
            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 <钉钉机器人Webhook地址>;
          }
          location ~ .*\.(js|css)?$
          {
            expires 15d;
            # access_log off;
          }
          access_log off;
        }
      <钉钉机器人Webhook地址>:请替换为接收报警消息的钉钉机器人的Webhook地址。
      说明 获取钉钉群机器人的Webhook地址:创建一个钉钉报警接收群,在群的右上角找到群机器人,然后添加一个自定义通过Webhook接入的机器人,并获取群机器人的Webhook地址,详情请参见获取自定义机器人Webhook
    3. 加载修改后的配置文件并重启Nginx。
      /usr/local/webserver/nginx/sbin/nginx -s reload            # 重新载入配置文件
      /usr/local/webserver/nginx/sbin/nginx -s reopen            # 重启Nginx
  3. 设置报警。
    1. 登录对应阿里云Elasticsearch实例的Kibana控制台。
      说明 具体操作,请参见登录Kibana控制台
    2. 在左侧菜单栏,单击Dev Tools(开发工具)。
    3. Console中,执行如下命令创建一个报警文档。
      以下示例以创建log_error_watch为例,每隔10s查询logs索引中是否出现error日志,如果出现0次以上则触发报警。
      PUT _xpack/watcher/watch/log_error_watch
      {
        "trigger": {
          "schedule": {
            "interval": "10s"
          }
        },
        "input": {
          "search": {
            "request": {
              "indices": ["logs"],
              "body": {
                "query": {
                  "match": {
                    "message": "error"
                  }
                }
              }
            }
          }
        },
        "condition": {
          "compare": {
            "ctx.payload.hits.total": {
              "gt": 0
            }
          }
        },
        "actions" : {
        "test_issue" : {
          "webhook" : {
            "method" : "POST",
            "url" : "http://<您的ECS内网IP>:8080",
            "body" : "{\"msgtype\": \"text\", \"text\": { \"content\": \"error 日志出现了,请尽快处理\"}}"
          }
        }
      }
      }
      注意
      • actions中配置的url为阿里云ECS实例的内网IP地址。该ECS必须与Elasticsearch实例在相同区域和专有网络下,并且已经按照上文的方式配置了安全组,否则不能进行通信。
      • 如果在执行以上命令时,出现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,钉钉机器人才会推送报警信息。
      如果不再需要执行报警任务,可执行以下命令删除该报警任务。
      DELETE _xpack/watcher/watch/log_error_watch