业务自定义指标埋点核心是让业务代码主动产出prometheus可抓取数据,路径为:java定义指标→actuator暴露→prometheus拉取→grafana可视化;需按counter、gauge、histogram类型精准选型,推荐micrometer+actuator快速实现,并可用aop无侵入埋点。

服务器监控中配置业务自定义指标埋点,关键不是“配服务器”,而是让业务代码主动产出可被 Prometheus 抓取的指标数据。核心路径是:在 Java(或其他语言)应用中定义业务维度的指标 → 通过 Actuator 暴露 → Prometheus 定时拉取 → Grafana 可视化。
明确要监控的业务指标类型
先想清楚你要监控什么,再选对应指标类型:
- Counter(计数器):适合累计类指标,比如“今日订单创建总数”“支付失败次数”。值只增不减,重启归零。
- Gauge(瞬时值):适合当前状态类指标,比如“当前待处理订单数”“缓存命中率实时值”。可升可降。
- Histogram(直方图):推荐用于响应时间、耗时分布,能计算 P90/P95 延迟,比 Summary 更适合 Prometheus 的拉取模型。
Spring Boot 中用 Micrometer 快速埋点
无需手写 Prometheus client,Micrometer 是 Spring 生态的标准抽象层,自动对接 Prometheus:
- 添加依赖:
spring-boot-starter-actuator和micrometer-registry-prometheus - 在
application.yml中启用指标暴露:management.endpoints.web.exposure.include: prometheus management.metrics.export.prometheus.enabled: true management.metrics.tags.application: ${spring.application.name} - 在业务方法里注入
MeterRegistry,直接注册指标:@Resource private MeterRegistry registry; <p>@GetMapping("/order/create") public String createOrder() { // 记录调用次数(带标签区分成功/失败) Counter.builder("business.order.create.total") .tag("status", "success") .register(registry) .increment();</p><p>// 记录耗时(Histogram 自动分桶) Timer.builder("business.order.create.duration") .register(registry) .record(() -> { /<em> 执行业务逻辑 </em>/ });</p><p>return "ok"; }</p>
用 AOP 实现无侵入式自动埋点
避免每个接口都写重复代码,定义一个 @MonitorMetric 注解 + 切面统一处理:
- 注解示例(支持自定义前缀、是否统计耗时、是否只计成功):
@Target(METHOD) @Retention(RUNTIME) public @interface MonitorMetric { String value() default ""; boolean recordDuration() default true; boolean countSuccessOnly() default false; } - AOP 切面自动创建 Counter 和 Histogram,根据方法名、异常类型动态打标,例如:
metricName = "business." + annotation.value() + ".invocations" labels = ["method", "exception", "status"] - 切面内用
Timer.start()+timer.record()统计耗时,用counter.increment()统计调用,失败时打status="error"标签。
验证与接入 Prometheus
完成埋点后,三步确认是否生效:
- 访问
http://localhost:8080/actuator/prometheus,搜索你的指标名(如business_order_create_total),看到数值即表示埋点成功; - 检查 Prometheus 的 targets 页面,确认你的服务实例状态为 UP;
- 在 Prometheus 表达式浏览器中输入
rate(business_order_create_total[1m])或histogram_quantile(0.95, rate(business_order_create_duration_seconds_bucket[1m])),看能否查到数据。











