Prometheus 3.x 配置参数详解

详解 Prometheus 3.15.0(实测)的配置文件(prometheus.yml)核心段与运行时参数,并实测确认 3.x 与 2.x 的关键差异(PromQL 变化、UTF-8 指标名、配置文件/CLI 变化、promtool 子命令变化)。所有输出均来自 Prometheus 3.15.0 官方预编译二进制实测

PrometheusPrometheus参数调优2026/09/27

Prometheus 3.x 配置参数详解

目标:详解 Prometheus 3.15.0(实测)的配置文件(prometheus.yml)核心段与运行时参数,并实测确认 3.x 与 2.x 的关键差异(PromQL 变化、UTF-8 指标名、配置文件/CLI 变化、promtool 子命令变化)。所有输出均来自 Prometheus 3.15.0 二进制真实实测。

环境信息

信息项值
Prometheus 版本3.15.0(最新 3.x)
配置文件prometheus.yml(tar.gz 自带,默认相对运行时所在目录)
默认监听0.0.0.0:9090
默认数据目录data/
默认数据保留15d
实测方式./prometheus --help 全量参数 + prometheus.yml 配置热加载 + HTTP API 验证

配置文件(prometheus.yml)核心段

Prometheus 配置文件为 YAML 格式,由 --config.file 指定。3.15.0 自带默认配置实测如下:

# my global config
global:
  scrape_interval: 15s          # 抓取间隔:每 15 秒抓取一次目标(默认 1m)
  evaluation_interval: 15s      # 规则评估间隔:每 15 秒评估一次规则(默认 1m)
  # scrape_timeout: 10s         # 单次抓取超时(默认 10s,不能大于 scrape_interval)

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]
        labels:
          app: "prometheus"
    scrape_native_histograms: true   # 3.x 默认配置新增(2.x 无此行)

段 1:global(全局配置)

参数默认值说明
scrape_interval1m默认抓取间隔,被未显式指定的 job 继承
evaluation_interval1m规则(记录规则/告警规则)评估间隔
scrape_timeout10s单次抓取超时,不能大于 scrape_interval
external_labels无对外通信(告警/远程存储)附加的标签
metric_name_validation_schemeutf83.x 新增:抓取指标名校验(utf8/legacy,见 UTF-8 说明)

段 2:scrape_configs(抓取配置)

每个抓取任务为一个 job,核心子参数(实测默认配置 + promtool 校验):

参数说明
job_name任务名,作为 job 标签写入时序
static_configs静态目标列表,targets 为 host:port 数组
metrics_path抓取路径(默认 /metrics)
schemehttp/https(默认 http)
scrape_interval覆盖全局抓取间隔
scrape_timeout覆盖全局抓取超时
labels附加标签
scrape_native_histograms3.x 默认 true:抓取原生直方图(protobuf 协商)

💡 说明:targets 支持静态列表,也可用服务发现(file_sd、consul_sd、kubernetes_sd 等)动态生成。

段 3:rule_files(规则文件)

rule_files:
  - "alerts.yml"          # 支持通配符,如 /etc/prometheus/rules/*.yml

规则文件内可定义记录规则(recording rule)与告警规则(alerting rule)。实测:

promtool check config /etc/prometheus/prometheus.yml

实测输出:

Checking /etc/prometheus/prometheus.yml
  SUCCESS: 1 rule files found
 SUCCESS: /etc/prometheus/prometheus.yml is valid prometheus config file syntax

Checking /etc/prometheus/alerts.yml
  SUCCESS: 2 rules found

段 4:alerting(告警配置)

alerting:
  alertmanagers:
    - static_configs:
        - targets: []
          # - "alertmanager:9093"

💡 说明:配置 Alertmanager 地址列表,Prometheus 将触发告警推送过去。不配告警则留空。3.x 起 Alertmanager 仅支持 v2 API(实测 release notes 确认:Disallow configuring AM with the v1 api)。

段 5:otlp(3.x 新增,OTLP 接收配置)

