Jaeger 如何配置 Badger 存储后端的目录与 span 保留时长?
【免费下载链接】jaegerCNCF Jaeger, a Distributed Tracing Platform项目地址: https://gitcode.com/GitHub_Trending/ja/jaeger
当你用 Jaeger 的 Badger 后端存储 span 时,需要回答两个配置问题:数据写到磁盘的哪个目录(key 目录与 value 目录),以及 span 保留多长时间后再不可访问。Jaeger 的 Badger 默认是ephemeral(临时)模式,数据放在临时文件系统中,directories配置不生效;只有显式关闭临时模式并指定目录,落盘配置才会起作用。本文基于仓库中 cmd/jaeger/config-badger.yaml 示例与 internal/storage/v1/badger/config.go 的配置定义,说明如何完成这一配置并验证结果。
Badger 后端配置块包含哪些字段
Badger 后端的配置项定义在 internal/storage/v1/badger/config.go 的Config结构体中。各字段的 YAML 键名(mapstructure标签)与文档给出的含义如下:
| 字段 | YAML 键 | 作用(按源码注释) | 默认值 |
|---|---|---|---|
| TTL | ttl.spans | span store 数据保留时长;超过该时长后 span 数据不再可访问 | 72h |
| Directories | directories.keys/directories.values | key 与 value 各自存放的目录。必须ephemeral: false才生效 | 可执行文件所在目录下的/data/keys与/data/values |
| Ephemeral | ephemeral | 为 true 时数据存放在临时文件系统,directories配置被忽略 | true |
| SyncWrites | consistency | 为 true 时所有写入立即同步到磁盘,源码注释标明这会影响写入性能 | false(性能优先于持久性) |
| MaintenanceInterval | maintenance_interval | 对存储内容执行维护任务的间隔 | 5m |
| MetricsUpdateInterval | metrics_update_interval | Jaeger 采集 Badger 指标的间隔 | 10s |
| ReadOnly | read_only | 以只读模式打开存储;多个实例可以只读方式打开同一个 store,但写在 write-ahead-log 中尚未落盘的值需要先 replay 才能打开 | false |
两点需要特别注意:
- 想配置目录,
ephemeral必须设为false,否则directories直接被忽略。 ttl.spans的语义是数据过期后“不再可访问”(no longer be accessible),这是 TTL 配置注释中的原文表述。
在配置文件中写入目录与保留时长
仓库中的 cmd/jaeger/config-badger.yaml 给出了完整的 Badger 后端示例。其中jaeger_storage扩展的backends下定义了两个 store:主 storesome_store(span 保留 48h)与归档 storeanother_store(保留 720h,即 30 天),分别指向不同的 keys/values 目录:
extensions: jaeger_query: storage: traces: some_store traces_archive: another_store jaeger_storage: backends: some_store: badger: directories: keys: "/tmp/jaeger/" values: "/tmp/jaeger/" ephemeral: false ttl: spans: 48h # 2 days metrics_update_interval: ${env:BADGER_METRICS_UPDATE_INTERVAL:-10s} another_store: badger: directories: keys: "/tmp/jaeger_archive/" values: "/tmp/jaeger_archive/" ephemeral: false ttl: spans: 720h # 30 days metrics_update_interval: ${env:BADGER_METRICS_UPDATE_INTERVAL:-10s} exporters: jaeger_storage_exporter: trace_storage: some_store这份配置中有三处关联关系需要保持自洽:
jaeger_storage.backends中定义的 store 名称(如some_store)是唯一的引用名;- 导出器
jaeger_storage_exporter通过trace_storage: some_store声明 trace 写往哪个 store; jaeger_query扩展通过storage.traces(以及可选的storage.traces_archive)声明查询服务读哪个 store。
示例中directories使用/tmp/jaeger/、/tmp/jaeger_archive/只是文档示例路径,实际使用时替换为你机器上可写的目录即可;metrics_update_interval的值${env:BADGER_METRICS_UPDATE_INTERVAL:-10s}表示读取环境变量BADGER_METRICS_UPDATE_INTERVAL,未设置时回落到 10s。如需调整写入同步行为或维护间隔,在同一个badger:块内补充consistency、maintenance_interval字段即可。
启动服务并验证目录已生效
不带配置文件直接启动jaeger时,走的是默认 All-in-One 配置并使用内存存储(见 cmd/jaeger/internal/command.go),Badger 配置不会生效。必须用--config显式传入配置文件:
jaeger --config cmd/jaeger/config-badger.yaml路径按你实际保存配置文件的位置替换。启动后让系统写入一些 trace,然后检查directories指定的目录:Badger 目录中会出现数据文件,仓库的 Badger v1 到 v3 升级文档 展示了一个 Badger 数据目录的ls示例输出(文档示例):
❯ ls /tmp/badger/ 000001.vlog 000180.sst 000257.sst 000294.sst ... MANIFEST KEYREGISTRY即目录下出现.vlog、.sst、MANIFEST等文件,说明数据已按配置落到该目录。
如果写入时遇到permission denied类错误,文档 Badger file permissions as non-root service 说明:Jaeger 1.50 之后 Docker 镜像不再以 root 运行,挂载卷上的目录若属主不是进程用户,写数据就会报权限错误。文档给出的规避方式是运行一个以 root 执行的初始化步骤,预创建数据目录并把属主改为运行 Jaeger 的用户,compose 示例(文档原文,user: root的prepare-data-dir服务只做一次mkdir与chown,随后可删除):
jaeger: image: jaegertracing/all-in-one:latest command: - "--badger.ephemeral=false" - "--badger.directory-key=/badger/data/keys" - "--badger.directory-value=/badger/data/values" - "--badger.span-store-ttl=72h0m0s" # limit storage to 72hrs environment: - SPAN_STORAGE_TYPE=badger volumes: - jaeger_badger_data:/badger depends_on: prepare-data-dir: condition: service_completed_successfully prepare-data-dir: # Run this step as root so that we can change the directory owner. user: root image: jaegertracing/all-in-one:latest command: "/bin/sh -c 'mkdir -p /badger/data && touch /badger/data/.initialized && chown -R 10001:10001 /badger/data'" volumes: - jaeger_badger_data:/badger注意这段示例面向jaegertracing/all-in-one镜像,使用--badger.*命令行参数与SPAN_STORAGE_TYPE=badger环境变量;chown会修改挂载目录的属主,仅在首次初始化目录时执行。
其他两种相关配置位置与限制
- remote-storage 服务:cmd/remote-storage/config-badger.yaml 中,同样的
badger:配置块位于storage.backends.<名称>.badger之下,示例为ttl.spans: 168h(7 天)、maintenance_interval: 5m、metrics_update_interval: 10s。 - read_only 模式:多个实例可以只读打开同一个 store,但源码注释明确:仍在 write-ahead-log 中的值必须先 replay 才能打开,因此只读实例不适合紧跟写入实例使用同一目录。
- TTL 边界:
ttl.spans只控制 span 数据的过期,归档需求像示例那样用第二个 backend 配合更长的 TTL 与独立目录,而不是改一个目录内的参数。
配置核对的落点是:ephemeral为false、directories指向的目标目录可写且出现数据文件、ttl.spans与预期保留时长一致、jaeger_query与jaeger_storage_exporter引用的 store 名称与backends中定义的名称完全一致。满足这四点后,Badger 的目录与保留时长配置即按预期生效。
【免费下载链接】jaegerCNCF Jaeger, a Distributed Tracing Platform项目地址: https://gitcode.com/GitHub_Trending/ja/jaeger
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考