指标
编辑指标
编辑Java 代理会跟踪某些系统和应用程序指标。其中一些具有内置的可视化效果,而另一些只能使用自定义 Kibana 仪表板进行可视化。
这些指标将定期发送到 APM 服务器,然后从那里发送到 Elasticsearch。您可以使用设置 metrics_interval
调整间隔。
这些指标将存储在 apm-*
索引中,并将 processor.event
属性设置为 metric
。
自 Elastic Stack 7.2 版起,提供了专用的 JVM 指标视图。从 7.5 开始,指标会针对每个 JVM 单独聚合,依赖于底层系统的 ID,即容器 ID(如果适用)或主机名。从 Java 代理 1.11.0 版开始,可以通过 service_node_name
为每个服务节点/JVM 手动配置唯一名称。当多个 JVM 在同一主机上运行并报告同一服务的数据时,需要此配置才能在 JVM 级别查看指标。
系统指标
编辑主机指标。从 6.6 版开始,这些指标将在 APM 应用中可视化。
如需更多系统指标,请考虑在主机上安装 metricbeat。
-
system.cpu.total.norm.pct
-
类型:scaled_float
格式:百分比
处于空闲和 IOWait 状态之外的 CPU 时间百分比,由核心数进行归一化。
-
system.process.cpu.total.norm.pct
-
类型:scaled_float
格式:百分比
自上次事件以来进程花费的 CPU 时间百分比。此值由 CPU 核心数归一化,范围为 0 到 100%。
-
system.memory.total
-
类型:long
格式:字节
总内存。
-
system.memory.actual.free
-
类型:long
格式:字节
实际可用内存(以字节为单位)。它基于操作系统计算。在 Linux 上,它由可用内存加上缓存和缓冲区组成。在 OSX 上,它是可用内存和非活动内存的总和。在 Windows 上,此值不包括系统缓存和缓冲区消耗的内存。
-
system.process.memory.size
-
类型:long
格式:字节
进程拥有的总虚拟内存。
cgroup 指标(在 1.18.0 中添加)
编辑Linux 的 cgroup 指标。
-
system.process.cgroup.memory.mem.limit.bytes
-
类型:long
格式:字节
当前 cgroup 切片的内存限制。
-
system.process.cgroup.memory.mem.usage.bytes
-
类型:long
格式:字节
当前 cgroup 切片的内存使用量。
JVM 指标
编辑特定于 JVM 的指标
-
jvm.memory.heap.used
-
类型:long
格式:字节
已使用的堆内存量(以字节为单位)
-
jvm.memory.heap.committed
-
类型:long
格式:字节
为 Java 虚拟机使用的已提交的堆内存量(以字节为单位)。保证 Java 虚拟机可以使用此内存量。
-
jvm.memory.heap.max
-
类型:long
格式:字节
可用于内存管理的最大堆内存量(以字节为单位)。如果未定义最大内存大小,则该值为
-1
。 -
jvm.memory.heap.pool.used
-
类型:long
格式:字节
由
name
标签指定的堆内存池中已使用的内存量(以字节为单位)标签
- 名称:表示此内存池的名称
-
jvm.memory.heap.pool.committed
-
类型:long
格式:字节
为
name
标签指定的堆内存池提交的内存量(以字节为单位)。保证此特定池可以使用此内存量。标签
- 名称:表示此内存池的名称
-
jvm.memory.heap.pool.max
-
类型:long
格式:字节
可用于
name
标签指定的堆内存池的最大内存量(以字节为单位)。标签
- 名称:表示此内存池的名称
-
jvm.memory.non_heap.used
-
类型:long
格式:字节
已使用的非堆内存量(以字节为单位)
-
jvm.memory.non_heap.committed
-
类型:long
格式:字节
为 Java 虚拟机使用的已提交的非堆内存量(以字节为单位)。保证 Java 虚拟机可以使用此内存量。
-
jvm.memory.non_heap.max
-
类型:long
格式:字节
可用于内存管理的最大非堆内存量(以字节为单位)。如果未定义最大内存大小,则该值为
-1
。 -
jvm.memory.non_heap.pool.used
-
类型:long
格式:字节
由
name
标签指定的非堆内存池中已使用的内存量(以字节为单位)标签
- 名称:表示此内存池的名称
-
jvm.memory.non_heap.pool.committed
-
类型:long
格式:字节
为
name
标签指定的非堆内存池提交的内存量(以字节为单位)。保证此特定池可以使用此内存量。标签
- 名称:表示此内存池的名称
-
jvm.memory.non_heap.pool.max
-
类型:long
格式:字节
可用于
name
标签指定的非堆内存池的最大内存量(以字节为单位)。标签
- 名称:表示此内存池的名称
-
jvm.thread.count
-
类型:int
JVM 中当前活动线程数,包括守护线程和非守护线程。
-
jvm.gc.count
-
类型:long
标签
- 名称:表示此内存管理器的名称(例如
G1 Young Generation
、G1 Old Generation
)
发生的集合总数。
- 名称:表示此内存管理器的名称(例如
-
jvm.gc.time
-
类型:long
格式:毫秒
标签
- 名称:表示此内存管理器的名称(例如
G1 Young Generation
、G1 Old Generation
)
近似的累积集合经过时间(以毫秒为单位)。
- 名称:表示此内存管理器的名称(例如
-
jvm.gc.alloc
-
类型:long
格式:字节
在堆内存中分配的总内存量(以字节为单位)的近似值。
-
jvm.fd.used
-
类型:long
当前打开的文件描述符数。
-
jvm.fd.max
-
类型:long
最大打开文件描述符数。
JMX 指标
编辑Java Management Extensions (JMX) 在 JVM 上提供了一个通用的管理界面,通常用于通过此界面公开内部指标。
Elastic APM 代理能够直接连接到 JMX 界面,而无需其他凭据或更改 JVM 参数,这与其他外部工具(如 VisualVM 或 Jconsole)不同。此外,它仅捕获指标,不向最终用户公开整个 JMX 管理界面。
需要通过 capture_jmx_metrics
选项配置要捕获的 JMX 指标。
内置应用程序指标
编辑为了支持 按跨度类型花费的时间 图表,代理会收集有关跨度和事务时间(按跨度类型细分)的汇总指标。
-
span.self_time
-
类型:简单计时器
此计时器跟踪跨度自用时间,并且是事务细分可视化的基础。
字段
-
sum.us
:自上次报告以来所有跨度自用时间的总和(以微秒为单位)(增量) -
count
:自上次报告以来所有跨度自用时间的计数(增量)
您可以按以下维度进行筛选和分组
-
transaction.name
:事务的名称 -
transaction.type
:事务的类型,例如request
-
span.type
:跨度的类型,例如app
、template
或db
-
span.subtype
:跨度的子类型,例如mysql
(可选)
-
仅使用代理进行指标收集
编辑在某些情况下,您可能只想使用代理来收集和传输指标,而无需跟踪任何 Java 代码。在这种情况下,您可以将 instrument
配置选项设置为 false
。这样,代理将最大限度地减少对应用程序的影响,同时仍然收集指标并将其发送到 APM 服务器。
OpenTelemetry 指标
编辑Elastic APM Java 代理支持收集通过 OpenTelemetry 定义的指标。有关详细信息,请参阅相应的文档部分。
Micrometer 指标
编辑此功能处于测试阶段,可能会发生变化。设计和代码不如官方 GA 功能成熟,并且按原样提供,不提供任何保证。测试版功能不受官方 GA 功能的支持 SLA 约束。
Elastic APM Java 代理允许您使用流行的指标收集框架 Micrometer 来跟踪自定义应用程序指标。
从应用程序跟踪自定义指标的一些用例包括监视与性能相关的事项,例如缓存统计信息、线程池或页面点击量。但是,您还可以跟踪与业务相关的指标(例如收入),并将其与性能指标相关联。注册到 Micrometer MeterRegistry
的指标会在内存中聚合,并按照 metrics_interval
进行报告。基于有关服务和时间戳的元数据,您可以将指标与跟踪关联起来。优点是,指标不会受到 采样率 的影响,并且通常占用更少的空间。这是因为并非每个事件都单独存储。
跟踪指标的限制在于,您无法将值归因于特定事务。如果您想这样做,请将 标签添加到事务,而不是使用 Micrometer 跟踪指标。这里的权衡是您必须进行 100% 采样,或者考虑丢失的事件。原因是,例如,如果您将采样率设置为 10%,则只会存储 10 个请求中的一个。您在非采样事务上设置的标签将丢失。
备注
编辑- 为了避免映射冲突,Micrometer 指标的指标名称中的点会被替换为下划线。可以通过
dedot_custom_metrics
禁用取消点号。 - 直方图(DistributionSummary、Timer 和 LongTaskTimer)通过将直方图指标转换为三个派生指标来支持:值的计数器、值的总和以及直方图。例如,
DistributionSummary.builder("order").register(...).record(orderPrice)
将创建三个指标:order.sum
、order.count
和order.histogram
(其中包含用于存储桶的values
数组和用于存储每个桶中样本计数的counts
数组)。 - 当使用多个
MeterRegistry
时,指标会根据其指标 ID 进行去重。如果复合指标注册表中存在多个指标注册表发生冲突,则会发出警告。 - 当使用
CountingMode.CUMULATIVE
时,您可以使用 TSVB 的“正向速率”聚合将计数器转换为速率。但是,您必须记住按唯一标识时间序列的维度组合进行分组。这可能是host.name
和service.name
的组合,或者是kubernetes.pod.id
。 - 可以使用
disable_instrumentations
设置禁用 Micrometer 指标。
开始使用现有的 Micrometer 设置
编辑附加代理,就完成了!代理会自动检测所有 MeterRegistry
实例,并将所有指标报告给 APM 服务器(除了它们最初报告的位置之外)。当在应用程序已经启动后附加代理时,代理会在调用其任何公共方法时检测到 MeterRegistry
。如果您在 CompoundMeterRegistry
中使用多个注册表,则代理只会报告一次指标。
验证 Micrometer 数据
编辑使用 Discover 验证指标是否已成功报告给 Kibana。
- 启动 Kibana。
- 打开主菜单,然后单击 Discover。
- 选择
apm-*
作为您的索引模式。 - 筛选数据以仅显示带有指标的文档:
processor.name :"metric"
- (可选)如果仅在您的环境子集上检测到 Micrometer,则可以按服务或主机名应用其他筛选器。
现在,您应该看到包含 APM 代理收集的指标和来自 Micrometer 的自定义指标的文档。使用已知的 Micrometer 指标字段缩小搜索范围。例如,如果您知道已在 Micrometer MeterRegistry
中注册了指标名称 cache.puts
,请在搜索中添加 cache_puts: *
(点替换为下划线),以仅返回 Micrometer 指标文档。
可视化 Micrometer 数据
编辑当前版本不完全支持单调递增的计数器和正向速率聚合。
TSVB 是推荐用于 Micrometer 指标的可视化工具。首先,请确保选择正确的聚合。最常见的选项是:
- 总和:对于业务指标很有用
- 平均值:通常用于与性能相关的指标
通常按属性(包括 Micrometer 标签或 APM 代理已收集的属性)对指标进行分组。这可能是服务版本、运行时版本,甚至是云元数据。
有关详细信息,请参阅 TSVB 中的事件速率和变化率博客文章。
从头开始
编辑声明对 Micrometer 的依赖
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>${micrometer.version}</version> </dependency>
创建 Micrometer MeterRegistry
。
MeterRegistry registry = new SimpleMeterRegistry(new SimpleConfig() { @Override public CountingMode mode() { // to report the delta since the last report // this makes building dashbaords a bit easier return CountingMode.STEP; } @Override public Duration step() { // the duration should match metrics_interval, which defaults to 30s return Duration.ofSeconds(30); } @Override public String get(String key) { return null; } }, Clock.SYSTEM);
开始使用 Spring Boot
编辑开始使用 Spring Boot 的最简单方法是添加对 Spring Boot Actuator 的依赖。Spring Boot Actuator 为 Micrometer 提供依赖管理和自动配置。
使用 management.metrics.export.simple
前缀通过 application.properties
进行配置
management.metrics.export.simple.enabled=true management.metrics.export.simple.step=30s management.metrics.export.simple.mode=STEP
支持的 Meters
编辑本节列出所有受支持的 Micrometer Meter
,并描述它们如何映射到 Elasticsearch 文档。
Micrometer 标签嵌套在 labels
下。例如:
"labels": { "tagKey1": "tagLabel1", "tagKey2": "tagLabel2", }
标签非常适合按不同维度分解指标。尽管没有上限,但请注意,每个标签的大量不同值(也称为高基数)可能会导致更高的内存使用率、更高的索引大小和更慢的查询。此外,请确保限制不同标签键的数量,以避免 映射爆炸。
根据指标类型,某些指标可能会作为多个指标导出到 Elasticsearch。以下显示每个指标类型的结果字段。请注意,disable_metrics
选项对指标的原始名称起作用,而不是对生成的字段起作用。因此,只能禁用给定指标的所有字段,而不能禁用单个字段。
-
Timer
-
字段
-
${name}.sum.us
:记录事件的总时间(使用CountingMode.STEP
时为增量)。这等效于timer.totalTime(TimeUnit.MICROSECONDS)
。 -
${name}.count
:此计时器上调用 stop 的次数(使用CountingMode.STEP
时为增量)。这等效于timer.count()
。
-
-
FunctionTimer
-
字段
-
${name}.sum.us
:定时事件的所有发生次数的总时间(使用CountingMode.STEP
时为增量)。这等效于functionTimer.totalTime(TimeUnit.MICROSECONDS)
。 -
${name}.count
:定时事件的总发生次数(使用CountingMode.STEP
时为增量)。这等效于functionTimer.count()
。
-
-
LongTaskTimer
-
字段
-
${name}.sum.us
:所有当前任务的累积持续时间(使用CountingMode.STEP
时为增量)。这等效于longTaskTimer.totalTime(TimeUnit.MICROSECONDS)
。 -
${name}.count
:正在执行的任务的当前数量(使用CountingMode.STEP
时为增量)。这等效于longTaskTimer.activeTasks()
。
-
-
DistributionSummary
-
字段
-
${name}.sum
:所有记录事件的总量(使用CountingMode.STEP
时为增量)。这等效于distributionSummary.totalAmount()
。 -
${name}.count
:调用 record 的次数(使用CountingMode.STEP
时为增量)。这等效于distributionSummary.count()
。
-
-
Gauge
-
字段
-
${name}
:gauge.value()
的值。
-
-
Counter
-
字段
-
${name}
:counter.count()
的值(使用CountingMode.STEP
时为增量)。
-
-
FunctionCounter
-
字段
-
${name}
:functionCounter.count()
的值(使用CountingMode.STEP
时为增量)。
-
代理运行状况指标
编辑代理在内部使用队列来缓冲各种事件(例如,事务、跨度、指标),然后再将它们发送到 APM 服务器。启用 agent_reporter_health_metrics
后,代理将公开有关此队列的运行状况以及与 APM 服务器的网络连接的多个指标。此外,如果启用 agent_background_overhead_metrics
,则代理将持续测量其自身后台任务的资源消耗,并将结果作为指标提供。
代理报告和事件指标
编辑-
agent.events.total
-
类型:long
格式:事件数
尝试报告给 APM 服务器的事件总数。
-
agent.events.dropped
-
类型:long
格式:事件数
无法发送到 APM 服务器的事件数,例如,由于队列已满或发生错误。
-
agent.events.queue.min_size.pct
-
类型:double
格式:百分比 [0-1]
自上次指标报告以来,报告队列的最小大小。
-
agent.events.queue.max_size.pct
-
类型:double
格式:百分比 [0-1]
自上次指标报告以来,报告队列的最大大小。
-
agent.events.requests.count
-
类型:long
格式:请求数
向 APM 服务器发出以报告数据的请求数(成功和失败)。
-
agent.events.requests.bytes
-
类型:long
格式:字节
尝试发送到 APM 服务器以报告数据的字节数(成功和失败)。
代理后台资源消耗指标
编辑-
agent.background.cpu.total.pct
-
类型:double
格式:百分比 [0-1]
代理中运行的后台任务导致的总 CPU 使用率。
-
agent.background.cpu.overhead.pct
-
类型:double
格式:百分比 [0-1]
由代理中运行的后台任务导致的进程 CPU 使用率份额。
-
agent.background.memory.allocation.bytes
-
类型:long
格式:字节
代理中运行的后台任务在堆中分配的字节数。
-
agent.background.threads.count
-
类型:long
格式:线程数
代理中后台任务使用的线程数。