diff --git a/spring-boot-modules/spring-boot-3-observation/pom.xml b/spring-boot-modules/spring-boot-3-observation/pom.xml index a67f0c3a2450..090693e926bd 100644 --- a/spring-boot-modules/spring-boot-3-observation/pom.xml +++ b/spring-boot-modules/spring-boot-3-observation/pom.xml @@ -32,6 +32,11 @@ micrometer-tracing-bridge-brave + + io.micrometer + micrometer-test + test + io.micrometer micrometer-observation-test diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/micrometer/test/FooApplication.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/micrometer/test/FooApplication.java new file mode 100644 index 000000000000..a1a1949de362 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/micrometer/test/FooApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.micrometer.test; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class FooApplication { + + public static void main(String[] args) { + SpringApplication.run(FooApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/micrometer/test/FooService.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/micrometer/test/FooService.java new file mode 100644 index 000000000000..fb5636f9ead4 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/micrometer/test/FooService.java @@ -0,0 +1,38 @@ +package com.baeldung.micrometer.test; + +import java.util.concurrent.ThreadLocalRandom; + +import org.springframework.stereotype.Service; + +import io.micrometer.core.instrument.MeterRegistry; + +@Service +public class FooService { + + private final MeterRegistry registry; + + public FooService(MeterRegistry registry) { + this.registry = registry; + } + + public int foo() { + int delayedMs = registry.timer("foo.time") + .record(this::doSomething); + + registry.counter("foo.count") + .increment(); + + return delayedMs; + } + + private int doSomething() { + int delayMs = ThreadLocalRandom.current() + .nextInt(10, 100); + try { + Thread.sleep(delayMs); + return delayMs; + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/micrometer/test/MicrometerIntegrationTest.java b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/micrometer/test/MicrometerIntegrationTest.java new file mode 100644 index 000000000000..691bf011bec8 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/micrometer/test/MicrometerIntegrationTest.java @@ -0,0 +1,57 @@ +package com.baeldung.micrometer.test; + +import static java.time.Duration.ofMillis; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import io.micrometer.core.instrument.MeterRegistry; + +@SpringBootTest(classes = FooApplication.class ) +class MicrometerIntegrationTest { + + @Autowired + private MeterRegistry meterRegistry; + + @Autowired + private FooService fooService; + + @BeforeEach + void reset() { + meterRegistry.clear(); + } + + @Test + void whenFooIsCalled_thenCounterIsIncremented() { + fooService.foo(); + fooService.foo(); + fooService.foo(); + + double invocations = meterRegistry.get("foo.count") + .counter() + .count(); + + assertThat(invocations) + .isEqualTo(3); + } + + @Test + void whenFooIsCalled_thenTimerIsUpdated() { + fooService.foo(); + fooService.foo(); + fooService.foo(); + + int totalTimeMs = (int) meterRegistry.get("foo.time") + .timer() + .totalTime(TimeUnit.MILLISECONDS); + + assertThat(ofMillis(totalTimeMs)) + .isBetween(ofMillis(30), ofMillis(400)); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/micrometer/test/MicrometerUnitTest.java b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/micrometer/test/MicrometerUnitTest.java new file mode 100644 index 000000000000..5c027046a5d3 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/micrometer/test/MicrometerUnitTest.java @@ -0,0 +1,55 @@ +package com.baeldung.micrometer.test; + +import static java.time.Duration.ofMillis; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.Test; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import io.micrometer.core.tck.MeterRegistryAssert; + +class MicrometerUnitTest { + + private MeterRegistry meterRegistry= new SimpleMeterRegistry(); + private FooService fooService = new FooService(meterRegistry); + + @Test + void whenFooIsCalled_thenCounterIsIncremented() { + fooService.foo(); + fooService.foo(); + fooService.foo(); + + double invocations = meterRegistry.get("foo.count") + .counter() + .count(); + + assertThat(invocations) + .isEqualTo(3); + } + + @Test + void whenFooIsCalled_thenTimerIsUpdated() { + fooService.foo(); + fooService.foo(); + fooService.foo(); + + int totalTimeMs = (int) meterRegistry.get("foo.time") + .timer() + .totalTime(TimeUnit.MILLISECONDS); + + assertThat(ofMillis(totalTimeMs)) + .isBetween(ofMillis(30), ofMillis(400)); + } + + @Test + void whenFooIsCalled_thenTimerIsRegistered() { + fooService.foo(); + + MeterRegistryAssert.assertThat(meterRegistry) + .hasTimerWithName("foo.time"); + } + +}