监控 Elasticsearch 集群状态

编辑

监控 Elasticsearch 集群状态编辑

您可以轻松配置一个基本手表来监控 Elasticsearch 集群的健康状况。

安排手表并添加输入编辑

手表 计划 控制手表触发的频率。手表 输入 获取您要评估的数据。

定义计划的最简单方法是指定一个间隔。例如,以下计划每 10 秒运行一次。

PUT _watcher/watch/cluster_health_watch
{
  "trigger" : {
    "schedule" : { "interval" : "10s" } 
  }
}

计划通常配置为不太频繁地运行。此示例将间隔设置为 10 秒,以便您可以轻松地看到手表被触发。由于此手表运行如此频繁,请不要忘记在您完成实验后 删除手表

要获取集群的状态,您可以调用 集群健康 API

response = client.cluster.health(
  pretty: true
)
puts response
GET _cluster/health?pretty

要将健康状况加载到您的手表中,您只需添加一个 HTTP 输入,它调用集群健康 API。

PUT _watcher/watch/cluster_health_watch
{
  "trigger" : {
    "schedule" : { "interval" : "10s" }
  },
  "input" : {
    "http" : {
      "request" : {
        "host" : "localhost",
        "port" : 9200,
        "path" : "/_cluster/health"
      }
    }
  }
}

如果您使用的是安全功能,那么您还需要在手表配置中提供一些身份验证凭据。

PUT _watcher/watch/cluster_health_watch
{
  "trigger" : {
    "schedule" : { "interval" : "10s" }
  },
  "input" : {
    "http" : {
      "request" : {
        "host" : "localhost",
        "port" : 9200,
        "path" : "/_cluster/health",
        "auth": {
          "basic": {
            "username": "elastic",
            "password": "x-pack-test-password"
          }
        }
      }
    }
  }
}

最好创建一个具有使用此类手表配置所需的最低权限的用户。

根据您的集群配置方式,在手表可以访问您的集群之前,可能需要其他设置,例如密钥库、信任库或证书。有关更多信息,请参阅 Watcher 设置

如果您检查手表历史记录,您将看到集群状态作为每次手表执行的 watch_record 的一部分被记录下来。

例如,以下请求从手表历史记录中检索最后十个手表记录。

response = client.search(
  index: '.watcher-history*',
  body: {
    sort: [
      {
        'result.execution_time' => 'desc'
      }
    ]
  }
)
puts response
GET .watcher-history*/_search
{
  "sort" : [
    { "result.execution_time" : "desc" }
  ]
}

添加条件编辑

一个 条件 评估您已加载到手表中的数据,并确定是否需要采取任何措施。由于您已定义一个输入,它将集群状态加载到手表中,因此您可以定义一个条件来检查该状态。

例如,您可以添加一个条件来检查状态是否为红色。

PUT _watcher/watch/cluster_health_watch
{
  "trigger" : {
    "schedule" : { "interval" : "10s" } 
  },
  "input" : {
    "http" : {
      "request" : {
       "host" : "localhost",
       "port" : 9200,
       "path" : "/_cluster/health"
      }
    }
  },
  "condition" : {
    "compare" : {
      "ctx.payload.status" : { "eq" : "red" }
    }
  }
}

计划通常配置为不太频繁地运行。此示例将间隔设置为 10 秒,以便您可以轻松地看到手表被触发。

如果您检查手表历史记录,您将看到条件结果作为每次手表执行的 watch_record 的一部分被记录下来。

要检查条件是否满足,您可以运行以下查询。

response = client.search(
  index: '.watcher-history*',
  pretty: true,
  body: {
    query: {
      match: {
        'result.condition.met' => true
      }
    }
  }
)
puts response
GET .watcher-history*/_search?pretty
{
  "query" : {
    "match" : { "result.condition.met" : true }
  }
}

采取行动编辑

在手表历史记录中记录 watch_records 很好,但 Watcher 的真正强大之处在于能够对警报做出响应。手表的 操作 定义了当手表条件为真时该做什么——您可以发送电子邮件、调用第三方 Webhook 或将文档写入 Elasticsearch 索引或日志,当手表条件满足时。

例如,您可以添加一个操作,当状态为红色时索引集群状态信息。

PUT _watcher/watch/cluster_health_watch
{
  "trigger" : {
    "schedule" : { "interval" : "10s" }
  },
  "input" : {
    "http" : {
      "request" : {
       "host" : "localhost",
       "port" : 9200,
       "path" : "/_cluster/health"
      }
    }
  },
  "condition" : {
    "compare" : {
      "ctx.payload.status" : { "eq" : "red" }
    }
  },
  "actions" : {
    "send_email" : {
      "email" : {
        "to" : "[email protected]",
        "subject" : "Cluster Status Warning",
        "body" : "Cluster status is RED"
      }
    }
  }
}

为了让 Watcher 发送电子邮件,您必须在您的 elasticsearch.yml 配置文件中配置一个电子邮件帐户,并重新启动 Elasticsearch。要添加一个电子邮件帐户,请设置 xpack.notification.email.account 属性。

例如,以下代码段配置了一个名为 work 的 Gmail 帐户。

xpack.notification.email.account:
  work:
    profile: gmail
    email_defaults:
      from: <email> 
    smtp:
      auth: true
      starttls.enable: true
      host: smtp.gmail.com
      port: 587
      user: <username> 
      password: <password> 

<email> 替换为您要从中发送通知的电子邮件地址。

<username> 替换为您的 Gmail 用户名(通常是您的 Gmail 地址)。

<password> 替换为您的 Gmail 密码。

如果您为您的电子邮件帐户启用了高级安全选项,则需要采取其他步骤才能从 Watcher 发送电子邮件。有关更多信息,请参阅 配置电子邮件帐户

您可以检查手表历史记录或 status_index 以查看操作是否已执行。

response = client.search(
  index: '.watcher-history*',
  pretty: true,
  body: {
    query: {
      match: {
        'result.condition.met' => true
      }
    }
  }
)
puts response
GET .watcher-history*/_search?pretty
{
  "query" : {
    "match" : { "result.condition.met" : true }
  }
}

删除手表编辑

由于 cluster_health_watch 配置为每 10 秒运行一次,请确保在您完成实验后将其删除。否则,您将无限期地给自己发送垃圾邮件。

要删除手表,请使用 删除手表 API

response = client.watcher.delete_watch(
  id: 'cluster_health_watch'
)
puts response
DELETE _watcher/watch/cluster_health_watch