跳到主要内容

数据对比

有的时候我们可能需要去访问过去的数据,并和当前数据进行对比。例如,我们可能想比较今天的请求率和一周前的请求率之间的差异。我们可以在任何区间向量或瞬时向量选择器上附加一个偏移量 offset<duration> 的修饰符(比如 my_metric offset 5m 或者 my_metric[1m] offset 7d)。

让我们来看一个示例,在我们的 demo 服务中暴露了一个 Counter 指标 demo_items_shipped_total,该指标追踪物品的运输情况,用 5 分钟来模拟"每日"流量周期,所以我们不必等待一整天才能查看该时段的数据。

我们只使用第一个演示服务实例来测试即可,首先我们来看看它的速率:

rate(demo_items_shipped_total{instance="demo-service-0:10000"}[1m])

对比

该服务还暴露了一个 01 的布尔指标,告诉我们现在是否是假期:

holiday 指标

将假期与发货商品率进行比较,注意到节假日时它会减少!我们可以尝试将当前的发货速度与 7"天"(7 * 5 分钟)前的速度进行比较,看看是否有什么不正常的情况。

  rate(demo_items_shipped_total{instance="demo-service-0:10000"}[1m])
/
rate(demo_items_shipped_total{instance="demo-service-0:10000"}[1m] offset 35m)

通常情况下,该比率约为 1,但当当天或前一天是假期时,我们得到的比率比正常情况下要略低或高。

对比

但是,如果原因只是假期,我们想忽略这个较低或较高的比率。我们可以在过去或现在是假期的时候过滤掉这个比率,方法是附加一个 unless 集合操作符。

(
rate(demo_items_shipped_total{instance="demo-service-0:10000"}[1m])
/
rate(demo_items_shipped_total{instance="demo-service-0:10000"}[1m] offset 35m)
)
unless
(
demo_is_holiday == 1 # Is it currently a holiday?
or
demo_is_holiday offset 35m == 1 # Was it a holiday 7 "days" ago?
)

或者另外一种方法,我们只需要比较今天和一周前是否有相同的节日:

(
rate(demo_items_shipped_total{instance="demo-service-0:10000"}[1m])
/
rate(demo_items_shipped_total{instance="demo-service-0:10000"}[1m] offset 35m)
)
unless
(
demo_is_holiday
!=
demo_is_holiday offset 35m
)

这样我们就可以过滤掉当前时间有假期或过去有假期的结果。

过滤假期

练习

1.构建一个查询,计算每个 path 路径的总请求率和 35 分钟前的差异。

sum by(path) (rate(demo_api_request_duration_seconds_count[5m])) -
sum by(path) (rate(demo_api_request_duration_seconds_count[5m] offset 35m))