标签: spring-micrometer

@SpringbootTest 中缺少 /actuator/prometheus

我正在使用 springboot 2.4.0,并添加了以下依赖项以启用 prometheus 指标:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

然后在我的 application.properties 我有以下属性

management.endpoints.web.exposure.include=*
management.metrics.enable.all=true
Run Code Online (Sandbox Code Playgroud)

我正在尝试运行一个简单的集成测试,以查看我的自定义指标出现在 /actuator/prometheus 端点上。代码下方

package com.example.demo;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort;
import static io.restassured.RestAssured.given;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class IntegrationTest {

  @LocalServerPort
  private int port;

  private String baseUrl;

  @BeforeEach
  public void setup() {
      baseUrl = "http://localhost:" + port;
  }

  @Test
  public void metricsEndpoint() throws Exception {

    given().when().get(baseUrl + "/demo/actuator/prometheus")
            .then()
            .statusCode(200);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里得到的错误是

java.lang.AssertionError: 1 expectation failed.
Expected status …
Run Code Online (Sandbox Code Playgroud)

java metrics spring-boot-actuator spring-boot-test spring-micrometer

17
推荐指数
3
解决办法
1508
查看次数

简单公共和私有(服务)方法上的 Micrometer @Timed 注释

我正在尝试使用千分尺注释应用普罗米修斯指标@Timed。我发现它们只适用于控制器端点,而不适用于“简单”的公共和私有方法。

给出这个例子:

@RestController
public class TestController {

    @GetMapping("/test")
    @Timed("test-endpoint") //does create prometheus metrics
    public String test() {
        privateMethod();
        publicMethod();
        return "test";
    }

    @Timed("test-private") //does NOT create prometheus metrics
    private void privateMethod() {System.out.println("private stuff");}

    @Timed("test-public") //does NOT create prometheus metrics
    public void publicMethod() {System.out.println("public stuff");}
}
Run Code Online (Sandbox Code Playgroud)

创建以下指标:

...
# HELP test_endpoint_seconds  
# TYPE test_endpoint_seconds summary
test_endpoint_seconds_count{class="com.example.micrometerannotationexample.TestController",exception="none",method="test",} 1.0
test_endpoint_seconds_sum{class="com.example.micrometerannotationexample.TestController",exception="none",method="test",} 0.0076286
# HELP test_endpoint_seconds_max  
# TYPE test_endpoint_seconds_max gauge
test_endpoint_seconds_max{class="com.example.micrometerannotationexample.TestController",exception="none",method="test",} 0.0076286
...
Run Code Online (Sandbox Code Playgroud)

没有找到@Timed("test-private")和 的指标@Timed("test-public"),这是为什么?


注意:我在这个 github thread上读到,Spring …

java metrics spring-boot prometheus spring-micrometer

16
推荐指数
1
解决办法
3万
查看次数

千分尺永远不会更新

我正在尝试构建一个用于千分尺的自定义量规,它应该监视自定义 ThreadPoolTask​​Executor。问题在于,仪表值保持不变,并且自应用程序启动以来从未更新。但是,执行器统计信息(可以在调试器中看到)显示不断变化的值。

这是我的仪表配置类。

@Component
public class ThreadPoolMetricProbe implements MeterBinder {

@Inject
private Executor taskExecutor;

@Override
public void bindTo(MeterRegistry meterRegistry) {
    ThreadPoolTaskExecutor exec = (ThreadPoolTaskExecutor) taskExecutor;

    long completedTaskCount = exec.getThreadPoolExecutor().getCompletedTaskCount();
    int largestPoolSize = exec.getThreadPoolExecutor().getLargestPoolSize();
    int maximumPoolSize = exec.getThreadPoolExecutor().getMaximumPoolSize();
    int poolSize = exec.getThreadPoolExecutor().getPoolSize();
    long taskCount = exec.getThreadPoolExecutor().getTaskCount();
    int activeCount = exec.getThreadPoolExecutor().getActiveCount();

    String threadNamePrefix = exec.getThreadNamePrefix();

    Gauge.builder("executorCompletedTaskCount", completedTaskCount, Double::new)
            .description(String.format("Returns the approximate total number of tasks that have completed execution of %s executor", threadNamePrefix.toLowerCase()))
            .register(meterRegistry);

    Gauge.builder("executorLargestThreadsNumber", largestPoolSize, Double::new)
            .description(String.format(" Returns the largest number …
Run Code Online (Sandbox Code Playgroud)

java spring-boot spring-boot-actuator spring-micrometer

13
推荐指数
1
解决办法
9632
查看次数

Spring Boot 2.3.2.RELEASE - Micrometer - KafkaMetrics - 无法绑定仪表日志

我正在使用/actuator/prometheus端点作为其kafka_consumer_*指标。从Spring Boot 2.3.1.RELEASEto升级,向2.3.2.RELEASE我展示了很多这些“额外”日志——每当绑定失败时:

信息 io.micrometer.core.instrument.binder.kafka.KafkaMetrics.lambda$checkAndBindMetrics$1[173] -- 无法绑定仪表:kafka.consumer.fetch.manager.[metric1]...但是,这可能发生并且可能下次刷新时恢复。
信息 io.micrometer.core.instrument.binder.kafka.KafkaMetrics.lambda$checkAndBindMetrics$1[173] -- 无法绑定仪表:kafka.consumer.fetch.manager.[metric2]...但是,这可能发生并且可能下次刷新时恢复。
信息 io.micrometer.core.instrument.binder.kafka.KafkaMetrics.lambda$checkAndBindMetrics$1[173] -- 无法绑定仪表:kafka.consumer.fetch.manager.[metric3]...但是,这可能发生并且可能下次刷新时恢复。
信息 io.micrometer.core.instrument.binder.kafka.KafkaMetrics.lambda$checkAndBindMetrics$1[173] -- 无法绑定仪表:kafka.consumer.fetch.manager.[metric4]...但是,这可能发生并且可能下次刷新时恢复。

它是一个INFO日志级别,带有一些令人放心的结尾词However, this could happen and might be restored in the next refresh.,因此,并不意味着令人担忧,但是在此升级中显示它的目的是什么?

与此同时,我用以下方法抑制了它们(额外的日志): logging.level.io.micrometer.core.instrument.binder.kafka.KafkaMetrics=WARN

spring-boot spring-kafka spring-micrometer

10
推荐指数
1
解决办法
2182
查看次数

迁移到 Spring Boot 3 后 TraceId 和 SpanId 不可用

将 Spring Boot 从版本 2.x 迁移到版本 3 后,我们在日志中丢失了 traceId 和 spanId。

我们删除了所有sleuth依赖项并添加了

implementation 'io.micrometer:micrometer-core'
implementation 'io.micrometer:micrometer-tracing'
implementation 'io.micrometer:micrometer-tracing-bridge-brave'
implementation platform('io.micrometer:micrometer-tracing-bom:latest.release')
Run Code Online (Sandbox Code Playgroud)

implementation 'io.micrometer:micrometer-core'
implementation 'io.micrometer:micrometer-tracing'
implementation 'io.micrometer:micrometer-tracing-bridge-brave'
implementation platform('io.micrometer:micrometer-tracing-bom:latest.release')
Run Code Online (Sandbox Code Playgroud)

但没有记录任何traceIds 和spanIds。

有什么我们错过的吗?

java spring-boot micrometer spring-micrometer

10
推荐指数
1
解决办法
7157
查看次数

在 spring-boot 应用程序中将 Micrometer 与 OpenFeign 结合使用

OpenApi 文档说它支持微米。整合如何运作?除了这个小文档之外我找不到任何东西。

我在 Spring Boot 应用程序中有一个 FeignClient

@FeignClient(name = "SomeService", url = "xxx", configuration = FeignConfiguration.class)
public interface SomeService {

    @GET
    @Path("/something")
    Something getSomething();
}
Run Code Online (Sandbox Code Playgroud)

与配置

public class FeignConfiguration {
    @Bean
    public Capability capability() {
        return new MicrometerCapability();
    }
}
Run Code Online (Sandbox Code Playgroud)

和微米积分作为依赖项

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-micrometer</artifactId>
    <version>10.12</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

该代码进行了调用,但我无法通过actuator概述找到任何新指标,需要一些有关我的 HTTP 请求的一般信息。缺少什么部分?

spring-boot feign micrometer spring-micrometer

9
推荐指数
1
解决办法
1万
查看次数

Spring Boot 3 与微米级跟踪和处理 Traceparent 标头相关的问题

我有下面的代码,用于处理来自其他应用程序的请求,这些应用程序通过标头传递traceId Traceparent。我希望它能够从请求中吸收父级 TraceId,并且在 zipkin 仪表板中我应该看到该应用程序与其他应用程序之间的连接。它曾经与spring-cloud-sleuth-zipkin. 现在我迁移到spring boot 3,包改为micrometer-tracing-bridge-otel(参见pom.xml)。现在,它不再从请求中提取父traceId,而是生成一个全为0的默认父traceId,导致应用程序与zipkin仪表板中的其他应用程序断开连接

我使用带有标头的简单卷曲请求进行了测试Traceparentcurl --location --request GET 'http://localhost:8080/test' --header 'Traceparent: 00-63cf0173620c57b0aed605ee94255089-1444ca74c3d2133a-01'但此代码不会从标头中提取父上下文。知道如何进行这项工作吗?

@RestController
public class Test {

    @Autowired
    private Tracer tracer;

    @GetMapping(path="/test")
    public ResponseEntity<?> handleTest() {
        ScopedSpan span = tracer.startScopedSpan("test span");
        return ResponseEntity.ok();
    }
}

Run Code Online (Sandbox Code Playgroud)

pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.2</version>
    </parent>

        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing-bridge-otel</artifactId>
        </dependency>
        <dependency>
            <groupId>io.opentelemetry</groupId>
            <artifactId>opentelemetry-exporter-zipkin</artifactId>
        </dependency>
        <dependency>
            <groupId>io.zipkin.reporter2</groupId>
            <artifactId>zipkin-sender-urlconnection</artifactId>
        </dependency>

Run Code Online (Sandbox Code Playgroud)

spring-boot spring-cloud-sleuth micrometer spring-micrometer micrometer-tracing

9
推荐指数
1
解决办法
6418
查看次数

如何使用 Spring Boot 在运行时配置 Micrometer 的监控系统

我对一般指标尤其是微米很陌生,所以这可能是一个愚蠢的问题:

Micrometer 在主页上将自己描述为“外观”“没有供应商锁定”,“想想 SLF4J,但为了指标”。具有“对 [...] Netflix Atlas 的内置支持”。文档说它包含在 Spring Boot 2 中

所以我期望能够在启动时配置监控系统 - 就像我对 SLF4J 所做的那样。因此,本文档描述了 Spring Boot 的设置management.metrics.export.atlas.enabled(以及其他设置)。但即使使用此设置,自动装配也会MeterRegistry registry失败,如下所示:

[snip] 中构造函数的参数 4 需要一个类型为“io.micrometer.core.instrument.MeterRegistry”的 bean,但无法找到。

行动:

考虑在配置中定义“io.micrometer.core.instrument.MeterRegistry”类型的 bean。

Google 将我引导到 Baeldung,在那里我读到了一些micrometer-registry-atlas依赖项以及提供了MeterRegistrytype 的 bean AtlasMeterRegistry。这是可行的,但这不是我所说的“没有供应商锁定的外观”,但我想我只是做错了?

如何在运行时提供监控系统,在Atlas和其他系统之间切换而无需重新编译?

spring-boot micrometer spring-micrometer

8
推荐指数
1
解决办法
9742
查看次数

@Counted 在 Spring Boot 中如何工作?

@Counted 如何运作?我在控制器中的方法上添加了 @Counted 注释,并期望看到控制器有多少次点击。但我看不到添加到 URL http://localhost:8080/actuator/prometheus 上的指标。

 @Counted(value = "counted.success.test",description = "testCounter")
Run Code Online (Sandbox Code Playgroud)

health-monitoring spring-boot spring-boot-actuator prometheus spring-micrometer

8
推荐指数
1
解决办法
7660
查看次数

Spring Boot 3 中带有跟踪的自定义异步执行器

我正在将 Spring Boot 项目迁移到版本 3。该项目使用异步任务和跟踪。

根据Micrometer GitHub wiki 上的文档,我们尝试像这样定义异步执行器:

@Configuration(proxyBeanMethods = false)
@EnableAsync
class EventProcessingConfig {
  @Bean("eventsPublishExecutor")
  fun eventsPublishExecutor(): Executor {
     val executor =
          object : ThreadPoolTaskExecutor() {
            override fun initializeExecutor(
              threadFactory: ThreadFactory,
              rejectedExecutionHandler: RejectedExecutionHandler
            ): ExecutorService {
              val executorService = super.initializeExecutor(threadFactory,
     rejectedExecutionHandler)
              return ContextExecutorService.wrap(executorService, ContextSnapshot::captureAll)
            }
          }

        with(executor) {
          setThreadNamePrefix("processing-events-")
          setWaitForTasksToCompleteOnShutdown(true)
          setAwaitTerminationSeconds(30)
          initialize()
        }

        return executor
Run Code Online (Sandbox Code Playgroud)

然而,我们仍然失去了追踪。用下面的代码替换 bean 创建使一切按预期工作(尽管没有自定义)

 return ContextExecutorService.wrap(
      Executors.newSingleThreadExecutor(),
      ContextSnapshot::captureAll
    )
Run Code Online (Sandbox Code Playgroud)

您知道 Spring Boot 3 的第一个代码有什么问题或缺少什么吗?

asynchronous spring-boot spring-micrometer micrometer-tracing

8
推荐指数
0
解决办法
1709
查看次数