Uptime Monitoring with Heartbeat and the Elastic Stack | Elastic Blog
工程

使用 Heartbeat 和 Elastic Stack 进行运行时间监测

随着 Elastic Stack 6.5 版的发布,我们很高兴地宣布 Heartbeat 正式推出。Heartbeat 最初在 2017 年 1 月的公测版中引入,是一款轻量型采集器,与我们其他的 Beat(MetricbeatFilebeatWinlogbeat 等)类似,但它是专门针对运行时间监测而设计的。

Heartbeat 既可以从网络内部运行,也可以从网络外部运行。它只需获得所需 HTTP、TCP 或 ICMP 端点的网络访问权限即可。配置也非常简单,只需向 Heartbeat 提供要监测的 URL 列表就足够了。Heartbeat 会执行定期检查来验证端点是处于运行还是关闭状态,然后将此信息以及其他有用的指标报告给 ElasticSearch。此信息将自动显示在预构建的 Kibana 仪表板中,以便进行统包运行时间监测。

下面让我们仔细看看如何设置 Heartbeat 以及将其与 Elastic Stack 一起使用。

安装 Heartbeat

若要安装 Heartbeat,您需要为平台下载并解压缩预构建的可执行文件。在本示例中,我将使用 macOS,但我们也支持很多其他操作系统,因此,请使用适合您的系统的命令。

下载并解压缩最新版本的 Heartbeat:

curl -l -O https://artifacts.elastic.co/downloads/beats/heartbeat/heartbeat-6.5.0-darwin-x86_64.tar.gz
tar xzvf heartbeat-6.5.0-darwin-x86_64.tar.gz

配置运行时间监测

为了让 Heartbeat 知道要检查哪些服务,需要提供一个 URL 列表。这项配置是在 /heartbeat 文件夹下的 heartbeat.yml 文件中指定的。 下面是一个使用 Heartbeat 检查多个 HTTP 的示例,检查频率为每 10 秒运行一次:

# Configure monitors
heartbeat.monitors:
- type: http
  # List or urls to query
  urls:
        - "https://www.elastic.co"
        - "https://discuss.elastic.co"
  # Configure task schedule
  schedule: '@every 10s'

除了 HTTP/S 监测,Heartbeat 还可以执行 TCP 和 ICMP 检查,让您能够更好地洞察服务的不同层。在 Heartbeat 中,我们还可以定义附加检查层,例如,使用 HTTP/S 监测,可以检查响应代码、正文和标头。使用 TCP 监测,我们可以定义端口检查和字符串检查。

heartbeat.monitors:
- type: http
# List or urls to query
  urls: ["http://localhost:9200"]
  # request details:
  check.request:
       method:GET
  check.response:
       body:"You Know, for Search"
# Configure task schedule
  schedule: '@every 10s'

下面是一个 HTTP 正文检查示例,其中 Heartbeat 将在 http://localhost:9200(配置中指定的唯一 URL)查找字符串“You Know, for Search”。

在所有 Heartbeat 监测中,我们可以定义附加参数,例如,nametimeoutschedule。您可以在配置 Heartbeat 文档中找到完整的配置说明。

配置的最后一步是设置 Heartbeat 输出,也就是要将数据发送到的位置。支持的输出包括自管理 Elasticsearch 集群、Elastic Cloud、Logstash,等等。 在本示例中,我会将 Heartbeat 数据发送到我的本地 Elasticsearch 实例(“localhost:9200”):

output.elasticsearch:
# Array of hosts to connect to.
  hosts: ["localhost:9200"]
 # Optional protocol and basic auth credentials.
 #protocol: "https"
 username: "elastic"
  password: "changeme"

您可以在 heartbeat.reference.yml 文件中找到一个包含完整配置的示例文件。

首次启动 Heartbeat

Heartbeat 附带了很多预构建的仪表板,可提供大量现成有价值的内容。我们使用以下命令来设置仪表板并运行 Heartbeat:

在 Kibana 中设置 Heartbeat 仪表板(可选,只需要运行一次)

./heartbeat setup --dashboards

运行 Heartbeat:

./heartbeat -e

一旦 Heartbeat 开始运行,它就会检查您配置的 URL 列表,将信息发送回 Elastic Stack,并预填充 Kibana 仪表板。

