特性标志
以下是默认禁用的特性列表,因为它们是破坏性更改或被认为是实验性的。它们的行为可能会在未来的版本中发生变化,这将通过发布变更日志进行通知。
您可以使用 --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_replace
和 label_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
等效于10m
或600s
10m - 1m
等效于9m
或540s
(5+2) * 1m
等效于7m
或420s
1h / 2
等效于30m
或1800s
4h % 3h
等效于1h
或3600s
(2 ^ 3) * 1m
等效于8m
或480s
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 实现的。
欲了解更多详情,请参阅 提案。