特性开关
这里列出了一些默认禁用的特性,因为它们是重大变更或被认为是实验性的。它们的行为可能会在未来的版本中发生变化,相关信息将通过版本更新日志 进行沟通。
您可以使用 --enable-feature 标志,并附上一个以逗号分隔的特性列表来启用它们。它们可能会在未来的版本中默认启用。
Exemplar 存储
--enable-feature=exemplar-storage
OpenMetrics 引入了采集目标向某些指标添加 exemplar 的能力。Exemplar 是对 MetricSet 外部数据的引用。一个常见的用例是程序跟踪的 ID。
Exemplar 存储被实现为一个固定大小的循环缓冲区,将所有系列的 exemplar 存储在内存中。启用此特性将允许存储 Prometheus 采集的 exemplar。配置文件块 storage/exemplars 可用于按 exemplar 数量控制循环缓冲区的大小。一个仅包含 trace_id=<jaeger-trace-id> 的 exemplar 通过内存中的 exemplar 存储大约占用 100 字节的内存。如果启用了 exemplar 存储,我们还将 exemplar 附加到 WAL 中以实现本地持久化(在 WAL 持续时间内)。
关闭时生成内存快照
--enable-feature=memory-snapshot-on-shutdown
这会在关闭时为内存中的数据块(chunks)和系列(series)信息生成快照,并将其存储在磁盘上。这将减少启动时间,因为现在可以通过此快照和 m-map 映射的数据块来恢复内存状态,而只需对 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
此特性开关正在逐步淘汰。您不应再使用它。
原生直方图现在是一个稳定的特性。但是,要采集原生直方图,需要一个采集配置设置 scrape_native_histograms。为了简化过渡,此特性开关将 scrape_native_histograms 的默认值设置为 true。从 v3.9 开始,此特性开关将成为一个真正的无操作项,并且 scrape_native_histograms 的默认值将始终为 false。如果您在运行 v3.8 时仍在使用此特性开关,请在升级到 v3.9 之前更新您的采集配置并停止使用该特性开关。
实验性 PromQL 函数
--enable-feature=promql-experimental-functions
启用被认为是实验性的 PromQL 函数。这些函数的名称、语法或语义可能会发生变化。它们也可能被完全移除。
创建时间戳零值注入
--enable-feature=created-timestamp-zero-ingestion
启用创建时间戳的摄取。创建时间戳会在适当的时候作为值为 0 的样本注入。详情请参阅 PromCon 演讲 。
目前 Prometheus 仅在传统的 Prometheus Protobuf 协议上支持创建时间戳(其他协议正在开发中)。因此,启用此特性会预先将全局 scrape_protocols 配置选项设置为 [ PrometheusProto, OpenMetricsText1.0.0, OpenMetricsText0.0.1, PrometheusText0.0.4 ],从而以最高优先级协商 Prometheus Protobuf 协议(除非 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% 的随机偏移量被添加到 Head 压缩的开始时间。这有助于 Prometheus 实例避免同时进行压缩,并减少对共享资源的负载。
只有自动的 Head 压缩及其直接产生的操作会受到此延迟的影响。
如果可能连续进行多次 Head 压缩,只有第一次压缩会经历此延迟。
请注意,在此延迟期间,Head 会继续其正常操作,包括提供服务和追加系列。
尽管压缩存在延迟,但生成的块与没有延迟时的时间对齐方式相同。
为 PromQL 引擎延迟移除 __name__ 标签
--enable-feature=promql-delayed-name-removal
启用后,Prometheus 将更改从 PromQL 查询结果中移除 __name__ 标签的方式(对于需要此操作的函数和表达式)。具体来说,它会将移除操作延迟到查询评估的最后一步,而不是在每次评估创建派生指标的表达式或函数时进行移除。
这允许通过 label_replace 和 label_join 函数选择性地保留 __name__ 标签,并有助于防止“vector cannot contain metrics with the same labelset”(向量不能包含具有相同标签集的指标)错误,该错误在对 __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 指标从增量时间性(delta temporality)转换为其累积等效项,而不是丢弃它们。此特性不能与 otlp-native-delta-ingestion 一同启用。
这使用了 OTel collector 中的 deltatocumulative ,并使用其默认设置。
Delta 转换会维护内存中的状态,以随时间聚合每个系列的增量变化。当 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
当使用带有持续时间表达式的偏移时,您必须将表达式用括号括起来。如果没有括号,只有第一个持续时间值将用于偏移计算。
step() 可以在持续时间表达式中使用。对于范围查询,它解析为范围查询的步长。对于即时查询,它解析为 0s。
min(<duration>, <duration>) 和 max(<duration>, <duration>) 可用于查找两个持续时间表达式的最小值或最大值。
注意:@ 时间戳运算符不支持持续时间表达式。
支持以下运算符
+- 加法-- 减法*- 乘法/- 除法%- 模^- 幂运算
等效持续时间示例
5m * 2等效于10m或600s10m - 1m等效于9m或540s(5+2) * 1m等效于7m或420s1h / 2等效于30m或1800s4h % 3h等效于1h或3600s(2 ^ 3) * 1m等效于8m或480sstep() + 1等效于查询步长增加 1 秒。max(step(), 5s)等效于查询步长和5s中的较大者。min(2 * step() + 5s, 5m)等效于两倍查询步长加5s和5m中的较小者。
OTLP 原生 Delta 支持
--enable-feature=otlp-native-delta-ingestion
启用后,允许原生摄取增量 OTLP 指标,存储原始样本值而不进行转换。此特性不能与 otlp-deltatocumulative 一同启用。
目前,StartTimeUnixNano 字段被忽略,增量被赋予未知的指标元数据类型。
Delta 支持处于非常早期的开发阶段,摄取和查询过程可能会随时间变化。有关开放提案,请参见 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 范围查询(步长为 1 分钟),但指标的采集间隔是 10 分钟,图表将每 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 用户体验,有助于在错误类型的函数上使用错误类型时提供帮助,自动重命名,增量类型等。
与元数据记录的行为
当此特性启用且存在元数据 WAL 记录时,在不太可能的情况下,如果类型或单位在这些记录中不同,Prometheus 输出倾向于优先使用 __type__ 和 __unit__ 标签的值。例如,在 Remote Write 2.0 中,如果元数据记录由于某种原因(例如,错误)显示为“counter”,但 __type__="gauge",则远程时间序列将被设置为 gauge。
使用非缓存 I/O
--enable-feature=use-uncached-io
实验性特性,仅在 Linux 上可用。
启用后,它会使数据块写入绕过页面缓存。其主要目标是减少围绕页面缓存行为的混淆,并防止因误导性的缓存增长而过度分配内存。
目前这是通过直接 I/O 实现的。
更多详情,请参阅提案 。
扩展范围选择器
--enable-feature=promql-extended-range-selectors
为 PromQL 范围和即时选择器启用实验性的 anchored 和 smoothed 修饰符。这些修饰符提供了对 rate 和 increase 等函数中如何处理范围边界的更多控制,尤其是在数据缺失或不规则的情况下。
原生直方图尚不支持扩展范围选择器。
anchored
在范围的开头使用(在回溯增量内的)最新样本,或者,如果在回溯增量内没有样本,则使用范围内的第一个样本。在范围的末尾也会使用范围内的最后一个样本。不应用外插或内插,因此这对于获取样本值之间的直接差异很有用。
锚定范围选择器可用于:resets、changes、rate、increase 和 delta。
查询示例:increase(http_requests_total[5m] anchored)
注意:当将锚定修饰符与 increase 函数一起使用时,返回的结果是整数。
smoothed
在范围选择器中,使用边界之前和之后的样本值对范围边界的值进行线性插值,以获得更优的估算,这种估算对于不规则的抓取和缺失的样本具有鲁棒性。但是,它需要评估区间之后有一个样本才能正常工作,请参见下面的注意。
对于瞬时选择器,值是使用评估时间点前后紧邻的样本在该时间点进行线性插值的。
平滑范围选择器可用于:rate、increase 和 delta。
查询示例:rate(http_requests_total[step()] smoothed)
关于告警和记录规则的注意:
smoothed修饰符需要在评估区间之后有样本,因此直接在告警或记录规则中使用它通常会低估结果,因为在评估时未来的样本是不可用的。要在规则中安全地使用smoothed,你必须对规则组应用一个query_offset(请参阅文档),以确保计算窗口完全在过去,并且所有需要的样本都可用。
对于关键告警,请将偏移量设置为至少一个抓取间隔;对于不那么关键或更具弹性的用例,请考虑使用更大的偏移量(多个抓取间隔)以容忍抓取失败。
更多详情,请参阅设计文档 。
注意:扩展范围选择器不支持子查询。