指标
编辑指标编辑
指标 通过定期收集信息来衡量系统的状态。 APM 指标有两种类型
- 系统指标: 基本的基础设施和应用程序指标。
- 计算指标: 用于为 APM 应用程序中的可视化提供动力的聚合跟踪事件指标。
系统指标编辑
APM 代理会自动收集基本的主机级指标,包括系统和进程级 CPU 和内存指标。 代理特定的指标也可用,例如 JVM 指标 在 Java 代理中,以及 Go 运行时 指标在 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 服务器从跟踪事件中计算指标,以增强 APM 应用程序中的可视化效果。
计算指标是实现细节,虽然我们旨在为这些数据模型提供稳定性,但聚合的维度和具体限制可能会在次要版本更新中发生变化。
这些指标将在下面介绍。
细分指标编辑
为了增强 按跨度类型划分的时间 图表,代理会收集有关跨度和事务时间安排的汇总指标,按跨度类型进行细分。
-
span.self_time.count
和span.self_time.sum.us
-
这些指标衡量事务组中跨度类型(以及可选的子类型)的“自用时间”。 这些指标可以一起用于计算事务组中每种操作类型的平均持续时间和所占时间的百分比。
这些指标文档可以通过搜索
metricset.name: span_breakdown
来识别。您可以按以下维度进行过滤和分组
-
transaction.name
: 包含事务组的名称,例如GET /
-
transaction.type
: 包含事务的类型,例如request
-
span.type
: 跨度的类型,例如app
、template
或db
-
span.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" } }
事务指标编辑
为了增强 APM 应用程序 可视化效果,APM 服务器将事务事件聚合到延迟分布指标中。
-
transaction.duration.summary
和transaction.duration.histogram
-
这些指标表示事务组的延迟摘要和延迟分布,用于增强 Elastic APM 中面向事务的可视化和分析。
这些指标文档可以通过搜索
metricset.name: transaction
来识别。您可以按以下维度进行过滤和分组(其中一些是可选的,例如
container.id
)-
agent.name
: 对事务进行检测的 APM 代理的名称,例如java
-
cloud.account.id
: 提供事务的服务的云帐户 ID -
cloud.account.name
: 提供事务的服务的云帐户名称 -
cloud.availability_zone
: 托管提供事务的服务实例的云可用区 -
cloud.machine.type
: 提供事务的服务的云机器类型或实例类型 -
cloud.project.id
: 提供事务的服务的云项目标识符 -
cloud.project.name
: 提供事务的服务的云项目名称 -
cloud.provider
: 托管提供事务的服务实例的云提供商 -
cloud.region
: 托管提供事务的服务实例的云区域 -
cloud.service.name
: 提供事务的服务的云服务名称 -
container.id
: 提供事务的服务的容器 ID -
event.outcome
: 事务的结果,例如success
-
faas.coldstart
: 提供事务的无服务器服务是否发生了冷启动 -
faas.id
: 调用的无服务器函数的唯一标识符 -
faas.name
: lambda 函数的名称 -
faas.trigger.type
: 提供事务的服务的 lambda 函数执行的触发器类型 -
faas.version
: lambda 函数的版本 -
host.hostname
: 提供事务的服务的检测到的主机名 -
host.name
: 用户定义的主机名或提供事务的服务的检测到的主机名 -
host.os.platform
: 提供事务的服务的平台名称,例如linux
-
kubernetes.pod.name
: 运行提供事务的服务的 Kubernetes Pod 的名称 -
labels
: 包含 APM 代理全局设置的字符串标签的键值对象。 此维度不适用于 RUM 代理。 -
metricset.interval
: 包含指标集表示的聚合间隔的字符串。 -
numeric_labels
: 包含 APM 代理全局设置的数字标签的键值对象。 此维度不适用于 RUM 代理。 -
service.environment
: 提供事务的服务的环境 -
service.language.name
: 提供事务的服务的语言名称,例如Go
-
service.language.version
: 提供事务的服务的语言版本 -
service.name
: 提供事务的服务的名称 -
service.node.name
: 提供事务的服务实例的名称 -
service.runtime.name
: 提供事务的服务的运行时名称,例如jRuby
-
service.runtime.version
: 提供事务的运行时版本 -
service.version
: 提供事务的服务的版本 -
transaction.name
: 事务的名称,例如GET /
-
transaction.result
: 事务的结果,例如HTTP 2xx
-
transaction.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" } }
服务事务指标编辑
为了增强 APM 应用程序 可视化效果,APM 服务器将事务事件聚合到服务事务指标中。 服务事务指标类似于事务指标,但它们通常具有更低的基数,因为它们的维度明显更少。 当不需要事务的更多详细信息时,UI 会使用它们。
-
transaction.duration.summary
和transaction.duration.histogram
-
这些指标表示服务事务组的延迟摘要和延迟分布,用于增强 Elastic APM 中面向服务的可视化和分析。
这些指标文档可以通过搜索
metricset.name: service_transaction
来识别。您可以按以下维度进行过滤和分组
-
agent.name
: 对操作进行检测的 APM 代理的名称,例如java
-
labels
: 包含 APM 代理全局设置的字符串标签的键值对象。 此维度不适用于 RUM 代理。 -
metricset.interval
: 包含指标集表示的聚合间隔的字符串。 -
numeric_labels
: 包含 APM 代理全局设置的数字标签的键值对象。 此维度不适用于 RUM 代理。 -
service.environment
: 发出请求的服务的环境 -
service.language.name
: 提供事务的服务的语言名称,例如Go
-
service.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" } }
服务目标指标编辑
为了支持 APM 应用 可视化,APM Server 将跨度事件聚合到服务目标指标中。
-
span.destination.service.response_time.count
和span.destination.service.response_time.sum.us
-
这些指标衡量了一个服务到另一个服务的请求数量和总持续时间。这些指标用于计算 服务地图 中对后端服务(如数据库)的请求吞吐量和延迟。
这些指标文档可以通过搜索
metricset.name: service_destination
来识别。您可以按以下维度进行过滤和分组
-
agent.name
: 对操作进行检测的 APM 代理的名称,例如java
-
event.outcome
: 操作的结果,例如success
-
labels
: 包含 APM 代理全局设置的字符串标签的键值对象。 此维度不适用于 RUM 代理。 -
metricset.interval
: 包含指标集表示的聚合间隔的字符串。 -
numeric_labels
: 包含 APM 代理全局设置的数字标签的键值对象。 此维度不适用于 RUM 代理。 -
service.environment
: 发出请求的服务的环境 -
service.language.name
: 提供事务的服务的语言名称,例如Go
-
service.name
: 发出请求的服务的名称 -
service.target.name
: 目标服务名称,例如customer_db
-
service.target.type
: 目标服务类型,例如mysql
-
span.destination.service.resource
: 目标服务资源,例如mysql
-
span.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" } }
服务摘要指标编辑
为了支持 APM 应用 可视化,APM Server 将事务、错误、日志和指标事件聚合到服务摘要指标中。
这些指标文档可以通过搜索 metricset.name: service_summary
来识别。
您可以按以下维度进行过滤和分组
-
agent.name
: 对操作进行检测的 APM 代理的名称,例如java
-
labels
: 包含 APM 代理全局设置的字符串标签的键值对象。 此维度不适用于 RUM 代理。 -
metricset.interval
: 包含指标集表示的聚合间隔的字符串。 -
numeric_labels
: 包含 APM 代理全局设置的数字标签的键值对象。 此维度不适用于 RUM 代理。 -
service.environment
: 发出请求的服务的环境 -
service.language.name
: 提供事务的服务的语言名称,例如Go
-
service.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 个服务目标组的额外限制,从 1 GB APM Server 的 10000 个服务目标组开始,每个服务最多只能使用 10% 的服务目标组,即 1 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
是事务指标聚合键的一部分,因此当连接到具有 8GB RAM 的 APM Server 时,具有 100 个实例、10 个不同事务名称和每个事务名称 4 个事务结果的服务将达到最大事务组限制。一旦达到此限制,该服务任何新的 transaction.name
、transaction.result
和 host.name
组合将聚合到 transaction.name
: _other
下。
可以通过增加 APM Server 可用内存或确保维度不使用基于可变参数的值来解决此问题。例如,用户 ID、产品 ID、订单号、查询参数等应从维度中剥离。出于同样的原因,避免高基数全局标签(labels.\*
和 numeric_labels.*
)。
聚合指标不考虑来自 RUM 代理的全局标签,以保护 APM Server 不使用过多内存。