全站资源开放下载,感谢广大网友的支持
链接失效请移步职业司平台
非盈利平台

非盈利平台

只为分享一些优质内容

Java帮帮-微信公众号

Java帮帮-微信公众号

将分享做到极致

微信小程序

微信小程序

更方便的阅读

职业司微信公众号

职业司微信公众号

实时动态通知

安卓APP

安卓APP

我们从此不分开

程序员生活志-公众号

程序员生活志-公众号

程序员生活学习圈,互联网八卦黑料

支付宝赞助-Java帮帮社区
微信赞助-Java帮帮社区

Grafana+Prometheus系统监控之SpringBoot【数据采集监控5】

28
发表时间:2018-11-08 11:32来源:Java帮帮-微信公众号

前言

前一段时间使用SpringBoot创建了一个webhook项目,由于近期项目中也使用了不少SpringBoot相关的项目,趁着周末,配置一下使用prometheus监控微服务Springboot。

项目配置

引入坐标

<!-- Exposition spring_boot --><dependency>    <groupId>io.prometheus</groupId>    <artifactId>simpleclient_spring_boot</artifactId>    <version>0.1.0</version></dependency><!-- Hotspot JVM metrics --><dependency>    <groupId>io.prometheus</groupId>    <artifactId>simpleclient_hotspot</artifactId>    <version>0.1.0</version></dependency><!-- Exposition servlet --><dependency>    <groupId>io.prometheus</groupId>    <artifactId>simpleclient_servlet</artifactId>    <version>0.1.0</version></dependency>

配置Application

@SpringBootApplication@EnablePrometheusEndpoint@EnableSpringBootMetricsCollectorpublicclassApplication{    privatestaticfinal Logger logger = LoggerFactory.getLogger(Application.class);    publicstaticvoidmain(String[] args)throws InterruptedException {        SpringApplication.run(Application.class, args);        logger.info("项目启动 ");    }}

配置MonitoringConfig

@ConfigurationclassMonitoringConfig{    @Bean    SpringBootMetricsCollector springBootMetricsCollector(Collection<PublicMetrics> publicMetrics){        SpringBootMetricsCollector springBootMetricsCollector = new SpringBootMetricsCollector(publicMetrics);        springBootMetricsCollector.register();        return springBootMetricsCollector;    }    @Bean    ServletRegistrationBean servletRegistrationBean(){        DefaultExports.initialize();        returnnew ServletRegistrationBean(new MetricsServlet(), "/prometheus");    }}

配置Interceptor

RequestCounterInterceptor(计数):

publicclassRequestCounterInterceptorextendsHandlerInterceptorAdapter{    // @formatter:off    // Note (1)    privatestaticfinal Counter requestTotal = Counter.build()         .name("http_requests_total")         .labelNames("method", "handler", "status")         .help("Http Request Total").register();    // @formatter:on    @Override    publicvoidafterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e)throws Exception {         // Update counters         String handlerLabel = handler.toString();         // get short form of handler method name    if (handler instanceof HandlerMethod) {             Method method = ((HandlerMethod) handler).getMethod();              handlerLabel = method.getDeclaringClass().getSimpleName() + "." + method.getName();         }         // Note (2)         requestTotal.labels(request.getMethod(), handlerLabel, Integer.toString(response.getStatus())).inc();    }}

RequestTimingInterceptor(统计请求时间):

package com.itstyle.webhook.interceptor;import java.lang.reflect.Method;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import io.prometheus.client.Summary;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;publicclassRequestTimingInterceptorextendsHandlerInterceptorAdapter{    privatestaticfinal String REQ_PARAM_TIMING = "timing";    // @formatter:off// Note (1)    privatestaticfinal Summary responseTimeInMs = Summary         .build()         .name("http_response_time_milliseconds")         .labelNames("method", "handler", "status")         .help("Request completed time in milliseconds")         .register();    // @formatter:on    @Override    publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {         // Note (2)         request.setAttribute(REQ_PARAM_TIMING, System.currentTimeMillis());         returntrue;    }   @Override    publicvoidafterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {         Long timingAttr = (Long) request.getAttribute(REQ_PARAM_TIMING);         long completedTime = System.currentTimeMillis() - timingAttr;         String handlerLabel = handler.toString();         // get short form of handler method nameif (handler instanceof HandlerMethod) {              Method method = ((HandlerMethod) handler).getMethod();              handlerLabel = method.getDeclaringClass().getSimpleName() + "." + method.getName();         }             // Note (3)       responseTimeInMs.labels(request.getMethod(), handlerLabel,                                Integer.toString(response.getStatus())).observe(completedTime);    }}

配置Controller

主要是为了测试拦截器的效果

@RestControllerpublicclassHomeController{     privatestaticfinal Logger logger = LoggerFactory.getLogger(HomeController.class);      @RequestMapping("/endpointA")     publicvoidhandlerA()throws InterruptedException {          logger.info("/endpointA");          Thread.sleep(RandomUtils.nextLong(0, 100));     }      @RequestMapping("/endpointB")     publicvoidhandlerB()throws InterruptedException {          logger.info("/endpointB");          Thread.sleep(RandomUtils.nextLong(0, 100));     }}

以上都配置完成后启动项目即可。

配置Prometheus

vi prometheus.yml

 - job_name: webhook

  metrics_path: '/prometheus'

  static_configs:

   - targets: ['localhost:8080']

    labels:

   instance: webhook

保存后重新启动Prometheus即可。

访问http://ip/targets 服务State 为up说明配置成功,查阅很多教程都说需要配置 spring.metrics.servo.enabled=false,否则在prometheus的控制台的targets页签里,会一直显示此endpoint为down状态,然貌似并没有配置也是ok的。

2.png


访问http://ip/graph 测试一下效果

1.png

配置Grafana

如图所示:

3.png


Java帮帮学习群生态

Java帮帮学习群生态

总有一款能帮到你

Java学习群

Java学习群

与大牛一起交流

大数据学习群

大数据学习群

在数据中成长

九点编程学习群

九点编程学习群

深夜九点学编程

python学习群

python学习群

人工智能,爬虫

测试学习群

测试学习群

感受测试的魅力

Java帮帮生态承诺

Java帮帮生态承诺

一直坚守,不负重望

初心
勤俭
诚信
正义
分享
友链交换:加帮主QQ2524138991 留言即可 24小时内答复  
业司
满吉教育资讯
会员登录
获取验证码
登录
登录
我的资料
留言
回到顶部