Micrometer 和 OpenTelemetry 扩展
此扩展为 Quarkus 应用程序提供 Micrometer 和 OpenTelemetry 的支持。它通过整合两个扩展以及一个桥接器来简化集成,该桥接器支持通过 OpenTelemetry 发送 Micrometer 指标。
此技术被认为是预览版。 在预览阶段,不保证向后兼容性和在生态系统中的存在。具体的改进可能需要更改配置或 API,并且成为稳定版本的计划正在进行中。欢迎在我们的邮件列表或我们的 GitHub 问题跟踪器中提供反馈。 有关可能的完整状态列表,请查看我们的常见问题解答条目。 |
本文档是 Quarkus 可观察性参考指南的一部分,该指南介绍了此组件和其他可观察性相关组件。
|
此扩展允许正常使用 Micrometer API,但指标由 OpenTelemetry 扩展处理。
例如,Micrometer 中的 @Timed
注解用于测量方法的执行时间
import io.micrometer.core.annotation.Timed;
//...
@Timed(name = "timer_metric")
public String timer() {
return "OK";
}
输出遥测数据由 OpenTelemetry SDK 处理,并由 quarkus-opentelemetry
扩展导出器使用 OTLP 协议发送。
当独立使用 quarkus-micrometer
和 quarkus-opentelemetry
扩展时,这减少了在同一应用程序中同时拥有独立的 Micrometer 注册表和 OpenTelemetry SDK 在内存中的开销。
OpenTelemetry SDK 将处理所有指标。可以使用 Micrometer 指标(手动或自动)和 OpenTelemetry 指标。所有这些都可通过此单个扩展获得。
OpenTelemetry 和 Micrometer 扩展的所有配置都可与 quarkus-micrometer-opentelemetry
一起使用。
此桥接器不仅仅是 Quarkiverse 中发现的简单 OTLP 注册表。在此扩展中,OpenTelemetry SDK 提供了一个基于 micrometer/micrometer-1.5
OpenTelemetry instrumentation library 的 Micrometer 注册表实现。
用法
如果您已经配置了 Quarkus 项目,则可以通过在项目根目录中运行以下命令将 quarkus-micrometer-opentelemetry
扩展添加到您的项目
quarkus extension add micrometer-opentelemetry
./mvnw quarkus:add-extension -Dextensions='micrometer-opentelemetry'
./gradlew addExtension --extensions='micrometer-opentelemetry'
这会将以下内容添加到您的构建文件中
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-micrometer-opentelemetry</artifactId>
</dependency>
implementation("io.quarkus:quarkus-micrometer-opentelemetry")
配置
当存在此扩展时,默认情况下会启用 Micrometer 以及 OpenTelemetry 跟踪、指标和日志。
默认情况下,用于 HTTP 服务器和 JVM 指标的 OpenTelemetry 指标自动检测已禁用,因为这些指标可以由 Micrometer 收集。
特定的自动 Micrometer 指标默认情况下均已禁用,可以通过设置启用,例如对于 JVM 指标
quarkus.micrometer.binder.jvm=true
在 application.properties
文件中。
对于此属性和您可以与此扩展一起使用的其他属性,请参考
Micrometer 和 OpenTelemetry 之间的指标差异
API 差异
每个框架生成的指标遵循不同的 API,并且映射不是 1:1 的。
当将 @Timed
注解与 Micrometer 一起使用时,会在 OpenTelemetry 端创建 2 个不同的指标 创建,一个是用于 max
值的 Gauge
,一个是 Histogram
。
Micrometer 中的 DistributionSummary
被转换为 Histogram
和用于 max
值的 DoubleGauge
。如果在创建 DistributionSummary
时将服务级别目标 (slo) 设置为 true
,则会为它们创建一个额外的直方图。
下表显示了两个框架之间的差异
Micrometer | OpenTelemetry |
---|---|
DistributionSummary |
|
具有 SLO 的 DistributionSummary |
|
LongTaskTimer |
|
Timer |
|
语义约定差异
这两个框架遵循不同的语义约定。OpenTelemetry 指标基于 OpenTelemetry 语义约定,并且仍在积极开发中(2025 年初)。Micrometer 指标约定格式已经存在很长时间,并且没有太大变化。
当在 application.properties
文件中设置这两个配置时
quarkus.micrometer.binder.jvm=true
quarkus.micrometer.binder.http-server.enabled=true
JVM 和 HTTP 服务器指标由 Micrometer 收集。
接下来是一些由 Micrometer 收集的指标的示例,以及 quarkus-micrometer-registry-prometheus
输出与此桥接器上的输出的比较。还提供了指向等效 OpenTelemetry 语义约定的链接以供参考,但目前未在此桥接器中使用。
Micrometer Meter | Quarkus Micrometer Prometheus 输出 | 此桥接器 OpenTelemetry 输出名称 | 相关的 OpenTelemetry 语义约定(未应用) |
---|---|---|---|
使用 @Timed 拦截器。 |
method.timed (Histogram), method.timed.max (DoubleGauge) |
N/A |
|
使用 @Counted 拦截器。 |
method.counted (DoubleSum) |
N/A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N/A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N/A |
|
|
|
|
如果某些指标不包含数据,则可能会从输出中遗漏。 |
查看输出
Grafana-OTel-LGTM 开发服务
您可以使用 Grafana-OTel-LGTM 开发服务。
此开发服务包括用于可视化数据的 Grafana、用于存储日志的 Loki、用于存储跟踪的 Tempo 和用于存储指标的 Prometheus。它还提供了一个 OTel 收集器来接收数据
日志记录导出器
您可以通过在 application.properties
文件中将导出器设置为 logging
将所有指标输出到控制台
quarkus.otel.metrics.exporter=logging (1)
quarkus.otel.metric.export.interval=10000ms (2)
1 | 将导出器设置为 logging 。通常您不需要设置此项。默认值为 cdi 。 |
2 | 设置导出指标的间隔。默认值为 1m ,对于调试来说太长了。 |
还将此依赖项添加到您的项目中
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-logging</artifactId>
</dependency>