指标
Elastic Stack Serverless
在 Elastic Cloud 托管环境中,APM Server 从 Elastic APM 代理接收数据并将其转换为 Elasticsearch 文档。在 Elastic Cloud Serverless 中,实际上没有运行 APM Server,而是托管摄取服务接收和转换数据。
指标通过定期收集信息来衡量系统的状态。APM 指标有两种类型:
- 系统指标:基础架构和应用程序指标。
- 计算指标:聚合的追踪事件指标,用于驱动 Applications UI 中的可视化。
APM 代理会自动收集基础的主机级指标,包括系统和进程级的 CPU 和内存指标。还提供代理特定的指标,例如 Java Agent 中的 JVM 指标,以及 Go Agent 中的 Go 运行时指标。
在调试生产系统时,基础架构和应用程序指标是重要的信息来源,因此我们在 Kibana 的 指标概览中轻松筛选特定主机或容器的指标。
大多数代理将关键字字段限制为 1024 个字符,非关键字字段(例如 system.memory.total)限制为 10,000 个字符。
指标存储在指标索引中。
有关跟踪指标的完整列表,请参阅相关的代理文档。
此示例显示了系统指标文档在 Elasticsearch 中索引时可能的样子。
展开 Elasticsearch 文档
此示例包含 Elastic APM Java 代理生成的 JVM 指标,并包含两个相关指标:jvm.gc.time 和 jvm.gc.count。这些指标附带各种字段,描述了捕获指标的环境:服务名称、主机名、Kubernetes pod UID、容器 ID、进程 ID 等。这些字段使得可以按各种维度进行搜索和聚合,例如按服务、主机和 Kubernetes pod。
{
"container": {
"id": "a47ed147c6ee269400f7ea4e296b3d01ec7398471bb2951907e4ea12f028bc69"
},
"kubernetes": {
"pod": {
"uid": "b0cb3baa-4619-4b82-bef5-84cc87b5f853",
"name": "opbeans-java-7c68f48dc6-n6mzc"
}
},
"process": {
"pid": 8,
"title": "/opt/java/openjdk/bin/java",
"parent": {
"pid": 1
}
},
"agent": {
"name": "java",
"ephemeral_id": "29a27947-ed3a-4d87-b2e6-28f7a940ec2d",
"version": "1.25.1-SNAPSHOT.UNKNOWN"
},
"jvm.gc.time": 11511,
"processor": {
"name": "metric",
"event": "metric"
},
"labels": {
"name": "Copy"
},
"metricset.name": "app",
"observer": {
"hostname": "3c5ac040e8f9",
"name": "instance-0000000002",
"type": "apm-server",
"version": "7.15.0"
},
"@timestamp": "2021-09-14T09:52:49.454Z",
"ecs": {
"version": "1.11.0"
},
"service": {
"node": {
"name": "a47ed147c6ee269400f7ea4e296b3d01ec7398471bb2951907e4ea12f028bc69"
},
"environment": "production",
"name": "opbeans-java",
"runtime": {
"name": "Java",
"version": "11.0.11"
},
"language": {
"name": "Java",
"version": "11.0.11"
},
"version": "2021-09-08 03:55:06"
},
"jvm.gc.count": 2224,
"host": {
"os": {
"platform": "Linux"
},
"ip": ["35.240.52.17"],
"architecture": "amd64"
},
"event": {
"ingested": "2021-09-14T09:53:00.834276431Z"
}
}
APM 代理和 APM Server 或托管的 intake 服务会根据追踪事件计算指标,以驱动 Applications UI 中的可视化。
计算指标是实现细节,虽然我们致力于保持这些数据模型的稳定性,但聚合的维度和具体限制可能会在次版本更新中发生变化。
这些指标将在下文中描述。
为了驱动 按 span 类型花费的时间图表,代理会收集关于 span 和事务时序的汇总指标,并按 span 类型进行细分。
span.self_time.count和span.self_time.sum.us- 这些指标衡量了事务组内 span 类型的“自时间”,以及可选的子类型。结合使用这两个指标可以计算事务组内每种操作类型的平均持续时间和所占时间百分比。
可以通过搜索 metricset.name: span_breakdown 来识别这些指标文档。
您可以按以下维度进行过滤和分组
transaction.name:包含事务组的名称,例如GET /transaction.type:包含事务的类型,例如requestspan.type:跨的类型,例如app、template或dbspan.subtype:跨的子类型,例如mysql(可选)
此示例显示了细分指标文档在 Elasticsearch 中索引时可能的样子。
展开 Elasticsearch 文档
{
"@timestamp": "2022-02-28T13:41:14.594Z",
"agent": {
"name": "ruby",
"version": "4.5.0"
},
"data_stream": {
"dataset": "apm.internal",
"namespace": "default",
"type": "metrics"
},
"ecs": {
"version": "8.6.0-dev"
},
"event": {
"agent_id_status": "missing",
"ingested": "2023-06-20T09:45:03Z"
},
"host": {
"architecture": "x86_64",
"hostname": "19887b56414b",
"ip": "127.0.0.1",
"name": "19887b56414b",
"os": {
"platform": "linux"
}
},
"metricset": {
"name": "span_breakdown"
},
"observer": {
"hostname": "hostname",
"type": "apm-server",
"version": "8.8.2"
},
"process": {
"args": [
"-C",
"config/puma.rb"
],
"pid": 150,
"title": "/usr/local/bundle/bin/puma"
},
"processor": {
"event": "metric",
"name": "metric"
},
"service": {
"environment": "production",
"framework": {
"name": "Ruby on Rails",
"version": "6.1.4.1"
},
"language": {
"name": "ruby",
"version": "2.7.3"
},
"name": "opbeans-ruby",
"node": {
"name": "19887b56414b"
},
"runtime": {
"name": "ruby",
"version": "2.7.3"
},
"version": "None"
},
"span": {
"self_time": {
"count": 1,
"sum": {
"us": 3473
}
},
"subtype": "controller",
"type": "app"
},
"transaction": {
"name": "Api::OrdersController#create",
"type": "request"
}
}
为了驱动 Kibana Applications UI 可视化,APM Server 或托管的 intake 服务会将事务事件聚合为延迟分布指标。
transaction.duration.summary和transaction.duration.histogram- 这些指标代表事务组的延迟摘要和延迟分布,用于驱动 Elastic APM 中面向事务的可视化和分析。
可以通过搜索 metricset.name: transaction 来识别这些指标文档。
您可以按以下维度进行筛选和分组(其中一些是可选的,例如 container.id):
agent.name:检测事务的 APM 代理的名称,例如javacloud.account.id:提供事务的服务所在的云账户 IDcloud.account.name:提供事务的服务所在的云账户名称cloud.availability_zone:提供事务的服务实例所在的云可用区cloud.machine.type:提供事务的服务所在的云机器类型或实例类型cloud.project.id:提供事务的服务所在的云项目标识符cloud.project.name:提供事务的服务所在的云项目名称cloud.provider:提供事务的服务实例所在的云提供商cloud.region:提供事务的服务实例所在的云区域cloud.service.name:提供事务的服务所在的云服务名称container.id:提供事务的服务所在的容器 IDevent.outcome:事务的结果,例如successfaas.coldstart:提供事务的服务(serverless)是否经历了冷启动faas.id:被调用的无服务器函数的唯一标识符faas.name:Lambda 函数的名称faas.trigger.type:驱动事务的服务所执行的 Lambda 函数的触发器类型faas.version:Lambda 函数的版本host.hostname:提供事务的服务的主机名(已检测)host.name:提供事务的服务的主机名(用户定义)或已检测到的主机名host.os.platform:提供事务的服务所在的操作系统平台,例如linuxkubernetes.pod.name:运行提供事务的服务所在的 Kubernetes pod 名称labels:APM 代理全局设置的字符串标签的键值对象。RUM 代理不包含此维度。metricset.interval:表示指标集的聚合时间间隔的字符串。numeric_labels:APM 代理全局设置的数字标签的键值对象。RUM 代理不包含此维度。service.environment:提供事务的服务所属的环境service.language.name:提供事务的服务所使用的语言名称,例如Goservice.language.version:提供事务的服务所使用的语言版本service.name:提供事务的服务名称service.node.name:提供事务的服务实例名称service.runtime.name:提供事务的服务所使用的运行时名称,例如jRubyservice.runtime.version:提供事务的服务所使用的运行时版本service.version:提供事务的服务版本transaction.name:事务的名称,例如GET /transaction.result:事务的结果,例如HTTP 2xxtransaction.root:一个布尔标志,指示事务是否为追踪的根transaction.type:事务的类型,例如request
这些文档的 @timestamp 字段包含聚合时间段的开始时间。
此示例显示了事务文档在 Elasticsearch 中索引时可能的样子。
展开 Elasticsearch 文档
{
"@timestamp": "2022-02-28T13:39:00.000Z",
"_doc_count": 2421,
"agent": {
"name": "ruby"
},
"data_stream": {
"dataset": "apm.transaction.1m",
"namespace": "default",
"type": "metrics"
},
"ecs": {
"version": "8.6.0-dev"
},
"event": {
"agent_id_status": "missing",
"ingested": "2023-06-20T09:49:53Z",
"outcome": "success",
"success_count": {
"sum": 2421.0,
"value_count": 2421
}
},
"host": {
"hostname": "19887b56414b",
"name": "19887b56414b",
"os": {
"platform": "linux"
}
},
"metricset": {
"interval": "1m",
"name": "transaction"
},
"observer": {
"hostname": "hostname",
"type": "apm-server",
"version": "8.8.2"
},
"processor": {
"event": "metric",
"name": "metric"
},
"service": {
"environment": "production",
"language": {
"name": "ruby",
"version": "2.7.3"
},
"name": "opbeans-ruby",
"node": {
"name": "19887b56414b"
},
"runtime": {
"name": "ruby",
"version": "2.7.3"
},
"version": "None"
},
"transaction": {
"duration": {
"histogram": {
"values": [
16255.0,
20095.0,
20351.0,
24447.0,
24703.0,
25087.0,
25471.0,
26111.0,
26623.0,
28287.0,
29695.0,
30847.0,
31231.0,
31871.0,
33023.0,
36351.0,
41727.0,
44287.0,
46847.0,
56575.0,
61695.0,
81407.0,
88575.0,
107519.0
],
"counts": [
90,
89,
90,
90,
90,
180,
180,
90,
89,
90,
90,
90,
90,
89,
90,
90,
89,
89,
90,
179,
89,
89,
90,
89
]
},
"summary": {
"sum": 9.5487371E7,
"value_count": 2421
}
},
"name": "Api::CustomersController#index",
"result": "HTTP 2xx",
"root": true,
"type": "request"
}
}
为了驱动 Kibana Applications UI 可视化,APM Server 或托管的 intake 服务会将事务事件聚合为服务-事务指标。服务-事务指标与事务指标类似,但它们通常基数低得多,因为它们的维度少得多。UI 在需要较少事务细节时使用它们。
transaction.duration.summary和transaction.duration.histogram- 这些指标代表服务事务组的延迟摘要和延迟分布,用于驱动 Elastic APM 中面向服务的可视化和分析。
可以通过搜索 metricset.name: service_transaction 来识别这些指标文档。
您可以按以下维度进行过滤和分组
agent.name:检测操作的 APM 代理的名称,例如javalabels:APM 代理全局设置的字符串标签的键值对象。RUM 代理不包含此维度。metricset.interval:表示指标集的聚合时间间隔的字符串。numeric_labels:APM 代理全局设置的数字标签的键值对象。RUM 代理不包含此维度。service.environment:发起请求的服务所属的环境service.language.name:提供事务的服务所使用的语言名称,例如Goservice.name:发起请求的服务名称transaction.type:包含事务的类型,例如request
这些文档的 @timestamp 字段包含聚合时间段的开始时间。
此示例显示了服务-事务文档在 Elasticsearch 中索引时可能的样子。
展开 Elasticsearch 文档
{
"@timestamp": "2022-02-28T13:40:00.000Z",
"_doc_count": 2677,
"agent": {
"name": "ruby"
},
"data_stream": {
"dataset": "apm.service_transaction.1m",
"namespace": "default",
"type": "metrics"
},
"ecs": {
"version": "8.6.0-dev"
},
"event": {
"agent_id_status": "missing",
"ingested": "2023-06-20T09:59:52Z",
"success_count": {
"sum": 2567.0,
"value_count": 2677
}
},
"metricset": {
"interval": "1m",
"name": "service_transaction"
},
"observer": {
"hostname": "hostname",
"type": "apm-server",
"version": "8.8.2"
},
"processor": {
"event": "metric",
"name": "metric"
},
"service": {
"environment": "production",
"language": {
"name": "ruby"
},
"name": "opbeans-ruby"
},
"transaction": {
"duration": {
"histogram": {
"values": [
9215.0,
9279.0,
10047.0,
10687.0,
10751.0,
11263.0,
12991.0,
13631.0,
14335.0,
14399.0,
15167.0,
15295.0,
15935.0,
16063.0,
16767.0,
18047.0,
18175.0,
18303.0,
18431.0,
18559.0,
18943.0,
19199.0,
19583.0,
19711.0,
19839.0,
20479.0,
20735.0,
20863.0,
20991.0,
21119.0,
21375.0,
22143.0,
22399.0,
22527.0,
22655.0,
23167.0,
23807.0,
24319.0,
24575.0,
24959.0,
25855.0,
26239.0,
26367.0,
26623.0,
26751.0,
27007.0,
27135.0,
27263.0,
27647.0,
28031.0,
28287.0,
28543.0,
28671.0,
28927.0,
29951.0,
30079.0,
30335.0,
30463.0,
31231.0,
31487.0,
31615.0,
31743.0,
32127.0,
32383.0,
32767.0,
33023.0,
33279.0,
33535.0,
34047.0,
34303.0,
34815.0,
35071.0,
35327.0,
35583.0,
36351.0,
37631.0,
38143.0,
38911.0,
39167.0,
39679.0,
40447.0,
40703.0,
40959.0,
41215.0,
41471.0,
41983.0,
42495.0,
43007.0,
43263.0,
43519.0,
43775.0,
44799.0,
45311.0,
46591.0,
46847.0,
47103.0,
48127.0,
48383.0,
48639.0,
48895.0,
49151.0,
49407.0,
49919.0,
50431.0,
50687.0,
51455.0,
51711.0,
52223.0,
53759.0,
54271.0,
54527.0,
55039.0,
55807.0,
56063.0,
56319.0,
57087.0,
57343.0,
57599.0,
58879.0,
59647.0,
59903.0,
60927.0,
61695.0,
62719.0,
63743.0,
64255.0,
64767.0,
66559.0,
67071.0,
68095.0,
68607.0,
69119.0,
69631.0,
70655.0,
71679.0,
72191.0,
72703.0,
73727.0,
74239.0,
75775.0,
76287.0,
76799.0,
77311.0,
77823.0,
82943.0,
83967.0,
84991.0,
86015.0,
87551.0,
89087.0,
89599.0,
91647.0,
92671.0,
95231.0,
95743.0,
97279.0,
98815.0,
99327.0,
99839.0,
100863.0,
101887.0,
102399.0,
102911.0,
103423.0,
103935.0,
105983.0,
109055.0,
111615.0,
112127.0,
118271.0,
119295.0,
122879.0,
129023.0,
129535.0,
132095.0,
133119.0,
137215.0,
139263.0,
140287.0,
146431.0,
147455.0,
148479.0,
152575.0,
158719.0,
159743.0,
161791.0,
165887.0,
171007.0,
173055.0,
174079.0,
178175.0,
181247.0,
182271.0,
190463.0,
193535.0,
195583.0,
198655.0,
201727.0,
212991.0,
224255.0,
240639.0,
250879.0,
262143.0,
329727.0,
1236991.0,
2097151.0,
2408447.0,
2424831.0,
3801087.0,
3850239.0,
4063231.0,
4177919.0,
4390911.0,
4947967.0,
5275647.0,
5832703.0,
5898239.0,
5931007.0,
6324223.0,
6455295.0,
6488063.0,
8454143.0
],
"counts": [
9,
9,
9,
9,
10,
9,
9,
9,
9,
9,
10,
10,
18,
9,
10,
18,
9,
10,
9,
9,
18,
19,
9,
19,
9,
9,
9,
9,
19,
9,
10,
18,
9,
9,
18,
10,
9,
9,
9,
9,
10,
18,
10,
18,
9,
18,
9,
9,
10,
9,
10,
9,
9,
9,
9,
9,
9,
27,
9,
9,
10,
9,
10,
9,
19,
9,
19,
9,
9,
19,
9,
18,
28,
9,
27,
18,
18,
10,
10,
9,
10,
9,
10,
10,
18,
29,
18,
9,
9,
9,
10,
9,
9,
9,
9,
19,
19,
10,
10,
10,
18,
19,
9,
9,
10,
18,
10,
19,
9,
9,
9,
10,
10,
10,
9,
9,
18,
9,
9,
9,
9,
19,
18,
18,
10,
18,
9,
38,
9,
9,
18,
19,
9,
9,
18,
9,
18,
9,
9,
9,
10,
19,
27,
10,
18,
28,
19,
9,
20,
18,
18,
10,
9,
9,
9,
28,
9,
10,
9,
9,
19,
28,
9,
18,
9,
9,
9,
9,
9,
9,
9,
9,
10,
9,
9,
10,
9,
29,
9,
10,
10,
18,
9,
10,
9,
19,
10,
9,
18,
10,
9,
9,
10,
10,
9,
9,
10,
9,
10,
9,
9,
10,
9,
9,
9,
9,
9,
9,
9,
9,
9,
9,
9,
9,
9,
9,
10,
9,
10,
10,
10,
18
]
},
"summary": {
"sum": 1.027476555E9,
"value_count": 2677
}
},
"type": "request"
}
}
为了驱动 Kibana Applications UI 可视化,APM Server 或托管的 intake 服务会将 span 事件聚合为服务-目标指标。
span.destination.service.response_time.count和span.destination.service.response_time.sum.us- 这些指标衡量了一个服务到另一个服务的请求数量和总持续时间。它们用于计算后端服务(如数据库)的吞吐量和延迟,可在 服务图中使用。
可以通过搜索 metricset.name: service_destination 来识别这些指标文档。
您可以按以下维度进行过滤和分组
agent.name:检测操作的 APM 代理的名称,例如javaevent.outcome:操作的结果,例如successlabels:APM 代理全局设置的字符串标签的键值对象。RUM 代理不包含此维度。metricset.interval:表示指标集的聚合时间间隔的字符串。numeric_labels:APM 代理全局设置的数字标签的键值对象。RUM 代理不包含此维度。service.environment:发起请求的服务所属的环境service.language.name:提供事务的服务所使用的语言名称,例如Goservice.name:发起请求的服务名称service.target.name:目标服务名称,例如customer_dbservice.target.type:目标服务类型,例如mysqlspan.destination.service.resource:目标服务资源,例如mysqlspan.name:操作的名称,例如SELECT FROM table_name。
这些文档的 @timestamp 字段包含聚合时间段的开始时间。
此示例显示了服务-目标文档在 Elasticsearch 中索引时可能的样子。
展开 Elasticsearch 文档
{
"@timestamp": "2022-02-28T13:41:00.000Z",
"_doc_count": 7488,
"agent": {
"name": "ruby"
},
"data_stream": {
"dataset": "apm.service_destination.1m",
"namespace": "default",
"type": "metrics"
},
"ecs": {
"version": "8.6.0-dev"
},
"event": {
"agent_id_status": "missing",
"ingested": "2023-06-20T09:45:53Z",
"outcome": "unknown"
},
"metricset": {
"interval": "1m",
"name": "service_destination"
},
"observer": {
"hostname": "hostname",
"type": "apm-server",
"version": "8.8.2"
},
"processor": {
"event": "metric",
"name": "metric"
},
"service": {
"environment": "production",
"language": {
"name": "ruby"
},
"name": "opbeans-ruby",
"target": {
"type": "postgresql"
}
},
"span": {
"destination": {
"service": {
"resource": "postgresql",
"response_time": {
"count": 7488,
"sum": {
"us": 21309833
}
}
}
},
"name": "SELECT FROM product_kinds"
}
}
为了驱动 Kibana Applications UI 可视化,APM Server 或托管的 intake 服务会将事务、错误、日志和指标事件聚合为服务摘要指标。
可以通过搜索 metricset.name: service_summary 来识别这些指标文档。
您可以按以下维度进行过滤和分组
agent.name:检测操作的 APM 代理的名称,例如javalabels:APM 代理全局设置的字符串标签的键值对象。RUM 代理不包含此维度。metricset.interval:表示指标集的聚合时间间隔的字符串。numeric_labels:APM 代理全局设置的数字标签的键值对象。RUM 代理不包含此维度。service.environment:发起请求的服务所属的环境service.language.name:提供事务的服务所使用的语言名称,例如Goservice.name:发起请求的服务名称
这些文档的 @timestamp 字段包含聚合时间段的开始时间。
此示例显示了服务摘要文档在 Elasticsearch 中索引时可能的样子。
展开 Elasticsearch 文档
{
"@timestamp": "2022-02-28T13:37:00.000Z",
"agent": {
"name": "nodejs"
},
"data_stream": {
"dataset": "apm.service_summary.1m",
"namespace": "default",
"type": "metrics"
},
"ecs": {
"version": "8.6.0-dev"
},
"event": {
"agent_id_status": "missing",
"ingested": "2023-06-20T09:45:53Z"
},
"metricset": {
"interval": "1m",
"name": "service_summary"
},
"observer": {
"hostname": "hostname",
"type": "apm-server",
"version": "8.8.2"
},
"processor": {
"event": "metric",
"name": "metric"
},
"service": {
"environment": "production",
"language": {
"name": "javascript"
},
"name": "opbeans-node"
}
}
指标存储在以下数据流中:
- APM 内部指标:
metrics-apm.internal-<namespace> - APM 事务指标:
metrics-apm.transaction.<metricset.interval>-<namespace> - APM 服务目标指标:
metrics-apm.service_destination.<metricset.interval>-<namespace> - APM 服务事务指标:
metrics-apm.service_transaction.<metricset.interval>-<namespace> - APM 服务摘要指标:
metrics-apm.service_summary.<metricset.interval>-<namespace> - 应用程序指标:
metrics-apm.app.<service.name>-<namespace>
有关详细信息,请参阅 数据流。
对于所有聚合指标,即事务、服务-事务、服务-目标和数据摘要指标,在任何给定时间跟踪的唯一组的数量都有限制。
请注意,以下所有限制在未来可能会随着进一步的改进而改变。
对于所有以下指标,它们共享每 GB APM Server 1000 个服务的限制。
- 对于事务指标,还有一个额外的限制,即每 GB APM Server 最多 5000 个事务组,并且每个服务最多只能使用 10% 的事务组,即每 GB APM Server 每服务 500 个事务组。
- 对于服务-事务指标,还有一个额外的限制,即每 GB APM Server 最多 1000 个服务事务组,并且每个服务最多只能使用 10% 的服务事务组,即每 GB APM Server 每服务 100 个服务事务组。
- 对于服务-目标指标,每 GB APM Server 最多 5000 个服务目标组(从 10000 个服务目标组/GB APM Server 开始),并且每个服务最多只能使用 10% 的服务目标组,即每 GB APM Server 1000 个服务目标组,每 GB APM Server 增加 500 个。
- 对于服务摘要指标,没有额外的限制。
在上述指标中,服务定义为 service.name、service.environment、service.language.name 和 agent.name 的组合。
当某个维度具有高基数并超出限制时,指标将被聚合到一个专用的溢出桶中。
例如,当 transaction.name 有很多唯一值并达到跟踪的唯一事务组的限制时,任何具有新 transaction.name 的事务都将被聚合到 transaction.name: _other 下。
事务组限制可能达到的另一个示例是,如果 transaction.name 只包含几个唯一值,但服务部署在许多不同的主机上。由于 host.name 是事务指标聚合键的一部分,因此对于一个拥有 100 个实例、10 个不同事务名称和 4 个事务结果(每个事务名称)的服务,当连接到具有 8GB RAM 的 APM Server 时,事务组的最大限制将达到。一旦达到此限制,该服务的 transaction.name、transaction.result 和 host.name 的任何新组合都将被聚合到 transaction.name: _other 下。
可以通过增加 APM Server 可用的内存或确保维度不使用基于可能更改的参数的值来解决此问题。例如,用户 ID、产品 ID、订单号、查询参数等应从维度中剥离。出于同样的原因,避免高基数的全局标签(labels.\* 和 numeric_labels.*)。
为了防止 APM Server 使用过多的内存,聚合指标不考虑 RUM 代理的全局标签。