效能監控之 blackbox_exporter+Prometheus+Grafana 實現網路探測

語言: CN / TW / HK

theme: smartblue

「這是我參與11月更文挑戰的第25天,活動詳情檢視:2021最後一次更文挑戰

一、什麼是黑盒監控?

前面文章中我們主要介紹了 Prometheus 下如何進行白盒監控,我們監控主機的資源用量等執行資料。 這些都是支援業務和服務的基礎設施,通過白盒能夠了解其內部的實際執行狀態,通過對監控指標的觀察能夠預判可能出現的問題,從而對潛在的不確定因素進行優化。而從完整的全域性監控邏輯的角度,除了大量的應用白盒監控以外,還應該新增適當的黑盒監控。黑盒監控即以使用者的身份測試服務的外部可見性,常見的黑盒監控包括 HTT P探針、TCP 探針等用於檢測站點或者服務的可訪問性,以及訪問效率等。

二、blackbox_exporter 簡介

blackbox_exporter 是 Prometheus 官方提供的官方黑盒監控解決方案,其中 exporter 之一,可以提供 http(s)、dns、tcp、icmp 的方式對網路進行探測。

Github地址:https://github.com/prometheus/blackbox_exporter

目前支援的應用場景: - ICMP 測試 - 主機探活機制 - TCP 測試 - 業務元件埠狀態監聽 - 應用層協議定義與監聽 - HTTP 測試 - 定義 Request Header 資訊 - 判斷 Http status / Http Respones Header / Http Body 內容 - POST 測試 - 介面聯通性 - SSL 證書過期時間 - 自定義測試(擴充套件)

三、安裝

1、二進位制包

各個版本的 blackbox_exporter 下載地址為: https://github.com/prometheus/blackbox_exporter/releases

以 Linux 系統為例,下載編譯好的二進位制包,解壓使用:

```bash

cd /data/blackbox_exporter/

./blackbox_exporter --version

blackbox_exporter, version 0.16.0 (branch: HEAD, revision: 991f89846ae10db22a3933356a7d196642fcb9a9) build user: [email protected] build date: 20191111-16:27:24 go version: go1.13.4

nohup ./blackbox_exporter & ```

2、docker

bash docker run -id --name blackbox-exporter -p 9115:9115 prom/blackbox-exporter

四、使用原理

官方解釋:https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md

執行 blackbox_exporter 時,需要使用者提供探針的配置資訊,這些配置資訊可能是一些自定義的 http 頭資訊,也可能是探測時需要的一些 tls 配置,也可能是探針本身的驗證行為。在 blackbox_exporter 每一個探針配置稱為一個 module,並且以 yaml 配置檔案的形式提供給 blackbox_exporter 。每一個 module 主要包含以下配置內容,包括探針型別(prober)、驗證訪問超時時間(timeout)、以及當前探針的具體配置項:

```bash # 探針型別: http https tcp dns icmp prober:

# 超時時間 [ timeout: ] #預設單位秒

# 探針的詳細配置,最多隻能配置其中一個 [ http: ] [ tcp: ] [ dns: ] [ icmp: ] ```

可配置引數: ```bash # 此探針接受的狀態程式碼。 預設為2xx。 [ valid_status_codes: , ... | default = 2xx ]

# 此探針接受的 HTTP 版本。 [ valid_http_versions: , ... ]

# 探針將使用的 HTTP 方法。 [ method: | default = "GET" ]

# 為探針設定的 HTTP 標頭。 headers: [ : ... ]

# 探針是否將遵循任何重定向。 [ no_follow_redirects: | default = false ]

# 如果存在SSL,則探測失敗。 [ fail_if_ssl: | default = false ]

# 如果不存在SSL,則探測失敗。 [ fail_if_not_ssl: | default = false ]

# 如果響應主體與正則表示式匹配,則探測失敗。 fail_if_body_matches_regexp: [ - , ... ]

# 如果響應主體與正則表示式不匹配,則探測失敗。 fail_if_body_not_matches_regexp: [ - , ... ]

# 如果響應頭與正則表示式匹配,則探測失敗。 對於具有多個值的標頭,如果至少一個匹配,則失敗。 fail_if_header_matches: [ - , ... ]

# 如果響應頭與正則表示式不匹配,則探測失敗。 對於具有多個值的標頭,如果 none 不匹配,則失敗。 fail_if_header_not_matches: [ - , ... ]

# HTTP 探針的 TLS 協議的配置。 tls_config: [ ]

# 目標的 HTTP 基本身份驗證憑據。 basic_auth: [ username: ] [ password: ] [ password_file: ]

# 目標的承載令牌。 [ bearer_token: ]

# 目標的承載令牌檔案。 [ bearer_token_file: ]

# 用於連線到目標的 HTTP 代理伺服器。 [ proxy_url: ]

# HTTP 探針的 IP 協議(ip4,ip6) [ preferred_ip_protocol: | default = "ip6" ] [ ip_protocol_fallback: | default = true ]

# 探針中使用的 HTTP 請求的主體。 body: [ ] ```

