SpringBoot集成Prometheus-自定义指标

引入

这里首先说以下整体大概的思路,第一步当然是引入对应的 SDK,第二步则是添加配置信息、定义自定义指标,并进行注册,接下来的第三步则是指标根据具体业务的处理逻辑,那么最后一步就是在 prometheus 服务中增加 job 配置,最终在 grafana 中展示自定义指标。


实操

引入 SDK

1
2
3
4
5
6
7
8
9
10
11
<!-- Micrometer Prometheus registry  -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.micrometer/micrometer-registry-prometheus -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.9.0</version>
</dependency>

配置信息

1
2
3
4
5
6
management.endpoints.enabled-by-default=false
management.endpoint.health.enabled=true
management.endpoint.metrics.enabled=true
management.endpoint.prometheus.enabled=true
management.endpoints.web.exposure.include=health,prometheus,metrics
management.metrics.tags.application=${spring.application.name}

注册自定义指标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Component
public class ContentListener implements ApplicationListener<ContextRefreshedEvent> {

private Logger logger = LoggerFactory.getLogger(ContentListener.class);

private Counter counter;

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
logger.info("start register prometheus counter");
CollectorRegistry collectorRegistry = event.getApplicationContext().getBean(CollectorRegistry.class);
counter = Counter.build().name("xx_counter").labelNames("label1", "label2").help("xx counter help").register(collectorRegistry);
logger.info("end register prometheus counter");
}

private Counter getCounter() {
return this.counter;
}
}

指标业务逻辑

  1. 自定义指标注解

    1
    2
    3
    4
    5
    @Documented
    @Retention(RUNTIME)
    @Target(METHOD)
    public @interface Counter {
    }
  2. 注解实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    @Aspect
    @Component
    public class CounterAspect {

    private static final Logger logger = LoggerFactory.getLogger(CounterAspect.class);

    @Autowired
    private ContentListener contentListener;

    @Pointcut("execution(* com.example.controller.*.*(..)) && @annotation(com.example.annotation.Counter)")
    private void cut() { }

    @Around("cut()")
    public Object advice(ProceedingJoinPoint pjp) throws Throwable {
    Object retValue = pjp.proceed();

    try {
    // 记录结果指标
    contentListener.getCounter().labels("label1", "label2").inc();
    } catch (Exception e) {
    logger.error("error", e);
    }
    return retValue;
    }
    }

Prometheus Server 中增加 Job 配置

1
2
3
4
5
6
job_name: 'springboot-demo'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
metrics_path: /actuator/prometheus
static_configs:
targets: ['localhost:8080']

接着重新启动 prometheus

1
./prometheus –config.file=prometheus.yml

grafana 展示自定义指标

  1. 检查 curl http://localhost:8080/actuator/prometheus 是否存在自定义指标。
  2. grafana 中配置 prometheus server 数据源。
  3. 在面板中配置对应的指标和需要展示的图例。

总结


个人备注

此博客内容均为作者学习所做笔记,侵删!
若转作其他用途,请注明来源!