首页 > 解决方案 > 在 Grafana 中合并多个 Prometheus 查询

问题描述

我有一个 PostgreSQL 集群,我将使用 Grafana 7.2.0 和 Prometheus 进行监控。特别是,我想在同一仪表板的三个 SingleStat(一个用于节点)上显示谁是 master、replica-sync 和 replica-potential。

我有以下指标来了解谁是主服务器和副本(注意字段角色)。

patroni_patroni_info{group="testdb",instance="host0:9547",job="db-test",name="my-node-0",role="master",scope="main",state="running",version="2000.0.1"} 1
patroni_patroni_info{group="testdb",instance="host1:9547",job="db-test",name="my-node-1",role="replica",scope="main",state="running",version="2000.0.1"}    1
patroni_patroni_info{group="testdb",instance="host2:9547",job="db-test",name="my-node-2",role="replica",scope="main",state="running",version="2000.0.1"}    1

问题是关于谁是副本同步的信息在另一个普罗米修斯指标中(注意字段sync_state):

patroni_replication_info{application_name="patroni1", client_addr="10.0.0.1", group="testdb", instance="host0:9547",job="db-test",name="cfdb-node-0",state="streaming",sync_priority="1",sync_state="potential",usename="backup_user"}  1
patroni_replication_info{application_name="patroni2", client_addr="192.10.9.1", group="testdb",instance="host0:9547", job="db-test",name="cfdb-node-0",state="streaming",sync_priority="1",sync_state="sync",usename="backup_user"}

如您所见,node0 是主节点,node1 是潜在副本,node2 是副本同步。我的问题是我不知道如何在 Grafana SingleStat 中组合这些指标以显示:

Grafana 7.2.0 中的 SingleStat 使用转换来组合查询,但似乎它们不符合我的需求。此外,由于没有公共字段,因此无法进行连接。有人可以帮我弄这个吗?

标签: prometheusgrafana

解决方案


我将使用的策略是“计算”查询中的角色,例如 1 用于主服务器,2 用于 Replica-Sync,3 用于 Replica-Async,然后使用价值指标功能将这些数字映射到相应的字符串(或者如果您发现更好的可视化,也可以是颜色)

您可以将指标相乘并相加

# only one of these sub queries should return a result per node

# this will return 1 if the node is the master
patroni_patroni_info{role="master"} 
 or
# this will return 2 if the node is an async replica
2 * patroni_patroni_info{role="replica"} * patroni_replication_info{sync_state="potential"} 
 or
# this will return 3 if the node is a sync replica
3 * patroni_patroni_info{role="replica"} * patroni_replication_info{sync_state="sync"} 

不幸的是,如果没有包含数据的普罗米修斯,我就无法测试查询。因此,如果它不起作用,请分别尝试 3 个子查询,然后将它们相加,这样它就会为每个节点提供一个数字。也许你需要摆弄on,ignoringgroup_left(group_right这里)


推荐阅读