五、幾種應用場景

1、ICMP 測試(主機探活)

可以通過 ping(icmp) 檢測伺服器的存活,在 blackbox.yml 配置檔案中配置使用 icmp module: yaml modules: icmp: prober: icmp 在 prometheus 配置檔案如下:

yml - job_name: 'blackbox-ping' metrics_path: /probe params: modelus: [icmp] static_configs: - targets: - 172.16.106.208 #被監控端ip - 172.16.106.80 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 172.16.106.84:9115 #blackbox-exporter 所在的機器和埠

這裡分別配置了名為 blackbox-ping 的採集任務,並且通過 params 指定使用的探針(module)以及探測目標(target)。那問題就來了,假如我們有 N 個目標站點且都需要 M 種探測方式,那麼 Prometheus 中將包含 N * M 個採集任務,從配置管理的角度來說顯然是不可接受的。 在前面的文章我們介紹了 Prometheus 的 Relabeling 能力,這裡我們也可以採用 Relabling 的方式對這些配置進行簡化。 這裡針對每一個探針服務(如 icmp)定義一個採集任務,並且直接將任務的採集目標定義為我們需要探測的站點。在採集樣本資料之前通過 relabel_configs 對採集任務進行動態設定。 - 第1步,根據 target 例項的地址,寫入 __param_target 標籤中。__param_<name> 形式的標籤表示,在採集任務時會在請求目標地址中新增 <name> 引數,等同於 params 的設定; - 第2步,獲取 __param_target 的值,並覆寫到 instance 標籤中; - 第3步,覆寫 target 例項的 __address__ 標籤值為 blackbox_exporter 例項的訪問地址。

通過以上3個 relabel 步驟,即可大大簡化 Prometheus 任務配置的複雜度。 Blackbox Target例項

2、TCP 測試(監控主機埠存活狀態)

blackbox.yml 配置檔案中配置使用 tcp module:

yaml modules: tcp_connect: prober: tcp

在 prometheus 配置檔案如下:

yml - job_name: 'blackbox-tcp' metrics_path: /probe params: modelus: [tcp_connect] static_configs: - targets: - 172.16.106.208:6443 - 172.16.106.80:6443 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 172.16.106.84:9115

3、HTTP檢測(監控網站狀態)

http 探針是進行黑盒監控時最常用的探針之一,通過 http 探針能夠網站或者 http 服務建立有效的監控,包括其本身的可用性,以及使用者體驗相關的如響應時間等等。除了能夠在服務出現異常的時候及時報警,還能幫助運維同學分析和優化網站體驗。

blackbox.yml 配置檔案中配置使用 http module:

yml modules: http_2xx: prober: http http: method: GET http_post_2xx: prober: http http: method: POST

在 prometheus 配置檔案如下:

yml - job_name: 'blackbox-http' metrics_path: /probe params: modelue: [http_2xx] static_configs: - targets: - http://monitor.mall.demo.com/login relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 172.16.106.84:9115 #blackbox-exporter 所在的機器和埠

通過 prober 配置項指定探針型別。配置項 http 用於自定義探針的探測方式,這裡有沒對 http 配置項新增任何配置,表示完全使用 http 探針的預設配置,該探針將使用 http get 的方式對目標服務進行探測,並且驗證返回狀態碼是否為 2xx,是則表示驗證成功,否則失敗。

採集的資料如下:

```bash

DNS解析時間,單位 s

probe_dns_lookup_time_seconds 0.000199105

探測從開始到結束的時間,單位 s,請求這個頁面響應時間

probe_duration_seconds 0.010889113

HELP probe_failed_due_to_regex Indicates if probe failed due to regex

TYPE probe_failed_due_to_regex gauge

probe_failed_due_to_regex 0

HTTP 內容響應的長度

probe_http_content_length -1

按照階段統計每階段的時間

probe_http_duration_seconds{phase="connect"} 0.001083728 #連線時間 probe_http_duration_seconds{phase="processing"} 0.008365885 #處理請求的時間 probe_http_duration_seconds{phase="resolve"} 0.000199105 #響應時間 probe_http_duration_seconds{phase="tls"} 0 #校驗證書的時間 probe_http_duration_seconds{phase="transfer"} 0.000446424 #傳輸時間

重定向的次數

probe_http_redirects 0

ssl 指示是否將 SSL 用於最終重定向

probe_http_ssl 0

返回的狀態碼

probe_http_status_code 200

未壓縮的響應主體長度

probe_http_uncompressed_body_length 1766

http 協議的版本

probe_http_version 1.1

HELP probe_ip_addr_hash Specifies the hash of IP address. It's useful to detect if the IP address changes.

probe_ip_addr_hash 3.24030434e+09

使用的 ip 協議的版本號

probe_ip_protocol 4

是否探測成功

probe_success 1 ```

4、自定義 HTTP 請求

