【ElasticSearch实战】使用 Elastic Stack 简单有效快捷的监控网络资源

使用 Elastic Stack 简单有效监控网络资源

我们都知道监控web服务和应用的响应性的确是个挑战。随着时间的推移和规模的扩大,能够跟踪这种响应就更加有趣了。设置SLAs, SLOs, and KPIs 不仅需要历史视图,还需要进行分析和预测的能力。由于我们目前在学习ElasticSearch,所以可以基于它的技术栈来实现各种监控,接下来,我们将讨论利用 Heartbeat 和 Elastic Uptime 如何帮助运营团队实现可观察性,并提供大量的管理 web 服务所需的有价值的洞察力。我们将演示如何为 SOAP 和 RESTful web服务构建合成事务,以便您可以立即开始使用。

注意:生产环境还是使用Elastic 公司推荐的 阿里云腾讯云的 Elastic Stack 全部商业版本

前提条件

  1. 提前安装好ElasticSearch 和 Kibana,在官网下载最新稳定版本(7.8)解压运行即可,安装可以参考ElasticSearch 快速入门教程
  2. heartbeat下载及配置,可以通过在进入Kibana后台点击"Uptime"菜单下载及配置即可;

image-20200624170620622

heartbeat 的下载及安装

因为我使用的是Mac os操作系统,所以我这里以Mac系统为例。其他操作类似,各位根据自己的系统进行安装即可;

  1. 下载和并解压heartbeat包
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/
  1. 修改配置文件(heartbeat.yml)并设置你自己的连接ElasticSearch和Kibana的信息即可,此处测试我们就用默认参数
#elasticsearch配置
output.elasticsearch:
  hosts: ["<es_url>"]
  username: "elastic" 
  password: "<password>"
setup.kibana:
  host: "<kibana_url>"
#心跳监视配置  
heartbeat.monitors:
- type: http #此处为监听协议可以为TCP、icmp等
  urls: ["<http://localhost:9200>"]
  schedule: '@every 10s' #每10秒检测一次

其中,是elastic用户的密码,如果你没设置密码可以忽略此字段,我们可以不创建新的用户,只使用默认的super用户elastic,当然如果是生产环境不推荐不设置账号密码。<es_url>是ElasticSearch的url,<kibana_url>是kibana的url。heartbeat.monitors <http://localhost:9200>受监视的URL 在哪里,有关如何在心跳中配置监视器的更多详细信息,请阅读心跳配置文档。

  1. 启动heartbeat

setup命令将加载Kibana索引模式。

./heartbeat setup #建立索引 Index setup finished. 说明创建成功
./heartbeat -e #启动心跳

启动心跳就可以看到如下信息,说明启动成功!

[publisher_pipeline_output] pipeline/output.go:111 Connection to backoff(elasticsearch(http://localhost:9200)) established

  1. 测试–回到Kibana后台-"点击Uptime"页面 刷新一下即可看到如下页面,代表监控已生效

屏幕快照 2020-06-24 下午7.55.55

heartbeat配置文件(heartbeat.yml)说明

  1. 定义全局模式搜索配置文件并自动加载
#定义从中加载监视器定义的目录(monitors.d 目录下的监听器文件,同nginx 的自定义conf类似)。定义采用以下形式,我们以后的监控服务大多都采取这样的定义方式,方便我们统一管理不同的监听配置文件;
heartbeat.config.monitors:
  # 目录+全局模式搜索配置文件
  path: ${path.config}/monitors.d/*.yml
  # 如果为true则启用,heartbeat将定期检查配置监视器配置文件的变化
  reload.enabled: true
  # 检查更改的频率,默认为5s检测一次
  reload.period: 5s
  1. 监听器配置不建议在此处添加或修改的配置

虽然使用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
  1. 在监听器上增加丰富的地理位置信息,直观的观察是哪个机房服务出问题
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的,注意空格;

  1. 检查配置文件是否配置正确的命令(同nginx -t 类似)
./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用作用户代理产品。

tcphttp监视器类型都支持SSL / TLS和一些代理设置。

id说明(可选,但建议配置)

此配置的唯一标识符。无论对任何配置字段的更改如何,都不应随对监视器配置的编辑而改变。例如:uploader-servicehttp://example.netus-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://<host>:[port],其中:
    • scheme是以下之一tcpplainssltls。如果指定tcpplain,即使将监视器配置为使用SSL,心跳也会建立TCP连接。如果指定tlsssl,则心跳将建立SSL连接。但是,如果未将监视器配置为使用SSL,则使用系统默认值(当前Windows不支持)。
    • host 是主机名。
    • port是端口号。如果portURL中缺少, 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查找和执行网络请求)定义为任务。提供的统计信息是:

  • **jobs.active:**正在运行的作业/监视器的数量。
  • **jobs.missed_deadline:**在预定时间后执行的作业数。这可能是由于以前的工作超时时间过长或高负荷导致心跳无法跟上工作而造成的。
  • **task.active:**当前正在运行的任务数。
  • **Tasks.waiting:**如果schedule.limit设置了global选项,则该数字将反映准备执行但尚未启动的任务数,以防止超过schedule.limit

另请参阅任务计划程序设置。

ipv4说明

一个布尔值,它指定是否在配置主机名的情况下使用ipv4协议ping。默认值为true

ipv6说明

一个布尔值,它指定是否在配置主机名的情况下使用ipv6协议ping。默认值为true

mode说明

如果modeany,则监视器仅ping一个IP地址作为主机名。如果 modeall,则监视器将为主机名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以示区别;看看如图下

屏幕快照 2020-06-25 上午12.51.12

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章