04 - Uptime - 掌握系统的生命徵象 (2/4) - 使用 Heartbeat 收集系统生命徵象数据

Uptime - 掌握系统的生命徵象 系列文章


本篇学习重点

  • Elastic Heartbeat 简介
  • 如何安装及设定 Heartbeat 来收集系统的生命徵象数据
  • 使用 Heartbeat 时有哪些实用的技巧

04-heartbeat

什麽是 Heartbeat

Elastic Beats 是 Elastic Stack 中专门负责收集散落在各地的 Log 及各种资讯的一系列工具,Beats 家族的主要都是基於 libbeat framework 所开发,而 Heartbeat 是 Elastic Beats 家族的成员之一,是一个轻量化的常驻程序 (daemon),可以安装在远端的某一台机器上,并且定期的去检查指定的服务是否还活着 (availability)。

Heartbeat 支援的监控方法有以下几种:

  • ICMP (v4 or v6): 也就是我们很常在使用的 ping 这个指令所使用的 protocol,可以提供最基本的验证,确认机器是否能正常的回应。
  • TCP: 可以针对特别的 TCP port 去发送指定的请求,并且传送指定的 payload,也可以验证回传的 payload。
  • HTTP: 这个协定也是 Heartbeat 最常被使用到的通讯协定,像是我们 API 常用的 RESTful 协定,就可以透过 Heartbeat 发送请求,并且验证 HTTP 回传的 status coderesponse headerresponse body 是不是符合预期。
  • Browser: 这个功能很强,是目前最新、但还在实验阶段 (Experimental) 的功能,也就是收集 Elastic Observability 当中的 Synthetic Data 的功能,简单来说他会模拟浏览器,来执行一系列我们指定的步骤,我们就可以依照使用者实际的情境,一步一步的模拟、并且验证执行的结果,同时也会产生萤幕截图让我们知道执行的结果为何。这个功能会再下一篇文章进行介绍。

另外针对 TCPHTTP 都有支援 SSL/TLS 的 HTTPS 协定,也能支援 proxy 的设定,最贴心的是,他还能顺便记录 HTTPS 的凭证 (certificate) 的过期时间,我们也就能简单的透过 Alert 的设定,在凭证过期之前发出警告。

Heartbeat 的使用情境

以下列出 Heartbeat 可以使用的一些情境,当然能用的范围不只於此,我们也可以依照他的功能特性来创造合符合需求的应用情境。

  1. 从各个不同的地区、Data Center、检查服务是否活着。
  2. 在复杂的网路环境中,从各网段监控服务可否被存取,透过这些数据协助判断网路是否有状况,是否哪个网段无法正常存取服务。
  3. 除了检查服务是否活着,同时因为有收集回应的时间,所以也能确认是否有延迟时间更长、甚至导入於过时 (timeout) 的现象。
  4. 当我们与客户有协议 SLA (Service Level Agreement) 时,透过 Heartbeat 收集的资料,透过 Kibana 汇总成报表,可以清楚的验证我们是否有达到我们所承诺的 SLA。
  5. 反向的安全性检查,例如我们不允许外网能存取到服务,可以透过 Heartbeat 从外网周期的验证,服务不能被存取到。
  6. 针对特定服务存取的 API,定期验证特定功能的正常状态。
  7. 由於支援 Proxy,若商业服务的目标市场大量依赖於手机端用户,甚至可以透过 proxy 使用当地的 ISP 的手机网路来当作跳板,验证指定的 ISP 所提供的手机网路是否能正常存取服务。(以乔叔的经验,就有发生在日本特定的 ISP 无法存取服务,但其他 ISP 却可以使用的经验,这时若是需要举证,有这些日志与记录会非常有帮助)
  8. 在协助验证服务的可用性 (availability) 时,一并协助验证 HTTPS 的凭证是否快要过期,这部份也是服务可用性很重要的一点,而且从过往的新闻之中,有些很大很厉害的公司,也还是会发生不小心凭证过期忘了更新,而影响到用户使用的案例。

安装 Heartbeat

要安装 Heartbeat,官方网站的快速上手文件 [1],已经非常的清楚简单,我这边就不做细部说明,只大约以 MacOS 环境为例,列出以下的步骤:

  1. 先准备好 Elasticsearch Cluster 的环境,你会需要用 Elasticsearch 来储存与搜寻 Heartbeat 所收集到的资料。
  2. 准备好 Kibana 的环境,我们会要透过 Kibana 来检视这些资料。
  3. 下载 Heartbeat 并解压缩
curl -L -O https://artifacts.elastic.co/downloads/beats/heartbeat/heartbeat-7.14.1-darwin-x86_64.tar.gz
tar xzvf heartbeat-7.14.1-darwin-x86_64.tar.gz
  1. 进入解压缩後的目录,修改 heartbeat.yml,指定 Elasticsearch 与 Kibana 的位置。
