From ca5a3164c081017024786eb3fc21db428e7ec076 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Tue, 6 May 2025 21:32:18 -0400 Subject: [PATCH 1/4] Add loki port to lgtm test container --- modules/grafana/build.gradle | 9 + .../grafana/LgtmStackContainer.java | 8 +- .../grafana/LgtmStackContainerTest.java | 165 +++++++++++------- 3 files changed, 120 insertions(+), 62 deletions(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index d5c815018d0..f49a8ade726 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -12,4 +12,13 @@ dependencies { testImplementation 'io.opentelemetry:opentelemetry-api' testImplementation 'io.opentelemetry:opentelemetry-sdk' testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' + + testImplementation project(':junit-jupiter') + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.3' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.11.0' +} + +test { + useJUnitPlatform() } diff --git a/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java b/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java index 00299ac27f2..52443d7ba8a 100644 --- a/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java +++ b/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java @@ -31,6 +31,8 @@ public class LgtmStackContainer extends GenericContainer { private static final int OTLP_HTTP_PORT = 4318; + private static final int LOKI_PORT = 3100; + private static final int TEMPO_PORT = 3200; private static final int PROMETHEUS_PORT = 9090; @@ -42,7 +44,7 @@ public LgtmStackContainer(String image) { public LgtmStackContainer(DockerImageName image) { super(image); image.assertCompatibleWith(DEFAULT_IMAGE_NAME); - withExposedPorts(GRAFANA_PORT, TEMPO_PORT, OTLP_GRPC_PORT, OTLP_HTTP_PORT, PROMETHEUS_PORT); + withExposedPorts(GRAFANA_PORT, TEMPO_PORT, LOKI_PORT, OTLP_GRPC_PORT, OTLP_HTTP_PORT, PROMETHEUS_PORT); waitingFor( Wait.forLogMessage(".*The OpenTelemetry collector and the Grafana LGTM stack are up and running.*\\s", 1) ); @@ -61,6 +63,10 @@ public String getTempoUrl() { return "http://" + getHost() + ":" + getMappedPort(TEMPO_PORT); } + public String getLokiUrl() { + return "http://" + getHost() + ":" + getMappedPort(LOKI_PORT); + } + public String getOtlpHttpUrl() { return "http://" + getHost() + ":" + getMappedPort(OTLP_HTTP_PORT); } diff --git a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java index a2b4f5a221a..966484a19bb 100644 --- a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java +++ b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java @@ -7,17 +7,23 @@ import io.micrometer.registry.otlp.OtlpMeterRegistry; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.logs.Logger; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.logs.SdkLoggerProvider; +import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; import io.restassured.RestAssured; import io.restassured.response.Response; import org.awaitility.Awaitility; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import uk.org.webcompere.systemstubs.SystemStubs; import java.time.Duration; @@ -27,71 +33,27 @@ public class LgtmStackContainerTest { - @Test - public void shouldPublishMetricAndTrace() throws Exception { - try ( // container { - LgtmStackContainer lgtm = new LgtmStackContainer("grafana/otel-lgtm:0.11.0") - // } - ) { - lgtm.start(); - - String version = RestAssured - .get(String.format("http://%s:%s/api/health", lgtm.getHost(), lgtm.getMappedPort(3000))) - .jsonPath() - .get("version"); - assertThat(version).isEqualTo("11.6.0"); - - generateTrace(lgtm); - - OtlpConfig otlpConfig = createOtlpConfig(lgtm); - MeterRegistry meterRegistry = SystemStubs - .withEnvironmentVariable("OTEL_SERVICE_NAME", "testcontainers") - .execute(() -> new OtlpMeterRegistry(otlpConfig, Clock.SYSTEM)); - Counter.builder("test.counter").register(meterRegistry).increment(2); - - Awaitility - .given() - .pollInterval(Duration.ofSeconds(2)) - .atMost(Duration.ofSeconds(5)) - .ignoreExceptions() - .untilAsserted(() -> { - Response response = RestAssured - .given() - .queryParam("query", "test_counter_total{job=\"testcontainers\"}") - .get(String.format("%s/api/v1/query", lgtm.getPrometheusHttpUrl())) - .prettyPeek() - .thenReturn(); - assertThat(response.getStatusCode()).isEqualTo(200); - assertThat(response.body().jsonPath().getList("data.result[0].value")).contains("2"); - }); - - Awaitility - .given() - .pollInterval(Duration.ofSeconds(2)) - .atMost(Duration.ofSeconds(5)) - .ignoreExceptions() - .untilAsserted(() -> { - Response response = RestAssured - .given() - .get(String.format("%s/api/search", lgtm.getTempoUrl())) - .prettyPeek() - .thenReturn(); - assertThat(response.getStatusCode()).isEqualTo(200); - assertThat(response.body().jsonPath().getString("traces[0].rootServiceName")) - .isEqualTo("test-service"); - }); - } - } + private static final LgtmStackContainer lgtm = new LgtmStackContainer("grafana/otel-lgtm:0.11.1"); + + private static OpenTelemetrySdk openTelemetry; + + @BeforeAll + static void setup() { + lgtm.start(); + OtlpGrpcSpanExporter spanExporter = OtlpGrpcSpanExporter + .builder() + .setTimeout(Duration.ofSeconds(1)) + .setEndpoint(lgtm.getOtlpGrpcUrl()) + .build(); - private void generateTrace(LgtmStackContainer lgtm) { - OtlpGrpcSpanExporter exporter = OtlpGrpcSpanExporter + OtlpGrpcLogRecordExporter logExporter = OtlpGrpcLogRecordExporter .builder() .setTimeout(Duration.ofSeconds(1)) .setEndpoint(lgtm.getOtlpGrpcUrl()) .build(); BatchSpanProcessor spanProcessor = BatchSpanProcessor - .builder(exporter) + .builder(spanExporter) .setScheduleDelay(500, TimeUnit.MILLISECONDS) .build(); @@ -101,13 +63,94 @@ private void generateTrace(LgtmStackContainer lgtm) { .setResource(Resource.create(Attributes.of(AttributeKey.stringKey("service.name"), "test-service"))) .build(); - OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build(); + SdkLoggerProvider loggerProvider = SdkLoggerProvider + .builder() + .addLogRecordProcessor(SimpleLogRecordProcessor.create(logExporter)) + .build(); + + openTelemetry = + OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).setLoggerProvider(loggerProvider).build(); + } + @AfterAll + static void cleanup() { + openTelemetry.shutdown(); + lgtm.stop(); + } + + @Test + void shouldPublishMetric() throws Exception { + String version = RestAssured + .get(String.format("http://%s:%s/api/health", lgtm.getHost(), lgtm.getMappedPort(3000))) + .jsonPath() + .get("version"); + assertThat(version).isEqualTo("12.0.0"); + + OtlpConfig otlpConfig = createOtlpConfig(lgtm); + MeterRegistry meterRegistry = SystemStubs + .withEnvironmentVariable("OTEL_SERVICE_NAME", "testcontainers") + .execute(() -> new OtlpMeterRegistry(otlpConfig, Clock.SYSTEM)); + Counter.builder("test.counter").register(meterRegistry).increment(2); + + Awaitility + .given() + .pollInterval(Duration.ofSeconds(2)) + .atMost(Duration.ofSeconds(5)) + .ignoreExceptions() + .untilAsserted(() -> { + Response response = RestAssured + .given() + .queryParam("query", "test_counter_total{job=\"testcontainers\"}") + .get(String.format("%s/api/v1/query", lgtm.getPrometheusHttpUrl())) + .prettyPeek() + .thenReturn(); + assertThat(response.getStatusCode()).isEqualTo(200); + assertThat(response.body().jsonPath().getList("data.result[0].value")).contains("2"); + }); + } + + @Test + void shouldPublishLog() { + Logger logger = openTelemetry.getSdkLoggerProvider().loggerBuilder("test").build(); + logger.logRecordBuilder().setBody("Test log!").setAttribute(AttributeKey.stringKey("job"), "test-job").emit(); + + Awaitility + .given() + .pollInterval(Duration.ofSeconds(2)) + .atMost(Duration.ofSeconds(5)) + .ignoreExceptions() + .untilAsserted(() -> { + Response response = RestAssured + .given() + .queryParam("query", "{service_name=\"unknown_service:java\"}") + .get(String.format("%s/loki/api/v1/query_range", lgtm.getLokiUrl())) + .prettyPeek() + .thenReturn(); + assertThat(response.getStatusCode()).isEqualTo(200); + assertThat(response.body().jsonPath().getString("data.result[0].values[0][1]")).isEqualTo("Test log!"); + }); + } + + @Test + void shouldPublishTrace() { Tracer tracer = openTelemetry.getTracer("test"); Span span = tracer.spanBuilder("test").startSpan(); span.end(); - openTelemetry.shutdown(); + Awaitility + .given() + .pollInterval(Duration.ofSeconds(2)) + .atMost(Duration.ofSeconds(5)) + .ignoreExceptions() + .untilAsserted(() -> { + Response response = RestAssured + .given() + .get(String.format("%s/api/search", lgtm.getTempoUrl())) + .prettyPeek() + .thenReturn(); + assertThat(response.getStatusCode()).isEqualTo(200); + assertThat(response.body().jsonPath().getString("traces[0].rootServiceName")).isEqualTo("test-service"); + }); } private static OtlpConfig createOtlpConfig(LgtmStackContainer lgtm) { From 99ee59dc8ae5c31c4f0677ef9b0bf839602d6884 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Wed, 7 May 2025 05:52:43 -0400 Subject: [PATCH 2/4] undo test refactoring --- modules/grafana/build.gradle | 9 - .../grafana/LgtmStackContainerTest.java | 239 +++++++++--------- 2 files changed, 119 insertions(+), 129 deletions(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index f49a8ade726..d5c815018d0 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -12,13 +12,4 @@ dependencies { testImplementation 'io.opentelemetry:opentelemetry-api' testImplementation 'io.opentelemetry:opentelemetry-sdk' testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' - - testImplementation project(':junit-jupiter') - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.11.0' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.3' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.11.0' -} - -test { - useJUnitPlatform() } diff --git a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java index 966484a19bb..0f6788425c7 100644 --- a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java +++ b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java @@ -21,9 +21,7 @@ import io.restassured.RestAssured; import io.restassured.response.Response; import org.awaitility.Awaitility; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; +import org.junit.Test; import uk.org.webcompere.systemstubs.SystemStubs; import java.time.Duration; @@ -33,124 +31,125 @@ public class LgtmStackContainerTest { - private static final LgtmStackContainer lgtm = new LgtmStackContainer("grafana/otel-lgtm:0.11.1"); - - private static OpenTelemetrySdk openTelemetry; - - @BeforeAll - static void setup() { - lgtm.start(); - OtlpGrpcSpanExporter spanExporter = OtlpGrpcSpanExporter - .builder() - .setTimeout(Duration.ofSeconds(1)) - .setEndpoint(lgtm.getOtlpGrpcUrl()) - .build(); - - OtlpGrpcLogRecordExporter logExporter = OtlpGrpcLogRecordExporter - .builder() - .setTimeout(Duration.ofSeconds(1)) - .setEndpoint(lgtm.getOtlpGrpcUrl()) - .build(); - - BatchSpanProcessor spanProcessor = BatchSpanProcessor - .builder(spanExporter) - .setScheduleDelay(500, TimeUnit.MILLISECONDS) - .build(); - - SdkTracerProvider tracerProvider = SdkTracerProvider - .builder() - .addSpanProcessor(spanProcessor) - .setResource(Resource.create(Attributes.of(AttributeKey.stringKey("service.name"), "test-service"))) - .build(); - - SdkLoggerProvider loggerProvider = SdkLoggerProvider - .builder() - .addLogRecordProcessor(SimpleLogRecordProcessor.create(logExporter)) - .build(); - - openTelemetry = - OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).setLoggerProvider(loggerProvider).build(); - } - - @AfterAll - static void cleanup() { - openTelemetry.shutdown(); - lgtm.stop(); - } - - @Test - void shouldPublishMetric() throws Exception { - String version = RestAssured - .get(String.format("http://%s:%s/api/health", lgtm.getHost(), lgtm.getMappedPort(3000))) - .jsonPath() - .get("version"); - assertThat(version).isEqualTo("12.0.0"); - - OtlpConfig otlpConfig = createOtlpConfig(lgtm); - MeterRegistry meterRegistry = SystemStubs - .withEnvironmentVariable("OTEL_SERVICE_NAME", "testcontainers") - .execute(() -> new OtlpMeterRegistry(otlpConfig, Clock.SYSTEM)); - Counter.builder("test.counter").register(meterRegistry).increment(2); - - Awaitility - .given() - .pollInterval(Duration.ofSeconds(2)) - .atMost(Duration.ofSeconds(5)) - .ignoreExceptions() - .untilAsserted(() -> { - Response response = RestAssured - .given() - .queryParam("query", "test_counter_total{job=\"testcontainers\"}") - .get(String.format("%s/api/v1/query", lgtm.getPrometheusHttpUrl())) - .prettyPeek() - .thenReturn(); - assertThat(response.getStatusCode()).isEqualTo(200); - assertThat(response.body().jsonPath().getList("data.result[0].value")).contains("2"); - }); - } - - @Test - void shouldPublishLog() { - Logger logger = openTelemetry.getSdkLoggerProvider().loggerBuilder("test").build(); - logger.logRecordBuilder().setBody("Test log!").setAttribute(AttributeKey.stringKey("job"), "test-job").emit(); - - Awaitility - .given() - .pollInterval(Duration.ofSeconds(2)) - .atMost(Duration.ofSeconds(5)) - .ignoreExceptions() - .untilAsserted(() -> { - Response response = RestAssured - .given() - .queryParam("query", "{service_name=\"unknown_service:java\"}") - .get(String.format("%s/loki/api/v1/query_range", lgtm.getLokiUrl())) - .prettyPeek() - .thenReturn(); - assertThat(response.getStatusCode()).isEqualTo(200); - assertThat(response.body().jsonPath().getString("data.result[0].values[0][1]")).isEqualTo("Test log!"); - }); - } - @Test - void shouldPublishTrace() { - Tracer tracer = openTelemetry.getTracer("test"); - Span span = tracer.spanBuilder("test").startSpan(); - span.end(); - - Awaitility - .given() - .pollInterval(Duration.ofSeconds(2)) - .atMost(Duration.ofSeconds(5)) - .ignoreExceptions() - .untilAsserted(() -> { - Response response = RestAssured - .given() - .get(String.format("%s/api/search", lgtm.getTempoUrl())) - .prettyPeek() - .thenReturn(); - assertThat(response.getStatusCode()).isEqualTo(200); - assertThat(response.body().jsonPath().getString("traces[0].rootServiceName")).isEqualTo("test-service"); - }); + public void shouldPublishMetricsTracesAndLogs() throws Exception { + try ( // container { + LgtmStackContainer lgtm = new LgtmStackContainer("grafana/otel-lgtm:0.11.1") + // } + ) { + lgtm.start(); + + OtlpGrpcSpanExporter spanExporter = OtlpGrpcSpanExporter + .builder() + .setTimeout(Duration.ofSeconds(1)) + .setEndpoint(lgtm.getOtlpGrpcUrl()) + .build(); + + OtlpGrpcLogRecordExporter logExporter = OtlpGrpcLogRecordExporter + .builder() + .setTimeout(Duration.ofSeconds(1)) + .setEndpoint(lgtm.getOtlpGrpcUrl()) + .build(); + + BatchSpanProcessor spanProcessor = BatchSpanProcessor + .builder(spanExporter) + .setScheduleDelay(500, TimeUnit.MILLISECONDS) + .build(); + + SdkTracerProvider tracerProvider = SdkTracerProvider + .builder() + .addSpanProcessor(spanProcessor) + .setResource(Resource.create(Attributes.of(AttributeKey.stringKey("service.name"), "test-service"))) + .build(); + + SdkLoggerProvider loggerProvider = SdkLoggerProvider + .builder() + .addLogRecordProcessor(SimpleLogRecordProcessor.create(logExporter)) + .build(); + + OpenTelemetrySdk openTelemetry = OpenTelemetrySdk + .builder() + .setTracerProvider(tracerProvider) + .setLoggerProvider(loggerProvider) + .build(); + + // Metrics + String version = RestAssured + .get(String.format("http://%s:%s/api/health", lgtm.getHost(), lgtm.getMappedPort(3000))) + .jsonPath() + .get("version"); + assertThat(version).isEqualTo("12.0.0"); + + OtlpConfig otlpConfig = createOtlpConfig(lgtm); + MeterRegistry meterRegistry = SystemStubs + .withEnvironmentVariable("OTEL_SERVICE_NAME", "testcontainers") + .execute(() -> new OtlpMeterRegistry(otlpConfig, Clock.SYSTEM)); + Counter.builder("test.counter").register(meterRegistry).increment(2); + + Awaitility + .given() + .pollInterval(Duration.ofSeconds(2)) + .atMost(Duration.ofSeconds(5)) + .ignoreExceptions() + .untilAsserted(() -> { + Response response = RestAssured + .given() + .queryParam("query", "test_counter_total{job=\"testcontainers\"}") + .get(String.format("%s/api/v1/query", lgtm.getPrometheusHttpUrl())) + .prettyPeek() + .thenReturn(); + assertThat(response.getStatusCode()).isEqualTo(200); + assertThat(response.body().jsonPath().getList("data.result[0].value")).contains("2"); + }); + + // Logs + Logger logger = openTelemetry.getSdkLoggerProvider().loggerBuilder("test").build(); + logger + .logRecordBuilder() + .setBody("Test log!") + .setAttribute(AttributeKey.stringKey("job"), "test-job") + .emit(); + + Awaitility + .given() + .pollInterval(Duration.ofSeconds(2)) + .atMost(Duration.ofSeconds(5)) + .ignoreExceptions() + .untilAsserted(() -> { + Response response = RestAssured + .given() + .queryParam("query", "{service_name=\"unknown_service:java\"}") + .get(String.format("%s/loki/api/v1/query_range", lgtm.getLokiUrl())) + .prettyPeek() + .thenReturn(); + assertThat(response.getStatusCode()).isEqualTo(200); + assertThat(response.body().jsonPath().getString("data.result[0].values[0][1]")) + .isEqualTo("Test log!"); + }); + + // Traces + Tracer tracer = openTelemetry.getTracer("test"); + Span span = tracer.spanBuilder("test").startSpan(); + span.end(); + + Awaitility + .given() + .pollInterval(Duration.ofSeconds(2)) + .atMost(Duration.ofSeconds(5)) + .ignoreExceptions() + .untilAsserted(() -> { + Response response = RestAssured + .given() + .get(String.format("%s/api/search", lgtm.getTempoUrl())) + .prettyPeek() + .thenReturn(); + assertThat(response.getStatusCode()).isEqualTo(200); + assertThat(response.body().jsonPath().getString("traces[0].rootServiceName")) + .isEqualTo("test-service"); + }); + + openTelemetry.close(); + } } private static OtlpConfig createOtlpConfig(LgtmStackContainer lgtm) { From 30463792eeadc4e4d82c4946924b873eef8ca293 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Wed, 7 May 2025 05:57:16 -0400 Subject: [PATCH 3/4] rearrange tests for faster performance --- .../grafana/LgtmStackContainerTest.java | 54 +++++++------------ 1 file changed, 20 insertions(+), 34 deletions(-) diff --git a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java index 0f6788425c7..02f9e91ead1 100644 --- a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java +++ b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java @@ -86,22 +86,6 @@ public void shouldPublishMetricsTracesAndLogs() throws Exception { .execute(() -> new OtlpMeterRegistry(otlpConfig, Clock.SYSTEM)); Counter.builder("test.counter").register(meterRegistry).increment(2); - Awaitility - .given() - .pollInterval(Duration.ofSeconds(2)) - .atMost(Duration.ofSeconds(5)) - .ignoreExceptions() - .untilAsserted(() -> { - Response response = RestAssured - .given() - .queryParam("query", "test_counter_total{job=\"testcontainers\"}") - .get(String.format("%s/api/v1/query", lgtm.getPrometheusHttpUrl())) - .prettyPeek() - .thenReturn(); - assertThat(response.getStatusCode()).isEqualTo(200); - assertThat(response.body().jsonPath().getList("data.result[0].value")).contains("2"); - }); - // Logs Logger logger = openTelemetry.getSdkLoggerProvider().loggerBuilder("test").build(); logger @@ -110,41 +94,43 @@ public void shouldPublishMetricsTracesAndLogs() throws Exception { .setAttribute(AttributeKey.stringKey("job"), "test-job") .emit(); + // Traces + Tracer tracer = openTelemetry.getTracer("test"); + Span span = tracer.spanBuilder("test").startSpan(); + span.end(); + Awaitility .given() .pollInterval(Duration.ofSeconds(2)) .atMost(Duration.ofSeconds(5)) .ignoreExceptions() .untilAsserted(() -> { - Response response = RestAssured + Response metricResponse = RestAssured + .given() + .queryParam("query", "test_counter_total{job=\"testcontainers\"}") + .get(String.format("%s/api/v1/query", lgtm.getPrometheusHttpUrl())) + .prettyPeek() + .thenReturn(); + assertThat(metricResponse.getStatusCode()).isEqualTo(200); + assertThat(metricResponse.body().jsonPath().getList("data.result[0].value")).contains("2"); + + Response logResponse = RestAssured .given() .queryParam("query", "{service_name=\"unknown_service:java\"}") .get(String.format("%s/loki/api/v1/query_range", lgtm.getLokiUrl())) .prettyPeek() .thenReturn(); - assertThat(response.getStatusCode()).isEqualTo(200); - assertThat(response.body().jsonPath().getString("data.result[0].values[0][1]")) + assertThat(logResponse.getStatusCode()).isEqualTo(200); + assertThat(logResponse.body().jsonPath().getString("data.result[0].values[0][1]")) .isEqualTo("Test log!"); - }); - - // Traces - Tracer tracer = openTelemetry.getTracer("test"); - Span span = tracer.spanBuilder("test").startSpan(); - span.end(); - Awaitility - .given() - .pollInterval(Duration.ofSeconds(2)) - .atMost(Duration.ofSeconds(5)) - .ignoreExceptions() - .untilAsserted(() -> { - Response response = RestAssured + Response traceResponse = RestAssured .given() .get(String.format("%s/api/search", lgtm.getTempoUrl())) .prettyPeek() .thenReturn(); - assertThat(response.getStatusCode()).isEqualTo(200); - assertThat(response.body().jsonPath().getString("traces[0].rootServiceName")) + assertThat(traceResponse.getStatusCode()).isEqualTo(200); + assertThat(traceResponse.body().jsonPath().getString("traces[0].rootServiceName")) .isEqualTo("test-service"); }); From 29cc5a529b904f2c18eb9ff3a23df2721c83445d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 7 May 2025 08:11:49 -0600 Subject: [PATCH 4/4] Apply suggestions from code review --- .../org/testcontainers/grafana/LgtmStackContainerTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java index 02f9e91ead1..ba4fb94856c 100644 --- a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java +++ b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java @@ -73,7 +73,6 @@ public void shouldPublishMetricsTracesAndLogs() throws Exception { .setLoggerProvider(loggerProvider) .build(); - // Metrics String version = RestAssured .get(String.format("http://%s:%s/api/health", lgtm.getHost(), lgtm.getMappedPort(3000))) .jsonPath() @@ -86,7 +85,6 @@ public void shouldPublishMetricsTracesAndLogs() throws Exception { .execute(() -> new OtlpMeterRegistry(otlpConfig, Clock.SYSTEM)); Counter.builder("test.counter").register(meterRegistry).increment(2); - // Logs Logger logger = openTelemetry.getSdkLoggerProvider().loggerBuilder("test").build(); logger .logRecordBuilder() @@ -94,7 +92,6 @@ public void shouldPublishMetricsTracesAndLogs() throws Exception { .setAttribute(AttributeKey.stringKey("job"), "test-job") .emit(); - // Traces Tracer tracer = openTelemetry.getTracer("test"); Span span = tracer.spanBuilder("test").startSpan(); span.end();