指标
编辑指标
编辑指标 通过定期收集信息来衡量系统的状态。APM 指标有两种类型
- 系统指标:基本的基础设施和应用程序指标。
- 计算指标:聚合的跟踪事件指标,用于为应用程序 UI 中的可视化提供支持。
系统指标
编辑APM 代理会自动收集基本的主机级指标,包括系统和进程级的 CPU 和内存指标。还提供特定于代理的指标,例如 Java 代理中的 JVM 指标 和 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 服务器从跟踪事件计算指标,以便为应用程序 UI 中的可视化提供支持。
计算指标是实现细节,虽然我们的目标是这些数据模型的稳定性,但聚合的维度和具体限制可能会在次要版本更新中发生更改。
这些指标如下所述。
为了支持 按跨度类型花费的时间 图,代理收集有关跨度和事务计时的摘要指标,并按跨度类型分解。
-
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" } }
为了支持 Kibana 应用程序 UI 可视化,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" } }
为了支持 Kibana 应用程序 UI 可视化,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" } }
为了支持 Kibana Applications UI 可视化,APM Server 将 span 事件聚合为服务目标指标。
-
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" } }
为了支持 Kibana Applications UI 可视化,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 内存的 APM Server 时,对于具有 100 个实例、10 个不同事务名称以及每个事务名称 4 个事务结果的服务,将达到最大事务组限制。一旦达到此限制,该服务的 transaction.name
、transaction.result
和 host.name
的任何新组合都将聚合在 transaction.name
: _other
下。
可以通过增加 APM Server 可用的内存,或确保维度不使用基于可能更改的参数的值来解决此问题。例如,用户 ID、产品 ID、订单号、查询参数等应从维度中剥离。出于同样的原因,应避免高基数全局标签(labels.\*
和 numeric_labels.*
)。
聚合指标不考虑 RUM 代理的全局标签,以保护 APM Server 免于使用过多内存。