菜单
文档breadcrumb arrow Grafana Tempobreadcrumb arrow APIbreadcrumb arrow 指标摘要 API
开源

指标摘要 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 将会消耗更多资源,包括磁盘空间。

yaml
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 查询。
groupByname
.foo
resource.namespace
span.http.url,span.http.status_code
一个或多个 TraceQL 值用于分组。任何有效的固有属性或带作用域的属性。要按多个值分组,请使用逗号分隔列表。
start1672549200时间范围的开始时间(Unix 秒)。如果未指定,则查询所有最近数据。
end1672549200时间范围的结束时间(Unix 秒)。如果未指定,则查询所有最近数据。

示例

bash
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 数字值表示,因此这些字段被序列化为字符串。

示例

JavaScript
{
   "summaries": [
       {
           "spanCount": "20",
           "series" : [
               {
                   "key": ".attr1",
                   "value": {
                       "type": 5,
                       "s": "foo"
                   },
               },
               ...
           ],
           "p99": "68719476736",
           "p95": "1073741824",
           "p90": "1017990479",
           "p50": "664499239"
       },
字段说明
summaries每组的指标列表。
.spanCount此组中的 Span 数量。
.errorSpanCountstatus=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 延迟,单位为纳秒。