使用Spring Boot ✕ Prometheus ✕ Grafana对应用程序进行监控,第2部分
在写完上一篇文章之后我才注意到,
似乎Spring端有一个名为Spring Metrics的项目正在进行,并且其中包含Prometheus。
在上一篇文章中,提到了使用Spring Boot ✕ Prometheus ✕ Grafana进行应用程序监控的内容并不是错误,目前存在以下两种方法可供选择。
-
- spring,spring boot向けのPrometheusクライアントライブラリを使用する。(Prometheusが提供しているSpring向けの機能)
- spring-metricsでPrometheus向けの設定をする。(Springが提供しているPrometheus向けの機能)
换种说法,即双方相互提供对方所需的功能。
前文所提及的前者为前一篇文章中所介绍的内容,而后者则指本次将要介绍的功能。
春季指标
测试环境
-
- OS: macOS Sierra 10.12.6
-
- Java: 1.8.0_102
-
- Spring Boot: 1.5.10.RELEASE
-
- Spring Metrics: 0.5.1.RELEASE
-
- Docker For Mac: 17.12.0-ce-mac49
-
- Prometheus: v2.1.0
- Grafana: 5.0.0-beta4
Spring Metrics的配置
设定非常简单,只需添加依赖项和注解。
将spring-metrics、spring-boot-actuator和simpleclient_common添加到pom.xml中。
(由于生成为WEB应用程序,因此也添加了spring-boot-starter-web。)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.metrics</groupId>
<artifactId>spring-metrics</artifactId>
<version>${metrics.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_common</artifactId>
<version>${prom.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
只需要将@EnablePrometheusMetrics注释添加即可。
@SpringBootApplication
@EnablePrometheusMetrics
public class SpringBootPrometheusGrafanaSampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootPrometheusGrafanaSampleApplication.class, args);
}
}
如此一来,度量指标将会自动汇总,并作为终端/prometheus的响应返回这些度量指标。
添加方法单位的所需时间度量标准
只需要在类上加上@Timed。
@RestController
@Timed
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "hello";
}
}
单独实施
有几种实现方式,但这次我们介绍一下Counter。其他的请参考文档。
通过@EnablePrometheusMetrics,PrometheusMeterRegistry会被注册成为一个Bean,因此可以通过构造器注入。
@RestController
public class CounterController {
private static int num = 0;
private final Counter counter;
public CounterController(MeterRegistry registry) {
counter = registry.counter("count_requests_total");
}
@GetMapping("count")
public int count() {
counter.increment();
return ++num;
}
}
被统计的指标
经过在样本应用程序中的确认,以下数值被输出。
-
- JVM
-
- logレベル
-
- 個別実装 (count_requests_total部分)
- メソッド単位の所要時間(http_server_requests_count,http_server_requests_sum部分)
# HELP count_requests_total
# TYPE count_requests_total counter
count_requests_total 1.0
# HELP jvm_buffer_memory_used
# TYPE jvm_buffer_memory_used gauge
jvm_buffer_memory_used{id="direct",} 49152.0
jvm_buffer_memory_used{id="mapped",} 0.0
# HELP jvm_memory_committed
# TYPE jvm_memory_committed gauge
jvm_memory_committed{id="Code Cache",} 8126464.0
jvm_memory_committed{id="PS Eden Space",} 1.42082048E8
jvm_memory_committed{id="PS Old Gen",} 1.1534336E8
jvm_memory_committed{id="PS Survivor Space",} 1.3631488E7
jvm_memory_committed{id="Compressed Class Space",} 4636672.0
jvm_memory_committed{id="Metaspace",} 3.3734656E7
# HELP logback_events
# TYPE logback_events counter
logback_events{level="warn",} 93.0
logback_events{level="debug",} 3162.0
logback_events{level="error",} 0.0
logback_events{level="trace",} 7588.0
logback_events{level="info",} 90.0
# HELP jvm_memory_used
# TYPE jvm_memory_used gauge
jvm_memory_used{id="Code Cache",} 8064000.0
jvm_memory_used{id="PS Eden Space",} 2.1646824E7
jvm_memory_used{id="PS Old Gen",} 1.248472E7
jvm_memory_used{id="PS Survivor Space",} 1.3624504E7
jvm_memory_used{id="Compressed Class Space",} 4319216.0
jvm_memory_used{id="Metaspace",} 3.2767784E7
# HELP jvm_memory_max
# TYPE jvm_memory_max gauge
jvm_memory_max{id="Code Cache",} 2.5165824E8
jvm_memory_max{id="PS Eden Space",} 1.4024704E9
jvm_memory_max{id="PS Old Gen",} 2.863661056E9
jvm_memory_max{id="PS Survivor Space",} 1.3631488E7
jvm_memory_max{id="Compressed Class Space",} 1.073741824E9
jvm_memory_max{id="Metaspace",} -1.0
# HELP jvm_buffer_total_capacity
# TYPE jvm_buffer_total_capacity gauge
jvm_buffer_total_capacity{id="direct",} 49152.0
jvm_buffer_total_capacity{id="mapped",} 0.0
# HELP http_server_requests
# TYPE http_server_requests summary
http_server_requests_count{method="GET",uri="hello",exception="None",status="200",} 1.0
http_server_requests_sum{method="GET",uri="hello",exception="None",status="200",} 0.004397129
# HELP jvm_buffer_count
# TYPE jvm_buffer_count gauge
jvm_buffer_count{id="direct",} 6.0
jvm_buffer_count{id="mapped",} 0.0
作为前一个指标的差异,只有添加了Garbage collection,Memory pools,JMX,Classloading和Thread counts 。如果单独添加这些内容,几乎不会有差异。
Prometheus和Grafana的配置
由于与上次介绍的方法相同,因此略去不表。
请注意
Spring Metrics目前尚未达到1.0.0.RELEASE版本,属于尚未成熟的项目,不建议在生产环境中使用。文档中也有以下相关说明。
经常发布预发布版本的文物,但并不用于生产环境。
感受
Prometheus客户端库和Spring两者都提供几乎相同的功能。
但是由于使用Spring提供的功能可以更简单地进行配置,所以如果主要使用Spring的话,我想使用Spring端的功能。
另外,Spring还支持DataDog和Netflix Atlas,并且可以通过接口进行实现。这样,即使将其更改为DataDog,仍可以使用相同的接口进行访问,非常方便。
希望Prometheus和Spring之间能够互相妥协发展,调查两个类似的库真麻烦(笑)。
GitHub是一个面向开发者的版本管理平台,提供了代码托管、代码审查、团队协作等多种功能。
这次的示例应用是下面的。注意,分支是spring-metrics。
提供参考
以下是您要求的链接的中文表达:
https://docs.spring.io/spring-metrics/docs/current/public/prometheus :Spring Metrics的文档,关于Prometheus的公开内容
https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-metrics.html#production-ready-metrics-export-prometheus :Spring Boot的生产就绪指标文档,有关Prometheus导出的内容