Prometheus 无法通过 HTTPS 从 spring-boot 应用程序中抓取

Prometheus cannot scrape from spring-boot application over HTTPS

我正在通过 docker 部署 spring-boot 应用程序和 prometheus 容器,并且已成功公开 spring-boot /actuator/prometheus 端点。但是,当我启用 prometheus 调试日志时,我可以看到它无法抓取指标:

ts=2022-02-02T03:54:46.210Z
caller=scrape.go:1292
level=debug
component="scrape manager"
scrape_pool=spring-actuator
target=https://127.0.0.1:8443/actuator/prometheus/
msg="Scrape failed"
err="Get \"https://127.0.0.1:8443/actuator/prometheus/\": dial tcp 127.0.0.1:8443: connect: connection refused"

我认为这与我设置 spring-boot HTTPS 的方式有关。我在构建 spring-boot 应用程序期间使用以下命令生成自签名证书:

keytool
  -genkey
  -alias <alias>
  -dname <dname>
  -keyalg RSA
  -keysize 4096
  -storetype PKCS12
  -keystore <path_to_keystore>
  -validity 3650
  -storepass <keystore_pass>

然后我将证书导出到 .pem 文件,并提取 .crt 和 .key:

openssl pkcs12 -in cert.p12 -out cert.pem -nodes -passin pass:<pass>

这是通过共享卷安装到我的 prometheus 容器的,它有一个 --web.config.file 包含:

tls_server_config:
  cert_file: /path/to/cert.crt
  key_file: /path/to/cert.key

并且我将 insecure_skip_verify: true 添加到 prometheus.yml 配置中:

- job_name: 'spring-actuator'
metrics_path: '/actuator/prometheus/'
scrape_interval: 60s
scheme: https
static_configs:
  - targets: [ '127.0.0.1:8443' ]
tls_config:
  insecure_skip_verify: true

好的,我想我找到了我的问题。我做了两个更改:

首先,我将web.config.file的内容移动到'spring-actuator'下的prometheus.yml文件中。 然后我将目标更改为使用后端容器的主机名,而不是 127.0.0.1。

最终结果是一个 prometheus.yml 文件:

- job_name: 'spring-actuator'
metrics_path: '/actuator/prometheus/'
scrape_interval: 60s
scheme: https
static_configs:
  - targets: [ 'backend:8443' ]
tls_config:
  cert_file: /path/to/cert.crt
  key_file: /path/to/cert.key
  insecure_skip_verify: true

所以只是一些愚蠢的错误,不是由我所看到的证书引起的。 :)

下面是调试问题的关键部分

target=https://127.0.0.1:8443/actuator/prometheus/
msg="Scrape failed"
err="Get \"https://127.0.0.1:8443/actuator/prometheus/\": dial tcp 127.0.0.1:8443: connect: connection refused"

它指出 scrape 失败,因为它无法 connecttarget 服务器。作为目标服务器 127.0.0.1:8443 那么它应该在 Prometheus 所在的同一主机中 运行.

Prometheus 检索作业,也称为 scraper,从目标服务中提取数据、聚合数据并将其传递到数据库。 Prometheus 从存在于 Prometheus YAML-based 配置文件中的名为 static_configs 的静态列表(或文件)中获取一个抓取列表 targets(IP 地址和端口)。更复杂的 dynamic 环境,其中可能随时会出现新实例,请使用 service discovery mechanisms,它提供要监视的机器列表并提供有关这些机器的组织方式的信息。

Prometheus抓取目标时,它会自动为抓取的时间序列附加一些标签,用于识别抓取的目标。

up{job="<job-name>", instance="<instance-id>"}: 1 if the instance is healthy, i.e. reachable, or 0 if the scrape failed.

job:目标所属的已配置作业名称
实例:被抓取的目标 URL 的 : 部分。

配置 Prometheus 实例

  1. 当 Prometheus 在本地主机或同一主机中 运行。
scrape_configs:
- job_name: node
  static_configs:
  - targets: ['localhost:9100']
  1. 当 Prometheus 在不同的环境或主机中 运行
scrape_configs: 
  - job_name: prometheus 
    static_configs: 
      - targets: ["localhost:9090"] 
  - job_name: eventservice 
    static_configs: 
      - targets: ["events:9090"] 
  - job_name: bookingservice 
    static_configs: 
      - targets: ["bookings:9090"] 
  1. 当 运行 在多个端口使用 IPs
static_configs:
  - targets: ['192.168.1.117:':8080', '192.168.1.117:8081']

TLS 配置

TLS 用于在 Prometheus 实例和抓取目标之间建立安全的私有传输。默认情况下,Prometheus 实例会尝试根据其信任库验证 scrape targets 公开的 certificate,以建立抓取目标的真实性。

scrape_configs:
  - job_name: 'node'
    scheme: https
    tls_config:
        # Prometheus will check that the node_exporter presents a certificate
        # signed by this ca.
        ca_file: 'ca.crt'
        # The cert and key are presented to node_exporter to authenticate
        # Prometheus as a client.
        cert_file: 'client.crt'
        key_file: 'client.key'

    static_configs:
    - targets: ['myserver.net:443']