拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Grafana Tempo 2.7 发布说明深度解读:用量追踪、性能优化与 TraceQL 新能力

Grafana Tempo 2.7 发布说明深度解读用量追踪、性能优化与 TraceQL 新能力【免费下载链接】tempoGrafana Tempo is a high volume, minimal dependency distributed tracing backend.项目地址: https://gitcode.com/GitHub_Trending/tempo1/tempoGrafana Tempo 2.7 是围绕「可观测性成本的精确归属」与「大规模部署下的性能/资源占用优化」两个主线推出的重要版本它新增了基于自定义标签的摄入流量追踪与成本归因能力/usage_metrics端点引入一系列降低内存与 CPU 占用的优化并扩展了 TraceQL 的查询与指标计算能力。阅读本文后你将掌握 Tempo 2.7 各子版本2.7.0 / 2.7.1 / 2.7.2的核心特性、新配置参数、破坏性变更与升级注意事项并能基于仓库源码理解这些能力底层的实现机制。一、版本总览Tempo 2.7 带来了什么根据 docs/sources/tempo/release-notes/version-2/v2-7.md 的官方发布说明Tempo 2.7 的四大核心能力如下基于自定义标签精确追踪摄入流量并归因成本租户可以按自定义标签精确计量与归属摄入的 trace 数据成本作为现有基于尺寸size指标的更精确替代方案。一系列显著提升性能、降低整体资源占用的优化覆盖大 trace 拒绝、内存分配、标签查找、goroutine 数量等多个方面。新的 TraceQL 查询能力支持 instrumentation scope 字段查询、数组值自动匹配、更快的正则过滤等。TraceQL 指标Metrics能力改进实验性新增avg_over_time、min_over_time、max_over_time函数。此外2.7 是一个包含多个补丁子版本的分支2.7.1 将 gRPC 压缩默认改为snappy2.7.2 修复了查询结果 marshalling 期间的罕见 panic。下文按功能主题逐节展开并在升级注意事项一节集中汇总所有破坏性变更。二、摄入流量追踪与成本归因Usage Metrics2.1 为什么要做成本归因现代组织越来越依赖分布式 trace 做可观测性但把成本分摊到不同团队、服务或部门往往非常困难。原有的尺寸size类指标不够精确——它缺失了非 span 数据例如 resource、scope、schema URL 等层面的字节会导致成本被低估或高估。Tempo 2.7 的用量追踪功能通过公平分摊资源级数据解决了这一问题官方宣称可达99% 的精度非常适合做成本对账cost reconciliation。2.2 实现原理为什么放在 distributor 中计量该特性选择在distributor中计量因为它是 Tempo 中唯一保有原始 payload的组件——在数据被拆解、压缩、写入后端之前只有 distributor 能看到每个 span 的真实字节数。相关实现位于 modules/distributor/usage/tracker.go其核心Tracker.Observe方法被设计为热路径代码对每一个摄入的 span 都会被调用源码注释明确提醒任何改动都要考虑性能影响。计量过程的关键点如下对应 tracker.go 的Observe与nonSpanDataLength函数逐字节计量每个 span 的 proto 序列化大小s.Size()加上 proto 长度编码开销protoLengthMath作为该 span 的字节数。非 span 数据公平分摊nonSpanDataLength负责统计 batch 中无法归属到具体 span 的字节resource、schema URL、scope 等然后按1/N均摊到每个 spanbatchPortion : int(math.RoundToEven(float64(unaccountedForBatchData) / float64(totalSpanCount)))并把取整误差firstSpanPortion可能为负追加到第一个 span 上保证记录的总字节与输入严格一致。维度映射ParseDimensionKey将配置中的维度键解析为属性名与作用域——resource.前缀映射到 Resource 作用域span.前缀映射到 Span 作用域无前缀则匹配全部作用域ScopeAll。基数控制每个租户的序列series数量受MaxCardinality限制超过上限后所有数据落入专门的overflow 桶标签值统一为__overflow__属性缺失时标签值为__missing__。过期清理PurgeRoutine定时默认每分钟清理超过StaleDuration未更新的序列与空租户避免内存无限增长。2.3 配置与暴露端点该功能通过 per-tenant 配置控制相关配置结构定义在 modules/distributor/usage/config.go配置项默认值说明usage_tracker.cost_attribution.enabledfalse是否启用成本归因追踪usage_tracker.cost_attribution.max_cardinality10000每个租户允许的最大序列数超出部分进入__overflow__桶usage_tracker.cost_attribution.stale_duration15m序列/租户的过期清理时间窗口新增的 API 端点/usage_metrics由Tracker.Handler()通过 Prometheus HTTP handler 暴露见 tracker.go按租户暴露摄入数据与成本归属的指标核心指标名为tempo_usage_tracker_bytes_received_total标签由配置的维度 常量标签tenant、tracker组成。当维度配置非法导致指标注册失败时会通过限速日志与tempo_distributor_usage_tracker_errors_total计数器暴露问题。该特性被设计为更广泛用量追踪能力的基础——后续将支持更多 tracker 类型让组织测量和报告各类用量指标对应 发布说明中的 #4162。三、重大性能与内存占用改进3.1 更好地拒绝超大 traceingester 现在复用 metrics-generator 的代码来检测和拒绝过大的 trace使 trace 摄入更可靠、避免容量过载。同时新增两个指标提供 per-tenant 字节用量的更深入可见性tempo_metrics_generator_live_trace_bytestempo_ingester_live_trace_bytes3.2 减少内存分配query-frontend在处理低查询负载时消除了不必要的内存分配作为配套清理配置项querier_forget_delay被移除因为它已无实际用途。ingester通过改进prealloc预分配行为降低了工作集working set大小。新增可调优的 prealloc 环境变量与观测指标环境变量默认值说明PREALLOC_BKT_SIZE400预分配池中每个 bucket 的字节大小PREALLOC_NUM_BUCKETS250预分配池的 bucket 数量PREALLOC_MIN_BUCKET0预分配池的最小 bucket 编号这些变量在 pkg/tempopb/prealloc.go 的init()中被读取并用于构建NewPool(ingester_prealloc, minBucket, numBuckets, bktSize)PreallocBytes.Unmarshal从该池获取字节切片以复用内存ReuseByteSlices则把用过的切片归还池中。配套指标tempo_ingester_prealloc_miss_bytes_total用于观察和调优预分配行为miss 越高说明池命中率越低可考虑调整 bucket 大小与数量。3.3 更快的标签查找与 collector 操作多项优化对应 PR #4100、#4104、#4109使标签查找与 collector 任务响应更快尤其对 distinct value 搜索场景。此外为 ingester 中已完成 block启用磁盘缓存能显著降低查询延迟与整体 I/O 开销#4069。3.4 减少非 querier 组件的 goroutine通过简化设计非 querier 组件如 distributor、ingester 等的总 goroutine 数量下降使 Tempo 在高 trace 量下更高效、更易扩展#4484。四、新的 TraceQL 查询能力4.1 instrumentation scope 查询TraceQL 现在可以查询instrumentation scope插桩作用域字段#3967允许你基于 trace 是在哪里、以何种方式被插桩来过滤和探索——例如按 SDK 名称、版本等 scope 元数据筛选。4.2 数组值自动匹配TraceQL 扩展为自动从数组值收集匹配#3867解析包含属性数组的 span 更加容易——只要数组中的任一元素满足条件即视为匹配。4.3 查询性能与正则引擎升级多项优化#4114、#4163、#4438使查询时间显著缩短。更重要的是Tempo 2.7 改用Prometheus fast regex 正则引擎#4329来加速基于正则表达式的过滤这同时带来了一个破坏性变更所有正则表达式匹配现在都是**完全锚定fully anchored**的即span.foo ~ bar会被求值为span.foo ~ ^bar$。这需要你检查并更新所有受影响的查询——如果你原本依赖子串匹配语义需要显式写出通配符如span.foo ~ .*bar.*。仓库中 pkg/regexp/regexp.go 即是该正则引擎的封装实现含 pkg/regexp/regexp_test.go 测试覆盖。五、查询改进API v2 可返回部分 trace在 API v2 查询中即使 trace超过最大字节数限制Tempo 现在也可以返回部分 trace#3941。这意味着面对超大 trace 时你仍能取回并检查其中有用的分段用于调试而不再是一律失败。六、TraceQL 指标新函数实验性TraceQL metrics 在 2.7 中新增了三个时间聚合函数avg_over_time#4073在指定时间范围内计算 trace 指标的平均值便于发现趋势与异常。min_over_time#3975获取数据中的最小值。max_over_time#4065获取数据中的最大值。这些函数在仓库中的实现位于 pkg/traceql/engine_metrics.go并有大量测试覆盖例如 pkg/traceql/engine_metrics_average_test.go 中的{ } | avg_over_time(duration) by (span.service)以及 pkg/traceql/engine_metrics_test.go 中min_over_time、max_over_time的用例。需要说明的是这些函数在聚合下推pushdown上有限制——当查询包含avg_over_time()时无法下推到第二阶段执行见 engine_metrics.go 中相关注释查询会在前端聚合完成。七、其他增强与改进7.1 2.7.1 版本更新所有内部 gRPC 通信默认使用snappy压缩#4696官方认为这是在资源占用与网络流量之间的良好平衡。7.2 2.7.0 版本更新metrics-generator 引入失败 flush 上限 100 次#4254防止在损坏的 block 上无限重试新增指标跟踪这些 flush 失败提升摄入期问题可见性。span metrics 的 span multiplier 现在也从 resource 属性取值#4210使你可以通过 service 或 environment 配置来调整和修正指标保证数据报告更准确。tempo-cli支持单条命令删除多个 trace ID#4266加快管理操作与清理流程。新增可选日志log_discarded_spans#3957记录被 Tempo 丢弃的 span提升摄入工作流的可见性帮助快速诊断。可对 tag 与 tag-value 查找设置限制#4320防止大规模部署中失控的查询保障用户体验。tags 与 tag-values 端点新增吞吐量与 SLO 相关指标#4148可从 Tempo 内置监控中获取查询性能与可靠性洞察。/api/status/buildinfo端点现在暴露 SemVer 版本号#4110对云部署与自动化流水线尤其有用。八、升级注意事项与破坏性变更升级到 Tempo 2.7 前请逐项核对以下变更。8.1 OpenTelemetry Collector receiver 默认监听localhost变更后OTLP receiver 默认绑定localhost而非0.0.0.0#4465。大多数部署使用默认 receiver 配置distributor: receivers: otlp: protocols: grpc: http:此前该配置能正常工作是因为 receiver 默认监听0.0.0.0:4317与0.0.0.0:4318现在默认变为localhost:4317与localhost:4318。运行在 Docker 或其他容器环境中的 Tempo 将无法再接收数据。解决方法是指定要绑定的地址。例如 Tempo 运行在主机名为tempo的容器中# ... http: endpoint: tempo:4318也可以显式绑定到0.0.0.0注意这有潜在安全风险# ... http: endpoint: 0.0.0.0:43188.2 Tempo serverless 弃用Tempo serverless 已正式弃用将在后续版本中移除#4017。请提前将 serverless 工作流迁移到其他部署方式。本版本对 serverless 没有功能变更但在下一版本发布前你需要移除相关配置。8.3 TraceQL 锚定正则匹配如前述TraceQL 已改用 Prometheus fast regex 引擎且所有正则匹配完全锚定#4329。span.foo ~ bar等价于span.foo ~ ^bar$请更新受影响的查询。8.4 从 OpenTracing 迁移到 OpenTelemetry本版本移除了use_otel_tracer选项#3646。请改用标准 OpenTelemetry 环境变量配置 span 导出例如 Jaeger 导出设置OTEL_TRACES_EXPORTERjaeger8.5 配置参数变更汇总参数变更类型说明querier_forget_delay移除无实际功能已删除#3996use_otel_tracer移除改用标准 OpenTelemetry 环境变量Jaeger 导出设置OTEL_TRACES_EXPORTERjaeger#3646max_spans_per_span_set新增query-frontend 配置默认启用并设为100设为0恢复旧行为无限否则超出配置上限的 span 会被丢弃#4275/#4383关于max_spans_per_span_set仓库中的实现位于 modules/frontend/search_sharder.go当配置值非 0 且请求的SpansPerSpanSet超过该上限时返回 400 Bad Requestspans per span set exceeds %d. received %d默认值 100 定义在 modules/frontend/config.go 的MaxSpansPerSpanSet: 100。配置参考文档位于 modules/frontend/docs/config-reference.md。8.6 gRPC 压缩默认改为 snappyTempo 2.7.0出于性能原因在 querier 与 distributor 中禁用了 gRPC 压缩#4429。官方基准测试表明不压缩时 querier 与 distributor 使用更少的 CPU 和内存。Tempo 2.7.1将内部组件的默认值改为snappy#4696在资源占用与网络流量之间取得平衡。⚠️ 注意禁用 gRPC 压缩虽提升性能但会增加数据量与网络流量视你的云配置可能影响账单。若你希望手动启用/调整压缩可通过grpc_compression配置项控制例如统一使用snappyingester_client: grpc_client_config: grpc_compression: snappy metrics_generator_client: grpc_client_config: grpc_compression: snappy querier: frontend_worker: grpc_client_config: grpc_compression: snappy如果你偏好不同的 CPU/内存与带宽平衡也可以考虑禁用压缩或改用 zstd。8.7 其他升级注意事项Tempo CLI 默认目标端点变更tempo-cli现在默认访问/api/v2/traces端点若仍依赖旧的/api/traces端点请使用--v1标志#4127。X-Scope-OrgID请求头行为变更如果你已在 per-tenant overrides 或全局 Tempo 配置中设置了X-Scope-OrgID头它现在会被保留而不再被 Tempo 覆盖。若你此前依赖自动注入行为可能发生变化#4021。AWS Lambda 构建输出变更从main变为bootstrap请按 AWS 官方迁移步骤确保 Lambda 函数继续工作#3852。九、Bugfix 汇总9.1 2.7.2修复 querier 在将 ingester 与 generator 的结果 marshalling 为 proto 时发生修改所导致的罕见 panic#4790。该 bug 还会影响近期 trace 数据的查询正确性——在结果就绪前返回不完整结果。9.2 2.7.0span metrics 丢弃 span 的原因中新增invalid_utf8#4293现在会捕获 trace 数据中无法作为合法指标标签的值例如你按foo做 span metrics但foo含有非法的 Prometheus 字符则不会被写入。metrics-generator在停止摄入前正确地从 ring 退出减少滚动发布期间的数据丢失#4101。gRPC streaming 中正确处理 400 Bad Request 与 404 Not Found#4144。gRPC streaming 中正确处理 Authorization 请求头#4419。修复 TraceQL metrics 在近期数据与后端数据边界处的时间范围处理#4257。修复 TraceQL metrics 的多个exemplar 值问题#4366、#4404。tempo-cli选项中的S3Pass与S3User参数此前未被使用现已生效#4259。结语Tempo 2.7 以「成本可归因」与「性能可调优」为核心交付/usage_metrics让租户级成本对账首次达到接近 100% 的字节级精度prealloc 池化、fast regex 引擎、goroutine 精简与 gRPC snappy 压缩共同降低了大规模部署的资源足迹而 TraceQL 的 scope 查询、数组匹配与三个 time-over 聚合函数进一步解放了 trace 数据的分析能力。升级时请特别注意 OTLP receiver 的 localhost 默认绑定、正则锚定语义与use_otel_tracer移除这三项破坏性变更。更多细节可查阅仓库内 docs/sources/tempo/release-notes/version-2/v2-7.md 及对应模块源码。【免费下载链接】tempoGrafana Tempo is a high volume, minimal dependency distributed tracing backend.项目地址: https://gitcode.com/GitHub_Trending/tempo1/tempo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门