指标摘要 API
警告
从 Tempo 2.7 起,指标摘要 API 已被弃用。由指标摘要 API 支持的功能(例如按表聚合)在 Grafana Cloud 和 Grafana 11.3 及更高版本中也已弃用。该 API 将在未来的版本中移除。
本文档解释了如何在 Tempo 中使用指标摘要 API。该 API 返回过去一小时内发送到 Tempo 的类型为 kind=server
的 Span 的 RED 指标(Span 计数、错误 Span 计数和延迟信息),并按用户指定的属性分组。
弃用并推荐使用 TraceQL 指标
考虑到 TraceQL 指标的发布,指标摘要 API 现已冗余。因此,弃用此 API 是为了减轻维护负担。
TraceQL 指标查询比指标摘要 API 提供的功能强大得多。TraceQL 指标可以查看任意时间窗口(而不仅仅是过去一小时),返回时间序列信息(而不仅仅是过去一小时的单个瞬时值),并且可以查看所有 Span(而不仅仅是 kind=server
)。
举例来说,如果您使用指标摘要 API 按属性 resource.cloud.region
进行聚合,您可以通过几个 TraceQL 查询获得相同的结果:
按 resource.cloud.region
的请求速率
{ } | rate() by (resource.cloud.region)
按 resource.cloud.region
的错误率
{ status=error } | rate() by (resource.cloud.region)
按 resource.cloud.region
的第 50、90 和 99 百分位延迟(例如 p99、p90 和 p50)
{ } | quantile_over_time(duration, .99, .9, .5) by (resource.cloud.region)
如果您想比在 Explore 的代码模式下手动输入这些查询更快,可以使用 Grafana Trace Drilldown,这是一种无需查询即可导航存储在 Tempo 中的追踪数据的体验,其底层由 TraceQL 指标查询提供支持。
激活指标摘要
要启用(已弃用的)指标摘要 API,必须在 metrics generator 中开启本地块处理器。请注意,如果启用该功能,generator 将会消耗更多资源,包括磁盘空间。
overrides:
defaults:
metrics_generator:
processors: [..., 'local-blocks']
在 Grafana 和 Grafana Cloud 中,默认禁用指标摘要 API。要在 Grafana Cloud 中启用它,请联系 Grafana 支持团队。
请求
要向此 API 发送请求,请使用 query-frontend 上的以下端点:
GET http://<tempo>/api/metrics/summary
查询参数
所有查询参数必须进行 URL 编码,以保留查询中非 URL 安全的字符,例如 &
。
名称 | 示例 | 定义 | 是否必需? |
---|---|---|---|
q | { resource.service.name = "foo" && span.http.status_code != 200 } | 具有完整语法的 TraceQL 查询。所有与此查询匹配的 Span 都包含在计算中。支持任何有效的 TraceQL 查询。 | 是 |
groupBy | name .foo resource.namespace span.http.url,span.http.status_code | 一个或多个 TraceQL 值用于分组。任何有效的固有属性或带作用域的属性。要按多个值分组,请使用逗号分隔列表。 | 是 |
start | 1672549200 | 时间范围的开始时间(Unix 秒)。如果未指定,则查询所有最近数据。 | 否 |
end | 1672549200 | 时间范围的结束时间(Unix 秒)。如果未指定,则查询所有最近数据。 | 否 |
示例
curl "$URL/api/metrics/summary" --data-urlencode 'q={resource.service.name="checkout-service"}' --data-urlencode 'groupBy=name'
响应
Tempo 响应是一个在 tempo.proto 中定义的 SpanMetricsSummary
对象,相关部分粘贴如下:
message SpanMetricsSummaryResponse {
repeated SpanMetricsSummary summaries = 1;
}
message SpanMetricsSummary {
uint64 spanCount = 1;
uint64 errorSpanCount = 2;
TraceQLStatic static = 3;
uint64 p99 = 4;
uint64 p95 = 5;
uint64 p90 = 6;
uint64 p50 = 7;
}
message TraceQLStatic {
int32 type = 1;
int64 n = 2;
double f = 3;
string s = 4;
bool b = 5;
uint64 d = 6;
int32 status = 7;
int32 kind = 8;
}
响应遵循 标准 protobuf->JSON 映射规则以 JSON 格式返回。
注意
uint64
字段无法完全由 JSON 数字值表示,因此这些字段被序列化为字符串。
示例
{
"summaries": [
{
"spanCount": "20",
"series" : [
{
"key": ".attr1",
"value": {
"type": 5,
"s": "foo"
},
},
...
],
"p99": "68719476736",
"p95": "1073741824",
"p90": "1017990479",
"p50": "664499239"
},
字段 | 说明 |
---|---|
summaries | 每组的指标列表。 |
.spanCount | 此组中的 Span 数量。 |
.errorSpanCount | status =error 的 Span 数量。(如果值为 0 ,则此字段不存在。) |
.series | 此组的唯一值。groupBy 中的每个条目都会返回一个键/值对。 |
.key | 键名。 |
.value | 具有 TraceQL 底层类型的值。 |
.type | 数据类型 enum 定义 此处(如果值为 0 ,则此字段不存在。)0 = nil 3 = integer 4 = float 5 =string 6 = bool 7 = duration 8 = span status 9 = span kind |
.n | 如果这是整数值,则填充此字段。 |
.s | 如果这是字符串值,则填充此字段。 |
.f | 如果这是浮点数值,则填充此字段。 |
.b | 如果这是布尔值,则填充此字段。 |
.d | 如果这是 duration 值,则填充此字段。 |
.status | 如果这是 span status 值,则填充此字段。 |
.kind | 如果这是 span kind 值,则填充此字段。 |
.p99 | 此组的 P99 延迟,单位为纳秒。 |
.p95 | 此组的 P95 延迟,单位为纳秒。 |
.p90 | 此组的 P90 延迟,单位为纳秒。 |
.p50 | 此组的 P50 延迟,单位为纳秒。 |