如何从Java(Spring启动)应用程序向Prometheus公开指标

时间:2017-11-29 18:22:56

标签: maven spring-boot instrumentation grafana prometheus

我的Spring-Boot应用程序只有一个计数器指标。我只是不知道如何将此信息发送给普罗米修斯。我正在使用Maven(构建工具)和Spring Boot(Java)。

4 个答案:

答案 0 :(得分:2)

Prometheus和Graphite一样,是一个时间序列存储引擎。

然后,Grafana可以查询Prometheus以生成图形和警报。

https://prometheus.io/docs/introduction/faq/

正如文档所述,与其他指标存储系统不同,Prometheus使用(有争议的)" pull"模型。

这意味着必须下载/安装(独立)Prometheus服务器。然后,该服务器定期向应用程序服务器列表发送HTTP GET请求(pull) - 例如Java SpringBoot服务器以获取(内存中)存储的度量标准。

参考:https://prometheus.io/docs/introduction/faq/#why-do-you-pull-rather-than-push?

因此,(Spring Boot)应用程序必须公开Prometheus服务器可以从中提取的度量标准终点(默认为/ metrics)。

参考:https://github.com/prometheus/client_java

因此,谷歌提供了大量文档,但这是(可以说是错综复杂的)拓扑结构 - 以及来自SoundCloud和Prometheus人员的争论,以及为什么"拉动"模型优于" push"正如所有其他指标框架一样。

答案 1 :(得分:1)

对于Intergrating Prometheus,请在POM.XML中添加以下依赖项

<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_spring_boot</artifactId>
    <version>0.1.0</version>
</dependency>
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_servlet</artifactId>
    <version>0.1.0</version>
</dependency>
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_hotspot</artifactId>
    <version>0.1.0</version>
</dependency>

在SpringBoot应用程序类中,添加Annonation @EnablePrometheusEndpoint

在Controller中,您可以定义自定义计数器

private static final Counter myCounter = Counter.build()
        .name("CounterName")
        .labelNames("status")
        .help("Counter desc").register();

在您的服务中,您可以为您的计数器提供适当的逻辑,该逻辑将由Prometheus自动提取

@RequestMapping("/myService")
    public void endpoint() {
           String processingResult = yourLogic(myCounter);
            myCounter.labels("label1",processingResult).inc();
            }

答案 2 :(得分:0)

Spring Boot 2.0.0

检查您的spring boot属性文件,以确保启用了度量和Prometheus导出。

例如:

management.endpoints.web.exposure.include=*
management.endpoint.metrics.enabled=true
management.endpoint.prometheus.enabled=true
management.metrics.export.prometheus.enabled=true

答案 3 :(得分:0)

从春季启动的角度来看,我的几分钱-

build.gradle

@EnableSpringBootMetricsCollector
@EnablePrometheusEndpoint
...
...
@Bean
public boolean initializePrometheusEssentials() {
    return prometheusUtility.initializePrometheusEssentials();
}

您的包含 main 函数的类应具有以下注释

import io.prometheus.client.Counter;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

@Component("PrometheusUtility")
public class PrometheusUtility {

private PrometheusUtility(){

}

private final static Map<String,Counter> counters = new HashMap<>();

public boolean initializePrometheusEssentials() {
counters.put("SAMPLE-COUNTER",Counter.build()
            .name("SAMPLE COUNTER")
            .help("Records the Sample Count").register());
            return true;
}


public static void incrementCounter(String counterName){
    counters.get(counterName).inc();
}
}

PometheusUtility.java

# Prometheus settings
#change prometheus endpoint to metrics
endpoints.prometheus.id=
#change actuator endpoint to springmetrics
endpoints.metrics.id=
endpoints.metrics.sensitive=
endpoints.metrics.enabled=
endpoints.prometheus.sensitive=

使用增量计数器方法对其进行递增。

并确保将以下属性添加到您的环境文件中

{{1}}