prometheus blackbox_exporter

blackbox_exporter 监控组件

【1】Blackbox_exporter 简介

(1.1)实现功能

blackbox-exporter项目地址:https://github.com/prometheus/blackbox_exporter

  blackbox_exporter 是 Prometheus 官方提供的一个 exporter,可以监控 HTTP、 HTTPS,、DNS、 TCP 、ICMP 等目标实例,从而实现对被监控节点进行监控 和数据采集。promethes调用blackbox_exporter去访问目标监控服务器,实现指标的采集

  prometheus blackbox_exporter下载地址:Download | Prometheus

  HTTP/HTPPS:URL/API 可用性检测

  TCP:端口监听检测

  ICMP:主机存活检测

  DNS:域名解析

 

黑盒监控和白盒监控:

  黑盒监控,关注的是实时状态,一般都是正在发生的事件,比如网站访问不了、磁盘无法写入数据等。即黑盒监控的重点是能对正在发生的故障进行告警。常见的黑盒监控包括HTTP探针、TCP探针等用于检测站点或者服务的可访问性,以及访问效率等。

  白盒监控,关注的是原因,也就是系统内部的一些运行指标数据,例如nginx响应时长、存储I/O负载等

  监控系统要能够有效的支持百盒监控和黑盒监控,通过白盒能够了解系统内部的实际运行状态,以及对监控指标的观察能够预判出可能出现的潜在问题,从而对潜在的不确定因素进行提前处理避免问题发生;

  而通过黑盒监控,可以在系统或服务发生故障时快速通知相关人员进行处理。

(1.2)下载和部署blackbox_exporter

  https://github.com/prometheus/blackbox_exporter

wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.23.0/blackbox_exporter-0.23.0.linux-amd64.tar.gz
tar xf blackbox_exporter-0.23.0.linux-amd64.tar.gz -C /usr/local/
ln -sv /usr/local/blackbox_exporter-0.23.0.linux-amd64 /usr/local/blackbox_exporter
 /usr/local/blackbox_exporter/blackbox_exporter -h    #查看帮助信息


(1.3)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 ]

(1.4)结合 prometheus(ping)

  - 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

(1.5)http

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

 

配置好之后运行如指令 curl url:9115/metrics

#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_<name>形式的标签表示,在采集任务时会在请求目标地址中添加<name>参数,等同于 params 的设置

2, 获取__param_target的值,并覆写到instance标签中;

3, 覆写Target实例的__address__标签值为BlockBox Exporter实例的访问地址。

(1.6) 自定义 HTTP 请求(通过 POST),HTTPS

自定义 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探针只会对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:

  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服务是否启用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:
      method: GET
      fail_if_matches_regexp:
        - "Could not connect to database"
      fail_if_not_matches_regexp:
        - "Download the latest version here"

 


除了基于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"

 

具体可以看我上面的配置详解

(1.7)https 与 tls,证书与秘钥安全认证

如果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:
    prober: http
    http:
      method: GET
      tls_config:
        insecure_skip_verify: true
modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
      method: GET
      preferred_ip_protocol: "ip4"
      ip_protocol_fallback: false
      no_follow_redirects: false
      fail_if_ssl: false
      fail_if_not_ssl: false
      tls_config:
        insecure_skip_verify: true

 

    

要使用 blackbox_exporter 监控 HTTPS 网址,您需要在 probe_http_modules 部分中指定 tls_config

首先,您需要创建一个包含证书和密钥的 PEM 文件。然后,您可以将该文件路径指定为 tls_config 内的 cert_filekey_file 字段。

此外,您需要将 http 模块更改为 https 模块,以便 blackbox_exporter 使用 HTTPS 进行连接。以下是一个示例配置文件片段:

modules:
  http_2xx:
    prober: https
    timeout: 5s
    http:
      preferred_ip_protocol: "ip4"
      tls_config:
        cert_file: /path/to/cert.pem
        key_file: /path/to/key.pem

请注意,在使用 HTTPS 进行连接时,黑盒探针将验证服务器的证书。如果您使用自签名证书或无效证书,则需要设置 tls_config 中的 insecure_skip_verify 选项为 true

(1.X)启动与验证

启动:./blackbox_exporter --config.file=blackbox.yml

验证:

  方法1:curl http://172.16.10.65:9115/probe?target=prometheus.io&module=http_2xx&debug=true

  方法2:blackbox_exporter访问验证

  prometheus-server服务验证

  

【2】rules 基本告警

groups:
- name: example
  rules:
  - alert: curlHttpStatus
    expr:  probe_http_status_code{job="blackbox-http"}>=400 and probe_success{job="blackbox-http"}==0
    #for: 1m
    labels:
      docker: number
    annotations:
      summary: '业务报警: 网站不可访问'
      description: '{{$labels.instance}} 不可访问,请及时查看,当前状态码为{{$value}}'

 

【3】grafana导入模板

  模板:ID-13587、ID-9965

  

 

  

【最佳实践】

(1)prometheus 整合 blackbox_exporter (HTTP/Ping)

ping

  - job_name: 'blackbox-ping-IT设备'
    params:
      module: [icmp]
    metrics_path: /probe
    static_configs:
      - targets:
        - 192.168.1.1
        labels:
          name: '桌面云服务器-linx7(F12-17U)'
          source_type: B机房
      - targets:
        - 192.168.1.2
        labels:
          name: '桌面云服务器-linx7(F12-20U)'
          source_type: B机房
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9115

Http:

  - job_name: 'blackbox-http-业务模块'
    params:
      modelue: [http_2xx]
    metrics_path: /probe
    static_configs:
      - targets:
        - http://www.baidu.com
        labels:
          name: 'a系统'
          source_type: 信息科技部
      - targets:
        - https://www.abc.com
        labels:
          name: 'abc官网'
          source_type: 信息科技部
      - targets:
        - http://192.168.1.1:7180
        labels:
          name: 'CDH-cm'
          source_type: 大数据风控部
      - targets:
        - http://192.168.1.2:8088/
        labels:
          name: 'a'
          source_type: 大数据风控部
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9115

 

(2)服务发现

prometheus

url.json

 

(3)SSL证书监控

参考:https://blog.csdn.net/IT_ZRS/article/details/129812920  

 http里面就有,如下表达式,就是检测证书到期时间是否<90天

(probe_ssl_earliest_cert_expiry{} - time()   )/3600/24 <90

 

【参考文档】

部分转自:https://www.cnblogs.com/punchlinux/p/17035311.html

部分转自网络探测:Blackbox Exporter:https://blog.51cto.com/shoufu/2469397

posted @ 2023-04-13 11:06  郭大侠1  阅读(2301)  评论(0)    收藏  举报