otlp:
  translation_strategy: NoUTF8EscapingWithSuffixes

💡 说明:配合 --web.enable-otlp-receiver 使用。默认对 OTLP 指标名做规范化(UTF-8 转 ASCII),实测中文指标名默认推送报 HTTP 500 normalization for metric "温度计" resulted in empty name;配置 NoUTF8EscapingWithSuffixes 后保留 UTF-8 名称(实测配置后配置校验通过)。

运行时参数(命令行 flag)

用 ./prometheus --help 实测。以下为运维最常用的参数:

参数默认值实测说明
--config.fileprometheus.yml配置文件路径
--web.listen-address0.0.0.0:9090HTTP 监听地址(远程访问需显式指定 0.0.0.0)
--web.enable-lifecycle关闭HTTP 热加载 POST /-/reload(实测未开返回 403,开启返回 200)
--web.enable-admin-api关闭管理 API(实测 3.15 仍存在且默认关;未开调用返回 admin APIs disabled)
--web.enable-otlp-receiver关闭OTLP 写入端点 /api/v1/otlp/v1/metrics(3.x 新增)
--storage.tsdb.pathdata/TSDB 数据目录
--storage.tsdb.retention.time15d数据保留时长,如 30d、720h
--storage.tsdb.retention.size无按大小保留(如 50GB),二选一
--log.levelinfo日志级别(3.x 标记 deprecated,建议配置文件 runtime.log_level)
--agent关闭Agent 模式(3.x 起替代 --enable-feature=agent)
--enable-feature无逗号分隔的特性开关(实测 3.15 共 29 项,见下)
--no-auto-gomaxprocs自动3.x 自动按 CPU quota 设置 GOMAXPROCS(--no- 前缀关闭)
--no-auto-gomemlimit自动3.x 自动按进程可用内存上限设置 GOMEMLIMIT

实测 --enable-feature 完整选项(./prometheus --help):

Valid options: concurrent-rule-eval, created-timestamp-zero-ingestion,
delayed-compaction, exemplar-storage, extra-scrape-metrics,
histograms-st-encoding, memory-snapshot-on-shutdown, metadata-wal-records,
old-ui, openmetrics2, otlp-deltatocumulative, otlp-native-delta-ingestion,
promql-binop-fill-modifiers, promql-delayed-name-removal,
promql-experimental-functions, promql-extended-range-selectors,
promql-per-step-stats, search-api, st-storage, st-synthesis,
type-and-unit-labels, use-start-timestamps, use-uncached-io, xor2-encoding,
zstd-scrape

💡 说明:其中 old-ui 可切回 2.x 老 UI;promql-experimental-functions 开启实验性 PromQL 函数;auto-reload-config(3.0 新增)支持配置自动重载(release notes 确认)。

热加载配置实测(--web.enable-lifecycle)

# 未开启 flag:实测返回 403
curl -s -X POST http://localhost:9090/-/reload -o /dev/null -w "%{http_code}"
# 开启 flag 后:实测返回 200
curl -s -X POST http://localhost:9090/-/reload -o /dev/null -w "%{http_code}"

实测输出:

403
200

admin API 实测(--web.enable-admin-api)

curl -s -X POST http://localhost:9090/api/v1/admin/tsdb/snapshot

未开 flag 实测输出:

{"status":"error","errorType":"unavailable","error":"admin APIs disabled"}

开启 flag 后实测输出:

{"status":"success","data":{"name":"20260926T213128Z-5e7a03741436bdd5"}}

3.x 与 2.x 的关键差异(实测确认)

