Elastic:使用Heartbeat進行Uptime監控


Elastic:使用Heartbeat進行Uptime監控

Elastic在6.5的版本中推出Heartbeat。Heartbeat 也就是我們通常所說的心跳。我們知道在醫院,醫生是用聽心跳來判斷一個人是否有生命跡象。在Elastic的Heartbeat里,它也是一樣的道理。Heartbeat是一個輕量級的數據收集器。它用來幫我們進行uptime的健康監控。它可以幫我們查看一個服務器及服務器中一些服務是否運行正常。

心跳可以在網絡內部或外部運行。 它所需要的就是通過網絡訪問所需的HTTP,TCP或ICMP端點。 配置就像向Heartbeat提供您要監視的URL列表一樣簡單。 心跳將執行定期檢查以驗證端點是否處於運行狀態,然后將此信息以及其他有用的指標報告給Elasticsearch。 該信息會自動顯示在預建的Kibana儀表板中,以監控服務器或服務的正常運行。

Elastic使用heartbeat來進行Uptime的監控的架構可以表述如下:

讓我們仔細看看如何在Elastic Stack中設置和使用心跳。

安裝Uptime

如果我們打開我們的Kibana並點擊Uptime應用,那么第一次打開的時候,我們可以看到,如下的界面。

點擊Configure Heartbeat,可以選擇我們所關心的平台來進行安裝。:

curl -L -O https://artifacts.elastic.co/downloads/beats/heartbeat/heartbeat-7.5.0-linux-x86_64.tar.gz
tar xzvf heartbeat-7.5.0-linux-x86_64.tar.gz
cd heartbeat-7.5.0-linux-x86_64/

在實際的使用中,可以根據自己的Elasticsearch的版本選擇一樣版本的Heartbeat。我們進入到Heartbeat的安裝目錄:

$ 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協議的配置文件。

配置Uptime監控

為了使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

心跳帶有預建的儀表板,這些儀表板可提供大量的可用的可視化面板。 使用以下命令設置儀表板並運行Heartbeat:

要在Kibana中設置Heartbeat儀表板:(可選,只需運行一次)

./heartbeat setup

接着運行Heartbeat:

./heartbeat -e

Heartbeat一旦開始運行,它將檢查您配置的URL列表,將信息發送回Elastic Stack,並預填充Kibana儀表板。

下面我們用幾個例子來展示如何使用Uptime來監控我們的服務的。

例子

  1. 監控Elasticsearch服務器
    在這個配置中,我們使用3個docker:
  • 第一個docker運行一個Elasticsearch並置於口地址9200
  • 第二個docker運行一個Elasticsearch並置於口地址9202
  • 第三個docker運行一個Kibana並置於口地址5601,同時它的Elasticsearch配置指向第一個Elasticsearch口地址9200。這樣在第二個Elasticsearch docker不運行時,我們的Kibana還可以繼續運行

安裝的步驟是這樣的:

1)在一個Terminal中運行

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服務器有上線和掉線的情況(紅色為掉線,灰色為上線)。點擊下方的超鏈接,我們可以看到更多的細節

  1. 使用ICMP來監控網站

在接下來的實驗里,我們來通過 monitors.d里提供的yaml文件來進行我們的監視。我們可以在heartbeat.yml里看到:

我們可以看到上面有一個路徑指向當前heartbeat安裝目錄下的monitors.d的目錄。里面的每一個yml文件會自動成功一個uptime的配置文件,並收集數據。如果我們看一下在默認情況下的monitors.d目錄下的文件:

$ ls monitors.d/
sample.http.yml.disabled sample.icmp.yml.disabled sample.tcp.yml.disabled

因為所有的擴展名為.disabled,它們在默認的情況下沒有被自動啟動。

首先用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權限來運行。這在將來的版本中可能會有改變。:

chown root heartbeat.yml
chown root monitors.d/icmp.yml
sudo ./heartbeat -e

由於剛開始我使用的地址8.8.4.4.是錯的。多了一個“.",所以,我們可以看到有一些紅色。之后我矯正過后就可以看到連接的狀態。

我們可以點擊進入超鏈接,就可以看到每一個連接的具體情況

使用REST接口來查運行狀態


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來查看運行狀態

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狀態

使用TCP來監控運行狀態

除了上面我們介紹的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】https://www.elastic.co/webinars/elastic-uptime-monitoring-actively-monitor-the-availability-of-your-systems-and-services

【2】https://www.elastic.co/blog/elastic-uptime-monitoring-solution-released

【3】https://www.elastic.co/blog/uptime-monitoring-with-heartbeat-and-the-elastic-stack


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM