赞
踩
Elastic 在6.5的版本中推出 Heartbeat。Heartbeat 也就是我们通常所说的心跳。我们知道在医院,医生是用听心跳来判断一个人是否有生命迹象。在 Elastic 的 Heartbeat 里,它也是一样的道理。Heartbeat 是一个轻量级的数据收集器。它用来帮我们进行 Uptime 的健康监控。它可以帮我们查看一个服务器及服务器中一些服务是否运行正常。
心跳可以在网络内部或外部运行。 它所需要的就是通过网络访问所需的 HTTP,TCP 或 ICMP 端点。 配置就像向 Heartbeat 提供你要监视的 URL 列表一样简单。 心跳将执行定期检查以验证端点是否处于运行状态,然后将此信息以及其他有用的指标报告给 Elasticsearch。 该信息会自动显示在预建的 Kibana 仪表板中,以监控服务器或服务的正常运行。
Elastic 使用 Heartbeat 来进行 Uptime 的监控的架构可以表述如下:
让我们仔细看看如何在 Elastic Stack 中设置和使用心跳。
如果我们打开我们的 Kibana 并点击 Uptime 应用,那么第一次打开的时候,我们可以看到,如下的界面。
点击 Configure Heartbeat:
我们可以选择我们所关心的平台来进行安装。针对我的情况,我来安装到我的 Mac 电脑上:
- curl -L -O https://artifacts.elastic.co/downloads/beats/heartbeat/heartbeat-7.5.0-darwin-x86_64.tar.gz
- tar xzvf heartbeat-7.5.0-darwin-x86_64.tar.gz
- cd heartbeat-7.5.0-darwin-x86_64/
在实际的使用中,你可以根据自己的 Elasticsearch 的版本选择一样版本的 Heartbeat。我们进入到 Heartbeat 的安装目录:
- $ pwd
- /Users/liuxg/elastic5/heartbeat-7.5.0-darwin-x86_64
- liuxg-2:heartbeat-7.5.0-darwin-x86_64 liuxg$ ls
- LICENSE.txt fields.yml heartbeat.yml
- NOTICE.txt heartbeat kibana
- README.md heartbeat.reference.yml monitors.d
从上面我们可以看出来在 heartbeat 的安装目录中,有一个叫做 heartbeat.yml 的配置文件。同时在 monitor.d 目录中,有几个样本的 HTTP, ICMP 及 TCP 协议的配置文件。
为了使 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 检查,因此你可以更好地了解服务的不同层。 在心跳中,我们还可以定义其他检查层,例如,使用 HTTP/S 监视器,我们可以检查响应代码(code),正文(body)和标头(header)。 使用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”。如果没有找到这个字符串,说明这个服务器是死掉了。
在所有心跳监视器上,我们可以定义其他参数,例如 name, timeout 和 schedule。 你可以在配置心跳文档中找到完整的配置说明。
配置的最后一步是设置心跳输出(将数据发送到的位置)。 受支持的输出包括自我管理的 Elasticsearch 集群,Elastic Cloud,Logstash 等。 在此示例中,我将心跳数据发送到我的本地 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:
要在 Kibana 中设置 Heartbeat 仪表板:(可选,只需运行一次)
./heartbeat setup
接着运行 Heartbeat:
./heartbeat -e
Heartbeat 一旦开始运行,它将检查你配置的 URL 列表,将信息发送回 Elastic Stack,并预填充 Kibana 仪表板。
下面我们用几个例子来展示如何使用Uptime来监控我们的服务的。
首先,我们可以按照我之前的文章 “Elasticsearch:从零开始安装Elasticsearch并使用Python装载一个CSV并读写它” 来配置我们的环境。
在这个配置中,我们使用3个 docker:
安装的步骤是这样的(具体步骤可以参阅上面说的那篇文章):
1)在一个 Termina l中运行
docker network create elastic-network
2)在一个 Terminal 中启动第一个 Docker,口地址 9200
docker run --rm --name esn01 -p 9200:9200 -v esdata01:/usr/share/elasticsearch/data --network elastic-network -e "node.name=esn01" -e "cluster.name=liuxg-docker-cluster" -e "cluster.initial_master_nodes=esn01" -e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1 -e ES_JAVA_OPTS="-Xms512m -Xmx512m" docker.elastic.co/elasticsearch/elasticsearch:7.5.0
3)在另外一个 Terminal 中启动第二个 Docker,口地址 9202
docker run --rm --name esn02 -p 9202:9200 -v esdata02:/usr/share/elasticsearch/data --network elastic-network -e "node.name=esn02" -e "cluster.name=liuxg-docker-cluster" -e "discovery.seed_hosts=esn01" -e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1 -e ES_JAVA_OPTS="-Xms512m -Xmx512m" docker.elastic.co/elasticsearch/elasticsearch:7.5.0
4)在另外一个 Terminal 中启动 Kibana,口地址 5601
docker run --rm --link esn01:elasticsearch --name kibana --network elastic-network -p 5601:5601 docker.elastic.co/kibana/kibana:7.5.0
这样我们的配置就运行好了。我们可以打开 Kibana,并查看我们的 node 运行情况:
我们可以看出来 node 运行正常。
5)在另外一个 Terminal 中运行 heartbeat 应用
因为我们想对我们的口地址为 9202 的 Elasticsearch 进行监控,那么,我们需要修改我们的 heartbeat.yml 口地址如下:
- ./heartbeat setup
- ./heartbeat -e
6)打开 Uptime 应用:
我们可以让我们的 9202 口地址的 docker 退出,过一会再重新开启。我们可以看出来如下的变化:
由于我们的 Kibana 是连接到 9200 口地址的 Elasticsearch,所以即使我们的 9202 口地址的 Elasticsearch 是退出了,那么我们的Kibana也可以照常工作。从上面我们可以看出来,我们的端口为 9202 的 Elasticsearch 服务器有上线和掉线的情况(红色为掉线,灰色为上线)。点击下方的超链接,我们可以看到更多的细节:
在接下来的实验里,我们来通过 monitors.d 目录里提供的 yaml 文件来进行我们的监视。我们可以在 heartbeat.yml 里看到:
我们可以看到上面有一个路径指向当前 heartbeat 安装目录下的 monitors.d 的目录。里面的每一个 yml 文件会自动成功一个 uptime 的配置文件,并收集数据。如果我们看一下在默认情况下的 monitors.d 目录下的文件:
- $ pwd
- /Users/liuxg/elastic5/heartbeat-7.5.0-darwin-x86_64
- liuxg-2:heartbeat-7.5.0-darwin-x86_64 liuxg$ ls monitors.d/
- sample.http.yml.disabled sample.icmp.yml.disabled sample.tcp.yml.disabled
因为所有的扩展名为 .disabled,它们在默认的情况下没有被自动启动。
我们现在来下载我们所需要的配置及所需要用来做测试的服务源码:
git clone https://github.com/liu-xiao-guo/uptime_example
下载后的文件显示为:
我们首先用我们下载的 heartbeat.yml 文件来覆盖我们之前的缺省 heartbeat.yml 文件:
heartbeat.yml:
- heartbeat.config.monitors:
- path: ${path.config}/monitors.d/*.yml
- reload.enabled: true
- reload.period: 5s
-
- setup.template.settings:
- index.number_of_shards: 1
- index.codec: best_compression
-
- tags: ["dev-web-services"]
-
- fields:
- env: dev
-
- processors:
- - add_observer_metadata:
- netinfo.enabled: false
- cache.ttl: 5m
- geo:
- name: dev-dc-1
- location: 40.7128, -74.0060
- continent_name: North America
- country_iso_code: US
- region_name: Atlanta
- region_iso_code: GA
- city_name: Rosewell
-
- setup.kibana:
- output.elasticsearch:
- # Array of hosts to connect to.
- hosts: ["localhost:9200"]
然后,我们我们下载文件里的 icmp.yml 文件拷入到 monitors.d 目录中。我们来首先看看 icmp.yml 里的内容:
icmp.yml
- - type: icmp
- name: ping-tests-google-dns
- schedule: '*/5 * * * * * *'
- hosts: ["8.8.8.8","8.8.4.4."]
- ipv4: true
- ipv6: false
- mode: any
- timeout: 16s
- wait: 1s
- fields:
- env: dev
上面的配置文件非常地简单。它每隔5秒去 ping 一下谷歌的DNS服务器 8.8.8.8 及 8.8.4.4。重新启动 Heartbeat 应用
./heartbeat -e
注意:目前由于一些原因,针对 ICMP 的监测,我们必须使用 root 权限来运行。这在将来的版本中可能会有改变。所以针对上面的命令,在 MacOS上,应该是:
- chown root heartbeat.yml
- chown root monitors.d/icmp.yml
- sudo ./heartbeat -e
由于刚开始我使用的地址 8.8.8.4. 是错的。多了一个“.",所以,我们可以看到有一些红色。之后我矫正过后就可以看到连接的状态。
我们可以点击进入超链接,就可以看到每一个连接的具体情况:
我们首先停止我们之前运行的 Heartbeat。我们首先进入到我们下载的 service 目录下的 restful 目录下,并执行如下的命令:
- gradle clean
- gradle build
等我们顺利编译好我们的 RESTful 项目后,我们重新进入到 RESTful 下的 build/libs 目录,并运行我们的 JAVA 应用:
从上面的显示,我们可以看出来我们已经成功地启动我们的 Restful 服务。我们在浏览器的地址栏中输入如下写地址:
从上面的显示中,我们可以看到我们的链接地址 http://localhost:9001/product/logstash 返回一个 JSON 的结果。针对我们的检测来说,我们如果通过这个接口能够返回到这样的一个 JSON 的结果,我们认为我们的微服务是正常工作的,否则,我们认为是处于不正常工作状态。我们需要定制我们的 restful.http.yml 文件。我们把从上面下载的文件中的 restful.http.yml 文件拷入到我们的 monitors.d 文件目录下。
restful.http.yml
- - type: http
- name: product-service-restful
- schedule: '@every 5s'
- urls: ["http://localhost:9001/product/logstash"]
- check.request:
- method: GET
- check.response:
- status: 200
- json:
- - description: check status
- condition:
- equals:
- name: "Logstash"
上面的 restful.http.yml 文件的意思是 restful 接口的返回结果是 200,并且是 JSON 格式的输出,返回结果是 “Logstash”。如果这样的条件满足的话,那么我们认为这个微服务是正常的。
现在我们重新运行我们的 Heartbeat:
./heartbeat -e
我们重新在我们的 Kibana 中查看:
我们可以看到我们的 Restful 接口显示是在 Up 的状态。假如我们把我们的微服务接口关掉,那么我们看到的是如下的情况:
SOAP 的方法和刚才我们讲到的 REST 接口方法是一样的。我们可以编译在 services 目录下的 soap 项目,并运行它:
- cd services/soap
- gradle clean
- gradle build fatjar
-
- cd services/soap/build/libs
- java -jar soap-1.0.0.jar
然后,我们在浏览器的地址中输入 http://localhost:9002/ws/product.wsdl?,我们可以看到如下的输出:
显然我们的 Web Service 是成功地部署了。接下来,我们来定义我们的配置文件。我们把下载下来的 soap.http.yml 拷入到我们的 monitors.d 文件目录中。
soap.http.yml
- - type: http
- name: product-service-soap
- schedule: '@every 5s'
- urls: ["http://localhost:9002/ws/product"]
- check.request:
- method: POST
- body: '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.elksoft.com/"> <soapenv:Header/> <soapenv:Body> <ws:getProduct> <arg0>logstash</arg0> </ws:getProduct> </soapenv:Body> </soapenv:Envelope>'
- check.response:
- status: 200
- body: '(?s).*.<name>Logstash</name>.*'
这样我们配置成功后,我们重新运行我们的 Heartbeat 应用:
./heartbeat -e
我们可以看到我们的微服务状态是 Up 状态:
如果我们把刚才启动的微服务关掉的话,那么我们可以看到如下的图:
除了上面我们介绍的 ICMP, SOAP, REST 方法外,我们其实也可以通过 TCP 协议来监测运行的状态。比如我们可以这样定义:
tcp.yml
- - type: tcp
- name: elasticsearch-checker
- schedule: '@every 5s'
- hosts: ["localhost:9200"]
- ipv4: true
- ipv6: true
- mode: any
- fields:
- env: dev
其实这个和我们刚开始介绍那个运用 HTTP 协议来监测 Elasticsearch 运行的情况相似。在这里我就不再详述了。
参考:
【1】Elastic Uptime: Actively Monitor the Availability of Your Systems and Services | Elastic Videos
【2】Elastic Uptime Monitoring solution released | Elastic Blog
【3】Uptime Monitoring with Heartbeat and the Elastic Stack | Elastic Blog
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。