在Prometheus中将实例重新标记为主机名

Nor*_*ius 4 prometheus

我有几台具有这样配置的机器上的节点导出器从Prometheus抓取指标:

scrape_configs:
  - job_name: node_exporter
    static_configs:
      - targets:
        - 1.2.3.4:9100
        - 2.3.4.5:9100
        - 3.4.5.6:9100
Run Code Online (Sandbox Code Playgroud)

在Grafana中查看时,这些实例被分配了相当无意义的IP地址。相反,我希望查看其主机名。我认为您应该能够重新标记instance标签以匹配节点的主机名,因此我尝试使用这样的重新标记规则,无论如何都无效:

relabel_configs:
  - source_labels: ['nodename']
    target_label: 'instance'
Run Code Online (Sandbox Code Playgroud)

我可以手动重新标记每个目标,但是这需要将每个主机名硬编码到Prometheus中,这并不是很好。我看到节点导出器提供了node_uname_info包含主机名的度量,但是如何从中提取它呢?

node_uname_info{domainname="(none)",machine="x86_64",nodename="myhostname",release="4.13.0-32-generic",sysname="Linux",version="..."} 1
Run Code Online (Sandbox Code Playgroud)

vit*_*ams 7

我找到了硬编码解决方案:

    全球的:
      刮擦间隔:5s
      刮擦超时:5 秒
      外部标签:
        监视器:'普罗米修斯'

    刮配置:

    - 工作名称:'谢尔比'
      静态配置:
      - 目标:
        - 10.100.0.01:9100
      relabel_configs:
      - source_labels: [__address__]
        正则表达式:'.*'
        目标标签:实例
        替换:'谢尔比'

    - 工作名称:'camaro'
      静态配置:
      - 目标:
        - 10.101.0.02:9100
      relabel_configs:
      - source_labels: [__address__]
        正则表达式:'.*'
        目标标签:实例
        替换:'camaro'

    - 工作名称:'维罗纳'
      静态配置:
      - 目标:
        - 10.101.0.03:9100
      relabel_configs:
      - source_labels: [__address__]
        正则表达式:'.*'
        目标标签:实例
        替换:'维罗纳'

结果:

    node_load15{instance="camaro",job="camaro"} 0.16
    node_load15{instance="shelby",job="shelby"} 0.4
    node_load15{instance="verona",job="verona"} 0.07

  • 如果我在一项作业中有多个目标,并且希望每个目标都有不同的 target_label,该怎么办? (2认同)

nig*_*old 6

我只是遇到了这个问题,解决方案是使用group_left解决此问题。您不能在请求中使用不存在的值来重新标记,您只能使用提供给Prometheus的不同参数或模块中用于请求的参数(gcp,aws ...)。

因此,我使用的解决方案是将包含我们想要的值(主机名)的现有值与节点导出器的指标结合起来。我们的答案存在于node_uname_info度量标准之内,该度量标准包含nodename值。

我使用此帖子的答案作为我的请求的模型:https : //stackoverflow.com/a/50357418

解决方法是:

node_memory_Active * on(instance) group_left(nodename) (node_uname_info)
Run Code Online (Sandbox Code Playgroud)

这样,默认情况下,node_memory_Active指标仅包含实例和作业,作为可在grafana的description字段中使用的第三值节点名。

希望这对别人有帮助。


The*_*eJJ 6

该解决方案在抓取时使用所需的标签存储数据,无需有趣的 PromQL 查询或硬编码的黑客攻击。它通过将正则表达式的抓取数据的标签替换为relabel_configs.

默认情况下,instance设置为__address__$host:$port

为了将instance标签设置为$host,可以使用relabel_configs摆脱端口:

  - job_name: 'whatever'
    static_configs:
      - targets: [
            'yourhost.lol:9001'
        ]
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance
        regex: '([^:]+)(:[0-9]+)?'
        replacement: '${1}'
Run Code Online (Sandbox Code Playgroud)

但是上面的内容也会覆盖这样设置的标签,例如file_sd_configs

[
    {
        "targets": ['yourhost.lol:9001'],
        "labels": {
            "instance": 'node42'
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

如果要保留这些标签,relabel_configs可以通过以下方式完成:

  - job_name: 'rolf'
    metrics_path: /metric/rolf
    file_sd_configs:
      - files:
        - rolf_exporter_targets.yml
    relabel_configs:
      - source_labels: [instance]
        target_label: __tmp_instance
        regex: '(.+)'
        replacement: '${1};'
      - source_labels: [__tmp_instance, __address__]
        separator: ''
        target_label: instance
        regex: '([^:;]+)((:[0-9]+)?|;(.*))'
        replacement: '${1}'
Run Code Online (Sandbox Code Playgroud)

然后手动设置的instancefromsd_configs优先,但如果未设置,端口仍会被剥离。


mrj*_*eph 5

您不必对其进行硬编码,也不需要连接两个标签。targets您可以使用一些分隔符将所有逻辑放置在该部分中 - 我使用过@,然后使用正则表达式对其进行处理。请在下面找到来自其他导出器(黑盒)的示例,但同样的逻辑node exporter也适用。在您的情况下,请仅包含以下列表项:

  • target_label: app_ip
  • target_label: instance
- job_name: 'blackbox'
    metrics_path: '/probe'
    scrape_interval: 15s
    params:
      module: [ http_2xx ]
    static_configs:
      - targets:
        - "1.2.3.4:8080@JupyterHub"
        - "1.2.3.5:9995@Zeppelin"
        - "1.2.3.6:8080@Airflow UI"
    relabel_configs:
      - source_labels: [ __address__ ]
        regex: '(.*)@.*'
        replacement: $1
        target_label: __param_target
      - source_labels: [ __address__ ]
        regex: '(.*)@.*'
        replacement: $1
        target_label: app_ip
      - source_labels: [ __address__ ]
        regex: '.*@(.*)'
        replacement: $1
        target_label: instance
      - target_label: __address__
        replacement: '{{ blackbox_exporter_host }}:{{ blackbox_exporter_port }}'
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您使用 Prometheus Operator,请将此部分添加到您的 ServiceMonitor:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
...
spec:
  endpoints:
  - relabelings:
    - sourceLabels: [__meta_kubernetes_pod_node_name]
      targetLabel: instance
Run Code Online (Sandbox Code Playgroud)