当前位置: 首页 > 知识库问答 >
问题:

使用spring java的千分尺度量(没有Spring Boot)

慕仲渊
2023-03-14

我是千分尺/普罗米修斯世界的新手。

另外,仅仅公开spring中的localhost:8080/metricsendpoint似乎并不能为Prometheus服务器提供任何东西。

我希望能够从我的应用程序中提取一些简单的指标,比如一些endpoint被调用了多少次,以及一些endpoint完成工作或一些数据处理需要多少时间。

共有1个答案

田兴怀
2023-03-14

在pom.xml中添加以下依赖项:

<dependency>
   <groupId>io.micrometer</groupId>
   <artifactId>micrometer-registry-prometheus</artifactId>
   <version>1.2.0</version>
</dependency>

下面是一个简单的测试类:

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.DistributionSummary;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.Tags;
import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import org.junit.jupiter.api.Test;

public class MicrometerTest {

    private PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);

    @Test
    public void test() {}

//    @Test
    public void test_metrics() {
        Counter.builder("http_requests_total").description("Http Request Total").tags("method", "GET", "handler",
                "/employee", "status", "200").register(registry).increment();
        Counter.builder("http_requests_total").description("Http Request Total").tags("method", "GET", "handler",
                "/employee", "status", "200").register(registry).increment();

        DistributionSummary.builder("http_response_time_milliseconds").description("Request completed time in milliseconds")
                .tags("method", "GET", "handler", "/employee", "status", "200")
                .publishPercentiles(.5,.95,.99)
                .register(registry).record(40d);
        DistributionSummary.builder("http_response_time_milliseconds").description("Request completed time in milliseconds")
                .tags("method", "GET", "handler", "/employee", "status", "200")
                .publishPercentiles(.5,.95,.99)
                .register(registry).record(50d);

        registry.counter("http_requests_total2", "method", "GET", "status", "200").increment();
        registry.counter("http_requests_total2", "method", "Post", "status", "200").increment();
        registry.counter("http_requests_total2", "method", "GET", "status", "200").increment();

        registry.newCounter(new Meter.Id("query time", Tags.of("select query", "country"), null, "query desc", Meter.Type.COUNTER));
        System.out.println(registry.scrape());
    }
}

如果希望通过servlet公开它,请添加另一个依赖项:

<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>4.0.1</version>
</dependency>

用于公开度量的示例servlet:

import com.aeris.amp.metrics.util.MeterRegistry;
import io.micrometer.core.instrument.binder.jvm.DiskSpaceMetrics;
import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics;
import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;
import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
import io.micrometer.core.instrument.binder.system.ProcessorMetrics;
import io.micrometer.core.instrument.binder.system.UptimeMetrics;
import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.prometheus.client.exporter.common.TextFormat;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.Writer;

@WebServlet("/metrics")
public class MetricsServlet extends HttpServlet {

    public static PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);

    public void init() {
        new JvmThreadMetrics().bindTo(registry);
        new JvmGcMetrics().bindTo(registry);
        new JvmMemoryMetrics().bindTo(registry);
        new DiskSpaceMetrics(new File("/")).bindTo(registry);
        new ProcessorMetrics().bindTo(registry); // metrics related to the CPU stats
        new UptimeMetrics().bindTo(registry);
    }

    @Override
    protected void doGet(final HttpServletRequest req, final HttpServletResponse resp)
            throws IOException {

        resp.setStatus(HttpServletResponse.SC_OK);
        resp.setContentType(TextFormat.CONTENT_TYPE_004);

        Writer writer = resp.getWriter();
        try {
            registry.scrape(writer);
            writer.flush();
        } finally {
            writer.close();
        }

    }

    public static String getMetricsString() {
        if (registry == null)
            registry = MeterRegistry.registry;
        return registry.scrape();
    }
}
 类似资料:
  • 是否有任何方法可以测量实用程序如何使用线程池?我已经浏览了代码,但还没有看到任何直接的选项。

  • 我正在构建一个Spring Boot应用程序,并计划使用进行Prometheus的数据刮取。看来主要的办法是用千分尺。但是,我看到还有另一个库,这就是Spring Metrics。

  • 我对Spring很陌生,正在尝试将我的应用程序连接到麋鹿。该应用程序运行的是Spring boot 1.5.5,因此我使用的是微米遗产。我的pom看起来像这样: 每当我尝试启动我的应用程序时,我都会收到以下错误: 根本原因似乎是类io.micrometer.core.instrument.config.validate.Validated它似乎没有像它应该的那样出现在包中。对此有什么想法吗?

  • 我试图配置一个SpringBoot应用程序,将度量导出到InfluxDB,以便使用Grafana仪表板可视化它们。我使用这个仪表板作为一个例子,它使用普罗米修斯作为后端。对于一些度量,我不知道如何为它们创建图,但对于其他一些度量,我不知道如何创建图,甚至不知道是否可能。所以我在以下几点中列举了我不太确定的事情: > 是否有描述价值单位的文档?我作为示例使用的应用程序没有任何负载,所以有时我不知道值

  • 我正在利用dogstatsd方法,使用千分尺将指标发送给datadog。我获得了正常的指标,如计数器和计量器,但我无法生成事件。有办法生成datadog事件吗?

  • 响应于“/acturet/prometheus”的DistributionSummary可用的度量仅是度量的Sum、Max和Count。 我想显示在选定的时间量内API调用所用的平均时间。用于EX:API在过去5分钟内所用的平均时间。

  • 我有一个Spring Boot应用程序,我现在正在迁移到Micrometer。 我想实现的是,随着时间的推移计算特定对象的调用。 让我们假设我有一个创建某些品牌的汽车的功能。然后我想测量一下我在过去一分钟内创造了多少辆福特,斯柯达,大众等。特别是,如果在 之间没有创建斯柯达,则指标应返回 0。 文档声明我不应该使用计数器,因为在运行应用程序时,创建的汽车数量可能会无限增长。计时器也不太合适,因为我

  • 假设我有一个应用程序,其中REST API更新产品的价格。 我想使用微米计来公开新价格作为指标。我无法理解微米计留档应该如何完成。 唯一对我有效的DoubleFunction是在我的ProductService中创建一个新方法来返回它的价格。这似乎是我想公开作为指标的每一条数据的开销。 我这里缺少什么?为什么不足以更新Gauge?