菜单
文档breadcrumb arrow Grafana Mimirbreadcrumb arrow 配置breadcrumb arrow 乱序样本摄取
开源 此页面内容适用于开源版本。

配置乱序样本摄取

如果由于您的架构或您正在观察的系统的特性而存在乱序样本,则可以配置 Grafana Mimir,设置一个乱序时间窗口阈值,控制可摄取的样本的最大旧度。

作为一项**实验性**功能,Mimir 允许您摄取乱序样本。因此,如果样本在配置的时间窗口内,则不会被丢弃。

实例范围配置乱序样本摄取

要配置 Mimir 接受乱序样本,请参阅以下配置片段

yaml
limits:
  # Allow ingestion of out-of-order samples up to 5 minutes since the latest received sample for the series.
  out_of_order_time_window: 5m

按租户配置乱序样本摄取

如果您的 Mimir 启用了多租户功能,您仍然可以使用前述方法为所有租户设置默认的乱序时间窗口阈值。如果特定租户需要自定义阈值,您可以使用运行时配置设置每个租户的覆盖。

  1. 启用运行时配置
  2. 为需要自定义乱序时间窗口的租户添加覆盖配置
yaml
overrides:
  tenant1:
    out_of_order_time_window: 2h
  tenant2:
    out_of_order_time_window: 30m

out_of_order_time_window 设置为 0s 将禁用乱序摄取,但您仍然可以继续查询已摄取的乱序样本。

启用乱序摄取时的查询缓存

一旦查询被缓存,稍后摄取的乱序样本可能会改变这些查询结果。

为了解决这个问题,我们建议您将相同的限制配置传递给 query-frontend 组件。它将为落在乱序样本摄取窗口内(即时间戳在 now 减去 out_of_order_time_window 之后)的任何查询缓存条目设置较低的 TTL(存活时间)为 10 分钟。

如果您完全不想缓存此时间窗口内的任何查询,可以将 -query-frontend.max-cache-freshness 设置为与 out_of_order_time_window 相匹配,这样您就不会缓存仍在预期样本到达的时间窗口内的查询。这样做可能会根据查询特性增加您的 Mimir 集群负载。

启用乱序摄取时的记录规则

与上面的查询缓存问题类似,通过记录规则记录的样本可能会因新的乱序样本摄取而过时。因此,如果您运行记录规则的原始查询,应该会看到结果有所差异。差异大小很大程度上取决于您的乱序摄取模式。

如果您恰好有一个较短的 out_of_order_time_window,例如小于 10 分钟,则可以使用 -ruler.evaluation-delay-duration 将规则评估延迟到该时间。

理解乱序

之前,Mimir 和 Prometheus TSDB 对接受的时间戳有一些规则。

当新的序列样本到达时,Mimir 需要确定该序列是否已存在,以及该样本是否过旧。

  • 如果序列存在于 TSDB 的 Head 块中,则传入样本的时间戳必须比该序列存储的最新样本的时间戳新。否则,ingester 会将其视为乱序样本。
  • 如果序列不存在,则样本必须在界限内,该界限从 TSDB 的 Head 块最大时间回溯 1 小时(使用 2 小时块范围时)。如果不在界限内,则 ingester 会将其视为越界样本。

实验性的乱序摄取有助于解决这两个问题。

注意

如果您使用 Prometheus 远程写入或 Grafana Agent 写入指标,则不应出现乱序样本。

Prometheus 和 Grafana Agent 保证同一序列的样本按顺序写入。