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來監控我們的服務的。
例子
- 監控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服務器有上線和掉線的情況(紅色為掉線,灰色為上線)。點擊下方的超鏈接,我們可以看到更多的細節
- 使用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運行的情況相似。
參考:
【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