提交 b8ab0d18 authored 作者: huangxingyao's avatar huangxingyao

新增指标监控

上级 98f2f924
......@@ -19,6 +19,25 @@
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/io.prometheus/simpleclient_common -->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_common</artifactId>
<version>0.7.0</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
......
package com.bookinfo;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
......@@ -9,7 +11,7 @@ import org.springframework.web.client.RestTemplate;
import java.time.Duration;
@SpringBootApplication
public class ProductpageApplication {
public class ProductpageApplication {
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder
......@@ -20,4 +22,11 @@ public class ProductpageApplication {
public static void main(String[] args) {
SpringApplication.run(ProductpageApplication.class, args);
}
@Bean(value = "meterRegistryCustomizer")
MeterRegistryCustomizer<MeterRegistry> meterRegistryCustomizer() {
return meterRegistry -> meterRegistry.config()
.commonTags("application", "springboot-app");
}
}
package com.bookinfo.config;
import com.bookinfo.prometheus.PrometheusMetricsInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* @author: Bowen huang
* @date: 2021/03/07
*/
@Configuration
public class AppConfig extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new PrometheusMetricsInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
\ No newline at end of file
package com.bookinfo.prometheus;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.prometheus.client.CollectorRegistry;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author: Bowen huang
* @date: 2021/03/07
*/
@Component
public class InitPrometheus implements ApplicationListener<ContextRefreshedEvent> {
@Resource
PrometheusMeterRegistry meterRegistry;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
new MyMetrics();
CollectorRegistry prometheusRegistry = meterRegistry.getPrometheusRegistry();
prometheusRegistry.register(MyMetrics.requestCounter);
prometheusRegistry.register(MyMetrics.inprogressRequests);
prometheusRegistry.register(MyMetrics.requestLatencyHistogram);
prometheusRegistry.register(MyMetrics.requestLatency);
}
}
package com.bookinfo.prometheus;
import io.prometheus.client.Counter;
import io.prometheus.client.Gauge;
import io.prometheus.client.Histogram;
import io.prometheus.client.Summary;
public class MyMetrics {
/**
* 计数器可以用于记录只会增加不会减少的指标类型,比如记录应用请求的总量(http_requests_total),
* cpu使用时间(process_cpu_seconds_total)等。 一般而言,Counter类型的metrics指标在命名中
* 我们使用_total结束。
*/
public static Counter requestCounter = Counter.build()
.name("io_namespace_http_requests_total")
.labelNames("path", "method", "code")
.help("Total requests.").register();
/**
* 使用Gauge可以反映应用的当前状态,例如在监控主机时,主机当前空闲的内容大小(node_memory_MemFree),
* 可用内存大小(node_memory_MemAvailable)。或者容器当前的CPU使用率,内存使用率。这里我们使用
* Gauge记录当前应用正在处理的Http请求数量。
*/
public static Gauge inprogressRequests = Gauge.build()
.name("io_namespace_http_inprogress_requests").labelNames("path", "method")
.help("Inprogress requests.").register();
/**
* 主要用于在指定分布范围内(Buckets)记录大小(如http request bytes)或者事件发生的次数。
* 以请求响应时间requests_latency_seconds为例
*/
public static Histogram requestLatencyHistogram = Histogram.build()
.labelNames("path", "method", "code")
.name("io_namespace_http_requests_latency_seconds_histogram")
.help("Request latency in seconds.")
.register();
public static Histogram.Timer histogramRequestTimer;
/**
* 和Histogram类似,不同在于Histogram可以通过histogram_quantile函数在服务器端计算分位数,而
* Sumamry的分位数则是直接在客户端进行定义。因此对于分位数的计算。 Summary在通过PromQL进行查询时
* 有更好的性能表现,而Histogram则会消耗更多的资源。相对的对于客户端而言Histogram消耗的资源更少
*/
public static Summary requestLatency = Summary.build()
.name("io_namespace_http_requests_latency_seconds_summary")
.quantile(0.5, 0.05)
.quantile(0.9, 0.01)
.labelNames("path", "method", "code")
.help("Request latency in seconds.").register();
public static Summary.Timer requestTimer;
public MyMetrics(){
System.out.println(null == requestCounter);
System.out.println(null == inprogressRequests);
System.out.println(null == requestLatencyHistogram);
System.out.println(null == histogramRequestTimer);
System.out.println(null == requestLatency);
System.out.println(null == requestTimer);
}
}
\ No newline at end of file
package com.bookinfo.prometheus;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author: Bowen huang
* @date: 2021/03/07
*/
public class PrometheusMetricsInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
String method = request.getMethod();
int status = response.getStatus();
MyMetrics.inprogressRequests.labels(requestURI,method).inc();
MyMetrics.histogramRequestTimer = MyMetrics.requestLatencyHistogram.labels(requestURI, method, String.valueOf(status)).startTimer();
MyMetrics.requestTimer = MyMetrics.requestLatency.labels(requestURI, method, String.valueOf(status)).startTimer();
return super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String requestURI = request.getRequestURI();
String method = request.getMethod();
int status = response.getStatus();
MyMetrics.requestCounter.labels(requestURI, method, String.valueOf(status)).inc();
MyMetrics.inprogressRequests.labels(requestURI,method).dec();
MyMetrics.histogramRequestTimer.observeDuration();
MyMetrics.requestTimer.observeDuration();
super.afterCompletion(request, response, handler, ex);
}
}
......@@ -40,12 +40,12 @@ public class ProductPageController {
HttpServletRequest request){
String user = username;
request.getSession().setAttribute("user", user);
return "redirect:/productpage";
return "productpage";
}
@GetMapping("/logout")
public String destroySession(HttpServletRequest request) {
request.getSession().invalidate();
return "redirect:/productpage";
return "productpage";
}
@GetMapping("/productpage")
......
......@@ -36,3 +36,14 @@ spring:
detailsHostname: ${DETAILS_HOST:#{'http://localhost:8084'}}
ratingsHostname: ${RATINGS_HOST:#{'http://localhost:8085'}}
reviewsHostname: ${REVIEWS_HOST:#{'http://localhost:8081'}}
management:
#server:
#port: 7777 #不单独设置端口的话,和服务的端口一致
#servlet:
#context-path: /boot
endpoints:
web:
exposure:
include: "*"
base-path: /
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论