【问题标题】:Prometheus up metric shows 0 even the endpoint is reachable即使端点可达,Prometheus up 指标也显示为 0
【发布时间】:2021-10-13 03:42:02
【问题描述】:

我有一个带有 nginx 容器的简单 pod,它在路径 / 上返回文本 healthy。我有普罗米修斯在路径/ 上抓取端口 80。当我在 prometheus 仪表板中运行 up == 0 时,它显示了这个 pod,这意味着这个 pod 不健康。但我尝试 ssh 进入容器,它运行良好,我在 nginx 日志中看到 prometheus 正在 ping / 并得到 200 响应。知道为什么吗?

deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  ...
spec:
  ...
  template:
    metadata:
      labels:
        ...
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/path: "/"
        prometheus.io/port: "80"
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - name: nginx-conf
              mountPath: /etc/nginx
              readOnly: true
          ports:
            - containerPort: 80
      volumes:
        - name: nginx-conf
          configMap:
            name: nginx-conf
            items:
              - key: nginx.conf
                path: nginx.conf


nginx.conf

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-conf
data:
  nginx.conf: |
    http {
      server {
        listen 80;

        location / {
          return 200 'healthy\n';
        }
      }
    }

nginx访问日志

192.168.88.81 - - [xxx +0000] "GET / HTTP/1.1" 200 8 "-" "Prometheus/2.26.0"
192.168.88.81 - - [xxx +0000] "GET / HTTP/1.1" 200 8 "-" "Prometheus/2.26.0"
192.168.88.81 - - [xxx +0000] "GET / HTTP/1.1" 200 8 "-" "Prometheus/2.26.0"

【问题讨论】:

    标签: kubernetes prometheus


    【解决方案1】:

    当您为 pod 配置这些注释时,Prometheus 期望给定路径返回 Prometheus 可读的指标。但'healthy\n' 不是有效的 Prometheus 指标类型。

          annotations:
            prometheus.io/scrape: "true"
            prometheus.io/path: "/"
            prometheus.io/port: "80"
    

    推荐修复:

    • 使用nginx-prometheus-exporter 作为sidecar。
    • 将 sidecar 信息添加到注释中,以便 Prometheus 可以从中抓取指标。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      ...
    spec:
      ...
      template:
        metadata:
          labels:
            ...
          annotations:
            prometheus.io/scrape: "true"
            prometheus.io/path: "/metrics"
            prometheus.io/port: "9113"
        spec:
          containers:
            - name: nginx
              image: nginx
              volumeMounts:
                - name: nginx-conf
                  mountPath: /etc/nginx
                  readOnly: true
              ports:
                - containerPort: 80
            - name: nginx-exporter
              args:
              - "-nginx.scrape-uri=http://localhost:80/stub_status" # nginx address
              image: nginx/nginx-prometheus-exporter:0.9.0
              ports:
                - containerPort: 9113
          volumes:
            - name: nginx-conf
              configMap:
                name: nginx-conf
                items:
                  - key: nginx.conf
                    path: nginx.conf
    

    现在,尝试从 Prometheus 查询 nginx_up。 nginx-prometheus-exporter还自带了grafana dashboard,你也可以试试看。

    【讨论】:

    【解决方案2】:

    当 Prometheus 抓取端点时,它需要指标。典型指标如下所示:

    # HELP go_gc_duration_seconds A summary of the GC invocation durations.
    # TYPE go_gc_duration_seconds summary
    go_gc_duration_seconds{quantile="0"} 1.3234e-05
    go_gc_duration_seconds{quantile="0.25"} 1.7335e-05
    

    "healthy" 不符合标准,因此导致 Prometheus 无法抓取此目标。有blackbox exporter,旨在从用户的角度检查端点(这就是黑盒监控)。导出器可以执行 HTTP 请求并对结果进行度量。例如,它可以检查响应代码是否为 200,或者响应正文是否包含某些文本。以下是此导出器返回的示例指标(注意 probe_success,这与 up 相同):

    # HELP probe_dns_lookup_time_seconds Returns the time taken for probe dns lookup in seconds
    # TYPE probe_dns_lookup_time_seconds gauge
    probe_dns_lookup_time_seconds 0.026007318
    # HELP probe_duration_seconds Returns how long the probe took to complete in seconds
    # TYPE probe_duration_seconds gauge
    probe_duration_seconds 0.550007522
    # 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
    # HELP probe_http_content_length Length of http content response
    # TYPE probe_http_content_length gauge
    probe_http_content_length -1
    # HELP probe_http_duration_seconds Duration of http request by phase, summed over all redirects
    # TYPE probe_http_duration_seconds gauge
    probe_http_duration_seconds{phase="connect"} 0.098082009
    probe_http_duration_seconds{phase="processing"} 0.154402544
    probe_http_duration_seconds{phase="resolve"} 0.038066771
    probe_http_duration_seconds{phase="tls"} 0.209702302
    probe_http_duration_seconds{phase="transfer"} 0.047839785
    # HELP probe_http_redirects The number of redirects
    # TYPE probe_http_redirects gauge
    probe_http_redirects 1
    # HELP probe_http_ssl Indicates if SSL was used for the final redirect
    # TYPE probe_http_ssl gauge
    probe_http_ssl 1
    # HELP probe_http_status_code Response HTTP status code
    # TYPE probe_http_status_code gauge
    probe_http_status_code 200
    # HELP probe_http_uncompressed_body_length Length of uncompressed response body
    # TYPE probe_http_uncompressed_body_length gauge
    probe_http_uncompressed_body_length 87617
    # HELP probe_http_version Returns the version of HTTP of the probe response
    # TYPE probe_http_version gauge
    probe_http_version 2
    # HELP probe_ip_addr_hash Specifies the hash of IP address. It's useful to detect if the IP address changes.
    # TYPE probe_ip_addr_hash gauge
    probe_ip_addr_hash 8.57979034e+08
    # HELP probe_ip_protocol Specifies whether probe ip protocol is IP4 or IP6
    # TYPE probe_ip_protocol gauge
    probe_ip_protocol 4
    # HELP probe_ssl_earliest_cert_expiry Returns earliest SSL cert expiry in unixtime
    # TYPE probe_ssl_earliest_cert_expiry gauge
    probe_ssl_earliest_cert_expiry 1.639030838e+09
    # HELP probe_ssl_last_chain_expiry_timestamp_seconds Returns last SSL chain expiry in timestamp seconds
    # TYPE probe_ssl_last_chain_expiry_timestamp_seconds gauge
    probe_ssl_last_chain_expiry_timestamp_seconds 1.639030838e+09
    # HELP probe_ssl_last_chain_info Contains SSL leaf certificate information
    # TYPE probe_ssl_last_chain_info gauge
    probe_ssl_last_chain_info{fingerprint_sha256="ef4eaeb464efb33f5332b365a350b2b06588ea71837af27f83d45b726d19af2a"} 1
    # HELP probe_success Displays whether or not the probe was a success
    # TYPE probe_success gauge
    probe_success 1
    # HELP probe_tls_version_info Contains the TLS version used
    # TYPE probe_tls_version_info gauge
    probe_tls_version_info{version="TLS 1.2"} 1
    

    【讨论】:

      猜你喜欢
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 2018-05-18
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多