網路探測:Blackbox Exporter

  • 2020 年 2 月 17 日
  • 筆記

網路探測:Blackbox Exporter

什麼是 blackbox exporter?

Blackbox Exporter 是 Prometheus 社區提供的 官方黑盒監控解決方案,其允許用戶通過: httpHTTPSDNSTCPICMP的方式對網路進行探測.

以 docker 方式運行 blackbox exporter

拉取鏡像

docker pull prom/blackbox-exporter

查看 dockerfile(這是一個好習慣)

$ cat check_docker_file.sh  #!/bin/bash  export PATH=$PATH  if [ $# -eq 1 ];then          docker history --format {{.CreatedBy}} --no-trunc=true $1 |sed "s//bin/sh -c #(nop) //g"|sed "s//bin/sh -c/RUN/g" | tac      else          echo "sh Obtain_dockerfile.sh $DOCKER_IMAGE"  fi    $ sh check_docker_file.sh prom/blackbox-exporter:latest  ADD file:b265aa0ea2ef7ff1f4a3e087217e75aca2c90f5c345406299664cc7969b2b28e in /   CMD ["sh"]   MAINTAINER The Prometheus Authors <[email protected]>  COPY dir:b1c1c3c551755544b818d03ad9136b137ca12c48393ba5cdd58d7f845647e042 in /   LABEL maintainer=The Prometheus Authors <[email protected]>   ARG ARCH=amd64   ARG OS=linux  COPY file:2bfe91827ebb767bc51f40cd84675a3c315d9da8a70f6d8071c806e0b2b1ee73 in /bin/blackbox_exporter  COPY file:6e820c2d591d3433d139b66241b74e9b7ffc90c9e120bac49cf97014e16f070a in /etc/blackbox_exporter/config.yml   EXPOSE 9115   ENTRYPOINT ["/bin/blackbox_exporter"]   CMD ["--config.file=/etc/blackbox_exporter/config.yml"]

運行 blackbox exporter

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

blackbox exporter 配置文件解讀

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

modules:    http_2xx:      prober: http    http_post_2xx:      prober: http      http:        method: POST    tcp_connect:      prober: tcp    pop3s_banner:      prober: tcp      tcp:        query_response:        - expect: "^+OK"        tls: true        tls_config:          insecure_skip_verify: false    ssh_banner:      prober: tcp      tcp:        query_response:        - expect: "^SSH-2.0-"    irc_banner:      prober: tcp      tcp:        query_response:        - send: "NICK prober"        - send: "USER prober prober prober :prober"        - expect: "PING :([^ ]+)"          send: "PONG ${1}"        - expect: "^:[^ ]+ 001"    icmp:      prober: icmp

運行 blackbox exporter 時,需要用戶提供探針的配置資訊,這些配置資訊可能是一些自定義的 HTTP 頭資訊,也可能是探測時需要的一些 TSL(秘鑰證書) 配置,也可能是探針本身的驗證行為.在 blackbox exporter 每一個探針配置稱為一個 module,並且以 YAML 配置文件的形式提供給 blackbox exporter.每一個 module 主要包含以下配置內容,探針類型(prober),驗證訪問超時時間(timeout),以及當前探針的具體配置項:

# 探針類型: http https tcp dns icmp  prober: <prober_string>   #必選    # 超時時間:  [timeout: <duration>] #默認單位秒    # 探針的詳細配置,最多只能配置其中一個  [ http: <http_probe> ]  [ tcp: <tcp_probe> ]  [ dns: <dns_probe> ]  [ icmp: <icmp_probe> ]

<http_probe>可配置參數

# 此探針接受的狀態程式碼。 默認為2xx。    [ valid_status_codes: <int>, ... | default = 2xx ]    # 此探針接受的 HTTP 版本.    [ valid_http_versions: <string>, ... ]    #探針將使用的HTTP方法。    [ method: <string> | default = "GET" ]    # 為探針設置的HTTP標頭。    headers:      [ <string>: <string> ... ]    # 探針是否將遵循任何重定向    [ no_follow_redirects: <boolean> | default = false ]    # 如果存在SSL,則探測失敗。    [ fail_if_ssl: <boolean> | default = false ]    # 如果不存在SSL,則探測失敗。    [ fail_if_not_ssl: <boolean> | default = false ]    # 如果響應主體與正則表達式匹配,則探測失敗。    fail_if_body_matches_regexp:      [ - <regex>, ... ]    # 如果響應主體與正則表達式不匹配,則探測失敗。    fail_if_body_not_matches_regexp:      [ - <regex>, ... ]    # 如果響應頭與正則表達式匹配,則探測失敗。 對於具有多個值的標頭,如果*至少一個*匹配,則失敗。    fail_if_header_matches:      [ - <http_header_match_spec>, ... ]    # 如果響應頭與正則表達式不匹配,則探測失敗。 對於具有多個值的標頭,如果* none *不匹配,則失敗。    fail_if_header_not_matches:      [ - <http_header_match_spec>, ... ]    # HTTP探針的TLS協議的配置。    tls_config:      [ <tls_config> ]    # 目標的HTTP基本身份驗證憑據。    basic_auth:      [ username: <string> ]      [ password: <secret> ]    # 目標的承載令牌。    [ bearer_token: <secret> ]    # 目標的承載令牌文件    [ bearer_token_file: <filename> ]    # 用於連接到目標的HTTP代理伺服器。    [ proxy_url: <string> ]    # HTTP探針的IP協議(ip4,ip6)    [ preferred_ip_protocol: <string> | default = "ip6" ]    [ ip_protocol_fallback: <boolean> | default = true ]    # 探針中使用的HTTP請求的主體。    body: [ <string> ]    ###################################################################  <http_header_match_spec>      header: <string>,      regexp: <regex>,      [ allow_missing: <boolean> | default = false ]

