opentelemetry-java-instrume.../smoke-tests/src/test/java/io/opentelemetry/smoketest/SpringBootSmokeTest.java

99 lines
4.2 KiB
Java

/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.smoketest;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.sdk.trace.data.SpanData;
import io.opentelemetry.semconv.ServiceAttributes;
import io.opentelemetry.semconv.incubating.OsIncubatingAttributes;
import io.opentelemetry.semconv.incubating.TelemetryIncubatingAttributes;
import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.stream.Collectors;
import org.junit.jupiter.api.condition.DisabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.testcontainers.containers.output.OutputFrame;
@DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers")
class SpringBootSmokeTest extends JavaSmokeTest {
public SpringBootSmokeTest() {
super(
SmokeTestTarget.springBoot("20241021.11448062567")
.setServiceName(false)
.env("OTEL_METRICS_EXPORTER", "otlp")
.env("OTEL_RESOURCE_ATTRIBUTES", "foo=bar"));
}
@ParameterizedTest
@ValueSource(ints = {8, 11, 17, 21, 23})
void springBootSmokeTest(int jdk) throws Exception {
Consumer<OutputFrame> output = startTarget(jdk);
String currentAgentVersion;
try (JarFile agentJar = new JarFile(agentPath)) {
currentAgentVersion =
agentJar
.getManifest()
.getMainAttributes()
.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
}
var response = client().get("/greeting").aggregate().join();
assertThat(response.contentUtf8()).isEqualTo("Hi!");
testing.waitAndAssertTraces(
trace ->
trace.hasSpansSatisfyingExactly(
span ->
span.hasName("GET /greeting")
.hasAttribute(
satisfies(ThreadIncubatingAttributes.THREAD_ID, a -> a.isNotNull()))
.hasAttribute(
satisfies(ThreadIncubatingAttributes.THREAD_NAME, a -> a.isNotBlank()))
.hasResourceSatisfying(
resource ->
resource
.hasAttribute(
TelemetryIncubatingAttributes.TELEMETRY_DISTRO_VERSION,
currentAgentVersion)
.hasAttribute(
satisfies(
OsIncubatingAttributes.OS_TYPE, a -> a.isNotNull()))
.hasAttribute(AttributeKey.stringKey("foo"), "bar")
.hasAttribute(
ServiceAttributes.SERVICE_NAME, "otel-spring-test-app")
.hasAttribute(
ServiceAttributes.SERVICE_VERSION,
"2.10.0-alpha-SNAPSHOT")),
span -> span.hasName("WebController.withSpan")));
// Check agent version is logged on startup
assertVersionLogged(output, currentAgentVersion);
// Check trace IDs are logged via MDC instrumentation
Set<String> loggedTraceIds = getLoggedTraceIds(output);
List<SpanData> spans = testing.spans();
Set<String> spanTraceIds = spans.stream().map(SpanData::getTraceId).collect(Collectors.toSet());
assertThat(loggedTraceIds).isEqualTo(spanTraceIds);
// Check JVM metrics are exported
testing.waitAndAssertMetrics(
"io.opentelemetry.runtime-telemetry-java8",
metric -> metric.hasName("jvm.memory.used"),
metric -> metric.hasName("jvm.memory.committed"),
metric -> metric.hasName("jvm.memory.limit"),
metric -> metric.hasName("jvm.memory.used_after_last_gc"));
}
}