十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Tempo 2.2 版本特性深度解析:TraceQL 结构化运算符、流式查询与 Metrics Summary API

Tempo 2.2 版本特性深度解析:TraceQL 结构化运算符、流式查询与 Metrics Summary API Tempo 2.2 版本特性深度解析TraceQL 结构化运算符、流式查询与 Metrics Summary API【免费下载链接】tempoGrafana Tempo is a high volume, minimal dependency distributed tracing backend.项目地址: https://gitcode.com/GitHub_Trending/tempo1/tempoTempo 2.2 是 Grafana Tempo 分布式链路追踪后端的一个重要里程碑版本它大幅扩展了 TraceQL 语言新增结构化运算符、select()、by()与 3 个新 intrinsic 属性通过 gRPC 流式端点与多项性能优化显著加快 TraceQL 查询速度并推出了实验性的 Metrics Summary API可基于任意属性维度快速剖析最近一小时内的 RED 指标。阅读本文后你将掌握 Tempo 2.2 新增特性的完整用法、对应的底层实现机制、升级路径与破坏性变更清单。本文内容以仓库 docs/sources/tempo/release-notes/version-2/v2-2.md 为核心骨架并结合仓库中的 TraceQL 源码、配置文档与 CHANGELOG 进行源码级佐证。版本概览Tempo 2.2 的核心交付物可以概括为三个方向TraceQL 语言的大版本扩充新增结构化运算符后代 descendant、子 child、兄弟 sibling~、按属性分组结果的by()运算符、用于挑选返回属性的select()运算符以及traceDuration、rootName、rootServiceName三个新的 intrinsic 属性。更快的 TraceQL 查询查询前端新增 gRPC 流式streaming端点客户端可以在整个查询完成前先拿到部分结果同时合并了多项性能优化包括前后端查询批处理、正则表达式性能提升、Parquet row group 字典跳过、vParquet/vParquet2 同步读模式等。实验性 Metrics Summary API返回最近一小时内kindserver的 span 的 RED 指标span 数、错误 span 数、延迟信息并按你选择的属性维度分组。同时Tempo 2.2 将vParquet2设为默认块格式。vParquet2 是一个为兼容更多 Parquet 实现而设计的块格式它是使用结构化运算符的前提并能改善查询性能尤其是基于durationintrinsic 的查询。扩展 TraceQL 语言Tempo 2.2 为 TraceQL 带来了数个关键的语言级新增。完整语法可参考仓库文档 docs/sources/tempo/traceql/construct-traceql-queries.md语言设计架构见 docs/sources/tempo/traceql/architecture.md。结构化运算符descendant、child 与 siblingTraceQL 现在支持基于 trace 中 span 的结构与关系来检索相关 trace而不再局限于单条 span 上的条件匹配。三个核心运算符分别是后代运算符descendant查找匹配{condB}且是匹配{condA}的 span 的后代的 span。例如下面的查询找出frontend服务中或其下游服务中出现错误状态 span 的 trace{ resource.service.namefrontend } { status error }子运算符child查找匹配{condB}且是匹配{condA}的 span 的直接子 span 的 span。兄弟运算符sibling~查找匹配{condB}且至少有一个匹配{condA}的兄弟 span 的 span。例如下面的查询判断productcatalogservice与frontend是否互为兄弟{ resource.service.name productcatalogservice } ~ { resource.service.namefrontend }非子运算符!用于反选。例如找出所有不以productcatalogservice为父级的叶子 span{ } ! { resource.service.name productcatalogservice }此外还有对应的union 变体、、~与实验性的not 变体!、!、!~。union 变体会在保留左侧 span 集合的同时合并右侧匹配的 span。例如一条查询同时拿到失败的端点及其所有失败的后代 span{ span.http.status_code 500 } { status error }从源码看这些运算符在 pkg/traceql/enum_operators.go 中被定义为 spanset 级运算符例如OpSpansetChild、OpSpansetParent、OpSpansetDescendant、OpSpansetAncestor、OpSpansetSibling以及对应的 not/union 变体OpSpansetNotDescendant、OpSpansetUnionSibling等。它们与布尔运算、算术运算在同一枚举中定义由 pkg/traceql/expr.y 语法文件与生成的 pkg/traceql/expr.y.go 解析最终在 pkg/traceql/ast_execute.go 与 pkg/traceql/storage.go 中执行。pkg/traceql/ast_validate.go还负责对包含这些运算符的查询做合法性校验。select() 运算符select()允许你在 TraceQL 响应中指定希望包含的任意 span 属性。它常用于在返回 trace 的同时附带关键的业务属性方便客户端直接展示。{ span.http.status_code 200 } | select(resource.service.name)上面的查询找出 HTTP 状态为200的服务并在返回结果中一并给出这些 span 所属的resource.service.name。by() 分组运算符by()将 trace 内的 span set 按你选择的属性进行分组。注意该操作在 Grafana UI 中尚未支持只能直接调用 search API 使用。例如下面的查询按resource.service.name对错误 span 分组{ status error } | by(resource.service.name) | count() 1再配合聚合与排序可以找出快速、大量且过度埋点的服务来自 construct-traceql-queries.md 中的示例{ span:duration 5ms } | count_over_time() by(resource.service.name) | topk(10)新的 intrinsic 属性Tempo 2.2 为 TraceQL 新增了 3 个 trace 级 intrinsic 属性traceDurationtrace 的持续时间。rootName根 span 的名称。rootServiceName根 span 的服务名。使用示例{ trace:duration 5s } { resource.deployment.environment production trace:duration 2s } | count() 30在 pkg/traceql/enum_attributes.go 中可以看到这些 intrinsic 的定义IntrinsicTraceDuration等其字符串形式分别映射为traceDuration、rootName、rootServiceName并且traceDuration还支持trace:duration的 scoped 写法。span:childCount查找 span 的直接子 span 数量如{ span:childCount 0 }找叶子 span则是后续版本vParquet5 起才加入的 intrinsic不要在 Tempo 2.2 中直接依赖它。更快地获取 TraceQL 结果Tempo 2.2 在查询速度上做了两个方向的努力一是让用户更早看到结果二是让查询整体更快。gRPC 流式查询端点查询前端新增了一个基于 gRPC 双向流式 RPC 的端点客户端可以流式接收搜索结果。Tempo CLI 已更新为使用该流式端点相关实现位于 cmd/tempo-cli 下的搜索命令中。Grafana 从 10.1 版本起也支持该端点但需要先开启traceQLStreaming特性开关。流式返回的价值在于总查询耗时不变但你可以更快看到首批匹配的 trace。对长时间运行的查询尤其有用——整个查询完成前就能开始查看首批命中的结果。需要说明的是流式返回是 Tempo 2.2.1 中默认关闭的参考下文 Bug fixes 中的 Disabled streaming over HTTP by default。性能优化清单Tempo 2.2 合并了多项 TraceQL 性能改进包括但不限于查询批处理支持前端与 querier 之间的查询批处理提升吞吐量。正则性能提升优化了 TraceQL 正则表达式的执行性能相关实现见 pkg/traceql 中正则相关代码以及 pkg/regexp 工具包。Parquet row group 字典跳过在列字典中完全没有匹配时完全跳过对应的 Parquet row group。vParquet/vParquet2 同步读模式新增同步读模式减少读取路径上的开销。异步创建 job通过异步创建查询 job 提升 TraceQL 吞吐。Metrics Summary API实验性Tempo 2.2 新增了一个实验性 API对最近一小时内kindserver的 span 返回RED 指标RED 即 Rate/Errors/Duration 的缩写这里具体为 span 数量、错误 span 数量与延迟信息并按你选择的属性维度分组。典型应用场景按属性切分 span 并观察 RED 指标的差异可以更快定位问题来源。文档中给出了两个例子按namespace属性比较不同 namespace 的错误率如果发现namespaceA的 span 错误率显著高于namespaceB就能快速缩小问题范围。按region属性比较不同区域的延迟如果regionNorth-America的延迟高于regionAsia-Pacific就能针对性排查对应区域。与 metrics-generator 的区别这一 API 的设计定位是按需分析它与 metrics-generator 计算 RED 指标有本质区别Metrics Summary API 返回的指标不会持久化为时间序列。好处是不需要额外的时间序列数据库来存储和查询这些指标也允许按高基数属性high cardinality切分 RED 指标——如果写入时序数据库这样的基数成本会高得难以承受。metrics-generator 则适合需要长期存储与可视化跨数小时或数天或需要对这些指标设置告警的场景。使用建议很清晰临时排查用 Metrics Summary API长期监控与告警用 metrics-generator。演进与稳定性从仓库 CHANGELOGCHANGELOG.md看该 API 在 2.2 生命周期内持续被修复与收敛例如 2.2.2/2.2.3 附近修复了 panic 问题Fix panic in metrics summary api后续版本又补充了对请求时间范围的校验Metrics summary API validate the requested time range。在使用时请将其视为实验性能力接口细节可能随版本演进。其他增强标签值/标签名 API 支持过滤tag values与tag namesAPI 现在支持按条件过滤在给定某些条件的情况下只返回符合条件的属性值或属性名。例如你可以获取在属性resourceA的 span 上出现过的namespace属性值的列表。该功能默认关闭需要通过配置autocomplete_filtering_enabled启用Grafana 从 v10.2 起可以借助这一过滤能力提供更好的自动补全建议。metrics-generator 支持 span 过滤与虚拟节点检测span 过滤metrics-generator 现在支持设置过滤器只对关心的 span 计算指标、排除其他 span。这还能降低生成指标本身的基数从而降低在 Prometheus 兼容 TSDB 中存储这些指标的成本。相关文档与配置见 modules/generator/AGENTS.md 与 metrics-generator 配置。虚拟节点检测metrics-generator 现在可以检测虚拟节点virtual nodes这些虚拟节点会体现在 service graph 中。升级注意事项与破坏性变更从旧版本升级到 Tempo 2.2 时需要注意以下破坏性变更。块格式默认切换为 vParquet2升级后默认块格式将变为vParquet2。这本身不是破坏性变更但有两个重要影响结构化运算符依赖 vParquet2要使用 TraceQL 结构化运算符必须使用 vParquet2 或更高版本块格式。查询性能提升vParquet2 相对旧格式改善了查询性能尤其是涉及durationintrinsic 的查询。如果你希望停留在旧块格式需要在配置中显式指定块格式版本配置结构参考 docs/sources/tempo/configuration/parquet.mdstorage: trace: block: version: vParquet说明当前仓库已经演进到 vParquet5 作为默认块格式见 docs/sources/tempo/configuration/parquet.md且 CHANGELOG 显示 vParquet2 已在后续大版本中被弃用并最终移除Remove vParquet2 encoding。因此本文所述 vParquet2 仅适用于 Tempo 2.2 时代如果你运行的是更新的版本请按当前版本的默认格式vParquet5与迁移指引处理历史块。Jsonnet 用户metrics-generator 由 deployment 改为 statefulset仅影响使用 Jsonnet 的用户metrics-generator 组件从 k8sdeployment转换为了 k8sstatefulset。Jsonnet 用户需参考对应 PR 的迁移说明完成无缝迁移。移除或重命名的配置参数以下是 Tempo 2.2 中移除或重命名的配置字段参数说明query_frontend.tolerate_failed_blocks: int移除了对tolerate_failed_blocks的支持storage.trace.s3.insecure_skip_verify: true重命名为tls_insecure_skip_verify补丁版本修复要点Tempo 2.2 系列在 2.2 之后还有 2.2.12.2.4 等多个补丁版本仓库 CHANGELOG.md 中记录了完整的修复列表其中值得注意的有2.2.1修复了 metrics-generator 在多个租户使用默认 overrides 时的 panic恢复了被误删的tenant_header_key默认禁用 HTTP 流式返回。2.2.2修复了 node role auth IDMSv1。2.2.3修复了 S3 凭据提供者credentials providers配置。2.2.4更新 Alpine 镜像至 3.18 以修复 CVE-2022-48174升级 Jaeger query 镜像至 1.50.0。完整变更与 bug 修复列表以仓库根目录的 CHANGELOG.md 为准其中## v2.2.0 / 2023-07-31一节及后续 2.2.x 补丁版本条目均可直接查阅。小结与源码延伸Tempo 2.2 是 TraceQL 语言从基于单 span 条件走向基于 trace 结构关系查询的关键版本。如果你希望深入源码验证上述特性可以重点阅读以下位置结构化运算符与 spanset 运算的定义pkg/traceql/enum_operators.gointrinsic 属性定义traceDuration、rootName、rootServiceNamepkg/traceql/enum_attributes.go查询语法解析pkg/traceql/expr.y 与 pkg/traceql/expr.y.gospanset 运算执行pkg/traceql/ast_execute.go、pkg/traceql/storage.go查询合法性校验pkg/traceql/ast_validate.go前端流式查询相关实现modules/frontend/frontend.go、modules/frontend/search_handlers.go升级到 Tempo 2.2 时请务必将块格式尽快切换到 vParquet2当前仓库新版本则使用默认的 vParquet5以解锁结构化运算符并享受duration查询的性能收益。【免费下载链接】tempoGrafana Tempo is a high volume, minimal dependency distributed tracing backend.项目地址: https://gitcode.com/GitHub_Trending/tempo1/tempo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表