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

背景信息

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

    Watcher定时触发器,即多久触发一次Watcher,相当于多久执行一次input。支持多种调度触发器,详细信息请参见Schedule Trigger

  • Input
    Input将数据加载到执行上下文,用于后续的Watcher执行阶段,如果input没有指定,将会加载一个空上下文,详细信息请参见Inputs。Watcher支持以下input类型:
    • simple:将输入静态数据加载到执行上下文。例如手动输入一段简单的数据进行报警。
    • search:将搜索结果加载到执行上下文。例如全文搜索关键词,对搜索结果进行统计实现报警。
    • http:将HTTP请求结果加载到执行上下文。例如通过Elasticsearch请求接口获取集群健康状态、节点状态等实现报警。
    • chain:将一系列的输入数据加载到执行上下文,这些数据一般是来自多个源。
  • Condition
    执行Actions的条件。即满足条件将会触发下一步操作,如果不指定条件,默认为always,详细信息请参见Conditions。Watcher支持以下condition类型:
    • always:条件总为true,始终执行Watcher Actions。
    • nerver:条件总为false,从不执行Watcher Actions。
    • compare:对Watcher有效负载中的值进行简单比较,以确定是否执行Watcher Actions。
    • array_compare:将Watcher有效负载中的值数组与给定值进行比较,以确定是否执行Watcher Actions。
    • script:使用脚本确定是否执行Watcher Actions。
  • Actions
    报警接收对象,常见的报警接收对象包括邮件、Webhook 、index和logging等,详细信息请参见Actions
    说明 通过邮件接收报警存在端口限制,阿里云Elasticsearch不支持,建议通过Webhook进行邮件转发。

前提条件

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

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

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

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

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

注意事项

自2020年10月起,阿里云Elasticsearch对不同地域进行了网络架构的调整,对创建的实例有以下影响:
  • 2020年10月之前创建的实例均在旧网络架构下,即Elasticsearch实例处于用户VPC下,如果需要访问公网,可以直接使用SNAT功能或自建Nginx代理。
  • 2020年10月及之后创建的实例均在新网络架构下,即Elasticsearch实例处于Elasticsearch服务VPC下,X-Pack Watcher功能受到网络限制,为解决此问题,阿里云Elasticsearch提供了实例私网连接方案,详细信息请参见配置实例私网连接。如果您还需要将报警信息推送至公网环境,在通过实例私网连接打通Elasticsearch服务VPC和用户VPC的基础上,还需对负载均衡后端服务配置Nginx代理或开启SNAT功能实现公网信息推送。
    注意 实例私网连接方案是新网络架构下X-Pack Watcher、reindex、LDAP和AD(Active Directory)身份认证等功能受限的唯一解决方案,为保证功能使用不受影响,请严格按照文档配置。

操作流程

  1. 步骤一:创建并配置钉钉机器人
  2. (可选)步骤二:配置Elasticsearch实例私网连接
  3. 步骤三:配置ECS安全组和Nginx代理
  4. 步骤四:配置Watcher报警
  5. 步骤五:查看报警结果

步骤一:创建并配置钉钉机器人

  1. 创建一个钉钉报警接收群。
  2. 在群的右上角找到群机器人,然后添加一个自定义通过Webhook接入的机器人并进行安全设置,同时获取Webhook地址。

(可选)步骤二:配置Elasticsearch实例私网连接

旧网络架构下创建的实例,无需配置私网连接;新网络架构下创建的实例,需要配置私网连接。

  1. 登录阿里云Elasticsearch控制台
  2. 配置Elasticsearch实例的私网连接,获取终端节点域名作为访问外部服务的网络连接。
    具体操作,请参见配置实例私网连接

步骤三:配置ECS安全组和Nginx代理

  1. 配置ECS安全组。
    1. 登录阿里云ECS控制台
    2. 在左侧导航栏,单击实例
    3. 在实例列表页面,选择目标实例右侧操作列下的更多 > 网络和安全组 > 安全组配置
    4. 安全组列表页签下,单击目标安全组右侧操作列下的配置规则
    5. 入方向页签,单击手动添加
    6. 填写相关参数。
      添加安全组规则
      参数 说明
      授权策略 选择允许
      优先级 保持默认。
      协议类型 选择自定义TCP
      端口范围 填写您常用的端口(配置Nginx时需要用到,本文以8080为例)。
      授权对象 添加您购买的阿里云Elasticsearch实例所有节点的IP地址。
      说明 参见查看节点的基本信息,获取Elasticsearch实例中所有节点的IP地址。
      描述 输入对规则的描述。
    7. 单击保存
  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地址,获取方式请参见步骤一:创建并配置钉钉机器人

    3. 加载修改后的配置文件并重启Nginx。
      /usr/local/webserver/nginx/sbin/nginx -s reload            # 重新载入配置文件
      /usr/local/webserver/nginx/sbin/nginx -s reopen            # 重启Nginx

步骤四:配置Watcher报警

  1. 登录目标阿里云Elasticsearch实例的Kibana控制台,根据页面提示进入Kibana主页。
    登录Kibana控制台的具体操作,请参见登录Kibana控制台
    说明 本文以阿里云Elasticsearch 6.7.0版本为例,其他版本操作可能略有差别,请以实际界面为准。
  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://<yourAddress>:8080",
          "body" : "{\"msgtype\": \"text\", \"text\": { \"content\": \"error 日志出现了,请尽快处理\"}}"
        }
      }
    }
    }
    表 1. 关键参数说明
    参数 网络类型 配置对象 说明
    <yourAddress> 新网络 终端节点域名地址 新网络架构下,即通过配置实例私网连接进行网络打通,通过终端节点域名实现请求转发。
    注意 此处需要配置为终端节点域名,而非服务域名。获取终端节点域名的具体操作,请参见(可选)步骤五:查看终端节点域名
    旧网络 Nginx代理IP地址 通过同VPC下Nginx代理经公网进行请求转发。
    url配置为钉钉机器人的Webhook地址 开启SNAT网关,使处于用户VPC下的Elasticsearch实例可以访问外网,详细信息请参见使用公网NAT网关SNAT功能访问互联网
    注意
    • 如果在执行以上命令时,出现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,钉钉机器人才会推送报警信息。

步骤五:查看报警结果

正常情况下,当集群中的数据达到步骤四:配置Watcher报警中配置的报警条件时,您可以在钉钉群中收到类似error 日志出现了,请尽快处理的报警信息。
说明 如果您不再需要执行报警任务,可执行以下命令删除该报警任务。
DELETE _xpack/watcher/watch/log_error_watch