Java应用监控:从A到Z的指标与告警

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么Java应用监控是基础

现代Java应用是一个复杂的分布式系统。没有监控,你就是在盲目工作:响应速度下降、内存泄漏或突然的OutOfMemoryError可能在用户投诉之前都未被发现。合理配置的指标和告警监控不仅能让你快速响应事件,还能在问题变得严重之前预测瓶颈。

在本文中,我们将介绍完整的流程:从收集基本的JVM指标到在Prometheus中配置告警,以及在Grafana中进行可视化。所有代码示例均使用Java编写,并采用流行的Micrometer库。



1. Java应用的关键指标

监控始于选择正确的指标。它们可以分为三组:JVM指标、业务指标和基础设施指标。



1.1. JVM指标

这些指标显示Java虚拟机的状态。其中最重要的有:

  • Heap memory usage — 堆内存使用情况(已用/最大内存)。急剧增长可能表明存在内存泄漏。
  • GC pauses — 垃圾回收的频率和持续时间。长时间暂停(超过1秒)是问题的征兆。
  • Thread states — 处于RUNNABLE、BLOCKED、WAITING状态的线程数量。大量BLOCKED线程可能表示存在锁竞争。
  • CPU usage — JVM进程的CPU负载。


1.2. 业务指标

它们反映应用程序的业务逻辑。例如:

  • 每分钟处理的订单数量。
  • 外部API的响应时间。
  • 验证错误的数量。


1.3. 基础设施指标

  • 磁盘、网络、主机内存的使用情况。
  • 数据库连接状态(连接池)。
  • 消息队列的延迟(Kafka、RabbitMQ)。


2. 指标收集工具:Micrometer + Prometheus

对于Java应用,事实上的标准库是Micrometer。它为各种监控系统(Prometheus、Datadog、Graphite)提供了一个统一的门面。结合Prometheus(指标存储)和Grafana(可视化),你将获得一个强大且免费的生态系统。



2.1. 在Spring Boot中集成Micrometer

如果你使用Spring Boot 2.x或3.x,请在pom.xml中添加依赖:

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

之后,Spring Boot Actuator将自动启用/actuator/prometheus端点,该端点将以Prometheus格式提供指标。



2.2. 创建自定义指标

假设你想统计方法调用成功和失败的次数。创建一个计数器:

import io.micrometer.core.instrument.MeterRegistry;import io.micrometer.core.instrument.Counter;import org.springframework.stereotype.Service;

@Servicepublic class OrderService {

private final Counter successCounter; private final Counter errorCounter;

public OrderService(MeterRegistry registry) { this.successCounter = Counter.builder("orders.success") .description("Number of successful orders") .register(registry); this.errorCounter = Counter.builder("orders.error") .description("Number of failed orders") .register(registry); }

public void processOrder(String orderId) { try { // 订单处理逻辑 successCounter.increment(); } catch (Exception e) { errorCounter.increment(); throw e; } }}

在Prometheus中,该指标将显示为orders_succ

博客

书籍推荐