使用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导出的内容

广告
将在 10 秒后关闭
bannerAds