我正在使用 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
我正在尝试使用千分尺注释应用普罗米修斯指标@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 …
我正在尝试构建一个用于千分尺的自定义量规,它应该监视自定义 ThreadPoolTaskExecutor。问题在于,仪表值保持不变,并且自应用程序启动以来从未更新。但是,执行器统计信息(可以在调试器中看到)显示不断变化的值。
这是我的仪表配置类。
@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) 我正在使用/actuator/prometheus
端点作为其kafka_consumer_*
指标。从Spring Boot 2.3.1.RELEASE
to升级,向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 从版本 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。
有什么我们错过的吗?
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 请求的一般信息。缺少什么部分?
我有下面的代码,用于处理来自其他应用程序的请求,这些应用程序通过标头传递traceId Traceparent
。我希望它能够从请求中吸收父级 TraceId,并且在 zipkin 仪表板中我应该看到该应用程序与其他应用程序之间的连接。它曾经与spring-cloud-sleuth-zipkin
. 现在我迁移到spring boot 3,包改为micrometer-tracing-bridge-otel
(参见pom.xml)。现在,它不再从请求中提取父traceId,而是生成一个全为0的默认父traceId,导致应用程序与zipkin仪表板中的其他应用程序断开连接
我使用带有标头的简单卷曲请求进行了测试Traceparent
:curl --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
我对一般指标尤其是微米很陌生,所以这可能是一个愚蠢的问题:
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
依赖项以及提供了MeterRegistry
type 的 bean AtlasMeterRegistry
。这是可行的,但这不是我所说的“没有供应商锁定的外观”,但我想我只是做错了?
如何在运行时提供监控系统,在Atlas和其他系统之间切换而无需重新编译?
@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
我正在将 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
spring-boot ×9
java ×4
micrometer ×4
metrics ×2
prometheus ×2
asynchronous ×1
feign ×1
spring-kafka ×1