特性标志

以下是默认禁用的特性列表,因为它们是破坏性更改或被认为是实验性的。它们的行为可能会在未来的版本中发生变化,这将通过发布变更日志进行通知。

您可以使用 --enable-feature 标志和逗号分隔的特性列表来启用它们。它们可能会在未来版本中默认启用。

范例存储

--enable-feature=exemplar-storage

OpenMetrics 引入了抓取目标向某些指标添加范例的能力。范例是对 MetricSet 之外数据的引用。一个常见的用例是程序跟踪的 ID。

范例存储实现为一个固定大小的循环缓冲区,它将所有序列的范例存储在内存中。启用此特性将启用 Prometheus 抓取的范例的存储。配置文件块 storage/exemplars 可用于按范例数量控制循环缓冲区的大小。一个仅包含 trace_id=<jaeger-trace-id> 的范例通过内存范例存储大约使用 100 字节的内存。如果启用了范例存储,我们还会将范例附加到 WAL 以进行本地持久化(在 WAL 持续时间内)。

关机时内存快照

--enable-feature=memory-snapshot-on-shutdown

这会在关机时对内存中的数据块和序列信息进行快照,并将其存储在磁盘上。这将缩短启动时间,因为现在可以使用此快照和内存映射数据块恢复内存状态,而 WAL 仅需对不属于快照的 WAL 部分进行磁盘重放。

额外抓取指标

--enable-feature=extra-scrape-metrics

启用后,对于每个实例抓取,Prometheus 会在以下附加时间序列中存储一个样本:

  • scrape_timeout_seconds。目标的已配置 scrape_timeout。这允许您通过 scrape_duration_seconds / scrape_timeout_seconds 来衡量每个目标,以了解它们距离超时有多近。
  • scrape_sample_limit。目标的已配置 sample_limit。这允许您通过 scrape_samples_post_metric_relabeling / scrape_sample_limit 来衡量每个目标,以了解它们距离达到限制有多近。请注意,如果未配置限制,scrape_sample_limit 可以为零,这意味着上述查询对于没有限制的目标可以返回 +Inf(因为我们除以零)。如果您只想查询有样本限制的目标,请使用此查询:scrape_samples_post_metric_relabeling / (scrape_sample_limit > 0)
  • scrape_body_size_bytes。最近成功抓取响应的未压缩大小。如果抓取因超出 body_size_limit 而失败,则报告 -1,其他抓取失败报告 0

每步统计

--enable-feature=promql-per-step-stats

启用后,在查询请求中传入 stats=all 会返回每步统计信息。目前这仅限于 totalQueryableSamples。

如果在引擎或查询中禁用,则根本不计算每步统计信息。

原生直方图

--enable-feature=native-histograms

启用后,Prometheus 将摄取原生直方图(以前也称为稀疏直方图或高分辨率直方图)。原生直方图仍处于高度实验阶段。请预期会发生破坏性更改(包括导致 TSDB 不可读的更改)。

原生直方图目前仅在传统的 Prometheus protobuf 暴露格式中受支持。因此,此特性标志也启用了一个新的(也是实验性的)protobuf 解析器,通过该解析器,所有指标都将被摄取(即不只是原生直方图)。Prometheus 将首先尝试协商 protobuf 格式。被仪表化的目标也需要支持 protobuf 格式,并且它需要暴露原生直方图。protobuf 格式允许经典直方图和原生直方图并存暴露。如果禁用此特性标志,Prometheus 将继续解析经典直方图(尽管通过文本格式)。如果启用此标志,Prometheus 仍将摄取那些没有相应原生直方图的经典直方图。但是,如果存在原生直方图,Prometheus 将忽略相应的经典直方图,但范例除外,范例总是被摄取。要保留经典直方图,请在抓取作业中启用 always_scrape_classic_histograms

实验性 PromQL 函数

--enable-feature=promql-experimental-functions

启用被认为是实验性的 PromQL 函数。这些函数可能会更改其名称、语法或语义。它们也可能被完全移除。

创建时间戳零注入

--enable-feature=created-timestamp-zero-ingestion

启用创建时间戳的摄取。创建时间戳会在适当的时候注入为零值样本。详情请参见PromCon 演讲

目前 Prometheus 仅支持传统 Prometheus Protobuf 协议上的创建时间戳(WIP 用于其他协议)。因此,启用此特性后,Prometheus Protobuf 抓取协议将优先(更多详情请参见 scrape_config.scrape_protocols 设置)。

除了在 Prometheus 中启用此特性外,被抓取的应用程序还需要暴露创建时间戳。

