SkyWalking 10.4 引入了 TraceQL 支持,实现了 Grafana Tempo 的 HTTP 查询 API,使 Grafana 可以直接查询和可视化 SkyWalking 中存储的链路追踪数据。
By 万凯 | Wednesday, April 08, 2026
Apache SkyWalking 在 10.4.0 版本中引入了 TraceQL 支持,实现了 Grafana Tempo 的 HTTP 查询 API,使 Grafana 无需任何额外插件即可查询和可视化 SkyWalking 中存储的链路追踪数据。 这意味着你现在可以使用熟悉的 Grafana Tempo 数据源来搜索、过滤和深入分析 SkyWalking 原生链路追踪和 Zipkin 兼容链路追踪 —— 所有数据都由现有的 SkyWalking OAP 服务器提供。
┌────────────────────┐ Tempo HTTP API ┌─────────────────────────────┐│ │ ──── /skywalking/api/search ──► │ SkyWalking Native Backend ││ Grafana │ │ (Query Traces V2 API) ││ (Tempo Data Src) │ ├─────────────────────────────┤│ │ ──── /zipkin/api/search ──────► │ Zipkin-Compatible Backend │└────────────────────┘ └──────────┬──────────────────┘ │ ┌──────────▼──────────────────┐ │ SkyWalking OAP Server │ │ ┌───────────────────────┐ │ │ │ TraceQL Service │ │ │ │ (port 3200) │ │ │ └───────────────────────┘ │ │ ┌───────────────────────┐ │ │ │ Storage (BanyanDB / │ │ │ │ Elasticsearch / …) │ │ │ └───────────────────────┘ │ └─────────────────────────────┘TraceQL Service 位于 OAP 服务器内部,在端口 3200(默认)上暴露 Tempo 兼容的 HTTP API。 它将链路追踪数据从原生格式转换为 Tempo 的格式, 其中链路追踪详情部分(Trace 消息)复用了 OTLP Trace 定义。
TraceQL 是一种功能丰富的查询语言,但 SkyWalking 目前实现了一个实用的子集。 以下特性已支持:
| Feature | Examples |
|---|---|
| Spanset filter | {resource.service.name="frontend"} |
| Resource attributes | resource.service.name |
| Span attributes | span.http.method, span.http.status_code |
| Intrinsic fields | duration, name, status |
| Comparison operators | =, >, >=, <, <= |
| Compound conditions | {resource.service.name="frontend" && duration>100ms} |
| Duration units | us/µs, ms, s, m, h |
以下特性暂不支持:
{...} AND {...}, {...} OR {...})| operator)count(), avg(), max(), min(), sum())=~, !~)event and link scopeskind intrinsic field重要提示:TraceQL 中的 SkyWalking 原生链路追踪支持基于 Query Traces V2 API。 目前只有 BanyanDB 存储实现了该 API。其他存储后端 (如 Elasticsearch、MySQL、PostgreSQL)不支持通过 TraceQL 查询 SkyWalking 原生链路追踪数据。 Zipkin 兼容链路追踪不受此限制。
由于 Tempo 格式的链路追踪详情部分复用了 OTLP Trace 定义, 以下转换描述使用 OTLP 字段名称(如 span kind、status code)。
SkyWalking 原生 trace ID 是任意字符串(例如 2a2e04e8d1114b14925c04a6321ca26c.38.17739924187687539),而 Grafana Tempo 要求 纯十六进制编码的 trace ID。TraceQL Service 将原始 trace ID 的每个 UTF-8 字节编码为两个小写十六进制字符:
原始值: 2a2e04e8d1114b14925c04a6321ca26c.38.17739924187687539编码后: 32613265303465386431313134623134393235633034613633323163613236632e33382e3137373339393234313837363837353339编码后的十六进制 trace ID 会出现在所有 API 响应和 Grafana 中。当你在 Grafana 中点击 trace ID 时,TraceQL Service 会自动将其解码回原始的 SkyWalking trace ID 进行内部查询。
| SkyWalking Span Type | OTLP Span Kind |
|---|---|
Entry | SPAN_KIND_SERVER |
Exit | SPAN_KIND_CLIENT |
Local | SPAN_KIND_INTERNAL |
SkyWalking isError | OTLP Status Code |
|---|---|
true | STATUS_CODE_ERROR |
false | STATUS_CODE_OK |
SkyWalking SpanAttachedEvents 被转换为 OTLP span events, 其中 tags 映射为字符串属性,summary 映射为数值属性(序列化为字符串)。
| Zipkin Span Kind | OTLP Span Kind |
|---|---|
CLIENT | SPAN_KIND_CLIENT |
SERVER | SPAN_KIND_SERVER |
PRODUCER | SPAN_KIND_PRODUCER |
CONSUMER | SPAN_KIND_CONSUMER |
otel.status_code 标签,则直接使用。error 标签等于 true,则状态为 STATUS_CODE_ERROR。STATUS_CODE_UNSET。Zipkin endpoint 字段被映射为 OTLP 属性(例如 localEndpoint.ipv4 → net.host.ip), Zipkin annotations 被转换为 OTLP span events。
完整的转换详情请参阅 TraceQL Service 文档。
默认情况下,TraceQL 模块是禁用的(selector: ${SW_TRACEQL:-})。要启用它,将 selector 设置为 default:
# 在 application.yml 中traceQL:selector:${SW_TRACEQL:default} default:enableDatasourceSkywalking:${SW_TRACEQL_ENABLE_DATASOURCE_SKYWALKING:true} enableDatasourceZipkin:${SW_TRACEQL_ENABLE_DATASOURCE_ZIPKIN:true}或通过环境变量设置:
export SW_TRACEQL=defaultexport SW_TRACEQL_ENABLE_DATASOURCE_SKYWALKING=trueexport SW_TRACEQL_ENABLE_DATASOURCE_ZIPKIN=true如果你需要查询 Zipkin 链路追踪数据,还需要启用 Zipkin 接收器,以便 SkyWalking 能够接收 Zipkin 链路追踪数据:
# 在 application.yml 中receiver-zipkin: selector: ${SW_RECEIVER_ZIPKIN:default} default: searchableTracesTags: ${SW_ZIPKIN_SEARCHABLE_TAG_KEYS:http.method} sampleRate: ${SW_ZIPKIN_SAMPLE_RATE:10000} restHost: ${SW_RECEIVER_ZIPKIN_REST_HOST:0.0.0.0} restPort: ${SW_RECEIVER_ZIPKIN_REST_PORT:9411}或通过环境变量设置:
export SW_RECEIVER_ZIPKIN=default所有配置选项及其默认值的完整列表,请参阅 TraceQL Service 文档的配置章节。
前提条件:需要 Grafana 12 或更高版本。
每个链路追踪后端(SkyWalking 原生 / Zipkin)需要在 Grafana 中配置各自独立的 Tempo 数据源, 因为它们分别在不同的上下文路径下提供服务。
两个后端在同一端口上使用不同的上下文路径提供服务:
| Backend | Default Context Path | Env Variable | Full Default URL |
|---|---|---|---|
| SkyWalking native | /skywalking | SW_TRACEQL_REST_CONTEXT_PATH_SKYWALKING | http://<oap-host>:3200/skywalking |
| Zipkin | /zipkin | SW_TRACEQL_REST_CONTEXT_PATH_ZIPKIN | http://<oap-host>:3200/zipkin |
http://<oap-host>:3200/skywalking。与上述步骤相同,但将 URL 设置为 http://<oap-host>:3200/zipkin。
在 Grafana 中搜索链路追踪时,链路追踪列表面板会显示每条追踪的摘要信息。 tracesListResultTags 配置控制哪些 span 标签会包含在搜索结果中并作为列显示在追踪列表中。
| Env Variable | Default Value | Purpose |
|---|---|---|
SW_TRACEQL_ZIPKIN_TRACES_LIST_RESULT_TAGS | http.method,error | Tags shown for Zipkin traces |
SW_TRACEQL_SKYWALKING_TRACES_LIST_RESULT_TAGS | http.method,http.status_code,rpc.status_code,db.type,db.instance,mq.queue,mq.topic,mq.broker | Tags shown for SkyWalking traces |
注意,无论此设置如何,service.name 和 span.kind始终包含在结果中。
这些标签在 Grafana Tempo 链路追踪搜索结果中显示为属性列,方便快速识别和分组追踪数据:
SkyWalking 原生追踪列表:
Zipkin 追踪列表:
你可以根据应用程序的埋点情况自定义这些标签。例如,如果你的服务大量使用消息队列, 可以在列表中添加 mq.destination 或 messaging.system。
SkyWalkingTraceQL)。SkyWalking Trace。添加仪表板变量,以便用户可以动态过滤追踪数据(例如按服务名称过滤):
Search。$Service。点击追踪面板中的任意 trace ID,即可跳转到 Explore 页面,查看完整的追踪瀑布图, 包含所有 span、标签和事件:
Zipkin 追踪的设置与 SkyWalking 原生追踪完全相同 —— 只需使用你配置的 Zipkin Tempo 数据源 (例如 ZipkinTraceQL)。
Zipkin 追踪详情视图:
通过 SkyWalking 10.4.0 中的 TraceQL 支持,你现在可以利用 Grafana 强大的 Tempo 数据源 来查询和可视化 SkyWalking 原生链路追踪和 Zipkin 兼容链路追踪数据。 需要记住的要点:
SW_TRACEQL=default 并启用所需的后端。/skywalking 和 /zipkin)。SW_TRACEQL_SKYWALKING_TRACES_LIST_RESULT_TAGS 和 SW_TRACEQL_ZIPKIN_TRACES_LIST_RESULT_TAGS 控制搜索结果中显示的内容。完整的 API 参考和转换详情,请参阅 TraceQL Service 文档。 Grafana 集成详情,请参阅 使用 Grafana 作为 UI。