使用 Elastic Stack 簡單有效監控網絡資源
我們都知道監控web服務和應用的響應性的確是個挑戰。隨着時間的推移和規模的擴大,能夠跟蹤這種響應就更加有趣了。設置SLAs, SLOs, and KPIs 不僅需要歷史視圖,還需要進行分析和預測的能力。由於我們目前在學習ElasticSearch,所以可以基於它的技術棧來實現各種監控,接下來,我們將討論利用 Heartbeat 和 Elastic Uptime 如何幫助運營團隊實現可觀察性,並提供大量的管理 web 服務所需的有價值的洞察力。我們將演示如何爲 SOAP 和 RESTful web服務構建合成事務,以便您可以立即開始使用。
注意:生產環境還是使用Elastic 公司推薦的 阿里雲 或 騰訊雲的 Elastic Stack 全部商業版本
前提條件
- 提前安裝好ElasticSearch 和 Kibana,在官網下載最新穩定版本(7.8)解壓運行即可,安裝可以參考ElasticSearch 快速入門教程
- heartbeat下載及配置,可以通過在進入Kibana後臺點擊"Uptime"菜單下載及配置即可;
heartbeat 的下載及安裝
因爲我使用的是Mac os操作系統,所以我這裏以Mac系統爲例。其他操作類似,各位根據自己的系統進行安裝即可;
- 下載和並解壓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/
- 修改配置文件(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 在哪裏,有關如何在心跳中配置監視器的更多詳細信息,請閱讀心跳配置文檔。
- 啓動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
- 測試–回到Kibana後臺-"點擊Uptime"頁面 刷新一下即可看到如下頁面,代表監控已生效
heartbeat配置文件(heartbeat.yml)說明
- 定義全局模式搜索配置文件並自動加載
#定義從中加載監視器定義的目錄(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的,注意空格;
- 檢查配置文件是否配置正確的命令(同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
用作用戶代理產品。
在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://<host>:[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查找和執行網絡請求)定義爲任務。提供的統計信息是:
- **jobs.active:**正在運行的作業/監視器的數量。
- **jobs.missed_deadline:**在預定時間後執行的作業數。這可能是由於以前的工作超時時間過長或高負荷導致心跳無法跟上工作而造成的。
- **task.active:**當前正在運行的任務數。
- **Tasks.waiting:**如果
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以示區別;看看如圖下