分別介紹幾種應用場景

ping 檢測

可以通過 ping(icmp)檢測伺服器的存活,在 prometheus 配置文件中配置使用 ping module:

  icmp:      prober: icmp

與 prometheus 集成

  - job_name: 'blackbox-ping'      metrics_path: /probe      params:        modelus: [icmp]      static_configs:      - targets:        - 223.5.5.5        lables:          instance: aliyun      - targets:        - 47.92.229.67        lables:          instance: zsf      relabel_configs:        - source_labels: [__address__]          target_label: __param_target        - source_labels: [__param_target]          target_label: instance        - target_label: __address__          replacement: 192.168.111.65:9115

HTTP

blackbox config file

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

配置好之後運行如指令

#DNS解析時間,單位 s  probe_dns_lookup_time_seconds 0.039431355  #探測從開始到結束的時間,單位 s,請求這個頁面響應時間  probe_duration_seconds 0.651619323    probe_failed_due_to_regex 0    #HTTP 內容響應的長度  probe_http_content_length -1  #按照階段統計每階段的時間  probe_http_duration_seconds{phase="connect"} 0.050388884   #連接時間  probe_http_duration_seconds{phase="processing"} 0.45868667 #處理請求的時間  probe_http_duration_seconds{phase="resolve"} 0.040037612  #響應時間  probe_http_duration_seconds{phase="tls"} 0.145433254    #校驗證書的時間  probe_http_duration_seconds{phase="transfer"} 0.000566269  #重定向的次數  probe_http_redirects 1  #ssl 指示是否將 SSL 用於最終重定向  probe_http_ssl 1  #返回的狀態碼  probe_http_status_code 200  #未壓縮的響應主體長度  probe_http_uncompressed_body_length 40339  #http 協議的版本  probe_http_version 1.1  #使用的 ip 協議的版本號  probe_ip_protocol 4    probe_ssl_earliest_cert_expiry 1.59732e+09  #是否探測成功  probe_success 1  #TLS 的版本號  probe_tls_version_info{version="TLS 1.2"} 1

與 prometheus 集成,採用prometheus 的 Relabelinng 能力(服務發現)

  - job_name: 'blackbox-http'      metrics_path: /probe      params:        modelue: [http_2xx]      static_configs:      - targets:        - http://www.zhangshoufu.com        - http://www.xuliangwei.com      relabel_configs:        - source_labels: [__address__]          target_label: __param_target        - source_labels: [__param_target]          target_label: instance        - target_label: __address__          replacement: 192.168.111.65:9115  #blackbox-exporter 所在的機器和埠

這裡針對每一個探針服務(如http_2xx)定義一個採集任務,並且直接將任務的採集目標定義為我們需要探測的站點。在採集樣本數據之前通過relabel_configs對採集任務進行動態設置。

1, 根據 Target 實例的地址,寫入__param_target 標籤中,__param_&lt;name&gt;形式的標籤表示,在採集任務時會在請求目標地址中添加<name>參數,等同於 params 的設置 2, 獲取__param_target的值,並覆寫到instance標籤中; 3, 覆寫Target實例的__address__標籤值為BlockBox Exporter實例的訪問地址。

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

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

如果HTTP服務啟用了安全認證,Blockbox Exporter內置了對basic_auth的支援,可以直接設置相關的認證資訊即可:

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指定相關的證書資訊:

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

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

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

默認情況下,Blockbox返回的樣本數據中也會包含指標probe_http_ssl,用於表明當前探針是否使用了SSL:

# 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剛好相反。

  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返回內容是否符合或者不符合正則表達式的內容。

  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"

具體可以看我上面的配置詳解

在 grafana 裡面展示

在 grafana web 介面里導入9965 這個 dashboards,記得要安裝圖餅 手工安裝

wget https://grafana.com/api/plugins/grafana-piechart-panel/versions/latest/download -O ./grafana-piechart-panel.zip 下載到插件目錄,然後解壓成目錄名稱為grafana-piechart-panel 目錄,然後重新啟動 grafana

參考:

blackbox-configs –> https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md prometheus-configs –> https://prometheus.io/docs/prometheus/latest/configuration/configuration/ https://yunlzheng.gitbook.io/prometheus-book/part-ii-prometheus-jin-jie/exporter/commonly-eporter-usage/install_blackbox_exporter https://www.li-rui.top/2018/11/23/monitor/blackbox_exporter%E4%BD%BF%E7%94%A8/