Skip to content

Commit 705d59b

Browse files
authored
Expose Tempo in LgtmContainer (#10192)
1 parent 3d5e7ff commit 705d59b

File tree

3 files changed

+71
-4
lines changed

3 files changed

+71
-4
lines changed

modules/grafana/build.gradle

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ dependencies {
77
testImplementation 'io.rest-assured:rest-assured:5.5.0'
88
testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.4'
99
testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6'
10+
11+
testImplementation platform('io.opentelemetry:opentelemetry-bom:1.49.0')
12+
testImplementation 'io.opentelemetry:opentelemetry-api'
13+
testImplementation 'io.opentelemetry:opentelemetry-sdk'
14+
testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp'
1015
}
1116

1217
tasks.japicmp {

modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* Exposed ports:
1515
* <ul>
1616
* <li>Grafana: 3000</li>
17+
* <li>Tempo: 3200</li>
1718
* <li>OTel Http: 4317</li>
1819
* <li>OTel Grpc: 4318</li>
1920
* <li>Prometheus: 9090</li>
@@ -30,6 +31,8 @@ public class LgtmStackContainer extends GenericContainer<LgtmStackContainer> {
3031

3132
private static final int OTLP_HTTP_PORT = 4318;
3233

34+
private static final int TEMPO_PORT = 3200;
35+
3336
private static final int PROMETHEUS_PORT = 9090;
3437

3538
public LgtmStackContainer(String image) {
@@ -39,7 +42,7 @@ public LgtmStackContainer(String image) {
3942
public LgtmStackContainer(DockerImageName image) {
4043
super(image);
4144
image.assertCompatibleWith(DEFAULT_IMAGE_NAME);
42-
withExposedPorts(GRAFANA_PORT, OTLP_GRPC_PORT, OTLP_HTTP_PORT, PROMETHEUS_PORT);
45+
withExposedPorts(GRAFANA_PORT, TEMPO_PORT, OTLP_GRPC_PORT, OTLP_HTTP_PORT, PROMETHEUS_PORT);
4346
waitingFor(
4447
Wait.forLogMessage(".*The OpenTelemetry collector and the Grafana LGTM stack are up and running.*\\s", 1)
4548
);
@@ -54,6 +57,10 @@ public String getOtlpGrpcUrl() {
5457
return "http://" + getHost() + ":" + getMappedPort(OTLP_GRPC_PORT);
5558
}
5659

60+
public String getTempoUrl() {
61+
return "http://" + getHost() + ":" + getMappedPort(TEMPO_PORT);
62+
}
63+
5764
public String getOtlpHttpUrl() {
5865
return "http://" + getHost() + ":" + getMappedPort(OTLP_HTTP_PORT);
5966
}

modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java

+58-3
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,32 @@
55
import io.micrometer.core.instrument.MeterRegistry;
66
import io.micrometer.registry.otlp.OtlpConfig;
77
import io.micrometer.registry.otlp.OtlpMeterRegistry;
8+
import io.opentelemetry.api.common.AttributeKey;
9+
import io.opentelemetry.api.common.Attributes;
10+
import io.opentelemetry.api.trace.Span;
11+
import io.opentelemetry.api.trace.Tracer;
12+
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
13+
import io.opentelemetry.sdk.OpenTelemetrySdk;
14+
import io.opentelemetry.sdk.resources.Resource;
15+
import io.opentelemetry.sdk.trace.SdkTracerProvider;
16+
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
817
import io.restassured.RestAssured;
918
import io.restassured.response.Response;
1019
import org.awaitility.Awaitility;
1120
import org.junit.Test;
1221
import uk.org.webcompere.systemstubs.SystemStubs;
1322

1423
import java.time.Duration;
24+
import java.util.concurrent.TimeUnit;
1525

1626
import static org.assertj.core.api.Assertions.assertThat;
1727

1828
public class LgtmStackContainerTest {
1929

2030
@Test
21-
public void shouldPublishMetric() throws Exception {
31+
public void shouldPublishMetricAndTrace() throws Exception {
2232
try ( // container {
23-
LgtmStackContainer lgtm = new LgtmStackContainer("grafana/otel-lgtm:0.6.0")
33+
LgtmStackContainer lgtm = new LgtmStackContainer("grafana/otel-lgtm:0.11.0")
2434
// }
2535
) {
2636
lgtm.start();
@@ -29,7 +39,9 @@ public void shouldPublishMetric() throws Exception {
2939
.get(String.format("http://%s:%s/api/health", lgtm.getHost(), lgtm.getMappedPort(3000)))
3040
.jsonPath()
3141
.get("version");
32-
assertThat(version).isEqualTo("11.0.0");
42+
assertThat(version).isEqualTo("11.6.0");
43+
44+
generateTrace(lgtm);
3345

3446
OtlpConfig otlpConfig = createOtlpConfig(lgtm);
3547
MeterRegistry meterRegistry = SystemStubs
@@ -52,9 +64,52 @@ public void shouldPublishMetric() throws Exception {
5264
assertThat(response.getStatusCode()).isEqualTo(200);
5365
assertThat(response.body().jsonPath().getList("data.result[0].value")).contains("2");
5466
});
67+
68+
Awaitility
69+
.given()
70+
.pollInterval(Duration.ofSeconds(2))
71+
.atMost(Duration.ofSeconds(5))
72+
.ignoreExceptions()
73+
.untilAsserted(() -> {
74+
Response response = RestAssured
75+
.given()
76+
.get(String.format("%s/api/search", lgtm.getTempoUrl()))
77+
.prettyPeek()
78+
.thenReturn();
79+
assertThat(response.getStatusCode()).isEqualTo(200);
80+
assertThat(response.body().jsonPath().getString("traces[0].rootServiceName"))
81+
.isEqualTo("test-service");
82+
});
5583
}
5684
}
5785

86+
private void generateTrace(LgtmStackContainer lgtm) {
87+
OtlpGrpcSpanExporter exporter = OtlpGrpcSpanExporter
88+
.builder()
89+
.setTimeout(Duration.ofSeconds(1))
90+
.setEndpoint(lgtm.getOtlpGrpcUrl())
91+
.build();
92+
93+
BatchSpanProcessor spanProcessor = BatchSpanProcessor
94+
.builder(exporter)
95+
.setScheduleDelay(500, TimeUnit.MILLISECONDS)
96+
.build();
97+
98+
SdkTracerProvider tracerProvider = SdkTracerProvider
99+
.builder()
100+
.addSpanProcessor(spanProcessor)
101+
.setResource(Resource.create(Attributes.of(AttributeKey.stringKey("service.name"), "test-service")))
102+
.build();
103+
104+
OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build();
105+
106+
Tracer tracer = openTelemetry.getTracer("test");
107+
Span span = tracer.spanBuilder("test").startSpan();
108+
span.end();
109+
110+
openTelemetry.shutdown();
111+
}
112+
58113
private static OtlpConfig createOtlpConfig(LgtmStackContainer lgtm) {
59114
return new OtlpConfig() {
60115
@Override

0 commit comments

Comments
 (0)