在 Kibana 中可视化运行时间数据

在您打开 Kibana 后,当选择 Heartbeat 索引时,就会在“Discover”(发现)选项卡中看到 Heartbeat 信息(默认为 heartbeat-*):

在众多仪表板中,您将可以找到“Heartbeat HTTP monitoring”(Heartbeat HTTP 监测)仪表板,其中已填充 Heartbeat 发送的所有信息:

这是默认的 Heartbeat 仪表板:

在左上角,您会看到一个表,其中列出了所有受 Heartbeat 监测的端点及其响应时间。在右上角,您会看到监测状态代码的摘要信息,在它下面是附加图表,用于表示处于运行或关闭状态的监测器的百分比、随时间变化的响应时间和随时间变化的检查次数。

Heartbeat 仪表板是交互式的。使用默认的 Heartbeat 仪表板,您可以通过单击监测器关闭部分(位于右上角的“HTTP monitors status”(HTTP 监测状态)饼图中的红色切片部分),轻松检测特定端点是运行还是关闭。单击它,将会在仪表板上应用一个筛选器,只显示处于关闭状态的监测器。

您可以定制 Heartbeat Kibana 仪表板和可视化效果,以满足自己的需要。要开始定制操作,请单击仪表板右上角的“Edit”(编辑)按钮,单击各个可视化上的齿轮,然后选择“Edit Visualization”(编辑可视化)。此外,您还可以基于 Heartbeat 数据创建新的可视化效果,将 Heartbeat 指标与其他日志、指标和 APM 数据源结合起来,并将它们添加到您喜欢的任何操作仪表板中。

将 Heartbeat 数据与其他操作数据源组合

在对中断进行分类时,通过将 Heartbeat 数据与其他数据源(如 Metricbeat,Filebeat 和 APM)组合在一起,能够提供重要的信息。Heartbeat 会在特定服务关闭时通知您,Metricbeat和 APM 可以为您提供潜在的嫌疑对象,它可以显著缩短 MTTR,并让团队集中精力共同解决问题,而不是在工作区内相互指责。

请访问我们的解决方案页,了解有关日志、指标和 APM 解决方案的详细信息。

下面是一个 Kibana 仪表板示例,其中将 Heartbeat(上面两个面板)和 Metricbeat(下面两个面板)的指标组合在了一起。

  • 左侧,您可以看到,每当 Heartbeat 检测到端点关闭时,Metricbeat 就会通过 Nginx 模块检测到越来越多的错误。
  • 右侧,我们可以清楚地看到,每当 HTTP ping 时间增加时,Metricbeat 就会在 NGINX 服务器中检测到高请求率。

通过观察这种巧合,我们可以得出这样的结论:请求率的大幅飙升将会触发 Nginx 错误,进而导致 Heartbeat 检查失败:

警报和异常检测

您可以使用警报功能,根据 Heartbeat 监测数据来获取有关中断或性能降级的警报和通知。此外,您还可以使用 Elastic Stack 的Machine Learning 功能,根据 Heartbeat 数据的时序分析来检测任何异常。有关更详细的介绍,敬请期待我的下一篇 Heartbeat 博文。

总结

监测是一项艰巨的工作。您需要快速识别问题,发出警告并加以解决。如果您当前在使用多个迥然不同的工具跨应用程序和基础架构来获得可见性,那么您的任务可能会更加艰巨。

在 Elastic Stack 中现有日志、指标和 APM 功能的基础上,Heartbeat 添加了有效的运行时间监测功能。您可以单独使用它,或者将其与 ElasticSearch 中其他有价值的操作数据源相结合,让您不错过任何一个监测机会!

Heartbeat 资源

好了,就这么简单!希望这个概述能对您有所裨益。要开始操作,请下载 Heartbeat 并阅读相关文档,以对该功能有一个更深入的了解。体验 Heartbeat 其中一个最快的方法是:将您的运行时间数据发送到 Elastic Cloud 上的 Elasticsearch 服务 — 这些项目的创建者提供托管 Elasticsearch 和 Kibana。

如果您有任何疑问,请在 Heartbeat 讨论论坛上与我们联系;如果您发现任何问题或希望提交增强请求,请在 Github 中提交。