独立规则的并发评估

--enable-feature=concurrent-rule-eval

默认情况下,规则组并发执行,但组内的规则按顺序执行;这是因为规则可以使用前一个规则的输出来作为其输入。然而,如果规则之间没有可检测的关系,则没有理由按顺序运行它们。当启用 concurrent-rule-eval 特性标志时,规则组内没有任何其他规则依赖的规则将并发评估。这有可能改善规则组评估延迟和资源利用率,代价是增加更多并发查询负载。

并发规则评估的数量可以通过 --rules.max-concurrent-rule-evals 进行配置,默认为 4

提供旧版 Prometheus UI

回退到提供旧版(Prometheus 2.x)Web UI,而不是新版 UI。作为 Prometheus 3.0 的一部分发布的新版 UI 是一个完全重写的版本,旨在更简洁、更清爽、底层更现代化。然而,它尚未完全功能完善和经过实战测试,因此一些用户可能仍然喜欢使用旧版 UI。

--enable-feature=old-ui

元数据 WAL 记录

--enable-feature=metadata-wal-records

启用后,Prometheus 将在内存中存储元数据,并按序列跟踪元数据更改作为 WAL 记录。

如果您想使用新的远程写入 2.0 发送元数据,则必须使用此功能。

延迟压缩开始时间

--enable-feature=delayed-compaction

在头部压缩开始时间中会添加一个随机偏移,最大为数据块范围的 10%。这有助于 Prometheus 实例避免同时进行压缩,并减少共享资源的负载。

只有自动头部压缩以及由此直接产生的操作才会受到此延迟的影响。

如果可能进行多次连续的头部压缩,则只有第一次压缩会经历此延迟。

请注意,在此延迟期间,头部会继续其正常操作,包括提供服务和追加序列。

尽管压缩有延迟,但生成的数据块的时间对齐方式与没有延迟时相同。

延迟 PromQL 引擎移除 __name__ 标签

--enable-feature=promql-delayed-name-removal

启用后,Prometheus 将更改从 PromQL 查询结果中移除 __name__ 标签的方式(对于需要此操作的函数和表达式)。具体来说,它会将移除操作延迟到查询评估的最后一步,而不是每次评估生成派生指标的表达式或函数时都进行。

这允许通过 label_replacelabel_join 函数选择性地保留 __name__ 标签,并有助于防止“向量不能包含具有相同标签集指标”的错误,当对 __name__ 标签应用正则表达式匹配器时可能会发生此错误。

请注意,单独评估查询的部分仍然会触发标签集冲突。这通常发生在手动分析查询的中间结果或使用 PromLens 等工具时。

如果查询引用了已移除的 __name__ 标签,则在此特性标志设置期间其行为可能会发生变化。(例如:sum by (__name__) (rate({foo="bar"}[5m])),详见GitHub 上的详细信息。)这些查询很少出现,且易于修复。(在上述示例中,移除 by (__name__) 在没有特性标志的情况下不会改变任何内容,并修复了存在特性标志时可能出现的问题。)

自动重新加载配置

--enable-feature=auto-reload-config

启用后,Prometheus 将以指定间隔自动重新加载其配置文件。间隔由 --config.auto-reload-interval 标志定义,默认为 30s

通过检测主配置文件或任何引用文件(如规则和抓取配置)的校验和变化来触发配置重新加载。为确保重新加载期间的一致性并避免问题,建议原子地更新这些文件。

OTLP Delta 转换

--enable-feature=otlp-deltatocumulative

启用后,Prometheus 会将 OTLP 指标从增量时序转换为其累积等效,而不是丢弃它们。此功能不能与 otlp-native-delta-ingestion 同时启用。

这使用了 OTel 收集器中的 deltatocumulative,并使用其默认设置。

增量转换会保持内存中的状态,以便随时间聚合每个序列的增量变化。当 Prometheus 重启时,此状态会丢失,聚合将再次从零开始。这会导致累积序列中的计数器重置。

此状态会定期(max_stale)清除非活跃序列。

启用此功能可能会对性能产生负面影响,因为内存状态受到互斥锁保护。仅累积的 OTLP 请求不受影响。

PromQL 时间长度中的算术表达式

--enable-feature=promql-duration-expr

使用此标志,算术表达式可以在范围查询和偏移持续时间中用于时间持续时间。

在范围查询中

rate(http_requests_total[5m * 2])  # 10 minute range
rate(http_requests_total[(5+2) * 1m])  # 7 minute range

在偏移持续时间中

