编辑此页面

Micrometer 和 OpenTelemetry 扩展

此扩展为 Quarkus 应用程序提供 Micrometer 和 OpenTelemetry 的支持。它通过整合两个扩展以及一个桥接器来简化集成,该桥接器支持通过 OpenTelemetry 发送 Micrometer 指标。

此技术被认为是预览版。

预览阶段,不保证向后兼容性和在生态系统中的存在。具体的改进可能需要更改配置或 API,并且成为稳定版本的计划正在进行中。欢迎在我们的邮件列表或我们的 GitHub 问题跟踪器中提供反馈。

有关可能的完整状态列表,请查看我们的常见问题解答条目

本文档是 Quarkus 可观察性参考指南的一部分,该指南介绍了此组件和其他可观察性相关组件。

  • 此扩展自 Quarkus 3.19 版本起可用。

  • 有关 Micrometer 扩展的详细信息,请参阅Micrometer 指南

  • 有关 OpenTelemetry 扩展的信息,请参阅OpenTelemetry 指南

此扩展允许正常使用 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-micrometerquarkus-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 扩展添加到您的项目

CLI
quarkus extension add micrometer-opentelemetry
Maven
./mvnw quarkus:add-extension -Dextensions='micrometer-opentelemetry'
Gradle
./gradlew addExtension --extensions='micrometer-opentelemetry'

这会将以下内容添加到您的构建文件中

pom.xml
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-micrometer-opentelemetry</artifactId>
</dependency>
build.gradle
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 的。

一个基本的 API 差异是 Micrometer 使用 Timer,而 OpenTelemetry 使用 Histogram 来记录延迟(执行时间)指标和事件的频率。

当将 @Timed 注解与 Micrometer 一起使用时,会在 OpenTelemetry 端创建 2 个不同的指标 创建,一个是用于 max 值的 Gauge,一个是 Histogram

Micrometer 中的 DistributionSummary 被转换为 Histogram 和用于 max 值的 DoubleGauge。如果在创建 DistributionSummary 时将服务级别目标 (slo) 设置为 true,则会为它们创建一个额外的直方图。

下表显示了两个框架之间的差异

Micrometer OpenTelemetry

DistributionSummary

<Metric name> (Histogram), <Metric name>.max (DoubleGauge)

具有 SLO 的 DistributionSummary

<Metric name> (Histogram), <Metric name>.max (DoubleGauge), <Metric name>.histogram (DoubleGauge)

LongTaskTimer

<Metric name>.active (ObservableLongUpDownCounter), <Metric name>.duration (ObservableDoubleUpDownCounter)

Timer

<Metric name> (Histogram), <Metric name>.max (ObservableDoubleGauge)

语义约定差异

这两个框架遵循不同的语义约定。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

http.server.active.requests (Gauge)

http_server_active_requests (Gauge)

http.server.active.requests (DoubleGauge)

http.server.active_requests (UpDownCounter)

http.server.requests (Timer)

http_server_requests_seconds_count, http_server_requests_seconds_sum, http_server_requests_seconds_max (Gauge)

http.server.requests (Histogram), http.server.requests.max (DoubleGauge)

http.server.request.duration (Histogram)

http.server.bytes.read (DistributionSummary)

http_server_bytes_read_count, http_server_bytes_read_sum , http_server_bytes_read_max (Gauge)

http.server.bytes.read (Histogram), http.server.bytes.read.max (DoubleGauge)

http.server.request.body.size (Histogram)

http.server.bytes.write (DistributionSummary)

http_server_bytes_write_count, http_server_bytes_write_sum , http_server_bytes_write_max (Gauge)

http.server.bytes.write (Histogram), http.server.bytes.write.max (DoubleGauge)

http.server.response.body.size (Histogram)

http.server.connections (LongTaskTimer)

http_server_connections_seconds_active_count, http_server_connections_seconds_duration_sum http_server_connections_seconds_max (Gauge)

http.server.connections.active (LongSum), http.server.connections.duration (DoubleGauge)

N/A

jvm.threads.live (Gauge)

jvm_threads_live_threads (Gauge)

jvm.threads.live (DoubleGauge)

jvm.threads.live (UpDownCounter)

jvm.threads.started (FunctionCounter)

jvm_threads_started_threads_total (Counter)

jvm.threads.started (DoubleSum)

jvm.threads.live (UpDownCounter)

jvm.threads.daemon (Gauge)

jvm_threads_daemon_threads (Gauge)

jvm.threads.daemon (DoubleGauge)

jvm.threads.live (UpDownCounter)

jvm.threads.peak (Gauge)

jvm_threads_peak_threads (Gauge)

jvm.threads.peak (DoubleGauge)

N/A

jvm.threads.states (每个状态一个 Gauge)

jvm_threads_states_threads (Gauge)

jvm.threads.states (DoubleGauge)

jvm.threads.live (UpDownCounter)

如果某些指标不包含数据,则可能会从输出中遗漏。

查看输出

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>

相关内容