查询示例

简单的时间序列选择

返回所有指标为 `http_requests_total` 的时间序列

http_requests_total

返回指标为 `http_requests_total` 且具有给定 `job` 和 `handler` 标签的所有时间序列

http_requests_total{job="apiserver", handler="/api/comments"}

返回同一向量的整个时间范围(在本例中为查询时间之前的 5 分钟),使其成为范围向量

http_requests_total{job="apiserver", handler="/api/comments"}[5m]

请注意,产生范围向量的表达式不能直接绘制成图表,但可以在表达式浏览器的表格(“控制台”)视图中查看。

使用正则表达式,您可以仅选择作业名称与特定模式匹配的时间序列,在本例中,是所有以 `server` 结尾的作业

http_requests_total{job=~".*server"}

要选择除 4xx 以外的所有 HTTP 状态码,您可以运行

http_requests_total{status!~"4.."}

子查询

返回过去 30 分钟内 `http_requests_total` 指标的 5 分钟速率,分辨率为 1 分钟。

rate(http_requests_total[5m])[30m:1m]

这是一个嵌套子查询的示例。`deriv` 函数的子查询使用默认分辨率。请注意,不必要地使用子查询是不明智的。

max_over_time(deriv(rate(distance_covered_total[5s])[30s:5s])[10m:])

使用函数、操作符等

返回所有指标名称为 `http_requests_total` 的时间序列的每秒速率,测量时间范围为最近 5 分钟

rate(http_requests_total[5m])

假设 `http_requests_total` 时间序列都有标签 `job`(按作业名称扇出)和 `instance`(按作业实例扇出),我们可能希望对所有实例的速率求和,这样可以减少输出的时间序列数量,但仍保留 `job` 维度

sum by (job) (
  rate(http_requests_total[5m])
)

如果我们有两个具有相同维度标签的不同指标,我们可以对它们应用二元运算符,两侧具有相同标签集的元素将被匹配并传播到输出。例如,此表达式返回每个实例的未使用内存(以 MiB 为单位)(在一个虚构的集群调度器上,它暴露了有关其运行实例的这些指标)

(instance_memory_limit_bytes - instance_memory_usage_bytes) / 1024 / 1024

相同的表达式,但按应用程序求和,可以写成这样

sum by (app, proc) (
  instance_memory_limit_bytes - instance_memory_usage_bytes
) / 1024 / 1024

如果同一个虚构的集群调度器为每个实例暴露了如下的 CPU 使用率指标

instance_cpu_time_ns{app="lion", proc="web", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="elephant", proc="worker", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="turtle", proc="api", rev="4d3a513", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="fox", proc="widget", rev="4d3a513", env="prod", job="cluster-manager"}
...

...我们可以这样获取按应用程序(`app`)和进程类型(`proc`)分组的前 3 名 CPU 用户

topk(3, sum by (app, proc) (rate(instance_cpu_time_ns[5m])))

假设此指标为每个运行中的实例包含一个时间序列,您可以这样计算每个应用程序的运行实例数

count by (app) (instance_cpu_time_ns)

如果我们正在探索某些指标的标签,以便能够对其中一些进行聚合,我们可以使用以下方法

limitk(10, app_foo_metric_bar)

或者,如果我们希望返回的时间序列采样更均匀,我们可以使用以下方法获取大约 10% 的时间序列

limit_ratio(0.1, app_foo_metric_bar)

本页内容