【问题标题】:Decrease Prometheus scraping interval on k8s for one Pod减少一个 Pod 在 k8s 上的 Prometheus 抓取间隔
【发布时间】:2019-10-02 10:30:36
【问题描述】:

我们在 k8s 上的全局 Prometheus 抓取间隔是 60s,但我想要一个应用程序有 300s 抓取间隔。

我将以下内容附加到我的 pod,以便抓取指标。

prometheus.io/scrape: 'true'
prometheus.io/port: '{{ .Values.prometheus.port }}'
prometheus.io/path: '{{ .Values.prometheus.path }}'

现在我想专门减慢这个应用的频率,并测试了

prometheus.io/interval: '300s'

但是它不起作用。我认为它需要relabel,或任何其他建议? https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml#L251

【问题讨论】:

  • 仅供参考,它是刮而不是刮

标签: kubernetes prometheus


【解决方案1】:

我想补充一些细节。如果你使用官方的 Prometheus Helm 图表,这应该在你的 values-prometheus.yaml 文件中:

# extra scraping configs
# | is required, because extraScrapeConfigs is expected to be a string
extraScrapeConfigs: |
  - job_name: 'kubernetes-service-endpoints-scrape-every-2s'

    scrape_interval: 2s

    kubernetes_sd_configs:
      - role: endpoints

    relabel_configs:
      #Custom
      - source_labels: [__meta_kubernetes_service_annotation_example_com_scrape_every_2s]
        action: keep
        regex: true

      # Boilerplate
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: kubernetes_name
      - source_labels: [__meta_kubernetes_pod_node_name]
        action: replace
        target_label: kubernetes_node

升级现有(默认)安装:

helm upgrade prometheus --values values-prometheus.yaml stable/prometheus

您现在可以在服务或 pod 上添加这些注释:

prometheus.io/path: /metrics
prometheus.io/port: "9090"
example.com/scrape_every_2s: "true"

删除原来的prometheus.io/scrape: "true",否则你的服务将显示为两个独立的 Prometheus 目标,这可能不是你想要的。

【讨论】:

    【解决方案2】:

    在 Prometheus 中,您可以全局设置scrape_interval,更具体地每个作业。每个作业定义的值会覆盖全局值。与this 示例进行比较。

    更多详情请参考Prometheus官方documentation


    编辑:

    下面是一个将scrape_interval 设置为300s 的作业示例。它仅选择具有 example.io/should_be_scraped_every_300s: "true" 注释的 Pods 进行抓取:

      - job_name: 'kubernetes-pods-300s'
    
        scrape_interval: 300s
    
        kubernetes_sd_configs:
        - role: pod
    
        # example relabel to scrape only pods that have 'example.io/should_be_scraped_every_300s: "true"' annotation
        relabel_configs:
        - source_labels: [__meta_kubernetes_pod_annotation_example_io_should_be_scraped_every_300s]
          action: keep
          regex: true
    
        # rest of this config was taken from default 'kubernetes-pods' job already present in default Prometheus config
        - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
          action: keep
          regex: true
        - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
          action: replace
          target_label: __metrics_path__
          regex: (.+)
        - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
          action: replace
          regex: ([^:]+)(?::\d+)?;(\d+)
          replacement: $1:$2
          target_label: __address__
        - action: labelmap
          regex: __meta_kubernetes_pod_label_(.+)
        - source_labels: [__meta_kubernetes_namespace]
          action: replace
          target_label: kubernetes_namespace
        - source_labels: [__meta_kubernetes_pod_name]
          action: replace
          target_label: kubernetes_pod_name
    

    下面是Pod 定义的片段,其中包含适当的注释,以便 Prometheus 将其发现为要抓取的目标。

    apiVersion: v1
    kind: Pod 
    metadata:
      annotations:
        example.io/should_be_scraped_every_300s: "true"
        kubernetes.io/limit-ranger: 'LimitRanger plugin set: cpu request for container
          buildroot'
        prometheus.io/path: /metrics
        prometheus.io/port: "9090"
        prometheus.io/scrape: "true"
    ...
    

    【讨论】:

    • 使用k8s pod注解prometheus.io/scrape_interval: '300s'不起作用。使用 k8s,指标被一个特殊的 pod 报废,该 pod 收集导出到端点的 pod 的所有指标,例如/metrics
    • 因为它不能这样工作。您不能在 Pod 定义中通过 annotations 定义 scrape_interval。它适用于不同的级别,并且没有重新标记会在这里为您提供帮助。正如我上面已经提到的,scrape_interval 可以在通过ConfigMap 传递的 Prometheus 配置中全局和每个特定作业中定义。如果您需要抓取特定的Pod 或一组Pods 不像其他任何Pods 那样频繁,您需要在Prometheus 配置中定义一个新作业并通过适当的标签选择这样的Pods 及其在@987654342 中的值@ 部分。
    • 我编辑了我的答案,添加了这样一个job 的示例以使其更清晰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多