1. 引言

在现代应用开发中,监控和可观测性是不可或缺的环节,尤其在云原生和微服务架构中。Quarkus 作为构建 Java 应用的热门选择,以其轻量级和高性能著称。将 Micrometer 集成到 Quarkus 应用中,能为监控应用性能和行为提供强大解决方案

本教程将深入探讨在 Quarkus 中使用 Micrometer 的高级监控技巧。

2. Maven 依赖

要在 Quarkus 中使用 Micrometer,需添加以下依赖:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-micrometer-registry-prometheus</artifactId>
    <version>3.11.0</version>
</dependency>

该依赖提供了代码检测所需的接口和类,并包含特定的注册中心实现。其中 micrometer-registry-prometheus 是常用选择,它实现了 Prometheus REST 接口,用于在 Quarkus 应用中暴露指标。
此依赖会自动引入核心的 quarkus-micrometer 依赖,除了自定义指标注册中心外,还提供了 JVM、线程池和 HTTP 请求的现成指标。

3. 计数器

现在我们已了解如何集成 Micrometer,接下来实现自定义指标。首先添加基础计数器,跟踪各种操作的调用次数。

我们的 Quarkus 应用实现了一个简单接口,用于判断字符串是否为回文(如 "radar" 或 "level")。我们希望统计回文检查的调用次数。

创建 Micrometer 计数器:

@Path("/palindrome")
@Produces("text/plain")
public class PalindromeResource {

    private final MeterRegistry registry;

    public PalindromeResource(MeterRegistry registry) {
        this.registry = registry;
    }

    @GET
    @Path("check/{input}")
    public boolean checkPalindrome(String input) {
        registry.counter("palindrome.counter").increment();
        boolean result = internalCheckPalindrome(input);
        return result;
    }

    private boolean internalCheckPalindrome(String input) {
        int left = 0;
        int right = input.length() - 1;

        while (left < right) {
            if (input.charAt(left) != input.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

通过 GET 请求 */palindrome/check/{input}* 调用回文检查,其中 input 是待检测字符串。

实现计数器的关键步骤

  1. ✅ 注入 MeterRegistryPalindromeResource
  2. ✅ 每次检查前调用 increment() 增加计数
  3. ✅ 多次调用后访问 */q/metrics* 接口查看指标
  4. ✅ 在指标中找到 palindrome_counter_total 条目获取调用次数

4. 计时器

我们还可以跟踪回文检查的耗时。为此,在 PalindromeResource 中添加 Micrometer 计时器

@GET
@Path("check/{input}")
public boolean checkPalindrome(String input) {
    Timer.Sample sample = Timer.start(registry);
    boolean result = internalCheckPalindrome(input);
    sample.stop(registry.timer("palindrome.timer"));
    return result;
}

实现步骤:

  1. 启动计时器创建 Timer.Sample 跟踪操作耗时
  2. 执行 internalCheckPalindrome() 方法
  3. 停止计时器并记录耗时

通过计时器,我们能监控每次回文检查的耗时,快速定位性能瓶颈并优化应用效率

Micrometer 遵循 Prometheus 约定,将计时单位转换为秒并包含在指标名称中。多次调用接口后,指标端点会显示:

  • palindrome_timer_seconds_count – 调用次数
  • palindrome_timer_seconds_sum – 总耗时
  • palindrome_timer_seconds_max – 衰减区间内的最大耗时

⚠️ 通过 sum/count 可计算平均耗时,评估回文检测性能。

5. 仪表盘

仪表盘是表示可任意上下波动的单一数值的指标。它适合监控实时变化的值(如队列大小、线程数),帮助快速响应动态变化。

假设我们需要将所有检查过的字符串暂存内存,后续存入数据库或发送到其他服务。此时可用仪表盘监控内存使用情况。

在构造函数中初始化仪表盘,并声明空列表存储输入:

private final LinkedList<String> list = new LinkedList<>();

public PalindromeResource(MeterRegistry registry) {
    this.registry = registry;
    registry.gaugeCollectionSize("palindrome.list.size", Tags.empty(), list);
}

每次收到输入时添加元素,通过 palindrome_list_size 查看仪表盘值:

list.add(input);

仪表盘提供了程序状态的实时快照。我们还可以模拟清空列表并重置仪表盘:

@DELETE
@Path("empty-list")
public void emptyList() {
    list.clear();
}

这体现了仪表盘的实时性:清空列表后,palindrome_list_size 立即归零,直到再次检测回文。

6. 总结

在 Quarkus 中使用 Micrometer 的过程中,我们掌握了:

  • ✅ 用计数器跟踪操作频率
  • ✅ 用计时器测量操作耗时
  • ✅ 用仪表盘监控实时指标

这些工具为应用性能提供了宝贵洞察,助力我们做出优化决策。完整实现代码可在 GitHub 查看。


原始标题:A Guide to Micrometer in Quarkus | Baeldung