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
是待检测字符串。
实现计数器的关键步骤:
- ✅ 注入
MeterRegistry
到PalindromeResource
- ✅ 每次检查前调用
increment()
增加计数 - ✅ 多次调用后访问
*/q/metrics*
接口查看指标 - ✅ 在指标中找到
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;
}
实现步骤:
- 启动计时器创建
Timer.Sample
跟踪操作耗时 - 执行
internalCheckPalindrome()
方法 - 停止计时器并记录耗时
通过计时器,我们能监控每次回文检查的耗时,快速定位性能瓶颈并优化应用效率。
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 查看。