http 服務通常會以不同的形式對外展現,有些可能就是一些簡單的網頁,而有些則可能是一些基於 REST 的 API 服務。 對於不同型別的 http 的探測需要管理員能夠對 http 探針的行為進行更多的自定義設定,包括:http 請求方法、http 頭資訊、請求引數等。對於某些啟用了安全認證的服務還需要能夠對 http 探測設定相應的 auth 支援。對於 https 型別的服務還需要能夠對證書進行自定義設定。 如下所示,這裡通過 method 定義了探測時使用的請求方法,對於一些需要請求引數的服務,還可以通過 headers 定義相關的請求頭資訊,使用 body 定義請求內容:

yaml http_post_2xx: prober: http timeout: 5s http: method: POST headers: Content-Type: application/json body: '{}'

如果 http 服務啟用了安全認證,blackbox_exporter 內建了對 basic_auth 的支援,可以直接設定相關的認證資訊即可:

yaml http_basic_auth_example: prober: http timeout: 5s http: method: POST headers: Host: "login.example.com" basic_auth: username: "username" password: "mysecret"

對於使用了Bear Token 的服務也可以通過 bearer_token 配置項直接指定令牌字串,或者通過 bearer_token_file 指定令牌檔案。 對於一些啟用了 https 的服務,但是需要自定義證書的服務,可以通過 tls_config 指定相關的證書資訊:

yml http_custom_ca_example: prober: http http: method: GET tls_config: ca_file: "/certs/my_cert.crt"

5、自定義探針行為

在預設情況下 http 探針只會對 http 返回狀態碼進行校驗,如果狀態碼為 2XX(200 <= StatusCode < 300)則表示探測成功,並且探針返回的指標 probe_success 值為1。 如果使用者需要指定 http 返回狀態碼,或者對 http 版本有特殊要求,如下所示,可以使用 valid_http_versions 和valid_status_codes 進行定義:

yaml http_2xx_example: prober: http timeout: 5s http: valid_http_versions: ["HTTP/1.1", "HTTP/2"] valid_status_codes: []

預設情況下,Blockbox 返回的樣本資料中也會包含指標 probe_http_ssl,用於表明當前探針是否使用了 ssl:

```yml

HELP probe_http_ssl Indicates if SSL was used for the final redirect

TYPE probe_http_ssl gauge

probe_http_ssl 0 ```

而如果使用者對於 http 服務是否啟用 ssl 有強制的標準。則可以使用 fail_if_ssl 和 fail_if_not_ssl 進行配置。fail_if_ssl 為 true 時,表示如果站點啟用了 ssl 則探針失敗,反之成功。fail_if_not_ssl 剛好相反。

yaml http_2xx_example: prober: http timeout: 5s http: valid_status_codes: [] method: GET no_follow_redirects: false fail_if_ssl: false fail_if_not_ssl: false

除了基於 http 狀態碼,http 協議版本以及是否啟用 ssl 作為控制探針探測行為成功與否的標準以外,還可以匹配 http 服務的響應內容。使用 fail_if_matches_regexp 和 fail_if_not_matches_regexp 使用者可以定義一組正則表示式,用於驗證 http 返回內容是否符合或者不符合正則表示式的內容。

yaml http_2xx_example: prober: http timeout: 5s http: method: GET fail_if_matches_regexp: - "Could not connect to database" fail_if_not_matches_regexp: - "Download the latest version here"

最後需要提醒的時,預設情況 下http 探針會走 ipv6 的協議。 在大多數情況下,可以使用 preferred_ip_protocol=ip4 強制通過ipv4 的方式進行探測。在 Bloackbox 響應的監控樣本中,也會通過指標 probe_ip_protocol,表明當前的協議使用情況: ```yaml

HELP probe_ip_protocol Specifies whether probe ip protocol is IP4 or IP6

TYPE probe_ip_protocol gauge

probe_ip_protocol 6 ```

6、檢查配置檔案

檢查配置檔案是否書寫正確

bash cd /data/prometheus ./promtool check config prometheus.yml

六、整合 Grafana

在 grafana 匯入 blackbox_exporter 9965 號模板:https://grafana.com/grafana/dashboards/9965

注意:此模板需要安裝餅狀圖外掛,下載地址:https://grafana.com/grafana/plugins/grafana-piechart-panel

安裝外掛,重啟grafana生效。

bash grafana-cli plugins install grafana-piechart-panel service grafana-server restart

檢視資料如下:

在這裡插入圖片描述

八、小結

黑盒監控相較於白盒監控最大的不同在於黑盒監控是以故障為導向當故障發生時,黑盒監控能快速發現故障,而白盒監控則側重於主動發現或者預測潛在的問題。一個完善的監控目標是要能夠從白盒的角度發現潛在問題,能夠在黑盒的角度快速發現已經發生的問題。

示例資料:

  • https://github.com/zuozewei/blog-example/tree/master/Performance-testing/03-performance-monitoring/prometheus-blackbox_exporter-grafana

參考資料: - [1]:https://cloud.tencent.com/developer/article/1584310 - [2]:https://www.cnblogs.com/xiao987334176/p/12022482.html