Springboot使用 prometheus监控

添加prometheus的Maven依赖:

<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_spring_boot</artifactId>
    <version>0.0.26</version>
</dependency>

启动类增加prometheus注解

package com.newcapec;
import io.prometheus.client.spring.boot.EnablePrometheusEndpoint;
import io.prometheus.client.spring.boot.EnableSpringBootMetricsCollector;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * @version V1.0
 * @Title: 应用主类
 * @ClassName: com.newcapec.SpringbootdemoApplication.java
 * @Description:
 * @Copyright 2016-2017  - Powered By 研发中心
 * @author: fly
 * @date:2017-03-15 8:01
 */
@SpringBootApplication
@EnablePrometheusEndpoint
@EnableSpringBootMetricsCollector
@MapperScan("com.newcapec.dao.mapper")
public class SpringbootdemoApplication {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    public static void main(String[] args) {
        SpringApplication.run(SpringbootdemoApplication.class, args);
       /* SpringApplicationBuilder builder = new SpringApplicationBuilder(SpringbootdemoApplication.class);
        //修改Banner的模式为OFF
        builder.bannerMode(Banner.Mode.OFF).run(args);*/
    }
}

配置文件设置

在application.xml里设置属性:spring.metrics.servo.enabled=false, 去掉重复的metrics,不然在prometheus的控制台的targets页签里,会一直显示此endpoint为down状态。

#应用可视化监控
management.security.enabled=false
spring.metrics.servo.enabled=false

配置prometheus.yml,指定SpringBoot应用的ip和端口

 static_configs:
      - targets: ['IP:端口号']

自定义prometheus注解

package com.newcapec.config.annotation;
import java.lang.annotation.*;
 
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PrometheusMetrics {
    /**
     *  默认为空,程序使用method signature作为Metric name
     *  如果name有设置值,使用name作为Metric name
     * @return
     */
    String name() default "";
}

自定义prometheus切面

package com.newcapec.config.aspect;
import com.newcapec.config.annotation.PrometheusMetrics;
import groovy.util.logging.Slf4j;
import io.prometheus.client.Counter;
import io.prometheus.client.Histogram;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
 
@Aspect
@Component
@Slf4j
public class PrometheusMetricsAspect {
    private static final Counter requestTotal = Counter.build().name("couter_all").labelNames("api").help
            ("total request couter of api").register();
    private static final Counter requestError = Counter.build().name("couter_error").labelNames("api").help
            ("response Error couter of api").register();
    private static final Histogram histogram = Histogram.build().name("histogram_consuming").labelNames("api").help
            ("response consuming of api").register();
    // 自定义Prometheus注解的全路径
    @Pointcut("@annotation(com.newcapec.config.annotation.PrometheusMetrics)")
    public void pcMethod() {
    }
    @Around(value="pcMethod() && @annotation(annotation)")
    public Object MetricsCollector(ProceedingJoinPoint joinPoint, PrometheusMetrics annotation) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        PrometheusMetrics prometheusMetrics = methodSignature.getMethod().getAnnotation(PrometheusMetrics.class);
        if (prometheusMetrics != null) {
            String name;
            if (StringUtils.isNotEmpty(prometheusMetrics.name()) ){
                name = prometheusMetrics.name();
            }else{
                HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                        .getRequest();
                name = request.getRequestURI();
            }
            requestTotal.labels(name).inc();
            Histogram.Timer requestTimer = histogram.labels(name).startTimer();
            Object object;
            try {
                object = joinPoint.proceed();
            } catch (Exception e) {
                requestError.labels(name).inc();
                throw e;
            } finally {
                requestTimer.observeDuration();
            }
            return object;
        } else {
            return joinPoint.proceed();
        }
    }
}

被监控的方法上添加–自定义prometheus注解

@RequestMapping(value ="/hello", method = RequestMethod.GET)
@ResponseBody
@PrometheusMetrics
public String index() {
     return "Hello World";
}

prometheus的监控页面

http://localhost:9090/targets

多次访问 http://localhost:8888/web项目名/hello,然后在prometheus控制台查看相关metrics信息,couter_all,2个页签:Graph,Console

参考来源:http://blog.csdn.net/zl1zl2zl3/article/details/75045005?locationNum=9&fps=1

参考来源:http://blog.csdn.net/ericprotectearth/article/details/78581312

作者:琦彦
来源:CSDN
原文:https://blog.csdn.net/fly910905/article/details/78618969
版权声明:本文为博主原创文章,转载请附上博文链接!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享