Relabel实例到Prometheus中的主机名

时间:2018-04-18 10:08:02

标签: 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

在Grafana中查看时,这些实例被分配了相当无意义的IP地址;相反,我更愿意看到他们的主机名。我认为你应该能够重新标记instance标签以匹配节点的主机名,所以我尝试使用这样的重新标记规则,不会产生任何影响:

relabel_configs:
  - source_labels: ['nodename']
    target_label: 'instance'

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

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

7 个答案:

答案 0 :(得分:5)

我刚遇到此问题,解决方法是使用group_left解决此问题。您不能在请求中使用不存在的值重新标记,您只能使用给普罗米修斯提供的不同参数,或者在模块中用于请求的参数(gcp,aws ...)。

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

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

解决方案是这个:

node_memory_Active * on(instance) group_left(nodename) (node_uname_info)

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

希望这对其他人有帮助。

答案 1 :(得分:2)

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


    global:
      scrape_interval: 5s
      scrape_timeout: 5s
      external_labels:
        monitor: 'Prometheus'

    scrape_configs:

    - job_name: 'shelby'
      static_configs:
      - targets:
        - 10.100.0.01:9100
      relabel_configs:
      - source_labels: [__address__]
        regex: '.*'
        target_label: instance
        replacement: 'shelby'

    - job_name: 'camaro'
      static_configs:
      - targets:
        - 10.101.0.02:9100
      relabel_configs:
      - source_labels: [__address__]
        regex: '.*'
        target_label: instance
        replacement: 'camaro'

    - job_name: 'verona'
      static_configs:
      - targets:
        - 10.101.0.03:9100
      relabel_configs:
      - source_labels: [__address__]
        regex: '.*'
        target_label: instance
        replacement: 'verona'

结果:


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

答案 2 :(得分:2)

默认情况下,instance设置为__address__which is $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}'

但是上述操作也会覆盖这样设置的标签,例如file_sd_configs

[
    {
        "targets": ['yourhost.lol:9001'],
        "labels": {
            "instance": 'node42'
        }
    }
]

如果要保留这些标签,可以通过以下方式完成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}'

然后,从instance手动设置的sd_configs优先,但是如果未设置,则端口仍被剥夺。

答案 3 :(得分:1)

group_left不幸的是,解决方案比解决方案更多。我已经在VAI中尝试了一个月,以找到有关group_left的连贯解释,并且表达式不是标签。必须在每一个简单的表达上加上咒语会很烦人。弄清楚如何使用多个指标构建更复杂的PromQL查询是另一回事。期望我的任何用户,尤其是对于Grafana / PromQL完全陌生的用户,每次都编写一个复杂而难以理解的查询,也将不那么友好。

我的第一个刺是这样的:

  - job_name: 'node_exporter'
    scrape_interval: 10s
    static_configs:
      - targets: ['1.2.3.4:9100']
        labels:
          cluster: 'rkv-image01'
          ceph_role: 'mon'
          instance_node: 'rkv1701'

哪些被上游人视为“反模式”,因为显然期望instance是唯一在工作中所有度量值唯一的标签。我从未遇到过这样的情况,但是请确保是否有更好的方法,为什么不呢。有一个想法,出口商应该“固定”,但是我犹豫要走一个潜在的重大变更,去一个广泛使用的项目,我也不愿意分叉它,并且必须与上游保持并行,我既没有时间也没有业力。

接下来,我尝试了metrics_relabel_configs,但这似乎并不希望从其他指标(例如)复制标签。 node_uname_info{nodename}-> instance-启动时出现语法错误。

接下来,我遇到了一个问题,即如果收集器不提供值,并且出于某种原因,似乎< / em>好像我对instance的抓取并没有得到。这似乎很奇怪。但是我发现真正有效的方法很简单,而且非常明显,以至于我什至不尝试尝试:

address

即,只需在scrape配置中应用目标标签。我正在从数据库转储中进行基于文件的服务发现,它将能够写出这些目标。

可能是我的环境没有有关节点的DNS A或PTR记录的一个因素。是的,我知道,请相信我我也不喜欢,但这是我无法控制的。但仍然没关系,我不知道为什么node_exporter根本不提供任何 - job_name: 'node_exporter' scrape_interval: 10s static_configs: - targets: ['1.2.3.4:9100'] labels: cluster: 'rkv-image01' ceph_role: 'mon' instance: 'rkv1701' ... 标签,因为它确实找到了信息指标的主机名(这对我没有任何帮助)

node_exporter

答案 4 :(得分:0)

另一个答案是使用某些/ etc / hosts或本地dns(也许是dnsmasq)或诸如Service Discovery(由Consul或file_sd)之类的东西,然后删除如下端口:

relabel_configs:
  - source_labels: ['__address__']
    separator:     ':'
    regex:         '(.*):.*'
    target_label:  'instance'
    replacement:   '${1}'

答案 5 :(得分:0)

您可以在普罗米修斯工作描述中使用这样的重新标记规则:

- job_name: node-exporter
....
relabel_configs:
  .....
  # relable the label 'instance' with your pod_node_name 
  - source_labels: [__meta_kubernetes_pod_node_name]
    target_label: instance

在prometheus Service Discovery中,您可以首先检查标签的正确名称。标签将以'.... pod_node_name'

结尾

答案 6 :(得分:0)

您不必对其进行硬编码,也不需要连接两个标签。 您可以使用一些分隔符将所有逻辑放在 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 }}'