Springboot使用 prometheus监控
来源:互联网 发布:微软办公软件 win10 编辑:程序博客网 时间:2024/06/06 03:39
添加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和端口
- 可参考:http://blog.csdn.net/fly910905/article/details/78618534
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://blog.csdn.net/zl1zl2zl3/article/details/75045005?locationNum=9&fps=1
http://localhost:9090/targets
多次访问 http://localhost:8888/web项目名/hello,然后在prometheus控制台查看相关metrics信息,couter_all,2个页签:Graph,Console
参考来源:http://blog.csdn.net/ericprotectearth/article/details/78581312
阅读全文
1 0
- Springboot使用 prometheus监控
- Prometheus监控工具初使用
- 使用Prometheus监控服务器性能
- 使用prometheus + Hawkular 监控你的应用
- 使用Python和Flask编写Prometheus监控
- 使用Prometheus+Grafana 监控MySQL/MONGODB
- springboot集成prometheus
- 使用Prometheus监控Kafka logsize(kafka-logsize-exporter)
- Prometheus 系统监控方案
- Prometheus 监控Rabbitmq
- kubernetes监控--Prometheus
- Prometheus 系统监控方案
- 监控利器之 Prometheus
- prometheus监控方案
- Prometheus监控 - Alertmanager报警模块
- Prometheus监控 - 查询表达式篇
- 基于prometheus监控k8s集群
- Prometheus 系统监控方案 一
- angular 使用 ui-router 设计网页
- 机器学习3-无监督学习
- 实时异常预警
- 爱运动管理系统使用指南
- 优达机器学习:误差原因
- Springboot使用 prometheus监控
- python网络编程--IO多路复用之epoll
- 【数据结构】线性表 Python 实现
- Java环境变量配置&解决版本不一致问题
- COCOS2DX STUIDO clone错误
- CCF CSP 201709-1 打酱油
- 人工智能绪论
- 友好 RxJava2.x 源码解析(一)基本订阅流程
- (一)基础函数