Prometheus 运维工具 Promtool (二)Query 功能
Promtool 在查询方面一个有 4 个子命令,分别用来进行实时查询、范围查询、序列查询和 label 查询,接下来我们依次看一下。
实时查询
Promtool 的 query instant 子命令允许根据当前时间戳通过命令行直接查询 Prometheus 服务器的相关指标,命令用法如下:
promtool query instant [<flags>] <server> <expr>
按照子命令的使用说明必须提供一个 Prometheus 服务器 URL 作为参数,以及要执行的查询语句,比如像下边这样。
[root@Erdong-test ~]# ./promtool query instant 'http://127.0.0.1:9090' 'up == 1'
up{instance="172.16.6.97:9100", job="mysql_Host"} => 1 @[1658760087.156]
up{instance="172.16.6.98:9100", job="mysql_Host"} => 1 @[1658760087.156]
up{instance="172.16.6.98:9104", job="mysql_DB", nodename="Erdong-DB"} => 1 @[1658760087.156]
up{instance="172.16.6.76:7002", job="kong"} => 1 @[1658760087.156]
这个语句查询了该 Prometheus 实例中 up == 1
这个语句的结果,Prometheus 返回了对应的结果数据。
范围查询
Promtool 的 query range 子命令允许在指定的时间范围内显示对应的查询结果。因此,再查询语句中需要提供 Prometheus服务器 URL,并且在查询语句中我们必须提供开始和结束的时间戳,这个时间戳需要是 unix 格式 。命令格式如下 :
promtool query range [<flags>] <server> <expr>
接下来使用 Linux 的 date 命令来定义开始和结束时间戳,生成五分钟前的 unix 格式时间戳和现在的另一个时间戳。我们还可以使用 --step 参数指定查询的步长,或者叫查询的时间间隔,用来表示间隔多久输出一个数据点,在下边的查询语句中,它是一分钟。最后得到一个类似下面的查询语句:
[root@Erdong-test ~]# ./promtool query range --start=$(date -d '5minutes ago' +'%s') --end=$(date -d 'now' +'%s') --step=1m 'http://127.0.0.1:9090' 'up == 1'
up{instance="172.16.6.97:9100", job="mysql_Host"} =>
1 @[1658760631]
1 @[1658760691]
1 @[1658760751]
1 @[1658760811]
1 @[1658760871]
1 @[1658760931]
up{instance="172.16.6.98:9100", job="mysql_Host"} =>
1 @[1658760631]
1 @[1658760691]
1 @[1658760751]
1 @[1658760811]
1 @[1658760871]
1 @[1658760931]
up{instance="172.16.8.76:7002", job="kong"} =>
1 @[1658760631]
1 @[1658760691]
1 @[1658760751]
1 @[1658760811]
1 @[1658760871]
1 @[1658760931]
up{instance="172.16.6.98:9104", job="mysql_DB", nodename="Erdong-DB"} =>
1 @[1658760631]
1 @[1658760691]
1 @[1658760751]
1 @[1658760811]
1 @[1658760871]
1 @[1658760931]
这就是我们得到的查询结果。显示所有 up == 1
的指标,并且按照每分钟一个点的频率来显示最近 5 分钟的数据。
序列查询
Promtool 的 query series 子命令可以搜索与一组指标名称和标签匹配的所有时间序列。以下是使用方法:
promtool query series --match=MATCH [<flags>] <server>
按照子命令的使用说明必须提供一个 Prometheus 服务器 URL 作为参数,以及要查询的 label 或者 metric,比如像下边这样。
[root@Erdong-test ~]# ./promtool query series 'http://127.0.0.1:9090' --match='up' --match='go_info{job="prometheus"}'
{__name__="go_info", instance="172.16.6.97:9100", job="mysql_Host", version="go1.16.7"}
{__name__="go_info", instance="172.16.6.98:9100", job="mysql_Host", version="go1.16.7"}
{__name__="go_info", instance="172.16.6.99:9100", job="mysql_Host", version="go1.17.3"}
{__name__="up", instance="172.16.6.97:9100", job="mysql_Host"}
{__name__="up", instance="172.16.6.98:9100", job="mysql_Host"}
{__name__="up", instance="172.16.6.99:9100", job="mysql_Host"}
{__name__="up", instance="172.16.6.97:9104", job="mysql_DB", nodename="Erdong-DB"}
{__name__="up", instance="172.16.8.76:7002", job="kong"}
Prometheus 实例会按照参数返回数据结果。
label 查询
Promtool 的 query labels 子命令可以用来查询 label 对应的值,可以跨所有可用的指标搜索特定的 label ,并返回对应的所有的值,命令使用方法如下:
promtool query labels [<flags>] <server> <name>
接着我们看一下如何执行这个命令。
[root@Erdong-test ~]# ./promtool query labels 'http://127.0.0.1:9090' 'instance'
172.16.6.97:9100
172.16.6.97:9104
172.16.6.98:9100
172.16.6.99:9100
172.16.8.76:7002
命令执行后返回了 instance 这个 label 的所有值。
总结
当前 Promtool 工具的 2.37.0 版本只支持 4 个查询功能。后续版本支持查询更多内容的时候我们再看。