http_requests_total offset (1h / 2)  # 30 minute offset
http_requests_total offset ((2 ^ 3) * 1m)  # 8 minute offset

当使用带持续时间表达式的偏移时,必须将表达式括在括号中。如果没有括号,则只有第一个持续时间值将用于偏移计算。

注意:时间持续表达式不支持在 @ 时间戳运算符中。

支持以下运算符

  • + - 加法
  • - - 减法
  • * - 乘法
  • / - 除法
  • % - 模数
  • ^ - 幂运算

等效持续时间的示例

  • 5m * 2 等效于 10m600s
  • 10m - 1m 等效于 9m540s
  • (5+2) * 1m 等效于 7m420s
  • 1h / 2 等效于 30m1800s
  • 4h % 3h 等效于 1h3600s
  • (2 ^ 3) * 1m 等效于 8m480s

OTLP 原生增量支持

--enable-feature=otlp-native-delta-ingestion

启用后,允许原生摄取增量 OTLP 指标,存储原始样本值而无需转换。此功能不能与 otlp-deltatocumulative 同时启用。

目前,StartTimeUnixNano 字段被忽略,并且增量被赋予未知的指标元数据类型。

增量支持仍处于非常早期的开发阶段,摄取和查询过程可能会随时间变化。有关开放提案,请参阅 prometheus/proposals#48

查询

我们鼓励用户尝试使用增量和现有 PromQL 函数;我们将收集反馈,并可能构建功能来改善查询增量的体验。

请注意,标准 PromQL 计数器函数(如 rate()increase())是为累积指标设计的,当与增量指标一起使用时会产生不正确的结果。这在未来可能会改变,但目前,要获得增量指标的类似结果,您需要使用 sum_over_time()

  • sum_over_time(delta_metric[<range>]):计算指定时间范围内的增量值之和。
  • sum_over_time(delta_metric[<range>]) / <range>:计算增量指标的每秒速率。

如果 <range> 不是指标收集间隔的倍数,这些方法可能无法很好地工作。例如,如果您执行 sum_over_time(delta_metric[1m]) / 1m 范围查询(步长为 1m),但指标的收集间隔为 10m,则图表将每 10 分钟显示一个高速率值的点,而不是 10 个较低的、恒定值的点。

当前陷阱

  • 如果通过联邦暴露增量指标,如果摄取间隔与联邦端点的抓取间隔不一致,数据可能会被错误地收集。

  • 目前很难确定一个指标是增量时序还是累积时序,因为指标名称或标签中没有时序指示。目前,如果您正在摄取增量和累积指标的混合,我们建议您明确添加自己的标签来区分它们。将来,我们计划引入类型标签来一致地区分指标类型,并可能使 PromQL 函数具有类型感知能力(例如,当累积型函数与增量指标一起使用时提供警告)。

  • 如果多个样本在同一时间戳被摄取,则只保留其中一个点——样本会被求和(Prometheus 通常就是这样工作的——重复时间戳的样本会被拒绝)。任何聚合都必须在将样本发送到 Prometheus 之前完成。

类型和单位标签

--enable-feature=type-and-unit-labels

当启用时,Prometheus 将开始注入额外的保留的 __type____unit__ 标签,正如 PROM-39 提案 中所设计的那样。

这些标签来源于现有抓取和摄取格式(如 OpenMetrics Text、Prometheus Text、Prometheus Proto、Remote Write 2 和 OTLP)的元数据结构。所有用户提供的包含 __type____unit__ 的标签都将被覆盖。

PromQL 层将以处理 name 的相同方式处理这些标签,例如在某些操作(如 -+)中被丢弃,并受 promql-delayed-name-removal 特性影响。

此功能使得重要的元数据信息可以直接与样本和 PromQL 层一起访问。

这对于以下用户尤其有用:

  • 希望能够根据类型或单位选择指标。
  • 希望处理具有相同指标名称但不同类型和单位的序列。例如,原生直方图迁移或来自 OTLP 端点的 OpenTelemetry 指标,无需翻译。

未来计划开展更多 工作,这些工作将依赖于此,例如,丰富的 PromQL 用户体验,有助于在错误函数中使用错误类型时提供帮助、自动重命名、增量类型等。

使用无缓存 IO

--enable-feature=use-uncached-io

实验性功能,仅在 Linux 上可用。

启用后,它将使数据块写入绕过页面缓存。其主要目标是减少围绕页面缓存行为的困惑,并防止因误导性缓存增长而导致的内存过度分配。

目前,这是通过直接 I/O 实现的。

欲了解更多详情,请参阅 提案

本页内容