output.elasticsearch:
  hosts: ["myEShost:9200"]
  username: "heartbeat_internal"
  password: "YOUR_PASSWORD"
setup.kibana:
  host: "mykibanahost:5601" 
  username: "my_kibana_user"  
  password: "YOUR_PASSWORD"
  1. heartbeat.yml 里面,或是在 monitors.d 的目录里建立自己订义的 YAML 档,来设定 Monitors 的规则。
heartbeat.monitors:
- type: icmp
  schedule: '*/5 * * * * * *' 
  hosts: ["myhost"]
  id: my-icmp-service
  name: My ICMP Service
- type: tcp
  schedule: '@every 5s' 
  hosts: ["myhost:12345"]
  mode: any 
  id: my-tcp-service
- type: http
  schedule: '@every 5s'
  urls: ["http://example.net"]
  service.name: apm-service-name 
  id: my-http-service
  name: My HTTP Service

注意:如果在 monitors.d 里面建立新的 YAML 档的话,档案里是直接放 heartbeat.monitors 里面的设定值的,也就是 heartbeat.monitors 这一层是用宣告,直接从 - type: icmp 这一层开始宣告即可,请直接参考解压缩之後,资料夹里面附的范例。

  1. 依照布署的地理位置,设定好 processors 里的地区设定,这个设定可以协助之後在 Kibana 筛选检视的范围。
# ============================ Processors ============================

processors:
  - add_observer_metadata:
      # Optional, but recommended geo settings for the location Heartbeat is running in
      geo: 
        # Token describing this location
        name: us-east-1a 
        # Lat, Lon "
        #location: "37.926868, -78.024902" 
  1. 设置的最後是要透过 ./heartbeat setup -e 帮我们到 Elasticsearch 建立好 ILM (Index Lifecycle Management) 要使用的 Index Template。

image-20210919004201201

  1. 最後执行 heartbeat。
sudo chown root heartbeat.yml 
sudo ./heartbeat -e

如果你使用 root 的身份执行 heartbeat 时,要记得将 config 的拥有者一并修改成 root。

  1. 最後可以就可以从 KibanaObservability 选单中的 Uptime 看到收集的资料了。

04-kibana-uptime

Heartbeat 使用的技巧

以下列出一些在 Heartbeat 在使用上的技巧,可以提供大家参考。

针对需求情境环境设定不定的 tags

Heartbeat 里面可以设定 tags,并且在 heartbeat.yml 里可以设定 General 的 tags,而进入到 monitors 里,可以再设定特定 monitortag,这些 tags 设定的用途,是在 Kibana 的画面很可以清楚的分类我们所定义的这一些监示排程的工作,并且可以快速的筛选。

04-setup_tags

而什麽情境来设定这些 tags,建议可以使用最常会用来分类及筛选进行检示的项目,例如:Service Name、Data Center、Project Name…等。

若是有使用 301 或 302 HTTP Redirect 的页面,要注意的设定

如果今天要透过 Heartbeat 来监测的是有设置 HTTP Redirect 的网页页面,首先要注意 max_redirects 的设定,预设是 0 ,也就是不会去执行 redirect,所以会要 Heartbeat 去跟随 Redirect 回传的指示进一步的存取下一个 Location 的话,要记得将这个设定打开,另外要注意这个设定打开之後,因为记录的过程会变得较复杂,有些资讯会无法保留,这部份请直接参考官方文件 [2]。

另外在这种情境,可以视情况先设定一组专门确认有回传 301302 结果、并且验证 HTTP header 当中的 Location 设定值,另外再建一组是会依照 HTTP redirect 执行到最後页面的结果,这样能够多确认这一步一步的过程是否如预期。

以下是我的一个例子,我会要求先取得 301 的 response status,并且最後我会要拿到的是 404 (虽然你看到 404 好像很怪,但这是我目前需要的情境 :P)。

- type: http # monitor type `http`. Connect via HTTP an optionally verify response
  id: onedoggo-web
  name: OneDoggo Web
  schedule: '@every 5s' # every 5 seconds from start of beat
  hosts: ["https://onedoggo.com"]
  ipv4: true
  ipv6: true
  mode: any
  supported_protocols: ["TLSv1.0", "TLSv1.1", "TLSv1.2"]
  # 记录 Reponse header
  response.include_body: on_error
  check.response:
    status: 301
    headers:
    - location: https://onedoggo.com/98a4eb9cdd8b40ddb4a452af7577295d
  tags: ["onedoggo", "web"]
  fields:
    env: production

