基於 Prometheus 構建黑盒監控體系(已用於線上環境)
本文由 dbaplus 社羣授權轉載。
概述
在監控體系裏面,通常我們認爲監控分爲:白盒監控和黑盒監控。
黑盒監控:主要關注的現象,一般都是正在發生的東西,例如出現一個告警,業務接口不正常,那麼這種監控就是站在用戶的角度能看到的監控,重點在於能對正在發生的故障進行告警。
白盒監控:主要關注的是原因,也就是系統內部暴露的一些指標,例如 redis 的 info 中顯示 redis slave down,這個就是 redis info 顯示的一個內部的指標,重點在於原因,可能是在黑盒監控中看到 redis down,而查看內部信息的時候,顯示 redis port is refused connection。
白盒監控:有很多種,有中間件,有存儲,有 web 服務器例如 redis 可以使用 info 暴露內部的指標信息;例如 mysql 可以使用 show variables 暴露內部指標信息;例如 nginx 可以使用 nginx_status 來暴露內部信息,系統業務指標可以通過埋點或者命令進行採集。
Blackbox Exporter
在前面的知識中,我們介紹 Prometheus 下如何進行白盒監控,我們監控主機的資源用量、容器的運行狀態、數據庫中間件的運行數據,通過採集相關指標來預測我們的服務健康狀態。
在黑盒健康方面。Blackbox Exporter 是 Prometheus 社區提供的官方黑盒監控解決方案,其允許用戶通過:HTTP、HTTPS、DNS、TCP 以及 ICMP 的方式對網絡進行探測,目前我司相關業務監控接口也是基於 Blockbox 來進行的,下面我們開始。
Blackbox_exporter 應用場景
1、HTTP 測試
- 定義 Request Header 信息
- 判斷 Http status / Http Respones Header / Http Body 內容
2、TCP 測試
- 業務組件端口狀態監聽
- 應用層協議定義與監聽
3、ICMP 測試
- 主機探活機制
4、POST 測試
- 接口聯通性
5、SSL 證書過期時間
結合 grafana 生成的相關模板
1、首先看下我們這邊的相關圖表,門戶多項指標與 ssl 監控
2、機房線路監控
3、接口狀態監控
Blackbox Exporter 部署
1、安裝 Exporter
複製代碼
[root@cinder1 src]# wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.16.0/blackbox_exporter-0.16.0.linux-amd64.tar.gz [root@cinder1 src]#tar -zxvf blackbox_exporter-0.16.0.linux-amd64.tar.gz -C /usr/local [root@cinder1 src]#mv /usr/local/blackbox_exporter-0.16.0.linux-amd64 /usr/local/blackbox_exporter
2、添加到啓動項
複製代碼
[root@cinder1 src]# cat /etc/systemd/system/blackbox_exporter.service [Unit] Description=blackbox_exporter After=network.target [Service] WorkingDirectory=/usr/local/blackbox ExecStart=/usr/local/blackbox/blackbox_exporter \ --config.file=/usr/local/blackbox/blackbox.yml [Install] WantedBy=multi-user.target
3、檢測是否正常啓動
複製代碼
[root@cinder1 src]# ss -tunlp|grep9115 tcp LISTEN0128:::9115:::* users:(("blackbox_export",pid=2517722,fd=3))
icmp 監控
通過 icmp 這個指標的採集,我們可以確認到對方的線路是否有問題。這個也是監控裏面比較重要的一個環節。我們要了解全國各地到我們機房的線路有哪條有問題我們總結了兩種方案:
- 全國各地各節點 ping 和訪問數據採集。這種類似聽雲運營商有提供這類服務,但是要花錢;
- 我現在用的方法就是:找各地測試 ping 的節點,我們從機房主動 ping 看是否到哪個線路有故障,下面我們開始。
1、prometheus 添加相關監控,Blackbox 使用默認配置啓動即可
複製代碼
-job_name:"icmp_ping" metrics_path:/probe params: module:[icmp]# 使用 icmp 模塊 file_sd_configs: -refresh_interval:10s files: -"/home/prometheus/conf/ping_status*.yml"#具體的配置文件 relabel_configs: -source_labels:[__address__] regex:(.*)(:80)? target_label:__param_target replacement:${1} -source_labels:[__param_target] target_label:instance -source_labels:[__param_target] regex:(.*) target_label:ping replacement:${1} -source_labels:[] regex:.* target_label:__address__ replacement:192.168.1.14:9115
2、相關 ping 節點配置
複製代碼
[root@cinder1conf]#catping_status.yml - targets:['220.181.38.150','14.215.177.39','180.101.49.12','14.215.177.39','180.101.49.11','14.215.177.38','14.215.177.38'] labels: group:'一線城市 - 電信網絡監控' - targets:['112.80.248.75','163.177.151.109','61.135.169.125','163.177.151.110','180.101.49.11','61.135.169.121','180.101.49.11'] labels: group:'一線城市 - 聯通網絡監控' - targets:['183.232.231.172','36.152.44.95','182.61.200.6','36.152.44.96','220.181.38.149'] labels: group:'一線城市 - 移動網絡監控'
這些數據是從全國各地 ping 網站進行採集,大家可以從那些網站獲取.
3、添加 grafana
這個 grafana 是自己定義的,看到網上沒有就自己定義了一個。大家可以從 github 上下載,再看看效果,可以看到我們通過 Ping 就獲取到了全國各地的線路運行情況,可以有效的檢測到我們線路異常問題:
http 相關指標監控
1、prometheus 配置 http_get 訪問
複製代碼
-job_name:"blackbox" metrics_path:/probe params: module:[http_2xx]#使用 http 模塊 file_sd_configs: -refresh_interval:1m files: -"/home/prometheus/conf/blackbox*.yml" relabel_configs: -source_labels:[__address__] target_label:__param_target -source_labels:[__param_target] target_label:instance -target_label:__address__ replacement:192.168.1.14:9115
2、相關配置文件,類似舉例如下
複製代碼
[root@cinder1conf]#cat/home/prometheus/conf/blackbox-dis.yml - targets: - https://www.zhibo8.cc - https://www.baidu.com #配置相關 URL
3、添加 grafana 模板
可以選擇模板的 9965 模板,這個模板我們也看到前面的,提供了相關的 ssl 過期檢測,這裏以兩個常見的網站爲例。
接口 get 請求檢測
1、prometheus 配置,其實跟我們之前的配置一樣,我們直接看配置文件
複製代碼
-job_name:"check_get" metrics_path:/probe params: module:[http_2xx]# Look for a HTTP 200 response. file_sd_configs: -refresh_interval:1m files: -"/home/prometheus/conf/service_get.yml" relabel_configs: -source_labels:[__address__] target_label:__param_target -source_labels:[__param_target] target_label:instance -target_label:__address__ replacement:192.168.1.14:9115
2、相關接口配置參考
複製代碼
[root@cinder1 conf]# cat service_get.yml -targets: -http://10.10.1.123:10000/pmkb/atc_tcbi -http://10.10.1.123:10000/pmkb/get_ship_lock_count -http://10.10.1.123:10000/pmkb/get_terminal_count_by_city -http://10.10.1.123:10000/pmkb/get_terminal_monitor?industry=1 -http://10.10.1.123:10000/pmkb/get_terminal_comparison?industry=1 -http://10.10.1.123:10000/pmkb/get_terminal_city_count_industry?industry=1 -http://10.10.1.123:10000/pmkb/industry_stat?industry=1 -http://10.10.1.123:10000/pmkb/get_company_car_count?industry=1 -http://10.10.1.123:10000/pmkb/get_terminal_month_countbyi?industry=1 labels: group: 'service'
3、grafana 和前面一樣自己訂製的,可以從 github 上下載
接口 post 請求狀態檢測
1、這裏首先我們要改一下 post 相關接口的 blackbox.yml 配置,我們自己定義一個模塊
複製代碼
[root@cinder1 blackbox]# cat blackbox.yml modules: http_2xx: prober: http http_post_2xx: #這個模塊名稱可以自己定義 prober: http http: method:POST headers: Content-Type: application/json #添加頭部 body:'{"username":"admin","password":"123456"}'#發送的相關數據,這裏我們以登錄接口爲例
2、添加到 prometheus
複製代碼
-job_name:"check_service" metrics_path:/probe params: module:[http_post_2xx]# 這裏要對應配置文件裏,定義的模塊 file_sd_configs: -refresh_interval:1m files: -"/home/prometheus/conf/service_post.yml" relabel_configs: -source_labels:[__address__] target_label:__param_target -source_labels:[__param_target] target_label:instance -target_label:__address__ replacement:192.168.1.14:9115
3、相關配置查看
複製代碼
[root@cinder1 conf]# cat service_post.yml - targets: - http://10.2.4.103:5000/devops/api/v1.0/login labels: group:'service'
4、添加 grafana 相關配置,這個也是自己定義的,可以從 github 上下載
tcp 端口狀態檢測
個人理解的是這個跟 telnet 差不多都是檢測端口是否在線
1、prometheus 配置
複製代碼
-job_name:'port_status' metrics_path:/probe params: module:[tcp_connect]#使用 tcp 模塊 static_configs: -targets:['10.10.1.35:8068','10.10.1.35:8069']#對應主機接口 labels: instance:'port_status' group:'tcp' relabel_configs: -source_labels:[__address__] target_label:__param_target -target_label:__address__ replacement:192.168.1.14:9115
2、圖表
圖表可以集成到前面的 grafana 9965 模板。
告警規則定義
1、業務正常性
- icmp、tcp、http、post 監測是否正常可以觀察 probe_success 這一指標
- probe_success == 0 ##聯通性異常
- probe_success == 1 ##聯通性正常
- 告警也是判斷這個指標是否等於 0,如等於 0 則觸發異常報警
2、通過 http 模塊我們可以獲取證書的過期時間,可以根據過期時間添加相關告警
probe_ssl_earliest_cert_expiry :可以查詢證書到期時間。
#經過單位轉換我們可以得到一下,按天來計算:(probe_ssl_earliest_cert_expiry - time())/86400
3、所以我們結合上面的配置可以定製如下告警規則
複製代碼
[root@cinder1rules]#catblackbox.yml groups: -name:blackbox_network_stats rules: -alert:blackbox_network_stats expr:probe_success==0 for:1m labels: severity:critical annotations: summary:" 接口 / 主機 / 端口{{ $labels.instance }}無法聯通 " description:" 請儘快檢測 "
##ssl 檢測
複製代碼
[root@cinder1rules]#catssl.yml groups: -name:check_ssl_status rules: -alert:"ssl 證書過期警告 " expr:(probe_ssl_earliest_cert_expiry-time())/86400<30 for:1h labels: severity:warn annotations: description:'域名{{$labels.instance}}的證書還有{{ printf "%.1f" $value }}天就過期了, 請儘快更新證書' summary:"ssl 證書過期警告 "
4、重啓完成之後我們可以登錄 web 界面查看下
5、我們發現有個接口已經存在問題,這個時候我們也收到了一條相應的微信告警
總結
黑盒監控相較於白盒監控最大的不同在於黑盒監控是以故障爲導向當故障發生時,黑盒監控能快速發現故障,所以我們監控時候以粒度比較細的,如端口、接口、線路等進行監控。
通過 Prometheus Blackbox Exporter 可以快速實現和定製我們很多相關策略,大家線上環境可以基於以上做配置即可。
作者介紹:
羅輝,原荔枝 FM 運維工程師,現任北方激光研究院廣西分公司運維總監。