我们都知道监控web服务和应用的响应性的确是个挑战。随着时间的推移和规模的扩大,能够跟踪这种响应就更加有趣了。设置SLAs, SLOs, and KPIs 不仅需要历史视图,还需要进行分析和预测的能力。由于我们目前在学习ElasticSearch,所以可以基于它的技术栈来实现各种监控,接下来,我们将讨论利用 Heartbeat 和 Elastic Uptime 如何帮助运营团队实现可观察性,并提供大量的管理 web 服务所需的有价值的洞察力。我们将演示如何为 SOAP 和 RESTful web服务构建合成事务,以便您可以立即开始使用。
注意:生产环境还是使用Elastic 公司推荐的 阿里云 或 腾讯云的 Elastic Stack 全部商业版本
因为我使用的是Mac os操作系统,所以我这里以Mac系统为例。其他操作类似,各位根据自己的系统进行安装即可;
curl -L -O https://artifacts.elastic.co/downloads/beats/heartbeat/heartbeat-7.7.1-darwin-x86_64.tar.gz
tar xzvf heartbeat-7.7.1-darwin-x86_64.tar.gz
cd heartbeat-7.7.1-darwin-x86_64/
#elasticsearch配置
output.elasticsearch:
hosts: ["" ]
username: "elastic"
password: ""
setup.kibana:
host: ""
#心跳监视配置
heartbeat.monitors:
- type: http #此处为监听协议可以为TCP、icmp等
urls: ["" ]
schedule: '@every 10s' #每10秒检测一次
其中,是elastic用户的密码,如果你没设置密码可以忽略此字段,我们可以不创建新的用户,只使用默认的super用户elastic,当然如果是生产环境不推荐不设置账号密码。
受监视的URL 在哪里,有关如何在心跳中配置监视器的更多详细信息,请阅读心跳配置文档。
该setup
命令将加载Kibana索引模式。
./heartbeat setup #建立索引 Index setup finished. 说明创建成功
./heartbeat -e #启动心跳
启动心跳就可以看到如下信息,说明启动成功!
[publisher_pipeline_output] pipeline/output.go:111 Connection to backoff(elasticsearch(http://localhost:9200)) established
#定义从中加载监视器定义的目录(monitors.d 目录下的监听器文件,同nginx 的自定义conf类似)。定义采用以下形式,我们以后的监控服务大多都采取这样的定义方式,方便我们统一管理不同的监听配置文件;
heartbeat.config.monitors:
# 目录+全局模式搜索配置文件
path: ${path.config}/monitors.d/*.yml
# 如果为true则启用,heartbeat将定期检查配置监视器配置文件的变化
reload.enabled: true
# 检查更改的频率,默认为5s检测一次
reload.period: 5s
虽然使用heartbeat.yml
配置文件很方便,但有两个缺点:使用大量监视器可能会变得难以管理,并且更改内容后不会自动重新加载心跳。
# Configure monitors inline
heartbeat.monitors:
- type: http
#名字可以自定义,此处我们监听ElasticSearch,所以我命名为es
name: es
# List or urls to query
urls: ["http://localhost:9200"]
# Configure task schedule
schedule: '@every 10s'
# Total test connection and data exchange timeout
#timeout: 16s
processors:
- add_observer_metadata:
# Optional, but recommended geo settings for the location Heartbeat is running in
#如果我们需要获取网卡信息,可以开启下面参数
netinfo.enable: true
cache.ttl: 5m
geo:
# Token describing this location
name: us-east-1a
# Lat, Lon "
location: "37.926868, -78.024902"
注意yml文件的格式,name和location 都是归属于geo的,注意空格;
./heartbeat test config
Config OK
由于我们上面在heartbeat.yml文件中定义了全局配置文件扫描,所以我们只需在monitors.d 目录下新增下面的yml配置,heartbeat会自动加载配置文件
新增一个services.yml配置文件,内容如下
- type: http
id: web-service
name: web-service
hosts: ["http://localhost:80/service/status"]
check.response.status: [200]
schedule: '@every 5s'
ipv4: true
ipv6: true
mode: any
timeout: 16s
tags: ["service-X", "web-tier"]
#普通web服务
- type: http
id: myhost
name: My HTTP Host
schedule: '@every 5s'
hosts: ["http://myhost:80"]
#TLS/SSL web服务
- type: http
id: my-http-service
name: My HTTP Service
hosts: ["https://myhost:443"]
schedule: '@every 5s'
ssl:
certificate_authorities: ['/etc/ca.crt']
supported_protocols: ["TLSv1.0", "TLSv1.1", "TLSv1.2"]
#简单请求头响应
- type: http
id: my-http-host
name: My HTTP Service
hosts: ["http://myhost:80"]
check.request.method: HEAD
check.response.status: [200]
schedule: '@every 5s'
#请求body参数并响应接口检查
- type: http
id: demo-service
name: Demo Service
schedule: '@every 5s'
urls: ["http://localhost:8080/demo/add"]
check.request:
method: POST
headers:
'Content-Type': 'application/x-www-form-urlencoded'
# urlencode the body:
body: "name=first&email=someemail%40someemailprovider.com"
check.response:
status: [200]
body:
- Saved
- saved
#请求响应json解析
- type: http
id: demo-service
name: Demo Service
schedule: '@every 5s'
hosts: ["https://myhost:80"]
check.request:
method: GET
headers:
'X-API-Key': '12345-mykey-67890'
check.response:
status: [200,201] #状态码可以多个,根据自己业务而定
json:
- description: check status
condition:
equals:
status: ok
#以下配置显示了如何检查多个正则表达式模式的响应:
- type: http
id: demo-service
name: Demo Service
schedule: '@every 5s'
hosts: ["https://myhost:80"]
check.request:
method: GET
headers:
'X-API-Key': '12345-mykey-67890'
check.response:
status: [200]
body:
- hello
- world
#以下配置显示了如何使用多行正则表达式检查响应:
- type: http
id: demo-service
name: Demo Service
schedule: '@every 5s'
hosts: ["https://myhost:80"]
check.request:
method: GET
headers:
'X-API-Key': '12345-mykey-67890'
check.response:
status: [200]
body: '(?s)first.*second.*third'
- type: tcp
id: echo-service
name: Echo Service
hosts: ["myhost"]
ports: [80, 9200, 5044]
check.send: 'Hello World'
check.receive: 'Hello World'
schedule: '@every 5s'
ssl:
certificate_authorities: ['/etc/ca.crt']
supported_protocols: ["TLSv1.0", "TLSv1.1", "TLSv1.2"]
在任何位置定义心跳监视器时,可以指定以下选项。这些选项对于所有监视器都是相同的。每种监视器类型都有特定于该监视器类型的其他配置选项。
type说明
您可以将心跳配置为使用以下监视器类型:
icmp
使用ICMP(v4和v6)回显请求来ping通配置的主机。需要特殊权限或root用户访问权限。
tcp
通过TCP连接,并可选地通过发送和/或接收自定义有效负载来验证端点。
http
通过HTTP连接,并可选地验证主机是否返回了预期的响应。将Elastic-Heartbeat
用作用户代理产品。
在tcp
和http
监视器类型都支持SSL / TLS和一些代理设置。
id说明(可选,但建议配置)
此配置的唯一标识符。无论对任何配置字段的更改如何,都不应随对监视器配置的编辑而改变。例如:uploader-service
,http://example.net
,us-west-loadbalancer
。请注意,此唯一性仅在给定的beat实例内。如果要从多个位置监视同一终结点,建议这些心跳实例使用相同的ID,以便可以关联其结果。您可以使用该host.geo.name
属性消除歧义。
在查询索引的监控器数据时,这是您要汇总的字段。在导出的字段中显示 为monitor.id
。
如果未设置,则将对监视器的配置进行哈希处理,并使用生成的值。此值将随此监视器的任何选项更改而更改,从而使更改之间无法随时间进行汇总。因此,建议您手动设置。
name说明(可选,但建议配置)
可以自定义,最好取一个与业务有关联的名字,方便服务过多后方便查看;
hosts说明
主机列表。列表中的条目可以是:
localhost
或IP地址。如果指定此选项,则还必须指定的值ports
。如果将监视器配置为使用SSL,则心跳将建立基于SSL / TLS的连接。否则,它将建立纯TCP连接。localhost:12345
。心跳线连接到指定主机上的端口。如果将监视器 配置为使用SSL,则心跳将建立基于SSL / TLS的连接。否则,它将建立TCP连接。scheme://:[port]
,其中:
scheme
是以下之一tcp
,plain
,ssl
或tls
。如果指定tcp
或plain
,即使将监视器配置为使用SSL,心跳也会建立TCP连接。如果指定tls
或ssl
,则心跳将建立SSL连接。但是,如果未将监视器配置为使用SSL,则使用系统默认值(当前Windows不支持)。host
是主机名。port
是端口号。如果port
URL中缺少, ports
则需要设置。ports说明
如果在其中指定的主机hosts
不包含端口号,则要ping的端口列表。通常最好在此处使用单个值,因为每个端口都将使用单独的id
,具有给定id
值的值进行监控,该值用作心跳数据中的前缀,并name
通过此检查发送跨事件配置的共享值。
enabled说明
可以设置是否启用当前模块,缺省默认是启用的;
schedule说明
一个类似于cron的表达式,用于指定任务计划。例如:
*/5 * * * * * *
每5秒运行一次任务(例如,在10:00:00、10:00:05等)。@every 5s
从启动心跳开始,每隔5秒运行一次任务。该schedule
选项基于此cronexpr
实现使用类似cron的语法,但是添加了@every
关键字。
对于执行计划任务的统计信息,您可以http.enabled: true
在heartbeat.yml中启用HTTP统计服务器,然后运行curl http://localhost:5066/stats | jq .heartbeat.scheduler
以查看调度程序的统计信息。提供了作业和任务的统计信息。每次安排监视器时,都将其视为单个作业,而将作业的部分工作(如DNS查找和执行网络请求)定义为任务。提供的统计信息是:
schedule.limit
设置了global选项,则该数字将反映准备执行但尚未启动的任务数,以防止超过schedule.limit
。另请参阅任务计划程序设置。
ipv4说明
一个布尔值,它指定是否在配置主机名的情况下使用ipv4协议ping。默认值为true
。
ipv6说明
一个布尔值,它指定是否在配置主机名的情况下使用ipv6协议ping。默认值为true
。
mode说明
如果mode
为any
,则监视器仅ping一个IP地址作为主机名。如果 mode
为all
,则监视器将为主机名ping所有可解析的IP。mode: all
如果您正在使用DNS负载平衡器并且要ping通每个IP地址以获取指定的主机名,则此 设置很有用。默认值为any
。
timeout说明
每次Ping测试的总运行时间。这是测试连接和交换数据所允许的总时间。默认值为16秒(16s)。
如果超过了超时,则心跳将发布一个service-down
事件。如果指定的值timeout
大于schedule
,则调度程序将不执行中间检查。
tags说明
随监视事件一起发送的标签列表。此设置是可选的。
最后来看看我跑起来的效果吧,浏览器访问Elastic Kibana http://localhost:5601/app/uptime#/ 查看监控信息,我这里故意做了一个不能访问的服务,1个down,2个up以示区别;看看如图下