- type: http # monitor type `http`. Connect via HTTP an optionally verify response
  id: onedoggo-web
  name: OneDoggo Web
  schedule: '@every 5s' # every 5 seconds from start of beat
  hosts: ["https://onedoggo.com"]
  ipv4: true
  ipv6: true
  mode: any
  supported_protocols: ["TLSv1.0", "TLSv1.1", "TLSv1.2"]
  response.include_body: always
  max_redirects: 5
  check.response:
    status: 404
  tags: ["onedoggo", "web"]
  fields:
    env: production

Kibana 也很贴心,会将 Redirect 的过程都一步一步的标示出来,让我们知道过程中走过哪些路径。

image-20210919214559939

自行定义 fields 栏位的资料,一方面在 Kibana 协助搜寻筛选,另外也能延伸自行使用

透过 fields 可以存放任何的资料,以下面为例,我们定义了 env 的栏位,里面存了 production 的值,另外也定义了 onedoggo 的栏位,里面是存放一整个物件。

- type: http # monitor type `http`. Connect via HTTP an optionally verify response
  id: onedoggo-web
  name: OneDoggo Web
  schedule: '@every 5s' # every 5 seconds from start of beat
  hosts: ["https://onedoggo.com"]
  ipv4: true
  ipv6: true
  mode: any
  supported_protocols: ["TLSv1.0", "TLSv1.1", "TLSv1.2"]
  # 记录 Reponse header
  response.include_body: on_error
  check.response:
    status: 301
    headers:
    - location: https://onedoggo.com/98a4eb9cdd8b40ddb4a452af7577295d
  tags: ["onedoggo", "web"]
  fields:
    env: production
    onedoggo:
      product: homepage
      owner: joe
      tracking:
        user: standard

而这些设定,可以在 Kibana Uptime 的画面协助过滤,另外也可以自行额外延伸使用,例如使用 heartbeat 所收集的资料,另外拉出 dashboard 等检示的图表。

04-kibana-uptime-filter-fields

将 Heartbeat 暂存在 Queue 中的资料,写入 Disk 避免遗失

Heartbeat 所收集到的资料,在送出之前,预设是会存放在 Memory queue 当中,我们可以在 heartbeat.yml 中指定 queue 的方式:

queue.disk:
  max_size: 10GB
  path: /tmp/heartbeat/diskqueue
  max_retry_interval: 30s

透过类似以上的配置,可以让 heartbeat 的资料写入到 disk 中,避免 process 中断时,资料直接遗失的风险。

使用 Autodiscover 自动侦测需要被监控的机器

Heartbeat 有支援 Autodiscover 的机制,像是使用 Docker, Kubernetes, AWS ELB,Heartbeat 可以自动帮我们侦测有哪些机器需要被监测,这部份的细节请参考官方文件 - Heartbeat Autodiscovery [3]。

使用时你可能会遇到的坑

如果使用 ICMP 并且使用 MacOS 的环境,会发生这种 Invalid argument 的错误。

image-20210919194254996

有人已经在 Github 发 Issues ,而官方团队也有回应 [4]:

Unfortunately it's still not our highest priority issue. One workaround would be using the docker image instead of plain heartbeat for now.

所以会需要特别切换成 root 来执行,或是先用 Docker 来绕路喽。

参考资料

  1. 官方文件 - Heartbeat quick start: installation and configuration
  2. 官方文件 - Heartbeat HTTP options
  3. 官方文件 - Heartbeat Autodiscovery
  4. Github Beat Issue - [Heartbeat] Rootless ping doesn't work on OSX

查看最新 Elasticsearch 或是 Elastic Stack 教育训练资讯: https://training.onedoggo.com
欢迎追踪我的 FB 粉丝页: 乔叔 - Elastic Stack 技术交流
不论是技术分享的文章、公开线上分享、或是实体课程资讯,都会在粉丝页通知大家哦!


<<:  DAY19 搞样式--CSS Gird 怎麽用(上)?

>>:  <Day4>永丰Python API — Shioaji

Day37 ( 电子元件 ) 超音波倒车雷达

超音波倒车雷达 教学原文参考:超音波倒车雷达 这篇文章会介绍如何使用超音波感测器和蜂鸣器,搭配「变数...

群雄割据还是一统天下

少林秘笈宝典 基本指令介绍 查看docker目前有哪些images可以使用 docker image...

[Day30]只用一根k棒的策略-BOP 以及github位置

这次铁人赛的尾声,放个奇妙一点的策略BOP,这个策略只用最近的一根k棒来决定买卖。 它的原理就是使用...

Android学习笔记04

kotlin+mvvm+databinding+recyclerview 上一篇讲了一般kotlin...

MySQL 一对多基本操作

实体 所谓实体即为描述我们真实世界的物件,如员工、客户、订单皆属於实体。 在实务上的需求我们可以将实...