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