Java中Prometheus自定义注解监控的核心是Spring AOP结合simpleclient,通过@MonitorMetric注解标记方法,AOP切面自动创建Counter和Histogram指标并动态打点,集成Actuator后访问/actuator/prometheus暴露指标。

Java 中 Prometheus 自定义注解实现业务指标监控打点,核心是结合 Spring AOP + Prometheus 官方客户端(simpleclient),通过注解自动埋点,避免在业务代码中硬编码 Counter、Gauge 等指标操作。
定义自定义注解
声明一个运行时保留、可作用于方法的注解,用于标记需要监控的方法:
- 使用
@Target(ElementType.METHOD)和@Retention(RetentionPolicy.RUNTIME) - 可选添加属性,比如指标名前缀、标签键值(如
businessType)、是否记录响应时间等
示例:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MonitorMetric {
String value() default ""; // 指标名前缀,如 "order_create"
String[] labels() default {}; // 静态标签,如 {"env", "prod"}
boolean recordDuration() default true;
boolean countSuccessOnly() default false;
}
编写 AOP 切面处理埋点逻辑
利用 Spring AOP 拦截带注解的方法,自动创建并更新 Prometheus 指标:
立即学习“Java免费学习笔记(深入)”;
- 用
Counter统计调用次数(成功/失败/总次数) - 用
Summary或Histogram记录响应耗时(推荐Histogram支持分位数计算) - 从注解提取配置,动态构建指标名和标签(如加上方法名、异常类型等)
- 注意线程安全:Prometheus 的
CollectorRegistry是线程安全的,但需复用同一注册实例(通常用 Spring 管理的单例)
关键代码片段:
@Aspect
@Component
public class MetricAspect {
private static final Histogram REQUEST_DURATION = Histogram.build()
.name("business_request_duration_seconds")
.help("Request duration in seconds.")
.labelNames("method", "status", "business_type")
.register();
@Around("@annotation(monitor)")
public Object monitor(ProceedingJoinPoint joinPoint, MonitorMetric monitor) throws Throwable {
String method = joinPoint.getSignature().toShortString();
String businessType = StringUtils.defaultString(monitor.value(), "unknown");
long start = System.nanoTime();
try {
Object result = joinPoint.proceed();
Histogram.Timer timer = REQUEST_DURATION.labels(method, "success", businessType).startTimer();
timer.observeDuration();
return result;
} catch (Exception e) {
Histogram.Timer timer = REQUEST_DURATION.labels(method, "error", businessType).startTimer();
timer.observeDuration();
throw e;
}
}
}
集成到 Spring Boot 并暴露 /actuator/prometheus
确保项目引入必要依赖:
-
io.micrometer:micrometer-registry-prometheus(推荐,与 Spring Boot Actuator 原生集成) - 或直接使用
io.prometheus:simpleclient_spring_boot(旧方式,已不推荐)
启用 Actuator 端点:
management.endpoints.web.exposure.include=prometheus,health,info management.endpoint.prometheus.scrape=true
此时访问 /actuator/prometheus 即可看到自定义指标,例如:
business_request_duration_seconds_count{method="createOrder",status="success",business_type="order",} 127.0
business_request_duration_seconds_sum{method="createOrder",status="success",business_type="order",} 4.235
进阶建议:支持动态标签与业务上下文
真实场景中,标签常需运行时获取(如租户 ID、用户角色),可在切面中结合 ThreadLocal 或 MDC 提取:
- 在 Web Filter 或拦截器中将业务字段存入
MDC(如MDC.put("tenantId", "t123")) - AOP 中读取
MDC.get("tenantId"),作为额外 label 加入指标 - 避免在高频方法中频繁创建新
Histogram.Child实例,应复用.labels(...)返回的 child 对象(Prometheus 客户端内部缓存)
也可封装一个 MetricRegistry 工具类,统一管理指标生命周期和命名规范,降低 AOP 切面复杂度。


