差异点2.x3.x(实测)
Web UI老 UI全新 React UI(/ 重定向 /query),--enable-feature=old-ui 可回退
UTF-8 指标名需 --enable-feature=utf8-name默认启用(utf8-name flag 已移除);但实测 text 抓取仍拒 UTF-8,OTLP 需配置 translation_strategy
默认配置文件无 scrape_native_histograms自带 scrape_native_histograms: true
移除的 flag—--storage.tsdb.retention、--storage.tsdb.allow-overlapping-blocks、--alertmanager.timeout(实测 --help 已无)
Agent 模式--enable-feature=agent--agent(feature flag 移除,实测 --help 有 --[no-]agent)
OTLP 接收--enable-feature=otlp-write-receiver--web.enable-otlp-receiver(实测)
promtool tsdbtsdb ls / tsdb snapshot / tsdb checktsdb list / tsdb dump / tsdb analyze(实测 ls 报 expected command,snapshot/check 已移除,快照改走 admin API)
PromQL经典函数holt_winters 改名 double_exponential_smoothing(实验性);range selector 左开区间;新函数需 promql-experimental-functions
日志格式logfmt 自定义Go structured logging(实测日志 time=... level=INFO source=... msg=...)
资源自适应手动设置自动 GOMAXPROCS/GOMEMLIMIT(--no-auto-* 关闭)
scrape_classic_histograms原名改名 always_scrape_classic_histograms(3.0 release notes)
--log.level正常标记 deprecated(改配置文件 runtime.log_level,实测 --help 说明)

PromQL 变化实测

查询 UTF-8 指标名(3.x 新语法,实测):

curl -s --get "http://localhost:9090/api/v1/query" --data-urlencode 'query={"温度计"}'

💡 说明:2.x 指标名必须符合 [a-zA-Z_:][a-zA-Z0-9_:]*;3.x 支持 UTF-8 名称,查询时名称需加引号并放入大括号:{"温度计"},标签同理 {"metric.name", "label"=...}。

注意事项

  • --web.enable-lifecycle 与 --web.enable-admin-api 默认关闭(实测 403 / admin APIs disabled),生产按需开启;admin API 无鉴权,勿暴露公网
  • scrape_timeout 不能大于 scrape_interval,否则抓取会重叠
  • --storage.tsdb.retention.time 与 .size 同时设置时先达者生效
  • 3.x 移除的 flag 直接使用会启动报错,升级 2.x→3.x 前先 promtool check config 校验并阅读迁移指南
  • UTF-8 指标名:抓取 text 格式实测不支持(expected metric name after HELP),接入 OTLP 并配置 otlp.translation_strategy: NoUTF8EscapingWithSuffixes 才可保留中文名

常见问题

问题 1:启动报 unknown flag / 2.x 参数在 3.x 失效

原因: 3.x 移除了一批 2.x 参数(--storage.tsdb.retention、--alertmanager.timeout、--enable-feature=agent 等,实测 --help 已无)。

解决: 用 prometheus --help 核对新参数:retention 改 --storage.tsdb.retention.time;agent 用 --agent;OTLP 用 --web.enable-otlp-receiver。

问题 2:修改 prometheus.yml 后不生效

原因: 未开 --web.enable-lifecycle 时 /-/reload 返回 403(实测)。

解决: 启动加 --web.enable-lifecycle,改完配置执行 curl -X POST http://localhost:9090/-/reload(实测返回 200);或用 kill -HUP <pid>。

问题 3:抓取含中文指标名目标一直 down

原因: 实测 Prometheus 3.15 text/OpenMetrics 抓取报 expected metric name after HELP, got "\xe6" ("INVALID"),抓取失败——UTF-8 支持默认启用但抓取解析路径仍按 legacy 校验。

解决: 抓取目标用 ASCII 指标名;需 UTF-8 名称时走 OTLP(--web.enable-otlp-receiver + otlp.translation_strategy: NoUTF8EscapingWithSuffixes)。

问题 4:promtool tsdb ls 报 expected command but got "ls"

原因: 3.x 重命名了 tsdb 子命令(实测报错)。

解决: 用 promtool tsdb list / tsdb dump;快照功能改走 admin API POST /api/v1/admin/tsdb/snapshot(需 --web.enable-admin-api)。

参考链接


本文档由 www.quzuo.net 平台开发