指标
编辑指标
编辑指标 通过定期收集信息来衡量系统状态。APM 指标有两种类型
- 系统指标:基本的底层架构和应用程序指标。
- 计算指标:用于为 Applications 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 服务器会根据跟踪事件计算指标,以增强 Applications 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 Applications 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
:包含 metricset 所表示的聚合间隔的字符串。 -
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 Applications UI 可视化效果,APM 服务器会将事务事件聚合到服务事务指标中。服务事务指标类似于事务指标,但它们通常具有更低的基数,因为它们的维度要少得多。当不需要事务的更多详细信息时,UI 会使用它们。
-
transaction.duration.summary
和transaction.duration.histogram
-
这些指标表示服务事务组的延迟摘要和延迟分布,用于增强 Elastic APM 中面向服务的可视化效果和分析。
可以通过搜索
metricset.name: service_transaction
来识别这些指标文档。您可以按这些维度进行筛选和分组
-
agent.name
:检测操作的 APM 代理的名称,例如java
-
labels
:包含 APM 代理全局设置的字符串标签的键值对象。RUM 代理中不存在此维度。 -
metricset.interval
:包含 metricset 所表示的聚合间隔的字符串。 -
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 服务器会将跨度事件聚合到服务目标指标中。
-
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
:包含 metricset 所表示的聚合间隔的字符串。 -
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 应用程序 UI可视化,APM 服务器将事务、错误、日志和指标事件聚合到服务汇总指标中。
可以通过搜索metricset.name: service_summary
来识别这些指标文档。
您可以按这些维度进行筛选和分组
-
agent.name
:检测操作的 APM 代理的名称,例如java
-
labels
:包含 APM 代理全局设置的字符串标签的键值对象。RUM 代理中不存在此维度。 -
metricset.interval
:包含 metricset 所表示的聚合间隔的字符串。 -
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 服务器 1000 个服务的限制。
- 对于事务指标,每个 GB APM 服务器额外限制为 5000 个事务组,每个服务最多只能使用 10% 的事务组,即每个 GB APM 服务器每个服务 500 个事务组。
- 对于服务事务指标,每个 GB APM 服务器额外限制为 1000 个服务事务组,每个服务最多只能使用 10% 的服务事务组,即每个 GB APM 服务器每个服务 100 个服务事务组。
- 对于服务目标指标,每个 GB APM 服务器额外限制为 5000 个服务目标组(1 GB APM 服务器起步为 10000 个服务目标组),每个服务最多只能使用 10% 的服务目标组,即对于 1 GB APM 服务器为 1000 个服务目标组,每增加 1 GB APM 服务器增加 500 个。
- 对于服务汇总指标,没有额外的限制。
在上述内容中,服务定义为service.name
、service.environment
、service.language.name
和agent.name
的组合。
当维度具有高基数并超过限制时,指标将聚合到专用的溢出桶中。
例如,当transaction.name
具有许多唯一值并达到跟踪的唯一事务组限制时,任何具有新transaction.name
的事务都将聚合到transaction.name
:_other
下。
达到事务组限制的另一个示例是,如果transaction.name
只包含少量唯一值,但服务部署在许多不同的主机上。由于host.name
是事务指标聚合键的一部分,因此对于连接到具有 8GB RAM 的 APM 服务器,具有 100 个实例、10 个不同事务名称和每个事务名称 4 个事务结果的服务,将达到最大事务组限制。一旦达到此限制,该服务的transaction.name
、transaction.result
和host.name
的任何新组合都将聚合到transaction.name
:_other
下。
可以通过增加 APM 服务器的可用内存或确保维度不使用基于可更改参数的值来解决此问题。例如,应去除维度中基于用户 ID、产品 ID、订单号、查询参数等的维度。出于同样的原因,避免高基数全局标签(labels.\*
和numeric_labels.*
)。
为了保护 APM 服务器免于使用过多内存,聚合指标不考虑来自 RUM 代理的全局标签。