Prometheus 从公制标签创建标签
Prometheus create label from metric label
我们是运行容器中的节点导出器。为了快速识别每个节点导出器在哪个主机上 运行,我创建了一个如下所示的指标:host{host="$HOSTNAME",node="$CONTAINER_ID"} 1
我正在寻找一种方法来提取 host=
中的主机名,并为每个节点导出器实例创建一个标签作为主机名标签。我尝试了多种配置,none 似乎有效。当前的普罗米修斯配置如下所示:
scrape_configs:
- job_name: 'node'
scrape_interval: 10s
scrape_timeout: 5s
metrics_path: /metrics
scheme: http
dns_sd_configs:
- names:
- tasks.master-nodeexporter
refresh_interval: 30s
type: A
port: 9100
relabel_configs:
- source_labels: ['host']
regex: '"(.*)".*'
target_label: 'hostname'
replacement: ''
这是不可能的,因为目标重新标记发生在抓取之前。
您在这里要做的是首先使用服务发现来获得正确的主机名,这在 dns_sd_configs
中是不可能的。你可能会看看 Consul 和 https://www.robustperception.io/controlling-the-instance-label/
如果有人遇到这个:
将其创建为 docker-entrypoint.sh 并使其可执行。
#!/bin/sh -e
# Must be executable by others
NODE_NAME=$(cat /etc/nodename) echo "node_meta{node_id=\"$NODE_ID\", container_label_com_docker_swarm_node_id=\"$NODE_ID\", node_name=\"$NODE_NAME\"} 1" > /etc/node-exporter/node-meta.prom
set -- /bin/node_exporter "$@"
exec "$@"
不如像这样创建一个 Dockerfile
FROM prom/node-exporter:latest
ENV NODE_ID=none
USER root
COPY conf /etc/node-exporter/
ENTRYPOINT [ "/etc/node-exporter/docker-entrypoint.sh" ]
CMD [ "/bin/node_exporter" ]
然后构建它,您将始终获得主机名作为 node_meta 指标
解释了如何通过 node_name
标签在 node_meta
指标导出节点名称。然后可以在查询期间将 node_name
标签添加到 node_exporter
与 group_left()
修饰符公开的任何指标。例如,以下 PromQL 查询将 node_name
标签从 node_meta
指标添加到 node_memory_Active_bytes
指标:
node_memory_Active_bytes
* on(job,instance) group_left(node_name)
node_meta
在 these docs and this article 中查看有关 group_left()
修饰符的更多详细信息。
我们是运行容器中的节点导出器。为了快速识别每个节点导出器在哪个主机上 运行,我创建了一个如下所示的指标:host{host="$HOSTNAME",node="$CONTAINER_ID"} 1
我正在寻找一种方法来提取 host=
中的主机名,并为每个节点导出器实例创建一个标签作为主机名标签。我尝试了多种配置,none 似乎有效。当前的普罗米修斯配置如下所示:
scrape_configs:
- job_name: 'node'
scrape_interval: 10s
scrape_timeout: 5s
metrics_path: /metrics
scheme: http
dns_sd_configs:
- names:
- tasks.master-nodeexporter
refresh_interval: 30s
type: A
port: 9100
relabel_configs:
- source_labels: ['host']
regex: '"(.*)".*'
target_label: 'hostname'
replacement: ''
这是不可能的,因为目标重新标记发生在抓取之前。
您在这里要做的是首先使用服务发现来获得正确的主机名,这在 dns_sd_configs
中是不可能的。你可能会看看 Consul 和 https://www.robustperception.io/controlling-the-instance-label/
如果有人遇到这个:
将其创建为 docker-entrypoint.sh 并使其可执行。
#!/bin/sh -e
# Must be executable by others
NODE_NAME=$(cat /etc/nodename) echo "node_meta{node_id=\"$NODE_ID\", container_label_com_docker_swarm_node_id=\"$NODE_ID\", node_name=\"$NODE_NAME\"} 1" > /etc/node-exporter/node-meta.prom
set -- /bin/node_exporter "$@"
exec "$@"
不如像这样创建一个 Dockerfile
FROM prom/node-exporter:latest
ENV NODE_ID=none
USER root
COPY conf /etc/node-exporter/
ENTRYPOINT [ "/etc/node-exporter/docker-entrypoint.sh" ]
CMD [ "/bin/node_exporter" ]
然后构建它,您将始终获得主机名作为 node_meta 指标
node_name
标签在 node_meta
指标导出节点名称。然后可以在查询期间将 node_name
标签添加到 node_exporter
与 group_left()
修饰符公开的任何指标。例如,以下 PromQL 查询将 node_name
标签从 node_meta
指标添加到 node_memory_Active_bytes
指标:
node_memory_Active_bytes
* on(job,instance) group_left(node_name)
node_meta
在 these docs and this article 中查看有关 group_left()
修饰符的更多详细信息。