diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java index 170a8faac5d7..e67909490ee2 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java @@ -156,6 +156,7 @@ private static void configureIgnoredTasks(IgnoredTypesBuilder builder) { // TODO Workaround for // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/787 builder.ignoreTaskClass("org.apache.tomcat.util.net.NioEndpoint$SocketProcessor"); + builder.ignoreTaskClass("org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor"); // HttpConnection implements Runnable. When async request is completed HttpConnection // may be sent to process next request while context from previous request hasn't been diff --git a/smoke-tests/build.gradle.kts b/smoke-tests/build.gradle.kts index e3b48b20c430..69ec08118a5f 100644 --- a/smoke-tests/build.gradle.kts +++ b/smoke-tests/build.gradle.kts @@ -20,7 +20,6 @@ dependencies { compileOnly("com.google.auto.value:auto-value-annotations") annotationProcessor("com.google.auto.value:auto-value") - api("org.spockframework:spock-core") api(project(":testing-common")) implementation(platform("io.grpc:grpc-bom:1.75.0")) diff --git a/smoke-tests/src/main/java/io/opentelemetry/smoketest/GroovyTestTelemetryRetriever.java b/smoke-tests/src/main/java/io/opentelemetry/smoketest/GroovyTestTelemetryRetriever.java deleted file mode 100644 index ac6d8b1d8498..000000000000 --- a/smoke-tests/src/main/java/io/opentelemetry/smoketest/GroovyTestTelemetryRetriever.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.protobuf.GeneratedMessage; -import com.google.protobuf.util.JsonFormat; -import io.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest; -import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest; -import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest; -import io.opentelemetry.testing.internal.armeria.client.WebClient; -import java.util.Collection; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; - -public class GroovyTestTelemetryRetriever { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - - final WebClient client; - - GroovyTestTelemetryRetriever(int backendPort) { - client = WebClient.of("http://localhost:" + backendPort); - } - - void clearTelemetry() { - client.get("/clear").aggregate().join(); - } - - Collection waitForTraces() { - return waitForTelemetry("get-traces", ExportTraceServiceRequest::newBuilder); - } - - Collection waitForMetrics() { - return waitForTelemetry("get-metrics", ExportMetricsServiceRequest::newBuilder); - } - - Collection waitForLogs() { - return waitForTelemetry("get-logs", ExportLogsServiceRequest::newBuilder); - } - - @SuppressWarnings({"unchecked", "InterruptedExceptionSwallowed"}) - private > - Collection waitForTelemetry(String path, Supplier builderConstructor) { - try { - String content = waitForContent(path); - - return StreamSupport.stream(OBJECT_MAPPER.readTree(content).spliterator(), false) - .map( - jsonNode -> { - B builder = builderConstructor.get(); - // TODO: Register parser into object mapper to avoid de -> re -> deserialize. - try { - String json = OBJECT_MAPPER.writeValueAsString(jsonNode); - JsonFormat.parser().merge(json, builder); - } catch (Exception e) { - throw new IllegalStateException(e); - } - return (T) builder.build(); - }) - .collect(Collectors.toList()); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - @SuppressWarnings("SystemOut") - private String waitForContent(String path) throws InterruptedException { - long previousSize = 0; - long deadline = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(30); - String content = "[]"; - while (System.currentTimeMillis() < deadline) { - content = client.get(path).aggregate().join().contentUtf8(); - if (content.length() > 2 && content.length() == previousSize) { - break; - } - previousSize = content.length(); - System.out.println("Current content size $previousSize"); - TimeUnit.MILLISECONDS.sleep(500); - } - - return content; - } -} diff --git a/smoke-tests/src/main/java/io/opentelemetry/smoketest/MetricsInspector.java b/smoke-tests/src/main/java/io/opentelemetry/smoketest/MetricsInspector.java deleted file mode 100644 index 77c2dde0ae45..000000000000 --- a/smoke-tests/src/main/java/io/opentelemetry/smoketest/MetricsInspector.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest; - -import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest; -import java.util.Collection; - -public class MetricsInspector { - final Collection requests; - - public MetricsInspector(Collection requests) { - this.requests = requests; - } - - public boolean hasMetricsNamed(String metricName) { - return requests.stream() - .flatMap(it -> it.getResourceMetricsList().stream()) - .flatMap(it -> it.getScopeMetricsList().stream()) - .flatMap(it -> it.getMetricsList().stream()) - .anyMatch(it -> metricName.equals(it.getName())); - } -} diff --git a/smoke-tests/src/main/java/io/opentelemetry/smoketest/TelemetryRetriever.java b/smoke-tests/src/main/java/io/opentelemetry/smoketest/TelemetryRetriever.java index 32ad80ca2763..aff06b8817b1 100644 --- a/smoke-tests/src/main/java/io/opentelemetry/smoketest/TelemetryRetriever.java +++ b/smoke-tests/src/main/java/io/opentelemetry/smoketest/TelemetryRetriever.java @@ -18,6 +18,7 @@ import io.opentelemetry.testing.internal.protobuf.GeneratedMessage; import io.opentelemetry.testing.internal.protobuf.InvalidProtocolBufferException; import io.opentelemetry.testing.internal.protobuf.util.JsonFormat; +import java.time.Duration; import java.util.Collection; import java.util.List; import java.util.concurrent.TimeUnit; @@ -28,9 +29,11 @@ public class TelemetryRetriever { private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private final WebClient client; + private final Duration telemetryTimeout; - public TelemetryRetriever(int backendPort) { + public TelemetryRetriever(int backendPort, Duration telemetryTimeout) { client = WebClient.of("http://localhost:" + backendPort); + this.telemetryTimeout = telemetryTimeout; } public void clearTelemetry() { @@ -91,7 +94,7 @@ Collection waitForTelemetry(String path, Supplier builderConstructor) { @SuppressWarnings("SystemOut") private String waitForContent(String path) throws InterruptedException { long previousSize = 0; - long deadline = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(30); + long deadline = System.currentTimeMillis() + telemetryTimeout.toMillis(); String content = "[]"; while (System.currentTimeMillis() < deadline) { content = client.get(path).aggregate().join().contentUtf8(); diff --git a/smoke-tests/src/main/java/io/opentelemetry/smoketest/TestImage.java b/smoke-tests/src/main/java/io/opentelemetry/smoketest/TestImage.java deleted file mode 100644 index 65d3e51789f4..000000000000 --- a/smoke-tests/src/main/java/io/opentelemetry/smoketest/TestImage.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest; - -public class TestImage { - public final Platform platform; - public final String imageName; - - public TestImage(Platform platform, String imageName) { - this.platform = platform; - this.imageName = imageName; - } - - @Override - public String toString() { - return imageName + "(" + platform + ")"; - } - - public static TestImage linuxImage(String imageName) { - return new TestImage(Platform.LINUX_X86_64, imageName); - } - - public static TestImage windowsImage(String imageName) { - return new TestImage(Platform.WINDOWS_X86_64, imageName); - } - - public enum Platform { - WINDOWS_X86_64, - LINUX_X86_64, - } -} diff --git a/smoke-tests/src/main/java/io/opentelemetry/smoketest/TraceInspector.java b/smoke-tests/src/main/java/io/opentelemetry/smoketest/TraceInspector.java deleted file mode 100644 index 065079a6e557..000000000000 --- a/smoke-tests/src/main/java/io/opentelemetry/smoketest/TraceInspector.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest; - -import com.google.protobuf.ByteString; -import groovy.lang.GString; -import io.opentelemetry.api.trace.TraceId; -import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest; -import io.opentelemetry.proto.common.v1.AnyValue; -import io.opentelemetry.proto.common.v1.KeyValue; -import io.opentelemetry.proto.trace.v1.ResourceSpans; -import io.opentelemetry.proto.trace.v1.Span; -import java.util.Collection; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class TraceInspector { - final Collection traces; - - public TraceInspector(Collection traces) { - this.traces = traces; - } - - public Stream getSpanStream() { - return traces.stream() - .flatMap(it -> it.getResourceSpansList().stream()) - .flatMap(it -> it.getScopeSpansList().stream()) - .flatMap(it -> it.getSpansList().stream()); - } - - public Stream findResourceAttribute(String attributeKey) { - return traces.stream() - .flatMap(it -> it.getResourceSpansList().stream()) - .flatMap(it -> it.getResource().getAttributesList().stream()) - .filter(it -> it.getKey().equals(attributeKey)) - .map(KeyValue::getValue); - } - - public long countFilteredResourceAttributes(String attributeName, Object attributeValue) { - return traces.stream() - .flatMap(it -> it.getResourceSpansList().stream()) - .map(ResourceSpans::getResource) - .flatMap(it -> it.getAttributesList().stream()) - .filter(a -> a.getKey().equals(attributeName)) - .map(a -> a.getValue().getStringValue()) - .filter(s -> s.equals(attributeValue)) - .count(); - } - - public long countFilteredAttributes(String attributeName, Object attributeValue) { - Object value; - if (attributeValue instanceof GString) { - value = attributeValue.toString(); - } else { - value = attributeValue; - } - return getSpanStream() - .flatMap(s -> s.getAttributesList().stream()) - .filter(a -> a.getKey().equals(attributeName)) - .map(a -> a.getValue().getStringValue()) - .filter(s -> s.equals(value)) - .count(); - } - - public long countFilteredArrayAttributes(String attributeName, Object attributeValue) { - Object value; - if (attributeValue instanceof GString) { - value = attributeValue.toString(); - } else { - value = attributeValue; - } - return getSpanStream() - .flatMap(s -> s.getAttributesList().stream()) - .filter(a -> a.getKey().equals(attributeName)) - .map(a -> a.getValue().getArrayValue().getValues(0).getStringValue()) - .filter(s -> s.equals(value)) - .count(); - } - - public long countFilteredEventAttributes(String attributeName, Object attributeValue) { - return getSpanStream() - .flatMap(s -> s.getEventsList().stream()) - .flatMap(e -> e.getAttributesList().stream()) - .filter(a -> a.getKey().equals(attributeName)) - .map(a -> a.getValue().getStringValue()) - .filter(s -> s.equals(attributeValue)) - .count(); - } - - protected int countSpansByName(String spanName) { - return (int) getSpanStream().filter(it -> it.getName().equals(spanName)).count(); - } - - protected int countSpansByKind(Span.SpanKind spanKind) { - return (int) getSpanStream().filter(it -> it.getKind().equals(spanKind)).count(); - } - - protected int countSpans() { - return (int) getSpanStream().count(); - } - - public int size() { - return traces.size(); - } - - public Set getTraceIds() { - return getSpanStream() - .map(Span::getTraceId) - .map(ByteString::toByteArray) - .map(TraceId::fromBytes) - .collect(Collectors.toSet()); - } -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/AppServerTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/AppServerTest.groovy deleted file mode 100644 index df770eafc6c1..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/AppServerTest.groovy +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import io.opentelemetry.proto.trace.v1.Span -import io.opentelemetry.semconv.ClientAttributes -import io.opentelemetry.semconv.NetworkAttributes -import io.opentelemetry.semconv.UrlAttributes -import io.opentelemetry.testing.internal.armeria.common.HttpMethod -import io.opentelemetry.testing.internal.armeria.common.RequestHeaders -import spock.lang.Shared -import spock.lang.Unroll - -import java.util.jar.Attributes -import java.util.jar.JarFile - -import static io.opentelemetry.semconv.incubating.OsIncubatingAttributes.OS_TYPE -import static io.opentelemetry.semconv.incubating.OsIncubatingAttributes.OsTypeIncubatingValues.LINUX -import static io.opentelemetry.semconv.incubating.OsIncubatingAttributes.OsTypeIncubatingValues.WINDOWS -import static org.junit.Assume.assumeFalse -import static org.junit.Assume.assumeTrue - -abstract class AppServerTest extends SmokeTest { - @Shared - String jdk - @Shared - String serverVersion - @Shared - boolean isWindows - - private static final String TELEMETRY_DISTRO_VERSION = "telemetry.distro.version" - - def setupSpec() { - (serverVersion, jdk) = getAppServer() - isWindows = System.getProperty("os.name").toLowerCase().contains("windows") && - "1" != System.getenv("USE_LINUX_CONTAINERS") - - // ibm-semeru-runtimes doesn't publish windows images - // adoptopenjdk is deprecated and doesn't publish Windows 2022 images - assumeFalse(isWindows && jdk.endsWith("-openj9")) - - startTarget(jdk, serverVersion, isWindows) - } - - protected Tuple getAppServer() { - def appServer = getClass().getAnnotation(AppServer) - if (appServer == null) { - throw new IllegalStateException("Server not specified, either add @AppServer annotation or override getAppServer method") - } - return new Tuple(appServer.version(), appServer.jdk()) - } - - @Override - protected String getTargetImage(String jdk) { - throw new UnsupportedOperationException("App servers tests should use getTargetImagePrefix") - } - - @Override - protected String getTargetImage(String jdk, String serverVersion, boolean windows) { - String platformSuffix = windows ? "-windows" : "" - String extraTag = "-20241014.11321808438" - String fullSuffix = "${serverVersion}-jdk$jdk$platformSuffix$extraTag" - return getTargetImagePrefix() + ":" + fullSuffix - } - - protected abstract String getTargetImagePrefix() - - def cleanupSpec() { - stopTarget() - } - - boolean testSmoke() { - true - } - - boolean testAsyncSmoke() { - true - } - - boolean testException() { - true - } - - boolean testRequestWebInfWebXml() { - true - } - - boolean testRequestOutsideDeployedApp() { - true - } - - boolean testJsp() { - true - } - - //TODO add assert that server spans were created by servers, not by servlets - @Unroll - def "#appServer smoke test on JDK #jdk"(String appServer, String jdk, boolean isWindows) { - assumeTrue(testSmoke()) - - def currentAgentVersion = new JarFile(agentPath).getManifest().getMainAttributes().get(Attributes.Name.IMPLEMENTATION_VERSION) - - when: - def response = client() - .execute(RequestHeaders.of(HttpMethod.GET, "/app/greeting", "X-Test-Request", "test")) - .aggregate().join() - TraceInspector traces = new TraceInspector(waitForTraces()) - Set traceIds = traces.traceIds - String responseBody = response.contentUtf8() - - then: "There is one trace" - traceIds.size() == 1 - - and: "trace id is present in the HTTP headers as reported by the called endpoint" - responseBody.contains(traceIds.find()) - - and: "Server spans in the distributed trace" - traces.countSpansByKind(Span.SpanKind.SPAN_KIND_SERVER) == 2 - - and: "Expected span names" - traces.countSpansByName(getSpanName('/app/greeting')) == 1 - traces.countSpansByName(getSpanName('/app/headers')) == 1 - - and: "The span for the initial web request" - traces.countFilteredAttributes(UrlAttributes.URL_PATH.key, "/app/greeting") == 1 - - and: "Client span for the remote call" - traces.countFilteredAttributes(UrlAttributes.URL_FULL.key, "http://localhost:8080/app/headers") == 1 - - and: "Server span for the remote call" - traces.countFilteredAttributes(UrlAttributes.URL_PATH.key, "/app/headers") == 1 - - and: "Number of spans with client address" - traces.countFilteredAttributes(ClientAttributes.CLIENT_ADDRESS.key, "127.0.0.1") == 1 - - and: "Number of spans with http protocol version" - traces.countFilteredAttributes(NetworkAttributes.NETWORK_PROTOCOL_VERSION.key, "1.1") == 3 - - and: "Number of spans tagged with current otel library version" - traces.countFilteredResourceAttributes(TELEMETRY_DISTRO_VERSION, currentAgentVersion) == 3 - - and: "Number of spans tagged with expected OS type" - traces.countFilteredResourceAttributes(OS_TYPE.key, isWindows ? WINDOWS : LINUX) == 3 - - and: "Number of spans tagged with attribute set via agentArgs" - traces.countFilteredArrayAttributes("http.request.header.x-test-request", "test") == 1 - - where: - [appServer, jdk, isWindows] << getTestParams() - } - - @Unroll - def "#appServer test static file found on JDK #jdk"(String appServer, String jdk, boolean isWindows) { - def currentAgentVersion = new JarFile(agentPath).getManifest().getMainAttributes().get(Attributes.Name.IMPLEMENTATION_VERSION) - - when: - def response = client().get("/app/hello.txt").aggregate().join() - TraceInspector traces = new TraceInspector(waitForTraces()) - Set traceIds = traces.traceIds - String responseBody = response.contentUtf8() - - then: "There is one trace" - traceIds.size() == 1 - - and: "Response contains Hello" - responseBody.contains("Hello") - - and: "There is one server span" - traces.countSpansByKind(Span.SpanKind.SPAN_KIND_SERVER) == 1 - - and: "Expected span names" - traces.countSpansByName(getSpanName('/app/hello.txt')) == 1 - - and: "The span for the initial web request" - traces.countFilteredAttributes(UrlAttributes.URL_PATH.key, "/app/hello.txt") == 1 - - and: "Number of spans tagged with current otel library version" - traces.countFilteredResourceAttributes(TELEMETRY_DISTRO_VERSION, currentAgentVersion) == 1 - - and: "Number of spans tagged with expected OS type" - traces.countFilteredResourceAttributes(OS_TYPE.key, isWindows ? WINDOWS : LINUX) == 1 - - where: - [appServer, jdk, isWindows] << getTestParams() - } - - @Unroll - def "#appServer test static file not found on JDK #jdk"(String appServer, String jdk, boolean isWindows) { - def currentAgentVersion = new JarFile(agentPath).getManifest().getMainAttributes().get(Attributes.Name.IMPLEMENTATION_VERSION) - - when: - def response = client().get("/app/file-that-does-not-exist").aggregate().join() - TraceInspector traces = new TraceInspector(waitForTraces()) - Set traceIds = traces.traceIds - - then: "There is one trace" - traceIds.size() == 1 - - and: "Response code is 404" - response.status().code() == 404 - - and: "There is one server span" - traces.countSpansByKind(Span.SpanKind.SPAN_KIND_SERVER) == 1 - - and: "Expected span names" - traces.countSpansByName(getSpanName('/app/file-that-does-not-exist')) == 1 - - and: "The span for the initial web request" - traces.countFilteredAttributes(UrlAttributes.URL_PATH.key, "/app/file-that-does-not-exist") == 1 - - and: "Number of spans tagged with current otel library version" - traces.countFilteredResourceAttributes(TELEMETRY_DISTRO_VERSION, currentAgentVersion) == traces.countSpans() - - and: "Number of spans tagged with expected OS type" - traces.countFilteredResourceAttributes(OS_TYPE.key, isWindows ? WINDOWS : LINUX) == traces.countSpans() - - where: - [appServer, jdk, isWindows] << getTestParams() - } - - @Unroll - def "#appServer test request for WEB-INF/web.xml on JDK #jdk"(String appServer, String jdk, boolean isWindows) { - assumeTrue(testRequestWebInfWebXml()) - - def currentAgentVersion = new JarFile(agentPath).getManifest().getMainAttributes().get(Attributes.Name.IMPLEMENTATION_VERSION) - - when: - def response = client().get("/app/WEB-INF/web.xml").aggregate().join() - TraceInspector traces = new TraceInspector(waitForTraces()) - Set traceIds = traces.traceIds - - then: "There is one trace" - traceIds.size() == 1 - - and: "Response code is 404" - response.status().code() == 404 - - and: "There is one server span" - traces.countSpansByKind(Span.SpanKind.SPAN_KIND_SERVER) == 1 - - and: "Expected span names" - traces.countSpansByName(getSpanName('/app/WEB-INF/web.xml')) == 1 - - and: "The span for the initial web request" - traces.countFilteredAttributes(UrlAttributes.URL_PATH.key, "/app/WEB-INF/web.xml") == 1 - - and: "Number of spans with http protocol version" - traces.countFilteredAttributes(NetworkAttributes.NETWORK_PROTOCOL_VERSION.key, "1.1") == 1 - - and: "Number of spans tagged with current otel library version" - traces.countFilteredResourceAttributes(TELEMETRY_DISTRO_VERSION, currentAgentVersion) == traces.countSpans() - - and: "Number of spans tagged with expected OS type" - traces.countFilteredResourceAttributes(OS_TYPE.key, isWindows ? WINDOWS : LINUX) == traces.countSpans() - - where: - [appServer, jdk, isWindows] << getTestParams() - } - - @Unroll - def "#appServer test request with error JDK #jdk"(String appServer, String jdk, boolean isWindows) { - assumeTrue(testException()) - - def currentAgentVersion = new JarFile(agentPath).getManifest().getMainAttributes().get(Attributes.Name.IMPLEMENTATION_VERSION) - - when: - def response = client().get("/app/exception").aggregate().join() - TraceInspector traces = new TraceInspector(waitForTraces()) - Set traceIds = traces.traceIds - - then: "There is one trace" - traceIds.size() == 1 - - and: "Response code is 500" - response.status().code() == 500 - - and: "There is one server span" - traces.countSpansByKind(Span.SpanKind.SPAN_KIND_SERVER) == 1 - - and: "Expected span names" - traces.countSpansByName(getSpanName('/app/exception')) == 1 - - and: "There is one exception" - traces.countFilteredEventAttributes('exception.message', 'This is expected') == 1 - - and: "The span for the initial web request" - traces.countFilteredAttributes(UrlAttributes.URL_PATH.key, "/app/exception") == 1 - - and: "Number of spans tagged with current otel library version" - traces.countFilteredResourceAttributes(TELEMETRY_DISTRO_VERSION, currentAgentVersion) == traces.countSpans() - - and: "Number of spans tagged with expected OS type" - traces.countFilteredResourceAttributes(OS_TYPE.key, isWindows ? WINDOWS : LINUX) == traces.countSpans() - - where: - [appServer, jdk, isWindows] << getTestParams() - } - - @Unroll - def "#appServer test request outside deployed application JDK #jdk"(String appServer, String jdk, boolean isWindows) { - assumeTrue(testRequestOutsideDeployedApp()) - def currentAgentVersion = new JarFile(agentPath).getManifest().getMainAttributes().get(Attributes.Name.IMPLEMENTATION_VERSION) - - when: - def response = client().get("/this-is-definitely-not-there-but-there-should-be-a-trace-nevertheless").aggregate().join() - TraceInspector traces = new TraceInspector(waitForTraces()) - Set traceIds = traces.traceIds - - then: "There is one trace" - traceIds.size() == 1 - - and: "Response code is 404" - response.status().code() == 404 - - and: "There is one server span" - traces.countSpansByKind(Span.SpanKind.SPAN_KIND_SERVER) == 1 - - and: "Expected span names" - traces.countSpansByName(getSpanName('/this-is-definitely-not-there-but-there-should-be-a-trace-nevertheless')) == 1 - - and: "The span for the initial web request" - traces.countFilteredAttributes(UrlAttributes.URL_PATH.key, "/this-is-definitely-not-there-but-there-should-be-a-trace-nevertheless") == 1 - - and: "Number of spans with http protocol version" - traces.countFilteredAttributes(NetworkAttributes.NETWORK_PROTOCOL_VERSION.key, "1.1") == 1 - - and: "Number of spans tagged with current otel library version" - traces.countFilteredResourceAttributes(TELEMETRY_DISTRO_VERSION, currentAgentVersion) == traces.countSpans() - - and: "Number of spans tagged with expected OS type" - traces.countFilteredResourceAttributes(OS_TYPE.key, isWindows ? WINDOWS : LINUX) == traces.countSpans() - - where: - [appServer, jdk, isWindows] << getTestParams() - } - - @Unroll - def "#appServer async smoke test on JDK #jdk"(String appServer, String jdk, boolean isWindows) { - assumeTrue(testAsyncSmoke()) - - def currentAgentVersion = new JarFile(agentPath).getManifest().getMainAttributes().get(Attributes.Name.IMPLEMENTATION_VERSION) - - when: - def response = client().get("/app/asyncgreeting").aggregate().join() - TraceInspector traces = new TraceInspector(waitForTraces()) - Set traceIds = traces.traceIds - String responseBody = response.contentUtf8() - - then: "There is one trace" - traceIds.size() == 1 - - and: "trace id is present in the HTTP headers as reported by the called endpoint" - responseBody.contains(traceIds.find()) - - and: "Server spans in the distributed trace" - traces.countSpansByKind(Span.SpanKind.SPAN_KIND_SERVER) == 2 - - and: "Expected span names" - traces.countSpansByName(getSpanName('/app/asyncgreeting')) == 1 - traces.countSpansByName(getSpanName('/app/headers')) == 1 - - and: "The span for the initial web request" - traces.countFilteredAttributes(UrlAttributes.URL_PATH.key, "/app/asyncgreeting") == 1 - - and: "Client span for the remote call" - traces.countFilteredAttributes(UrlAttributes.URL_FULL.key, "http://localhost:8080/app/headers") == 1 - - and: "Server span for the remote call" - traces.countFilteredAttributes(UrlAttributes.URL_PATH.key, "/app/headers") == 1 - - and: "Number of spans with http protocol version" - traces.countFilteredAttributes(NetworkAttributes.NETWORK_PROTOCOL_VERSION.key, "1.1") == 3 - - and: "Number of spans tagged with current otel library version" - traces.countFilteredResourceAttributes(TELEMETRY_DISTRO_VERSION, currentAgentVersion) == 3 - - and: "Number of spans tagged with expected OS type" - traces.countFilteredResourceAttributes(OS_TYPE.key, isWindows ? WINDOWS : LINUX) == 3 - - where: - [appServer, jdk, isWindows] << getTestParams() - } - - @Unroll - def "JSP smoke test for Snippet Injection"() { - assumeTrue(testJsp()) - - when: - def response = client().get("/app/jsp").aggregate().join() - TraceInspector traces = new TraceInspector(waitForTraces()) - String responseBody = response.contentUtf8() - - then: - response.status().isSuccess() - responseBody.contains("Successful JSP test") - - responseBody.contains("") - - if (expectServerSpan()) { - traces.countSpansByKind(Span.SpanKind.SPAN_KIND_SERVER) == 1 - traces.countSpansByName('GET /app/jsp') == 1 - } - where: - [appServer, jdk] << getTestParams() - } - - protected boolean expectServerSpan() { - true - } - - protected String getSpanName(String path) { - switch (path) { - case "/app/greeting": - case "/app/headers": - case "/app/exception": - case "/app/asyncgreeting": - return "GET " + path - case "/app/hello.txt": - case "/app/file-that-does-not-exist": - return "GET /app/*" - } - return "GET" - } - - protected List> getTestParams() { - return [ - [serverVersion, jdk, isWindows] - ] - } -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/CrashEarlyJdk8Test.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/CrashEarlyJdk8Test.groovy deleted file mode 100644 index c6f79a2fea6d..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/CrashEarlyJdk8Test.groovy +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import org.testcontainers.containers.Container -import org.testcontainers.containers.GenericContainer -import org.testcontainers.containers.output.Slf4jLogConsumer -import org.testcontainers.containers.wait.strategy.Wait -import org.testcontainers.utility.DockerImageName -import org.testcontainers.utility.MountableFile -import spock.lang.IgnoreIf -import spock.lang.Specification - -import java.time.Duration - -import static io.opentelemetry.smoketest.TestContainerManager.useWindowsContainers - -// Hotspot versions before 8u40 crash in jit compiled lambdas when javaagent initializes -// java.lang.invoke.CallSite -// This test verifies that such jvm does not crash with opentelemetry agent -@IgnoreIf({ useWindowsContainers() }) -class CrashEarlyJdk8Test extends Specification { - private static final Logger logger = LoggerFactory.getLogger(CrashEarlyJdk8Test) - - private static final String TARGET_AGENT_FILENAME = "opentelemetry-javaagent.jar" - private static final String agentPath = System.getProperty("io.opentelemetry.smoketest.agent.shadowJar.path") - - def "test crash on early jdk8"() { - setup: - GenericContainer target = - new GenericContainer<>(DockerImageName.parse("ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-zulu-openjdk-8u31:20240709.9848833570")) - .withStartupTimeout(Duration.ofMinutes(5)) - .withLogConsumer(new Slf4jLogConsumer(logger)) - .withCopyFileToContainer( - MountableFile.forHostPath(agentPath), "/" + TARGET_AGENT_FILENAME) - .withCopyFileToContainer( - MountableFile.forClasspathResource("crashearlyjdk8/CrashEarlyJdk8.java"), "/CrashEarlyJdk8.java") - .withCopyFileToContainer( - MountableFile.forClasspathResource("crashearlyjdk8/start.sh", 777), "/start.sh") - .withCopyFileToContainer( - MountableFile.forClasspathResource("crashearlyjdk8/test.sh", 777), "/test.sh") - .waitingFor( - Wait.forLogMessage(".*started.*\\n", 1) - ) - .withCommand("/bin/sh", "-c", "/start.sh") - target.start() - - when: - Container.ExecResult result = target.execInContainer("/bin/sh", "-c", "/test.sh") - then: - result.getExitCode() == 0 - - cleanup: - System.err.println(result.toString()) - target.stop() - } -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/GrpcSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/GrpcSmokeTest.groovy deleted file mode 100644 index e56120f48daa..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/GrpcSmokeTest.groovy +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import io.grpc.ManagedChannelBuilder -import io.opentelemetry.api.trace.TraceId -import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest -import io.opentelemetry.proto.collector.trace.v1.TraceServiceGrpc -import spock.lang.IgnoreIf -import spock.lang.Unroll - -import java.time.Duration -import java.util.jar.Attributes -import java.util.jar.JarFile - -import static io.opentelemetry.smoketest.TestContainerManager.useWindowsContainers -import static java.util.stream.Collectors.toSet - -@IgnoreIf({ useWindowsContainers() }) -class GrpcSmokeTest extends SmokeTest { - - protected String getTargetImage(String jdk) { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-grpc:jdk$jdk-20241021.11448062549" - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Server started.*") - } - - @Unroll - def "grpc smoke test on JDK #jdk"(int jdk) { - setup: - def output = startTarget(jdk) - - def channel = ManagedChannelBuilder.forAddress("localhost", containerManager.getTargetMappedPort(8080)) - .usePlaintext() - .build() - def stub = TraceServiceGrpc.newBlockingStub(channel) - - def currentAgentVersion = new JarFile(agentPath).getManifest().getMainAttributes().get(Attributes.Name.IMPLEMENTATION_VERSION) - - when: - stub.export(ExportTraceServiceRequest.getDefaultInstance()) - Collection traces = waitForTraces() - - then: - countSpansByName(traces, 'opentelemetry.proto.collector.trace.v1.TraceService/Export') == 1 - countSpansByName(traces, 'TestService.withSpan') == 1 - - [currentAgentVersion] as Set == findResourceAttribute(traces, "telemetry.distro.version") - .map { it.stringValue } - .collect(toSet()) - - then: "correct traceIds are logged via MDC instrumentation" - def loggedTraceIds = getLoggedTraceIds(output) - def spanTraceIds = getSpanStream(traces) - .map({ TraceId.fromBytes(it.getTraceId().toByteArray()) }) - .collect(toSet()) - loggedTraceIds == spanTraceIds - - cleanup: - stopTarget() - channel.shutdown() - - where: - jdk << [8, 11, 17, 21, 23] - } -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/IbmHttpsUrlConnectionTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/IbmHttpsUrlConnectionTest.groovy deleted file mode 100644 index cfba01a7d654..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/IbmHttpsUrlConnectionTest.groovy +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import io.opentelemetry.proto.trace.v1.Span -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import org.testcontainers.containers.Container -import org.testcontainers.containers.GenericContainer -import org.testcontainers.containers.Network -import org.testcontainers.containers.output.Slf4jLogConsumer -import org.testcontainers.containers.wait.strategy.Wait -import org.testcontainers.utility.DockerImageName -import org.testcontainers.utility.MountableFile -import spock.lang.IgnoreIf -import spock.lang.Specification - -import java.time.Duration - -import static io.opentelemetry.smoketest.TestContainerManager.useWindowsContainers - -@IgnoreIf({ useWindowsContainers() }) -class IbmHttpsUrlConnectionTest extends Specification { - private static final Logger logger = LoggerFactory.getLogger(IbmHttpsUrlConnectionTest) - - private static final String TARGET_AGENT_FILENAME = "opentelemetry-javaagent.jar" - private static final String agentPath = System.getProperty("io.opentelemetry.smoketest.agent.shadowJar.path") - private static final int BACKEND_PORT = 8080 - private static final String BACKEND_ALIAS = "backend" - - private final Network network = Network.newNetwork() - - def "test https url connection"() { - setup: - GenericContainer backend = - new GenericContainer<>( - DockerImageName.parse( - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-fake-backend:20250811.16876216352")) - .withExposedPorts(BACKEND_PORT) - .withEnv("JAVA_TOOL_OPTIONS", "-Xmx128m") - .waitingFor(Wait.forHttp("/health").forPort(BACKEND_PORT)) - .withNetwork(network) - .withNetworkAliases(BACKEND_ALIAS) - .withLogConsumer(new Slf4jLogConsumer(logger)) - backend.start() - - def telemetryRetriever = new GroovyTestTelemetryRetriever(backend.getMappedPort(BACKEND_PORT)) - - GenericContainer target = - new GenericContainer<>(DockerImageName.parse("ibmjava:8-sdk")) - .withStartupTimeout(Duration.ofMinutes(5)) - .withNetwork(network) - .withLogConsumer(new Slf4jLogConsumer(logger)) - .withCopyFileToContainer( - MountableFile.forHostPath(agentPath), "/" + TARGET_AGENT_FILENAME) - .withCopyFileToContainer( - MountableFile.forClasspathResource("ibmhttpsurlconnection/IbmHttpsUrlConnectionTest.java"), "/IbmHttpsUrlConnectionTest.java") - .withCopyFileToContainer( - MountableFile.forClasspathResource("ibmhttpsurlconnection/start.sh", 777), "/start.sh") - .withCopyFileToContainer( - MountableFile.forClasspathResource("ibmhttpsurlconnection/test.sh", 777), "/test.sh") - .waitingFor( - Wait.forLogMessage(".*started.*\\n", 1) - ) - .withCommand("/bin/sh", "-c", "/start.sh") - target.start() - - when: - Container.ExecResult result = target.execInContainer("/bin/sh", "-c", "/test.sh") - then: - result.getExitCode() == 0 - - TraceInspector traces = new TraceInspector(telemetryRetriever.waitForTraces()) - Set traceIds = traces.traceIds - - then: "There is one trace" - traceIds.size() == 1 - - and: "Client span in the distributed trace" - traces.countSpansByKind(Span.SpanKind.SPAN_KIND_CLIENT) == 1 - - and: "Expected span names" - traces.countSpansByName("GET") == 1 - - cleanup: - System.err.println(result.toString()) - target.stop() - backend.stop() - } -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/JettyJpmsSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/JettyJpmsSmokeTest.groovy deleted file mode 100644 index ea83de0f0e9f..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/JettyJpmsSmokeTest.groovy +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -// jetty test with java module system -abstract class JettyJpmsSmokeTest extends JettySmokeTest { - - @Override - protected String[] getCommand() { - // --jpms flags enables using java module system - return ["java", "-jar", "/server/start.jar", "--jpms"] - } -} - -@AppServer(version = "11.0.19", jdk = "11") -class Jetty11JpmsJdk11 extends JettyJpmsSmokeTest { -} -@AppServer(version = "11.0.19", jdk = "17") -class Jetty11JpmsJdk17 extends JettyJpmsSmokeTest { -} -@AppServer(version = "11.0.19", jdk = "21") -class Jetty11JpmsJdk21 extends JettyJpmsSmokeTest { -} -@AppServer(version = "11.0.19", jdk = "23") -class Jetty11JpmsJdk23 extends JettyJpmsSmokeTest { -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/JettySmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/JettySmokeTest.groovy deleted file mode 100644 index c25d1b7ab734..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/JettySmokeTest.groovy +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import java.time.Duration - -abstract class JettySmokeTest extends AppServerTest { - - protected String getTargetImagePrefix() { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-jetty" - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Started Server.*") - } -} - -@AppServer(version = "9.4.53", jdk = "8") -class Jetty9Jdk8 extends JettySmokeTest { -} - -@AppServer(version = "9.4.53", jdk = "8-openj9") -class Jetty9Jdk8Openj9 extends JettySmokeTest { -} - -@AppServer(version = "9.4.53", jdk = "11") -class Jetty9Jdk11 extends JettySmokeTest { -} - -@AppServer(version = "9.4.53", jdk = "11-openj9") -class Jetty9Jdk11Openj9 extends JettySmokeTest { -} - -@AppServer(version = "9.4.53", jdk = "17") -class Jetty9Jdk17 extends JettySmokeTest { -} - -@AppServer(version = "9.4.53", jdk = "17-openj9") -class Jetty9Jdk17Openj9 extends JettySmokeTest { -} - -@AppServer(version = "9.4.53", jdk = "21") -class Jetty9Jdk21 extends JettySmokeTest { -} - -@AppServer(version = "9.4.53", jdk = "21-openj9") -class Jetty9Jdk21Openj9 extends JettySmokeTest { -} - -@AppServer(version = "9.4.53", jdk = "23") -class Jetty9Jdk23 extends JettySmokeTest { -} - -@AppServer(version = "9.4.53", jdk = "23-openj9") -class Jetty9Jdk23Openj9 extends JettySmokeTest { -} - -@AppServer(version = "10.0.19", jdk = "11") -class Jetty10Jdk11 extends JettySmokeTest { -} - -@AppServer(version = "10.0.19", jdk = "11-openj9") -class Jetty10Jdk11Openj9 extends JettySmokeTest { -} - -@AppServer(version = "10.0.19", jdk = "17") -class Jetty10Jdk17 extends JettySmokeTest { -} - -@AppServer(version = "10.0.19", jdk = "17-openj9") -class Jetty10Jdk17Openj9 extends JettySmokeTest { -} - -@AppServer(version = "10.0.19", jdk = "21") -class Jetty10Jdk21 extends JettySmokeTest { -} - -@AppServer(version = "10.0.19", jdk = "21-openj9") -class Jetty10Jdk21Openj9 extends JettySmokeTest { -} - -@AppServer(version = "10.0.19", jdk = "23") -class Jetty10Jdk23 extends JettySmokeTest { -} - -@AppServer(version = "10.0.19", jdk = "23-openj9") -class Jetty10Jdk23Openj9 extends JettySmokeTest { -} - -@AppServer(version = "11.0.19", jdk = "11") -class Jetty11Jdk11 extends JettySmokeTest { -} - -@AppServer(version = "11.0.19", jdk = "11-openj9") -class Jetty11Jdk11Openj9 extends JettySmokeTest { -} - -@AppServer(version = "11.0.19", jdk = "17") -class Jetty11Jdk17 extends JettySmokeTest { -} - -@AppServer(version = "11.0.19", jdk = "17-openj9") -class Jetty11Jdk17Openj9 extends JettySmokeTest { -} - -@AppServer(version = "11.0.19", jdk = "21") -class Jetty11Jdk21 extends JettySmokeTest { -} - -@AppServer(version = "11.0.19", jdk = "21-openj9") -class Jetty11Jdk21Openj9 extends JettySmokeTest { -} - -@AppServer(version = "11.0.19", jdk = "23") -class Jetty11Jdk23 extends JettySmokeTest { -} - -@AppServer(version = "11.0.19", jdk = "23-openj9") -class Jetty11Jdk23Openj9 extends JettySmokeTest { -} - -@AppServer(version = "12.0.6", jdk = "17") -class Jetty12Jdk17 extends JettySmokeTest { -} - -@AppServer(version = "12.0.6", jdk = "17-openj9") -class Jetty12Jdk17Openj9 extends JettySmokeTest { -} - -@AppServer(version = "12.0.6", jdk = "21") -class Jetty12Jdk21 extends JettySmokeTest { -} - -@AppServer(version = "12.0.6", jdk = "21-openj9") -class Jetty12Jdk21Openj9 extends JettySmokeTest { -} - -@AppServer(version = "12.0.6", jdk = "23") -class Jetty12Jdk23 extends JettySmokeTest { -} - -@AppServer(version = "12.0.6", jdk = "23-openj9") -class Jetty12Jdk23Openj9 extends JettySmokeTest { -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/LibertyServletOnlySmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/LibertyServletOnlySmokeTest.groovy deleted file mode 100644 index aea3d9d04bcf..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/LibertyServletOnlySmokeTest.groovy +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -abstract class LibertyServletOnlySmokeTest extends LibertySmokeTest { - - @Override - protected List getExtraResources() { - [ - // server.xml path on linux containers - ResourceMapping.of("liberty-servlet.xml", "/config/server.xml"), - // server.xml path on windows containers - ResourceMapping.of("liberty-servlet.xml", "/server/usr/servers/defaultServer/server.xml"), - ] - } - - @Override - protected String getSpanName(String path) { - switch (path) { - case "/app/hello.txt": - case "/app/file-that-does-not-exist": - return "GET" - } - return super.getSpanName(path) - } -} - -@AppServer(version = "21.0.0.12", jdk = "11") -class LibertyServletOnly21Jdk11 extends LibertySmokeTest { -} - -@AppServer(version = "22.0.0.12", jdk = "11") -class LibertyServletOnly22Jdk11 extends LibertySmokeTest { -} - -@AppServer(version = "23.0.0.12", jdk = "11") -class LibertyServletOnly23Jdk11 extends LibertySmokeTest { -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/LibertySmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/LibertySmokeTest.groovy deleted file mode 100644 index 1fe98edb6803..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/LibertySmokeTest.groovy +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import java.time.Duration - -abstract class LibertySmokeTest extends AppServerTest { - - protected String getTargetImagePrefix() { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-liberty" - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(3), ".*server is ready to run a smarter planet.*") - } -} - -@AppServer(version = "20.0.0.12", jdk = "8") -class Liberty20Jdk8 extends LibertySmokeTest { -} - -@AppServer(version = "20.0.0.12", jdk = "8-openj9") -class Liberty20Jdk8Openj9 extends LibertySmokeTest { -} - -@AppServer(version = "20.0.0.12", jdk = "11") -class Liberty20Jdk11 extends LibertySmokeTest { -} - -@AppServer(version = "20.0.0.12", jdk = "11-openj9") -class Liberty20Jdk11Openj9 extends LibertySmokeTest { -} - -@AppServer(version = "21.0.0.12", jdk = "8") -class Liberty21Jdk8 extends LibertySmokeTest { -} - -@AppServer(version = "21.0.0.12", jdk = "8-openj9") -class Liberty21Jdk8Openj9 extends LibertySmokeTest { -} - -@AppServer(version = "21.0.0.12", jdk = "11") -class Liberty21Jdk11 extends LibertySmokeTest { -} - -@AppServer(version = "21.0.0.12", jdk = "11-openj9") -class Liberty21Jdk11Openj9 extends LibertySmokeTest { -} - -@AppServer(version = "21.0.0.12", jdk = "17") -class Liberty21Jdk17 extends LibertySmokeTest { -} - -@AppServer(version = "21.0.0.12", jdk = "17-openj9") -class Liberty21Jdk17Openj9 extends LibertySmokeTest { -} - -@AppServer(version = "22.0.0.12", jdk = "8") -class Liberty22Jdk8 extends LibertySmokeTest { -} - -@AppServer(version = "22.0.0.12", jdk = "8-openj9") -class Liberty22Jdk8Openj9 extends LibertySmokeTest { -} - -@AppServer(version = "22.0.0.12", jdk = "11") -class Liberty22Jdk11 extends LibertySmokeTest { -} - -@AppServer(version = "22.0.0.12", jdk = "11-openj9") -class Liberty22Jdk11Openj9 extends LibertySmokeTest { -} - -@AppServer(version = "22.0.0.12", jdk = "17") -class Liberty22Jdk17 extends LibertySmokeTest { -} - -@AppServer(version = "22.0.0.12", jdk = "17-openj9") -class Liberty22Jdk17Openj9 extends LibertySmokeTest { -} - -@AppServer(version = "23.0.0.12", jdk = "8") -class Liberty23Jdk8 extends LibertySmokeTest { - @Override - boolean testJsp() { - false - } -} - -@AppServer(version = "23.0.0.12", jdk = "8-openj9") -class Liberty23Jdk8Openj9 extends LibertySmokeTest { - @Override - boolean testJsp() { - false - } -} - -@AppServer(version = "23.0.0.12", jdk = "11") -class Liberty23Jdk11 extends LibertySmokeTest { -} - -@AppServer(version = "23.0.0.12", jdk = "11-openj9") -class Liberty23Jdk11Openj9 extends LibertySmokeTest { -} - -@AppServer(version = "23.0.0.12", jdk = "17") -class Liberty23Jdk17 extends LibertySmokeTest { -} - -@AppServer(version = "23.0.0.12", jdk = "17-openj9") -class Liberty23Jdk17Openj9 extends LibertySmokeTest { -} - -@AppServer(version = "23.0.0.12", jdk = "20") -class Liberty23Jdk20 extends LibertySmokeTest { -} - -@AppServer(version = "23.0.0.12", jdk = "20-openj9") -class Liberty23Jdk20Openj9 extends LibertySmokeTest { -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PayaraSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PayaraSmokeTest.groovy deleted file mode 100644 index 435a1d6cf9db..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PayaraSmokeTest.groovy +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import java.time.Duration - -abstract class PayaraSmokeTest extends AppServerTest { - - protected String getTargetImagePrefix() { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-payara" - } - - @Override - protected Map getExtraEnv() { - return ["HZ_PHONE_HOME_ENABLED": "false"] - } - - @Override - protected String getJvmArgsEnvVarName() { - return "JVM_ARGS" - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(3), ".*(app was successfully deployed|deployed with name app).*") - } - - @Override - protected String getSpanName(String path) { - switch (path) { - case "/this-is-definitely-not-there-but-there-should-be-a-trace-nevertheless": - return "GET /*" - } - return super.getSpanName(path) - } -} - -@AppServer(version = "5.2020.6", jdk = "8") -class Payara52020Jdk8 extends PayaraSmokeTest { -} - -@AppServer(version = "5.2020.6", jdk = "8-openj9") -class Payara52020Jdk8Openj9 extends PayaraSmokeTest { -} - -@AppServer(version = "5.2020.6", jdk = "11") -class Payara52020Jdk11 extends PayaraSmokeTest { -} - -@AppServer(version = "5.2020.6", jdk = "11-openj9") -class Payara52020Jdk11Openj9 extends PayaraSmokeTest { -} - -@AppServer(version = "5.2021.8", jdk = "8") -class Payara52021Jdk8 extends PayaraSmokeTest { -} - -@AppServer(version = "5.2021.8", jdk = "8-openj9") -class Payara52021Jdk8Openj9 extends PayaraSmokeTest { -} - -@AppServer(version = "5.2021.8", jdk = "11") -class Payara52021Jdk11 extends PayaraSmokeTest { -} - -@AppServer(version = "5.2021.8", jdk = "11-openj9") -class Payara52021Jdk11Openj9 extends PayaraSmokeTest { -} - -@AppServer(version = "6.2023.12", jdk = "11") -class Payara6Jdk11 extends PayaraSmokeTest { -} - -@AppServer(version = "6.2023.12", jdk = "11-openj9") -class Payara6Jdk11Openj9 extends PayaraSmokeTest { -} - -@AppServer(version = "6.2023.12", jdk = "17") -class Payara6Jdk17 extends PayaraSmokeTest { -} - -@AppServer(version = "6.2023.12", jdk = "17-openj9") -class Payara6Jdk17Openj9 extends PayaraSmokeTest { -} - -@AppServer(version = "6.2023.12", jdk = "21-openj9") -class Payara6Jdk21Openj9 extends PayaraSmokeTest { -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy deleted file mode 100644 index 5df6ad4a14a5..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest -import io.opentelemetry.semconv.HttpAttributes -import spock.lang.IgnoreIf - -import java.time.Duration - -import static io.opentelemetry.smoketest.TestContainerManager.useWindowsContainers - -@IgnoreIf({ useWindowsContainers() }) -class PlaySmokeTest extends SmokeTest { - - protected String getTargetImage(String jdk) { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-play:jdk$jdk-20241022.11450623960" - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Listening for HTTP.*") - } - - def "play smoke test on JDK #jdk"(int jdk) { - setup: - startTarget(jdk) - when: - def response = client().get("/welcome?id=1").aggregate().join() - Collection traces = waitForTraces() - - then: - response.contentUtf8() == "Welcome 1." - countSpansByName(traces, 'GET /welcome') == 1 // SERVER span - countSpansByName(traces, '/welcome') == 1 // INTERNAL span - - new TraceInspector(traces).countFilteredAttributes(HttpAttributes.HTTP_ROUTE.key, "/welcome") == 1 - - cleanup: - stopTarget() - - where: - jdk << [8, 11, 17, 21] - } -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PrometheusSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PrometheusSmokeTest.groovy deleted file mode 100644 index 3fe7da6e3eed..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PrometheusSmokeTest.groovy +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import io.opentelemetry.testing.internal.armeria.client.WebClient -import java.time.Duration -import spock.lang.IgnoreIf - -import static io.opentelemetry.smoketest.TestContainerManager.useWindowsContainers - -@IgnoreIf({ useWindowsContainers() }) -class PrometheusSmokeTest extends SmokeTest { - private static final int PROMETHEUS_PORT = 9090 - - protected String getTargetImage(String jdk) { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk$jdk-20211213.1570880324" - } - - @Override - protected Map getExtraEnv() { - return Map.of("OTEL_METRICS_EXPORTER", "prometheus", "OTEL_EXPORTER_PROMETHEUS_PORT", PROMETHEUS_PORT.toString()) - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Started SpringbootApplication in.*") - } - - protected List getExtraPorts() { - return [PROMETHEUS_PORT] - } - - def "Should export metrics"(int jdk) { - setup: - startTarget(jdk) - - when: - client().get("/greeting").aggregate().join() - - then: - def prometheusClient = WebClient.of("h1c://localhost:${containerManager.getTargetMappedPort(9090)}") - def prometheusData = prometheusClient.get("/metrics").aggregate().join().contentUtf8() - - prometheusData.contains("jvm_memory_used") - - cleanup: - stopTarget() - - where: - jdk << [8, 11, 17] - } - -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SmokeTest.groovy deleted file mode 100644 index 931d7998ce71..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SmokeTest.groovy +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import io.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest -import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest -import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest -import io.opentelemetry.proto.common.v1.AnyValue -import io.opentelemetry.proto.trace.v1.Span -import io.opentelemetry.smoketest.windows.WindowsTestContainerManager -import io.opentelemetry.testing.internal.armeria.client.WebClient -import org.testcontainers.containers.output.ToStringConsumer -import spock.lang.Shared -import spock.lang.Specification - -import java.util.regex.Pattern -import java.util.stream.Stream - -import static io.opentelemetry.smoketest.TestContainerManager.useWindowsContainers -import static java.util.stream.Collectors.toSet - -abstract class SmokeTest extends Specification { - private static final Pattern TRACE_ID_PATTERN = Pattern.compile(".*trace_id=(?[a-zA-Z0-9]+).*") - - protected static final TestContainerManager containerManager = createContainerManager() - - @Shared - private GroovyTestTelemetryRetriever telemetryRetriever - - @Shared - protected String agentPath = System.getProperty("io.opentelemetry.smoketest.agent.shadowJar.path") - - protected WebClient client() { - return WebClient.of("h1c://localhost:${containerManager.getTargetMappedPort(8080)}") - } - - /** - * Subclasses can override this method to pass jvm arguments in another environment variable - */ - protected String getJvmArgsEnvVarName() { - return "JAVA_TOOL_OPTIONS" - } - - /** - * Subclasses can override this method to customise target application's environment - */ - protected Map getExtraEnv() { - return Collections.emptyMap() - } - - /** - * Subclasses can override this method to disable setting default service name - */ - protected boolean getSetServiceName() { - return true - } - - /** - * Subclasses can override this method to provide additional files to copy to target container - */ - protected List getExtraResources() { - return [] - } - - /** - * Subclasses can override this method to provide additional ports that should be exposed from the - * target container - */ - protected List getExtraPorts() { - return [] - } - - def setupSpec() { - containerManager.startEnvironmentOnce() - telemetryRetriever = new GroovyTestTelemetryRetriever(containerManager.getBackendMappedPort()) - } - - def startTarget(int jdk) { - startTarget(String.valueOf(jdk), null, false) - } - - def startTarget(String jdk, String serverVersion, boolean windows) { - def targetImage = getTargetImage(jdk, serverVersion, windows) - return containerManager.startTarget(targetImage, agentPath, jvmArgsEnvVarName, extraEnv, setServiceName, extraResources, extraPorts, getWaitStrategy(), getCommand()) - } - - protected abstract String getTargetImage(String jdk) - - protected String getTargetImage(String jdk, String serverVersion, boolean windows) { - return getTargetImage(jdk) - } - - protected TargetWaitStrategy getWaitStrategy() { - return null - } - - protected String[] getCommand() { - return null - } - - def cleanup() { - telemetryRetriever.clearTelemetry() - } - - def stopTarget() { - containerManager.stopTarget() - } - - protected static Stream findResourceAttribute(Collection traces, - String attributeKey) { - return traces.stream() - .flatMap { it.getResourceSpansList().stream() } - .flatMap { it.getResource().getAttributesList().stream() } - .filter { it.key == attributeKey } - .map { it.value } - } - - protected static boolean hasResourceAttribute(Collection traces, - String attributeKey, - String attributeValue) { - return findResourceAttribute(traces, attributeKey) - .filter { it.stringValue == attributeValue } - .findAny() - .isPresent() - } - - protected static int countSpansByName(Collection traces, String spanName) { - return getSpanStream(traces).filter { it.name == spanName }.count() - } - - protected static Stream getSpanStream(Collection traces) { - return traces.stream() - .flatMap { it.getResourceSpansList().stream() } - .flatMap { it.getScopeSpansList().stream() } - .flatMap { it.getSpansList().stream() } - } - - protected Collection waitForTraces() { - return telemetryRetriever.waitForTraces() - } - - protected Collection waitForMetrics() { - return telemetryRetriever.waitForMetrics() - } - - protected Collection waitForLogs() { - return telemetryRetriever.waitForLogs() - } - - protected static Set getLoggedTraceIds(ToStringConsumer output) { - output.toUtf8String().lines() - .flatMap(SmokeTest.&findTraceId) - .collect(toSet()) - } - - private static Stream findTraceId(String log) { - def m = TRACE_ID_PATTERN.matcher(log) - m.matches() ? Stream.of(m.group("traceId")) : Stream.empty() as Stream - } - - protected static boolean isVersionLogged(ToStringConsumer output, String version) { - output.toUtf8String().lines() - .filter({ it.contains("opentelemetry-javaagent - version: " + version) }) - .findFirst() - .isPresent() - } - - private static TestContainerManager createContainerManager() { - return useWindowsContainers() ? new WindowsTestContainerManager() : new LinuxTestContainerManager() - } -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy deleted file mode 100644 index e69c7271f964..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest -import spock.lang.IgnoreIf - -import java.time.Duration - -import static io.opentelemetry.smoketest.TestContainerManager.useWindowsContainers - -@IgnoreIf({ useWindowsContainers() }) -class SpringBootWithSamplingSmokeTest extends SmokeTest { - - static final double SAMPLER_PROBABILITY = 0.2 - static final int NUM_TRIES = 1000 - static final int ALLOWED_DEVIATION = 0.1 * NUM_TRIES - - protected String getTargetImage(String jdk) { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk$jdk-20211213.1570880324" - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Started SpringbootApplication in.*") - } - - @Override - protected Map getExtraEnv() { - return [ - "OTEL_TRACES_SAMPLER" : "parentbased_traceidratio", - "OTEL_TRACES_SAMPLER_ARG": String.valueOf(SAMPLER_PROBABILITY), - ] - } - - def "spring boot with probability sampling enabled on JDK #jdk"(int jdk) { - setup: - startTarget(jdk) - when: - for (int i = 1; i <= NUM_TRIES; i++) { - client().get("/greeting").aggregate().join() - } - Collection traces = waitForTraces() - - then: - // since sampling is enabled, not really expecting to receive NUM_TRIES spans - Math.abs(countSpansByName(traces, 'GET /greeting') - (SAMPLER_PROBABILITY * NUM_TRIES)) <= ALLOWED_DEVIATION - - cleanup: - stopTarget() - - where: - jdk << [8, 11, 17] - } -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/TomcatSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/TomcatSmokeTest.groovy deleted file mode 100644 index aca49bcbbedb..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/TomcatSmokeTest.groovy +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import java.time.Duration - -abstract class TomcatSmokeTest extends AppServerTest { - - protected String getTargetImagePrefix() { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-tomcat" - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Server startup in.*") - } - - @Override - protected boolean expectServerSpan() { - return this.serverVersion != "7.0.109" - } -} - -@AppServer(version = "7.0.109", jdk = "8") -class Tomcat7Jdk8 extends TomcatSmokeTest { -} - -@AppServer(version = "7.0.109", jdk = "8-openj9") -class Tomcat7Jdk8Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "8.5.98", jdk = "8") -class Tomcat8Jdk8 extends TomcatSmokeTest { -} - -@AppServer(version = "8.5.98", jdk = "8-openj9") -class Tomcat8Jdk8Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "8.5.98", jdk = "11") -class Tomcat8Jdk11 extends TomcatSmokeTest { -} - -@AppServer(version = "8.5.98", jdk = "11-openj9") -class Tomcat8Jdk11Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "8.5.98", jdk = "17") -class Tomcat8Jdk17 extends TomcatSmokeTest { -} - -@AppServer(version = "8.5.98", jdk = "17-openj9") -class Tomcat8Jdk17Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "8.5.98", jdk = "21") -class Tomcat8Jdk21 extends TomcatSmokeTest { -} - -@AppServer(version = "8.5.98", jdk = "21-openj9") -class Tomcat8Jdk21Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "8.5.98", jdk = "23") -class Tomcat8Jdk23 extends TomcatSmokeTest { -} - -@AppServer(version = "8.5.98", jdk = "23-openj9") -class Tomcat8Jdk23Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "9.0.85", jdk = "8") -class Tomcat9Jdk8 extends TomcatSmokeTest { -} - -@AppServer(version = "9.0.85", jdk = "8-openj9") -class Tomcat9Jdk8Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "9.0.85", jdk = "11") -class Tomcat9Jdk11 extends TomcatSmokeTest { -} - -@AppServer(version = "9.0.85", jdk = "11-openj9") -class Tomcat9Jdk11Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "9.0.85", jdk = "17") -class Tomcat9Jdk17 extends TomcatSmokeTest { -} - -@AppServer(version = "9.0.85", jdk = "17-openj9") -class Tomcat9Jdk17Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "9.0.85", jdk = "21") -class Tomcat9Jdk21 extends TomcatSmokeTest { -} - -@AppServer(version = "9.0.85", jdk = "21-openj9") -class Tomcat9Jdk21Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "9.0.85", jdk = "23") -class Tomcat9Jdk23 extends TomcatSmokeTest { -} - -@AppServer(version = "9.0.85", jdk = "23-openj9") -class Tomcat9Jdk23Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "10.1.18", jdk = "11") -class Tomcat10Jdk11 extends TomcatSmokeTest { -} - -@AppServer(version = "10.1.18", jdk = "11-openj9") -class Tomcat10Jdk11Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "10.1.18", jdk = "17") -class Tomcat10Jdk17 extends TomcatSmokeTest { -} - -@AppServer(version = "10.1.18", jdk = "17-openj9") -class Tomcat10Jdk17Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "10.1.18", jdk = "21") -class Tomcat10Jdk21 extends TomcatSmokeTest { -} - -@AppServer(version = "10.1.18", jdk = "21-openj9") -class Tomcat10Jdk21Openj9 extends TomcatSmokeTest { -} - -@AppServer(version = "10.1.18", jdk = "23") -class Tomcat10Jdk23 extends TomcatSmokeTest { -} - -@AppServer(version = "10.1.18", jdk = "23-openj9") -class Tomcat10Jdk23Openj9 extends TomcatSmokeTest { -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/TomeeSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/TomeeSmokeTest.groovy deleted file mode 100644 index db7e31d95f4a..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/TomeeSmokeTest.groovy +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import java.time.Duration - -abstract class TomeeSmokeTest extends AppServerTest { - - protected String getTargetImagePrefix() { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-tomee" - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(3), ".*Server startup in.*") - } - - @Override - protected String getSpanName(String path) { - switch (path) { - case "/this-is-definitely-not-there-but-there-should-be-a-trace-nevertheless": - return "GET /*" - } - return super.getSpanName(path) - } -} - -@AppServer(version = "7.0.9", jdk = "8") -class Tomee70Jdk8 extends TomeeSmokeTest { -} - -@AppServer(version = "7.0.9", jdk = "8-openj9") -class Tomee70Jdk8Openj9 extends TomeeSmokeTest { -} - -@AppServer(version = "7.1.4", jdk = "8") -class Tomee71Jdk8 extends TomeeSmokeTest { -} - -@AppServer(version = "7.1.4", jdk = "8-openj9") -class Tomee71Jdk8Openj9 extends TomeeSmokeTest { -} - -@AppServer(version = "8.0.16", jdk = "8") -class Tomee8Jdk8 extends TomeeSmokeTest { -} - -@AppServer(version = "8.0.16", jdk = "8-openj9") -class Tomee8Jdk8Openj9 extends TomeeSmokeTest { -} - -@AppServer(version = "8.0.16", jdk = "11") -class Tomee8Jdk11 extends TomeeSmokeTest { -} - -@AppServer(version = "8.0.16", jdk = "11-openj9") -class Tomee8Jdk11Openj9 extends TomeeSmokeTest { -} - -@AppServer(version = "8.0.16", jdk = "17") -class Tomee8Jdk17 extends TomeeSmokeTest { -} - -@AppServer(version = "8.0.16", jdk = "17-openj9") -class Tomee8Jdk17Openj9 extends TomeeSmokeTest { -} - -@AppServer(version = "8.0.16", jdk = "21") -class Tomee8Jdk21 extends TomeeSmokeTest { -} - -@AppServer(version = "8.0.16", jdk = "21-openj9") -class Tomee8Jdk21Openj9 extends TomeeSmokeTest { -} - -@AppServer(version = "8.0.16", jdk = "23") -class Tomee8Jdk23 extends TomeeSmokeTest { -} - -@AppServer(version = "8.0.16", jdk = "23-openj9") -class Tomee8Jdk23Openj9 extends TomeeSmokeTest { -} - -@AppServer(version = "9.1.2", jdk = "11") -class Tomee9Jdk11 extends TomeeSmokeTest { -} - -@AppServer(version = "9.1.2", jdk = "11-openj9") -class Tomee9Jdk11Openj9 extends TomeeSmokeTest { -} - -@AppServer(version = "9.1.2", jdk = "17") -class Tomee9Jdk17 extends TomeeSmokeTest { -} - -@AppServer(version = "9.1.2", jdk = "17-openj9") -class Tomee9Jdk17Openj9 extends TomeeSmokeTest { -} - -@AppServer(version = "9.1.2", jdk = "21") -class Tomee9Jdk21 extends TomeeSmokeTest { -} - -@AppServer(version = "9.1.2", jdk = "21-openj9") -class Tomee9Jdk21Openj9 extends TomeeSmokeTest { -} - -@AppServer(version = "9.1.2", jdk = "23") -class Tomee9Jdk23 extends TomeeSmokeTest { -} - -@AppServer(version = "9.1.2", jdk = "23-openj9") -class Tomee9Jdk23Openj9 extends TomeeSmokeTest { -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/WebsphereSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/WebsphereSmokeTest.groovy deleted file mode 100644 index afcac08f8643..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/WebsphereSmokeTest.groovy +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import java.time.Duration - -abstract class WebsphereSmokeTest extends AppServerTest { - - protected String getTargetImagePrefix() { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-websphere" - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(3), ".*Server server1 open for e-business.*") - } - - @Override - protected String getSpanName(String path) { - switch (path) { - case "/app/hello.txt": - case "/app/file-that-does-not-exist": - return "GET" - } - return super.getSpanName(path) - } - - @Override - boolean testRequestOutsideDeployedApp() { - false - } -} - -@AppServer(version = "8.5.5.22", jdk = "8-openj9") -class Websphere8Jdk8Openj9 extends WebsphereSmokeTest { -} - -@AppServer(version = "9.0.5.14", jdk = "8-openj9") -class Websphere9Jdk8Openj9 extends WebsphereSmokeTest { -} diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/WildflySmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/WildflySmokeTest.groovy deleted file mode 100644 index 150dedbbf509..000000000000 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/WildflySmokeTest.groovy +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest - -import java.time.Duration - -abstract class WildflySmokeTest extends AppServerTest { - - protected String getTargetImagePrefix() { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-wildfly" - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*started in.*") - } - -} - -@AppServer(version = "13.0.0.Final", jdk = "8") -class Wildfly13Jdk8 extends WildflySmokeTest { -} - -@AppServer(version = "13.0.0.Final", jdk = "8-openj9") -class Wildfly13Jdk8Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "17.0.1.Final", jdk = "8") -class Wildfly17Jdk8 extends WildflySmokeTest { -} - -@AppServer(version = "17.0.1.Final", jdk = "8-openj9") -class Wildfly17Jdk8Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "17.0.1.Final", jdk = "11") -class Wildfly17Jdk11 extends WildflySmokeTest { -} - -@AppServer(version = "17.0.1.Final", jdk = "11-openj9") -class Wildfly17Jdk11Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "17.0.1.Final", jdk = "17") -class Wildfly17Jdk17 extends WildflySmokeTest { -} - -@AppServer(version = "17.0.1.Final", jdk = "17-openj9") -class Wildfly17Jdk17Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "17.0.1.Final", jdk = "21") -class Wildfly17Jdk21 extends WildflySmokeTest { -} - -@AppServer(version = "17.0.1.Final", jdk = "21-openj9") -class Wildfly17Jdk21Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "21.0.0.Final", jdk = "8") -class Wildfly21Jdk8 extends WildflySmokeTest { -} - -@AppServer(version = "21.0.0.Final", jdk = "8-openj9") -class Wildfly21Jdk8Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "21.0.0.Final", jdk = "11") -class Wildfly21Jdk11 extends WildflySmokeTest { -} - -@AppServer(version = "21.0.0.Final", jdk = "11-openj9") -class Wildfly21Jdk11Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "21.0.0.Final", jdk = "17") -class Wildfly21Jdk17 extends WildflySmokeTest { -} - -@AppServer(version = "21.0.0.Final", jdk = "17-openj9") -class Wildfly21Jdk17Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "21.0.0.Final", jdk = "21") -class Wildfly21Jdk21 extends WildflySmokeTest { -} - -@AppServer(version = "21.0.0.Final", jdk = "21-openj9") -class Wildfly21Jdk21Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "28.0.1.Final", jdk = "11") -class Wildfly28Jdk11 extends WildflySmokeTest { -} - -@AppServer(version = "28.0.1.Final", jdk = "11-openj9") -class Wildfly28Jdk11Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "28.0.1.Final", jdk = "17") -class Wildfly28Jdk17 extends WildflySmokeTest { -} - -@AppServer(version = "28.0.1.Final", jdk = "17-openj9") -class Wildfly28Jdk17Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "28.0.1.Final", jdk = "21") -class Wildfly28Jdk21 extends WildflySmokeTest { -} - -@AppServer(version = "28.0.1.Final", jdk = "21-openj9") -class Wildfly28Jdk21Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "28.0.1.Final", jdk = "23") -class Wildfly28Jdk23 extends WildflySmokeTest { -} - -@AppServer(version = "28.0.1.Final", jdk = "23-openj9") -class Wildfly28Jdk23Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "29.0.1.Final", jdk = "11") -class Wildfly29Jdk11 extends WildflySmokeTest { -} - -@AppServer(version = "29.0.1.Final", jdk = "11-openj9") -class Wildfly29Jdk11Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "29.0.1.Final", jdk = "17") -class Wildfly29Jdk17 extends WildflySmokeTest { -} - -@AppServer(version = "29.0.1.Final", jdk = "17-openj9") -class Wildfly29Jdk17Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "29.0.1.Final", jdk = "21") -class Wildfly29Jdk21 extends WildflySmokeTest { -} - -@AppServer(version = "29.0.1.Final", jdk = "21-openj9") -class Wildfly29Jdk21Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "29.0.1.Final", jdk = "23") -class Wildfly29Jdk23 extends WildflySmokeTest { -} - -@AppServer(version = "29.0.1.Final", jdk = "23-openj9") -class Wildfly29Jdk23Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "30.0.1.Final", jdk = "11") -class Wildfly30Jdk11 extends WildflySmokeTest { -} - -@AppServer(version = "30.0.1.Final", jdk = "11-openj9") -class Wildfly30Jdk11Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "30.0.1.Final", jdk = "17") -class Wildfly30Jdk17 extends WildflySmokeTest { -} - -@AppServer(version = "30.0.1.Final", jdk = "17-openj9") -class Wildfly30Jdk17Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "30.0.1.Final", jdk = "21") -class Wildfly30Jdk21 extends WildflySmokeTest { -} - -@AppServer(version = "30.0.1.Final", jdk = "21-openj9") -class Wildfly30Jdk21Openj9 extends WildflySmokeTest { -} - -@AppServer(version = "30.0.1.Final", jdk = "23") -class Wildfly30Jdk23 extends WildflySmokeTest { -} - -@AppServer(version = "30.0.1.Final", jdk = "23-openj9") -class Wildfly30Jdk23Openj9 extends WildflySmokeTest { -} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/AbstractSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/AbstractSmokeTest.java new file mode 100644 index 000000000000..6dadf9bc9685 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/AbstractSmokeTest.java @@ -0,0 +1,110 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest; + +import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.smoketest.windows.WindowsTestContainerManager; +import io.opentelemetry.testing.internal.armeria.client.WebClient; +import java.io.IOException; +import java.util.Set; +import java.util.jar.Attributes; +import java.util.jar.JarFile; +import java.util.stream.Collectors; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.extension.RegisterExtension; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public abstract class AbstractSmokeTest implements TelemetryRetrieverProvider { + + @RegisterExtension + public static final InstrumentationExtension testing = SmokeTestInstrumentationExtension.create(); + + @RegisterExtension static final AutoCleanupExtension autoCleanup = AutoCleanupExtension.create(); + + protected static final TestContainerManager containerManager = createContainerManager(); + private static TelemetryRetriever telemetryRetriever; + + private final String agentPath = + System.getProperty("io.opentelemetry.smoketest.agent.shadowJar.path"); + private final String agentVersion = readAgentVersion(); + + private final SmokeTestOptions options = new SmokeTestOptions<>(); + + @BeforeAll + void setUp() { + containerManager.startEnvironmentOnce(); + configure(options); + telemetryRetriever = + new TelemetryRetriever(containerManager.getBackendMappedPort(), options.telemetryTimeout); + } + + protected void configure(SmokeTestOptions options) {} + + protected WebClient client() { + return WebClient.of("h1c://localhost:" + containerManager.getTargetMappedPort(8080)); + } + + public SmokeTestOutput start(T arg) { + autoCleanup.deferCleanup(this::stop); + return startWithoutCleanup(arg); + } + + public void stop() { + containerManager.stopTarget(); + } + + public SmokeTestOutput startWithoutCleanup(T arg) { + return new SmokeTestOutput( + this, + containerManager.startTarget( + options.getImage.apply(arg), + agentPath, + options.jvmArgsEnvVarName, + options.extraEnv, + options.setServiceName, + options.extraResources, + options.extraPorts, + options.waitStrategy, + options.command)); + } + + private static TestContainerManager createContainerManager() { + return TestContainerManager.useWindowsContainers() + ? new WindowsTestContainerManager() + : new LinuxTestContainerManager(); + } + + public int getMappedPort(int originalPort) { + return containerManager.getTargetMappedPort(originalPort); + } + + @Override + public TelemetryRetriever getTelemetryRetriever() { + return telemetryRetriever; + } + + private String readAgentVersion() { + try (JarFile agentJar = new JarFile(agentPath)) { + return agentJar + .getManifest() + .getMainAttributes() + .getValue(Attributes.Name.IMPLEMENTATION_VERSION); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + public String getAgentVersion() { + return agentVersion; + } + + public Set getSpanTraceIds() { + return testing.spans().stream().map(SpanData::getTraceId).collect(Collectors.toSet()); + } +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/AgentDebugLoggingTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/AgentDebugLoggingTest.java index 3e77810bfb1e..46d8de7a4da6 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/AgentDebugLoggingTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/AgentDebugLoggingTest.java @@ -11,23 +11,21 @@ import org.junit.jupiter.api.condition.DisabledIf; @DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") -class AgentDebugLoggingTest extends JavaSmokeTest { - @Override - protected String getTargetImage(String jdk) { - return "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk" - + jdk - + "-20250915.17728045097"; - } +class AgentDebugLoggingTest extends AbstractSmokeTest { @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log( - Duration.ofMinutes(1), ".*DEBUG io.opentelemetry.javaagent.tooling.VersionLogger.*"); + protected void configure(SmokeTestOptions options) { + options + .springBoot("20250915.17728045097") + .waitStrategy( + new TargetWaitStrategy.Log( + Duration.ofMinutes(1), + ".*DEBUG io.opentelemetry.javaagent.tooling.VersionLogger.*")); } @DisplayName("verifies that debug logging is working by checking for a debug log on startup") @Test void verifyLogging() { - startTarget(8); + start(8); } } diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/CrashEarlyJdk8Test.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/CrashEarlyJdk8Test.java new file mode 100644 index 000000000000..df7524f7cec2 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/CrashEarlyJdk8Test.java @@ -0,0 +1,76 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.Duration; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.Container; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.MountableFile; + +// Hotspot versions before 8u40 crash in jit compiled lambdas when javaagent initializes +// java.lang.invoke.CallSite +// This test verifies that such jvm does not crash with opentelemetry agent +@DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") +class CrashEarlyJdk8Test { + private static final Logger logger = LoggerFactory.getLogger(CrashEarlyJdk8Test.class); + + private static final String TARGET_AGENT_FILENAME = "opentelemetry-javaagent.jar"; + private static final String agentPath = + System.getProperty("io.opentelemetry.smoketest.agent.shadowJar.path"); + + private GenericContainer target; + private Container.ExecResult result; + + @BeforeEach + void setUp() { + target = + new GenericContainer<>( + DockerImageName.parse( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-zulu-openjdk-8u31:20240709.9848833570")) + .withStartupTimeout(Duration.ofMinutes(5)) + .withLogConsumer(new Slf4jLogConsumer(logger)) + .withCopyFileToContainer( + MountableFile.forHostPath(agentPath), "/" + TARGET_AGENT_FILENAME) + .withCopyFileToContainer( + MountableFile.forClasspathResource("crashearlyjdk8/CrashEarlyJdk8.java"), + "/CrashEarlyJdk8.java") + .withCopyFileToContainer( + MountableFile.forClasspathResource("crashearlyjdk8/start.sh", 777), "/start.sh") + .withCopyFileToContainer( + MountableFile.forClasspathResource("crashearlyjdk8/test.sh", 777), "/test.sh") + .waitingFor(Wait.forLogMessage(".*started.*\\n", 1)) + .withCommand("/bin/sh", "-c", "/start.sh"); + target.start(); + } + + @Test + void testCrashOnEarlyJdk8() throws Exception { + result = target.execInContainer("/bin/sh", "-c", "/test.sh"); + assertThat(result.getExitCode()).isZero(); + } + + @AfterEach + @SuppressWarnings("SystemOut") + void tearDown() { + if (result != null) { + System.err.println(result); + } + if (target != null) { + target.stop(); + } + } +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/DeclarativeConfigurationSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/DeclarativeConfigurationSmokeTest.java index 608ab18d2763..9cfda37317da 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/DeclarativeConfigurationSmokeTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/DeclarativeConfigurationSmokeTest.java @@ -12,42 +12,25 @@ import io.opentelemetry.semconv.incubating.HostIncubatingAttributes; import io.opentelemetry.semconv.incubating.ProcessIncubatingAttributes; import io.opentelemetry.semconv.incubating.TelemetryIncubatingAttributes; -import java.time.Duration; -import java.util.List; -import java.util.Map; import org.junit.jupiter.api.condition.DisabledIf; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") -class DeclarativeConfigurationSmokeTest extends JavaSmokeTest { - @Override - protected String getTargetImage(String jdk) { - return "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk" - + jdk - + "-20241021.11448062567"; - } - - @Override - protected List getExtraResources() { - return List.of(ResourceMapping.of("declarative-config.yaml", "/declarative-config.yaml")); - } - - @Override - protected Map getExtraEnv() { - return Map.of("OTEL_EXPERIMENTAL_CONFIG_FILE", "declarative-config.yaml"); - } +class DeclarativeConfigurationSmokeTest extends AbstractSmokeTest { @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log( - Duration.ofMinutes(1), ".*Started SpringbootApplication in.*"); + protected void configure(SmokeTestOptions options) { + options + .springBoot("20241021.11448062567") + .env("OTEL_EXPERIMENTAL_CONFIG_FILE", "declarative-config.yaml") + .extraResources(ResourceMapping.of("declarative-config.yaml", "/declarative-config.yaml")); } @ParameterizedTest @ValueSource(ints = {8, 11, 17}) void springBootSmokeTest(int jdk) { - startTarget(jdk); + start(jdk); client().get("/greeting").aggregate().join(); diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/GrpcSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/GrpcSmokeTest.java new file mode 100644 index 000000000000..e434bc2ece34 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/GrpcSmokeTest.java @@ -0,0 +1,65 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest; +import io.opentelemetry.proto.collector.trace.v1.TraceServiceGrpc; +import io.opentelemetry.semconv.incubating.TelemetryIncubatingAttributes; +import java.time.Duration; +import org.junit.jupiter.api.condition.DisabledIf; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +@DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") +class GrpcSmokeTest extends AbstractSmokeTest { + + @Override + protected void configure(SmokeTestOptions options) { + options + .image( + jdk -> + String.format( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-grpc:jdk%s-20241021.11448062549", + jdk)) + .waitStrategy(new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Server started.*")); + } + + @ParameterizedTest + @ValueSource(ints = {8, 11, 17, 21, 23}) + void grpcSmokeTest(int jdk) { + SmokeTestOutput output = start(jdk); + ManagedChannel channel = null; + try { + channel = + ManagedChannelBuilder.forAddress("localhost", getMappedPort(8080)).usePlaintext().build(); + TraceServiceGrpc.TraceServiceBlockingStub stub = TraceServiceGrpc.newBlockingStub(channel); + + stub.export(ExportTraceServiceRequest.getDefaultInstance()); + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("opentelemetry.proto.collector.trace.v1.TraceService/Export") + .hasResourceSatisfying( + resource -> + resource.hasAttribute( + TelemetryIncubatingAttributes.TELEMETRY_DISTRO_VERSION, + getAgentVersion())), + span -> span.hasName("TestService.withSpan"))); + + // Verify correct traceIds are logged via MDC instrumentation + assertThat(output.getLoggedTraceIds()).isEqualTo(getSpanTraceIds()); + } finally { + if (channel != null) { + channel.shutdown(); + } + } + } +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/IbmHttpsUrlConnectionTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/IbmHttpsUrlConnectionTest.java new file mode 100644 index 000000000000..663204f67c9d --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/IbmHttpsUrlConnectionTest.java @@ -0,0 +1,110 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest; + +import static io.opentelemetry.sdk.testing.assertj.TracesAssert.assertThat; +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.trace.SpanKind; +import java.time.Duration; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.Container; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.Network; +import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.MountableFile; + +@DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") +class IbmHttpsUrlConnectionTest { + private static final Logger logger = LoggerFactory.getLogger(IbmHttpsUrlConnectionTest.class); + + private static final String TARGET_AGENT_FILENAME = "opentelemetry-javaagent.jar"; + private static final String agentPath = + System.getProperty("io.opentelemetry.smoketest.agent.shadowJar.path"); + private static final int BACKEND_PORT = 8080; + private static final String BACKEND_ALIAS = "backend"; + + private Network network; + private GenericContainer backend; + private GenericContainer target; + private Container.ExecResult result; + private TelemetryRetriever telemetryRetriever; + + @BeforeEach + void setUp() { + network = Network.newNetwork(); + backend = + new GenericContainer<>( + DockerImageName.parse( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-fake-backend:20250811.16876216352")) + .withExposedPorts(BACKEND_PORT) + .withEnv("JAVA_TOOL_OPTIONS", "-Xmx128m") + .waitingFor(Wait.forHttp("/health").forPort(BACKEND_PORT)) + .withNetwork(network) + .withNetworkAliases(BACKEND_ALIAS) + .withLogConsumer(new Slf4jLogConsumer(logger)); + backend.start(); + telemetryRetriever = + new TelemetryRetriever(backend.getMappedPort(BACKEND_PORT), Duration.ofSeconds(30)); + + target = + new GenericContainer<>(DockerImageName.parse("ibmjava:8-sdk")) + .withStartupTimeout(Duration.ofMinutes(5)) + .withNetwork(network) + .withLogConsumer(new Slf4jLogConsumer(logger)) + .withCopyFileToContainer( + MountableFile.forHostPath(agentPath), "/" + TARGET_AGENT_FILENAME) + .withCopyFileToContainer( + MountableFile.forClasspathResource( + "ibmhttpsurlconnection/IbmHttpsUrlConnectionTest.java"), + "/IbmHttpsUrlConnectionTest.java") + .withCopyFileToContainer( + MountableFile.forClasspathResource("ibmhttpsurlconnection/start.sh", 777), + "/start.sh") + .withCopyFileToContainer( + MountableFile.forClasspathResource("ibmhttpsurlconnection/test.sh", 777), + "/test.sh") + .waitingFor(Wait.forLogMessage(".*started.*\\n", 1)) + .withCommand("/bin/sh", "-c", "/start.sh"); + target.start(); + } + + @Test + void testHttpsUrlConnection() throws Exception { + result = target.execInContainer("/bin/sh", "-c", "/test.sh"); + assertThat(result.getExitCode()).isZero(); + + assertThat(telemetryRetriever.waitForTraces()) + .hasTracesSatisfyingExactly( + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName("GET").hasKind(SpanKind.CLIENT).hasNoParent())); + } + + @AfterEach + @SuppressWarnings("SystemOut") + void tearDown() { + if (result != null) { + System.err.println(result); + } + if (target != null) { + target.stop(); + } + if (backend != null) { + backend.stop(); + } + if (network != null) { + network.close(); + } + } +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/JavaSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/JavaSmokeTest.java deleted file mode 100644 index 88ebff9a2e72..000000000000 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/JavaSmokeTest.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.smoketest; - -import static java.util.Collections.emptyList; -import static java.util.Collections.emptyMap; -import static java.util.stream.Collectors.toSet; -import static org.assertj.core.api.Assertions.assertThat; - -import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.smoketest.windows.WindowsTestContainerManager; -import io.opentelemetry.testing.internal.armeria.client.WebClient; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Consumer; -import java.util.regex.Pattern; -import java.util.stream.Stream; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.testcontainers.containers.output.OutputFrame; -import org.testcontainers.containers.output.ToStringConsumer; - -public abstract class JavaSmokeTest implements TelemetryRetrieverProvider { - - @RegisterExtension - public static final InstrumentationExtension testing = SmokeTestInstrumentationExtension.create(); - - private static final Pattern TRACE_ID_PATTERN = - Pattern.compile(".*trace_id=(?[a-zA-Z0-9]+).*"); - protected static final TestContainerManager containerManager = createContainerManager(); - private static TelemetryRetriever telemetryRetriever; - - protected String agentPath = - System.getProperty("io.opentelemetry.smoketest.agent.shadowJar.path"); - - @RegisterExtension static final AutoCleanupExtension autoCleanup = AutoCleanupExtension.create(); - - protected WebClient client() { - return WebClient.of("h1c://localhost:" + containerManager.getTargetMappedPort(8080)); - } - - /** Subclasses can override this method to pass jvm arguments in another environment variable */ - protected String getJvmArgsEnvVarName() { - return "JAVA_TOOL_OPTIONS"; - } - - /** Subclasses can override this method to customise target application's environment */ - protected Map getExtraEnv() { - return emptyMap(); - } - - /** Subclasses can override this method to disable setting default service name */ - protected boolean getSetServiceName() { - return true; - } - - /** Subclasses can override this method to provide additional files to copy to target container */ - protected List getExtraResources() { - return emptyList(); - } - - /** - * Subclasses can override this method to provide additional ports that should be exposed from the - * target container - */ - protected List getExtraPorts() { - return emptyList(); - } - - @BeforeAll - static void setUp() { - containerManager.startEnvironmentOnce(); - telemetryRetriever = new TelemetryRetriever(containerManager.getBackendMappedPort()); - } - - protected Consumer startTarget(int jdk) { - return startTarget(String.valueOf(jdk), null, false); - } - - protected Consumer startTarget(String jdk, String serverVersion, boolean windows) { - String targetImage = getTargetImage(jdk, serverVersion, windows); - autoCleanup.deferCleanup(() -> containerManager.stopTarget()); - - return containerManager.startTarget( - targetImage, - agentPath, - getJvmArgsEnvVarName(), - getExtraEnv(), - getSetServiceName(), - getExtraResources(), - getExtraPorts(), - getWaitStrategy(), - getCommand()); - } - - protected abstract String getTargetImage(String jdk); - - protected String getTargetImage(String jdk, String serverVersion, boolean windows) { - return getTargetImage(jdk); - } - - protected TargetWaitStrategy getWaitStrategy() { - return null; - } - - protected String[] getCommand() { - return null; - } - - protected static void assertVersionLogged(Consumer output, String version) { - assertThat( - logLines(output) - .anyMatch(l -> l.contains("opentelemetry-javaagent - version: " + version))) - .isTrue(); - } - - private static Stream logLines(Consumer output) { - return ((ToStringConsumer) output).toUtf8String().lines(); - } - - protected static Set getLoggedTraceIds(Consumer output) { - return logLines(output).flatMap(JavaSmokeTest::findTraceId).collect(toSet()); - } - - private static Stream findTraceId(String log) { - var m = TRACE_ID_PATTERN.matcher(log); - return m.matches() ? Stream.of(m.group("traceId")) : Stream.empty(); - } - - private static TestContainerManager createContainerManager() { - return TestContainerManager.useWindowsContainers() - ? new WindowsTestContainerManager() - : new LinuxTestContainerManager(); - } - - @Override - public TelemetryRetriever getTelemetryRetriever() { - return telemetryRetriever; - } -} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/LogsSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/LogsSmokeTest.java index 57233a9a8d0c..ccc10900dcfd 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/LogsSmokeTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/LogsSmokeTest.java @@ -8,31 +8,23 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.sdk.logs.data.LogRecordData; -import java.time.Duration; import java.util.Collection; import org.junit.jupiter.api.condition.DisabledIf; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") -class LogsSmokeTest extends JavaSmokeTest { - @Override - protected String getTargetImage(String jdk) { - return "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk" - + jdk - + "-20211213.1570880324"; - } +class LogsSmokeTest extends AbstractSmokeTest { @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log( - Duration.ofMinutes(1), ".*Started SpringbootApplication in.*"); + protected void configure(SmokeTestOptions options) { + options.springBoot("20211213.1570880324"); } @ParameterizedTest @ValueSource(ints = {8, 11, 17}) void shouldExportLogs(int jdk) { - startTarget(jdk); + start(jdk); client().get("/greeting").aggregate().join(); Collection logs = testing.logRecords(); diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/PlaySmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/PlaySmokeTest.java new file mode 100644 index 000000000000..d97ecfb711d0 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/PlaySmokeTest.java @@ -0,0 +1,49 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.semconv.HttpAttributes; +import org.junit.jupiter.api.condition.DisabledIf; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +@DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") +class PlaySmokeTest extends AbstractSmokeTest { + + @Override + protected void configure(SmokeTestOptions options) { + options + .image( + jdk -> + String.format( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-play:jdk%s-20241022.11450623960", + jdk)) + .waitStrategy( + new TargetWaitStrategy.Log(java.time.Duration.ofMinutes(1), ".*Listening for HTTP.*")); + } + + @ParameterizedTest + @ValueSource(ints = {8, 11, 17, 21}) + void playSmokeTest(int jdk) { + start(jdk); + + var response = client().get("/welcome?id=1").aggregate().join(); + + assertThat(response.contentUtf8()).isEqualTo("Welcome 1."); + + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("GET /welcome") + .hasKind(SpanKind.SERVER) + .hasAttribute(HttpAttributes.HTTP_ROUTE, "/welcome"), + span -> span.hasName("/welcome").hasKind(SpanKind.INTERNAL))); + } +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/PrometheusSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/PrometheusSmokeTest.java new file mode 100644 index 000000000000..cc996ff037a4 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/PrometheusSmokeTest.java @@ -0,0 +1,40 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.testing.internal.armeria.client.WebClient; +import org.junit.jupiter.api.condition.DisabledIf; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +@DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") +class PrometheusSmokeTest extends AbstractSmokeTest { + + private static final int PROMETHEUS_PORT = 9090; + + @Override + protected void configure(SmokeTestOptions options) { + options + .springBoot("20211213.1570880324") + .env("OTEL_METRICS_EXPORTER", "prometheus") + .env("OTEL_EXPORTER_PROMETHEUS_PORT", String.valueOf(PROMETHEUS_PORT)) + .extraPorts(PROMETHEUS_PORT); + } + + @ParameterizedTest + @ValueSource(ints = {8, 11, 17}) + void shouldExportMetrics(int jdk) { + start(jdk); + client().get("/greeting").aggregate().join(); + + WebClient prometheusClient = WebClient.of("h1c://localhost:" + getMappedPort(PROMETHEUS_PORT)); + String prometheusData = prometheusClient.get("/metrics").aggregate().join().contentUtf8(); + + assertThat(prometheusData).contains("jvm_memory_used"); + } +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/QuarkusSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/QuarkusSmokeTest.java index 9f7d3ea00946..95730713a111 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/QuarkusSmokeTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/QuarkusSmokeTest.java @@ -8,43 +8,29 @@ import io.opentelemetry.semconv.ServiceAttributes; import io.opentelemetry.semconv.incubating.TelemetryIncubatingAttributes; import java.time.Duration; -import java.util.jar.Attributes; -import java.util.jar.JarFile; import org.junit.jupiter.api.condition.DisabledIf; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") -class QuarkusSmokeTest extends JavaSmokeTest { - @Override - protected String getTargetImage(String jdk) { - return "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-quarkus:jdk" - + jdk - + "-20250915.17728045126"; - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Listening on.*"); - } +class QuarkusSmokeTest extends AbstractSmokeTest { @Override - protected boolean getSetServiceName() { - return false; + protected void configure(SmokeTestOptions options) { + options + .image( + jdk -> + String.format( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-quarkus:jdk%s-20250915.17728045126", + jdk)) + .waitStrategy(new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Listening on.*")) + .setServiceName(false); } @ParameterizedTest @ValueSource(ints = {17, 21, 23}) // Quarkus 3.7+ requires Java 17+ - void quarkusSmokeTest(int jdk) throws Exception { - startTarget(jdk); - String currentAgentVersion; - try (JarFile agentJar = new JarFile(agentPath)) { - currentAgentVersion = - agentJar - .getManifest() - .getMainAttributes() - .getValue(Attributes.Name.IMPLEMENTATION_VERSION); - } + void quarkusSmokeTest(int jdk) { + start(jdk); client().get("/hello").aggregate().join(); @@ -58,7 +44,7 @@ void quarkusSmokeTest(int jdk) throws Exception { resource .hasAttribute( TelemetryIncubatingAttributes.TELEMETRY_DISTRO_VERSION, - currentAgentVersion) + getAgentVersion()) .hasAttribute(ServiceAttributes.SERVICE_NAME, "quarkus"); }))); } diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/SdkDisabledSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SdkDisabledSmokeTest.java index 41b66d60f333..563d600701cb 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/SdkDisabledSmokeTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SdkDisabledSmokeTest.java @@ -7,43 +7,29 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; -import java.util.Map; -import java.util.function.Consumer; -import java.util.jar.Attributes; -import java.util.jar.JarFile; +import java.time.Duration; 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 SdkDisabledSmokeTest extends JavaSmokeTest { - @Override - protected String getTargetImage(String jdk) { - return "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk" - + jdk - + "-20211213.1570880324"; - } +class SdkDisabledSmokeTest extends AbstractSmokeTest { @Override - protected Map getExtraEnv() { - return Map.of("OTEL_SDK_DISABLED", "true"); + protected void configure(SmokeTestOptions options) { + options + .springBoot("20211213.1570880324") + .env("OTEL_SDK_DISABLED", "true") + .telemetryTimeout(Duration.ofSeconds(5)); } @ParameterizedTest @ValueSource(ints = {8, 11, 17}) - void noopSdkSmokeTest(int jdk) throws Exception { - Consumer output = startTarget(jdk); - String currentAgentVersion = - new JarFile(agentPath) - .getManifest() - .getMainAttributes() - .get(Attributes.Name.IMPLEMENTATION_VERSION) - .toString(); - + void noopSdkSmokeTest(int jdk) { + SmokeTestOutput output = start(jdk); assertThat(client().get("/greeting").aggregate().join().contentUtf8()).isEqualTo("Hi!"); assertThat(testing.spans()).isEmpty(); - assertVersionLogged(output, currentAgentVersion); + output.assertAgentVersionLogged(); assertThat(testing.spans()).isEmpty(); } } diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/SecurityManagerSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SecurityManagerSmokeTest.java index 1b9a0070775b..95e23775257c 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/SecurityManagerSmokeTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SecurityManagerSmokeTest.java @@ -5,32 +5,28 @@ package io.opentelemetry.smoketest; -import java.util.Collections; -import java.util.Map; import org.junit.jupiter.api.condition.DisabledIf; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") -class SecurityManagerSmokeTest extends JavaSmokeTest { +class SecurityManagerSmokeTest extends AbstractSmokeTest { @Override - protected String getTargetImage(String jdk) { - return "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-security-manager:jdk" - + jdk - + "-20250915.17728045123"; - } - - @Override - protected Map getExtraEnv() { - return Collections.singletonMap( - "OTEL_JAVAAGENT_EXPERIMENTAL_SECURITY_MANAGER_SUPPORT_ENABLED", "true"); + protected void configure(SmokeTestOptions options) { + options + .image( + jdk -> + String.format( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-security-manager:jdk%s-20250915.17728045123", + jdk)) + .env("OTEL_JAVAAGENT_EXPERIMENTAL_SECURITY_MANAGER_SUPPORT_ENABLED", "true"); } @ParameterizedTest @ValueSource(ints = {8, 11, 17, 21, 23}) void securityManagerSmokeTest(int jdk) { - startTarget(jdk); + start(jdk); testing.waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly(span -> span.hasName("test"))); } diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/SmokeTestOptions.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SmokeTestOptions.java new file mode 100644 index 000000000000..ba6a97717bfd --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SmokeTestOptions.java @@ -0,0 +1,103 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest; + +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import java.time.Duration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import javax.annotation.Nullable; + +public class SmokeTestOptions { + + Function getImage; + String[] command; + String jvmArgsEnvVarName = "JAVA_TOOL_OPTIONS"; + boolean setServiceName = true; + final Map extraEnv = new HashMap<>(); + List extraResources = List.of(); + TargetWaitStrategy waitStrategy; + List extraPorts = List.of(); + Duration telemetryTimeout = Duration.ofSeconds(30); + + /** Sets the container image to run. */ + @CanIgnoreReturnValue + public SmokeTestOptions image(Function getImage) { + this.getImage = getImage; + return this; + } + + /** Configure test for spring boot test app. */ + @CanIgnoreReturnValue + public SmokeTestOptions springBoot(String imageTag) { + image( + jdk -> + String.format( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk%s-%s", + jdk, imageTag)); + waitStrategy( + new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Started SpringbootApplication in.*")); + return this; + } + + /** Sets the command to run in the target container. */ + @CanIgnoreReturnValue + public SmokeTestOptions command(String... command) { + this.command = command; + return this; + } + + /** Sets the environment variable name used to pass JVM arguments to the target application. */ + @CanIgnoreReturnValue + public SmokeTestOptions jvmArgsEnvVarName(String jvmArgsEnvVarName) { + this.jvmArgsEnvVarName = jvmArgsEnvVarName; + return this; + } + + /** Enables or disables setting the default service name for the target application. */ + @CanIgnoreReturnValue + public SmokeTestOptions setServiceName(boolean setServiceName) { + this.setServiceName = setServiceName; + return this; + } + + /** Adds an environment variable to the target application's environment. */ + @CanIgnoreReturnValue + public SmokeTestOptions env(String key, String value) { + this.extraEnv.put(key, value); + return this; + } + + /** Specifies additional files to copy to the target container. */ + @CanIgnoreReturnValue + public SmokeTestOptions extraResources(ResourceMapping... resources) { + this.extraResources = List.of(resources); + return this; + } + + /** Sets the wait strategy for the target container startup. */ + @CanIgnoreReturnValue + public SmokeTestOptions waitStrategy(@Nullable TargetWaitStrategy waitStrategy) { + this.waitStrategy = waitStrategy; + return this; + } + + /** Specifies additional ports to expose from the target container. */ + @CanIgnoreReturnValue + public SmokeTestOptions extraPorts(Integer... ports) { + this.extraPorts = List.of(ports); + return this; + } + + /** Sets the timeout duration for retrieving telemetry data. */ + @CanIgnoreReturnValue + public SmokeTestOptions telemetryTimeout(Duration telemetryTimeout) { + this.telemetryTimeout = telemetryTimeout; + return this; + } +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/SmokeTestOutput.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SmokeTestOutput.java new file mode 100644 index 000000000000..08723a0a78ce --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SmokeTestOutput.java @@ -0,0 +1,49 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest; + +import static java.util.stream.Collectors.toSet; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Set; +import java.util.function.Consumer; +import java.util.regex.Pattern; +import java.util.stream.Stream; +import org.testcontainers.containers.output.OutputFrame; +import org.testcontainers.containers.output.ToStringConsumer; + +public class SmokeTestOutput { + + private static final Pattern TRACE_ID_PATTERN = + Pattern.compile(".*trace_id=(?[a-zA-Z0-9]+).*"); + private final AbstractSmokeTest smokeTest; + private final Consumer output; + + public SmokeTestOutput(AbstractSmokeTest smokeTest, Consumer output) { + this.smokeTest = smokeTest; + this.output = output; + } + + public static Stream findTraceId(String log) { + var m = TRACE_ID_PATTERN.matcher(log); + return m.matches() ? Stream.of(m.group("traceId")) : Stream.empty(); + } + + public void assertAgentVersionLogged() { + String version = smokeTest.getAgentVersion(); + assertThat( + logLines().anyMatch(l -> l.contains("opentelemetry-javaagent - version: " + version))) + .isTrue(); + } + + public Set getLoggedTraceIds() { + return logLines().flatMap(SmokeTestOutput::findTraceId).collect(toSet()); + } + + public Stream logLines() { + return ((ToStringConsumer) output).toUtf8String().lines(); + } +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/SpringBootSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SpringBootSmokeTest.java index 0029c10d0765..eb5c501b29e5 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/SpringBootSmokeTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SpringBootSmokeTest.java @@ -9,61 +9,30 @@ 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.time.Duration; -import java.util.List; -import java.util.Map; -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 { - @Override - protected String getTargetImage(String jdk) { - return "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk" - + jdk - + "-20241021.11448062567"; - } - - @Override - protected boolean getSetServiceName() { - return false; - } - - @Override - protected Map getExtraEnv() { - return Map.of("OTEL_METRICS_EXPORTER", "otlp", "OTEL_RESOURCE_ATTRIBUTES", "foo=bar"); - } +class SpringBootSmokeTest extends AbstractSmokeTest { @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log( - Duration.ofMinutes(1), ".*Started SpringbootApplication in.*"); + protected void configure(SmokeTestOptions options) { + options + .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 output = startTarget(jdk); - String currentAgentVersion; - try (JarFile agentJar = new JarFile(agentPath)) { - currentAgentVersion = - agentJar - .getManifest() - .getMainAttributes() - .getValue(Attributes.Name.IMPLEMENTATION_VERSION); - } + void springBootSmokeTest(int jdk) { + SmokeTestOutput output = start(jdk); var response = client().get("/greeting").aggregate().join(); assertThat(response.contentUtf8()).isEqualTo("Hi!"); @@ -82,7 +51,7 @@ void springBootSmokeTest(int jdk) throws Exception { resource .hasAttribute( TelemetryIncubatingAttributes.TELEMETRY_DISTRO_VERSION, - currentAgentVersion) + getAgentVersion()) .hasAttribute( satisfies( OsIncubatingAttributes.OS_TYPE, a -> a.isNotNull())) @@ -95,13 +64,10 @@ void springBootSmokeTest(int jdk) throws Exception { span -> span.hasName("WebController.withSpan"))); // Check agent version is logged on startup - assertVersionLogged(output, currentAgentVersion); + output.assertAgentVersionLogged(); // Check trace IDs are logged via MDC instrumentation - Set loggedTraceIds = getLoggedTraceIds(output); - List spans = testing.spans(); - Set spanTraceIds = spans.stream().map(SpanData::getTraceId).collect(Collectors.toSet()); - assertThat(loggedTraceIds).isEqualTo(spanTraceIds); + assertThat(output.getLoggedTraceIds()).isEqualTo(getSpanTraceIds()); // Check JVM metrics are exported testing.waitAndAssertMetrics( diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.java new file mode 100644 index 000000000000..ecf5c48a7236 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.java @@ -0,0 +1,42 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.condition.DisabledIf; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +@DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") +class SpringBootWithSamplingSmokeTest extends AbstractSmokeTest { + + private static final double SAMPLER_PROBABILITY = 0.2; + private static final int NUM_TRIES = 1000; + private static final int ALLOWED_DEVIATION = (int) (0.1 * NUM_TRIES); + + @Override + protected void configure(SmokeTestOptions options) { + options + .springBoot("20211213.1570880324") + .env("OTEL_TRACES_SAMPLER", "parentbased_traceidratio") + .env("OTEL_TRACES_SAMPLER_ARG", String.valueOf(SAMPLER_PROBABILITY)); + } + + @ParameterizedTest + @ValueSource(ints = {8, 11, 17}) + void springBootWithProbabilitySamplingEnabled(int jdk) { + start(jdk); + for (int i = 1; i <= NUM_TRIES; i++) { + client().get("/greeting").aggregate().join(); + } + + long actualCount = + testing.spans().stream().filter(span -> span.getName().endsWith("GET /greeting")).count(); + int expectedCount = (int) (SAMPLER_PROBABILITY * NUM_TRIES); + assertThat(Math.abs(actualCount - expectedCount)).isLessThanOrEqualTo(ALLOWED_DEVIATION); + } +} diff --git a/smoke-tests/src/main/java/io/opentelemetry/smoketest/AppServer.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/AppServer.java similarity index 85% rename from smoke-tests/src/main/java/io/opentelemetry/smoketest/AppServer.java rename to smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/AppServer.java index 6c52af3575c1..2f822ac75921 100644 --- a/smoke-tests/src/main/java/io/opentelemetry/smoketest/AppServer.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/AppServer.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.smoketest; +package io.opentelemetry.smoketest.appserver; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; @@ -14,7 +14,7 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Inherited -public @interface AppServer { +@interface AppServer { String version(); String jdk(); diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/AppServerImage.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/AppServerImage.java new file mode 100644 index 000000000000..385606f57746 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/AppServerImage.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest.appserver; + +class AppServerImage { + private final String jdk; + private final String serverVersion; + private final boolean windows; + + public AppServerImage(String jdk, String serverVersion, boolean windows) { + this.jdk = jdk; + this.serverVersion = serverVersion; + this.windows = windows; + } + + public String getJdk() { + return jdk; + } + + public String getServerVersion() { + return serverVersion; + } + + public boolean isWindows() { + return windows; + } +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/AppServerTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/AppServerTest.java new file mode 100644 index 000000000000..1f44a5403baa --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/AppServerTest.java @@ -0,0 +1,245 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest.appserver; + +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.OsIncubatingAttributes.OS_TYPE; +import static io.opentelemetry.semconv.incubating.OsIncubatingAttributes.OsTypeIncubatingValues.LINUX; +import static io.opentelemetry.semconv.incubating.OsIncubatingAttributes.OsTypeIncubatingValues.WINDOWS; +import static org.junit.jupiter.api.Assumptions.assumeFalse; +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; +import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.semconv.ClientAttributes; +import io.opentelemetry.semconv.NetworkAttributes; +import io.opentelemetry.semconv.UrlAttributes; +import io.opentelemetry.semconv.incubating.TelemetryIncubatingAttributes; +import io.opentelemetry.smoketest.AbstractSmokeTest; +import io.opentelemetry.smoketest.TestContainerManager; +import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse; +import io.opentelemetry.testing.internal.armeria.common.HttpMethod; +import io.opentelemetry.testing.internal.armeria.common.RequestHeaders; +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Function; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +public abstract class AppServerTest extends AbstractSmokeTest { + protected boolean isWindows; + protected String serverVersion; + + @BeforeAll + void setUpServer() { + var appServer = getClass().getAnnotation(AppServer.class); + if (appServer == null) { + throw new IllegalStateException("Server not specified, add @AppServer annotation"); + } + + var jdk = appServer.jdk(); + isWindows = TestContainerManager.useWindowsContainers(); + + // ibm-semeru-runtimes doesn't publish windows images + // adoptopenjdk is deprecated and doesn't publish Windows 2022 images + assumeFalse(isWindows && jdk.endsWith("-openj9")); + + serverVersion = appServer.version(); + startWithoutCleanup(new AppServerImage(jdk, serverVersion, isWindows)); + } + + @AfterAll + void afterAll() { + stop(); + } + + static Function appServerImage(String targetImagePrefix) { + return a -> { + String platformSuffix = a.isWindows() ? "-windows" : ""; + String extraTag = "-20241014.11321808438"; + String fullSuffix = a.getServerVersion() + "-jdk" + a.getJdk() + platformSuffix + extraTag; + return targetImagePrefix + ":" + fullSuffix; + }; + } + + protected boolean testRequestOutsideDeployedApp() { + return true; + } + + protected boolean testJsp() { + return true; + } + + @Test + void smokeTest() { + String path = "/app/greeting"; + var response = + client() + .execute(RequestHeaders.of(HttpMethod.GET, path, "X-Test-Request", "test")) + .aggregate() + .join(); + + assertFullTrace(path, response.contentUtf8(), true); + } + + private void assertFullTrace(String path, String responseBody, boolean captureHeader) { + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> { + assertServerSpan(span, path); + if (captureHeader) { + span.hasAttribute( + AttributeKey.stringArrayKey("http.request.header.x-test-request"), + List.of("test")); + } + }, + span -> + assertSpan(span) + .hasName("GET") + .hasKind(SpanKind.CLIENT) + .hasAttribute(UrlAttributes.URL_FULL, "http://localhost:8080/app/headers"), + span -> + assertServerSpan(span, "/app/headers") + .hasAttribute(ClientAttributes.CLIENT_ADDRESS, "127.0.0.1"))); + + // trace id is present in the HTTP headers as reported by the called endpoint + assertThat(responseBody).contains(getSpanTraceIds().iterator().next()); + } + + private String getExpectedOsType() { + return isWindows ? WINDOWS : LINUX; + } + + @Test + void testStaticFileFound() { + String path = "/app/hello.txt"; + var response = client().get(path).aggregate().join(); + assertThat(response.contentUtf8()).contains("Hello"); + + testing.waitAndAssertTraces( + trace -> trace.hasSpansSatisfyingExactly(span -> assertServerSpan(span, path))); + } + + @Test + void testStaticFileNotFound() { + String path = "/app/file-that-does-not-exist"; + var response = client().get(path).aggregate().join(); + + assertThat(response.status().code()).isEqualTo(404); + + getAndAssertServerSpan(span -> assertServerSpan(span, path)); + } + + @Test + void testRequestForWebInfWebXml() { + String path = "/app/WEB-INF/web.xml"; + AggregatedHttpResponse response = client().get(path).aggregate().join(); + + assertThat(response.status().code()).isEqualTo(404); + + getAndAssertServerSpan(span -> assertServerSpan(span, path)); + } + + @Test + void testRequestWithError() { + String path = "/app/exception"; + var response = client().get(path).aggregate().join(); + + assertThat(response.status().code()).isEqualTo(500); + + getAndAssertServerSpan( + span -> + assertServerSpan(span, path) + .hasEventsSatisfyingExactly( + event -> + event.hasAttributesSatisfying( + equalTo( + AttributeKey.stringKey("exception.message"), "This is expected")))); + } + + @Test + void testRequestOutsideDeployedApplication() { + assumeTrue(testRequestOutsideDeployedApp()); + + String path = "/this-is-definitely-not-there-but-there-should-be-a-trace-nevertheless"; + var response = client().get(path).aggregate().join(); + assertThat(response.status().code()).isEqualTo(404); + + getAndAssertServerSpan(span -> assertServerSpan(span, path)); + } + + @Test + void asyncSmokeTest() { + String path = "/app/asyncgreeting"; + var response = client().get(path).aggregate().join(); + assertFullTrace(path, response.contentUtf8(), false); + } + + @Test + void jspSmokeTestForSnippetInjection() { + assumeTrue(testJsp()); + + var response = client().get("/app/jsp").aggregate().join(); + + assertThat(response.contentUtf8()) + .contains("Successful JSP test") + .contains(""); + assertThat(response.status().isSuccess()).isTrue(); + + if (expectServerSpan()) { + getAndAssertServerSpan(span -> span.hasName("GET /app/jsp")); + } + } + + protected boolean expectServerSpan() { + return true; + } + + protected String getSpanName(String path) { + switch (path) { + case "/app/greeting": + case "/app/headers": + case "/app/exception": + case "/app/asyncgreeting": + return "GET " + path; + case "/app/hello.txt": + case "/app/file-that-does-not-exist": + return "GET /app/*"; + default: + return "GET"; + } + } + + private SpanDataAssert assertSpan(SpanDataAssert span) { + return span.hasResourceSatisfying( + resource -> + resource + .hasAttribute(OS_TYPE, getExpectedOsType()) + .hasAttribute( + TelemetryIncubatingAttributes.TELEMETRY_DISTRO_VERSION, getAgentVersion())) + .hasAttribute(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"); + } + + private SpanDataAssert assertServerSpan(SpanDataAssert span, String path) { + return assertSpan(span) + .hasName(getSpanName(path)) + .hasKind(SpanKind.SERVER) + .hasAttribute(UrlAttributes.URL_PATH, path); + } + + private static void getAndAssertServerSpan(Consumer assertion) { + Optional serverSpan = + testing.spans().stream().filter(span -> span.getKind() == SpanKind.SERVER).findFirst(); + + assertThat(serverSpan).hasValueSatisfying(span -> assertion.accept(assertThat(span))); + } +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/JettyJpmsSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/JettyJpmsSmokeTest.java new file mode 100644 index 000000000000..46b27b7074d4 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/JettyJpmsSmokeTest.java @@ -0,0 +1,28 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest.appserver; + +import io.opentelemetry.smoketest.SmokeTestOptions; + +abstract class JettyJpmsSmokeTest extends AppServerTest { + + @Override + protected void configure(SmokeTestOptions options) { + JettySmokeTest.configureOptions(options).command("java", "-jar", "/server/start.jar", "--jpms"); + } + + @AppServer(version = "11.0.19", jdk = "11") + static class Jetty11JpmsJdk11 extends JettyJpmsSmokeTest {} + + @AppServer(version = "11.0.19", jdk = "17") + static class Jetty11JpmsJdk17 extends JettyJpmsSmokeTest {} + + @AppServer(version = "11.0.19", jdk = "21") + static class Jetty11JpmsJdk21 extends JettyJpmsSmokeTest {} + + @AppServer(version = "11.0.19", jdk = "23") + static class Jetty11JpmsJdk23 extends JettyJpmsSmokeTest {} +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/JettySmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/JettySmokeTest.java new file mode 100644 index 000000000000..663b57a1a0bf --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/JettySmokeTest.java @@ -0,0 +1,123 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest.appserver; + +import io.opentelemetry.smoketest.SmokeTestOptions; +import io.opentelemetry.smoketest.TargetWaitStrategy; +import java.time.Duration; + +abstract class JettySmokeTest extends AppServerTest { + + @Override + protected void configure(SmokeTestOptions options) { + configureOptions(options); + } + + static SmokeTestOptions configureOptions( + SmokeTestOptions options) { + return options + .image( + appServerImage( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-jetty")) + .waitStrategy(new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Started Server.*")); + } + + @AppServer(version = "9.4.53", jdk = "8") + static class Jetty9Jdk8 extends JettySmokeTest {} + + @AppServer(version = "9.4.53", jdk = "8-openj9") + static class Jetty9Jdk8Openj9 extends JettySmokeTest {} + + @AppServer(version = "9.4.53", jdk = "11") + static class Jetty9Jdk11 extends JettySmokeTest {} + + @AppServer(version = "9.4.53", jdk = "11-openj9") + static class Jetty9Jdk11Openj9 extends JettySmokeTest {} + + @AppServer(version = "9.4.53", jdk = "17") + static class Jetty9Jdk17 extends JettySmokeTest {} + + @AppServer(version = "9.4.53", jdk = "17-openj9") + static class Jetty9Jdk17Openj9 extends JettySmokeTest {} + + @AppServer(version = "9.4.53", jdk = "21") + static class Jetty9Jdk21 extends JettySmokeTest {} + + @AppServer(version = "9.4.53", jdk = "21-openj9") + static class Jetty9Jdk21Openj9 extends JettySmokeTest {} + + @AppServer(version = "9.4.53", jdk = "23") + static class Jetty9Jdk23 extends JettySmokeTest {} + + @AppServer(version = "9.4.53", jdk = "23-openj9") + static class Jetty9Jdk23Openj9 extends JettySmokeTest {} + + @AppServer(version = "10.0.19", jdk = "11") + static class Jetty10Jdk11 extends JettySmokeTest {} + + @AppServer(version = "10.0.19", jdk = "11-openj9") + static class Jetty10Jdk11Openj9 extends JettySmokeTest {} + + @AppServer(version = "10.0.19", jdk = "17") + static class Jetty10Jdk17 extends JettySmokeTest {} + + @AppServer(version = "10.0.19", jdk = "17-openj9") + static class Jetty10Jdk17Openj9 extends JettySmokeTest {} + + @AppServer(version = "10.0.19", jdk = "21") + static class Jetty10Jdk21 extends JettySmokeTest {} + + @AppServer(version = "10.0.19", jdk = "21-openj9") + static class Jetty10Jdk21Openj9 extends JettySmokeTest {} + + @AppServer(version = "10.0.19", jdk = "23") + static class Jetty10Jdk23 extends JettySmokeTest {} + + @AppServer(version = "10.0.19", jdk = "23-openj9") + static class Jetty10Jdk23Openj9 extends JettySmokeTest {} + + @AppServer(version = "11.0.19", jdk = "11") + static class Jetty11Jdk11 extends JettySmokeTest {} + + @AppServer(version = "11.0.19", jdk = "11-openj9") + static class Jetty11Jdk11Openj9 extends JettySmokeTest {} + + @AppServer(version = "11.0.19", jdk = "17") + static class Jetty11Jdk17 extends JettySmokeTest {} + + @AppServer(version = "11.0.19", jdk = "17-openj9") + static class Jetty11Jdk17Openj9 extends JettySmokeTest {} + + @AppServer(version = "11.0.19", jdk = "21") + static class Jetty11Jdk21 extends JettySmokeTest {} + + @AppServer(version = "11.0.19", jdk = "21-openj9") + static class Jetty11Jdk21Openj9 extends JettySmokeTest {} + + @AppServer(version = "11.0.19", jdk = "23") + static class Jetty11Jdk23 extends JettySmokeTest {} + + @AppServer(version = "11.0.19", jdk = "23-openj9") + static class Jetty11Jdk23Openj9 extends JettySmokeTest {} + + @AppServer(version = "12.0.6", jdk = "17") + static class Jetty12Jdk17 extends JettySmokeTest {} + + @AppServer(version = "12.0.6", jdk = "17-openj9") + static class Jetty12Jdk17Openj9 extends JettySmokeTest {} + + @AppServer(version = "12.0.6", jdk = "21") + static class Jetty12Jdk21 extends JettySmokeTest {} + + @AppServer(version = "12.0.6", jdk = "21-openj9") + static class Jetty12Jdk21Openj9 extends JettySmokeTest {} + + @AppServer(version = "12.0.6", jdk = "23") + static class Jetty12Jdk23 extends JettySmokeTest {} + + @AppServer(version = "12.0.6", jdk = "23-openj9") + static class Jetty12Jdk23Openj9 extends JettySmokeTest {} +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/LibertyServletOnlySmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/LibertyServletOnlySmokeTest.java new file mode 100644 index 000000000000..d545ef0f4177 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/LibertyServletOnlySmokeTest.java @@ -0,0 +1,43 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest.appserver; + +import io.opentelemetry.smoketest.ResourceMapping; +import io.opentelemetry.smoketest.SmokeTestOptions; + +abstract class LibertyServletOnlySmokeTest extends AppServerTest { + + @Override + protected void configure(SmokeTestOptions options) { + LibertySmokeTest.configureOptions(options) + .extraResources( + ResourceMapping.of("liberty-servlet.xml", "/config/server.xml"), + ResourceMapping.of( + "liberty-servlet.xml", "/server/usr/servers/defaultServer/server.xml")); + } + + @Override + protected boolean testJsp() { + return false; + } + + @Override + protected String getSpanName(String path) { + if ("/app/hello.txt".equals(path) || "/app/file-that-does-not-exist".equals(path)) { + return "GET"; + } + return super.getSpanName(path); + } + + @AppServer(version = "21.0.0.12", jdk = "11") + static class LibertyServletOnly21Jdk11 extends LibertyServletOnlySmokeTest {} + + @AppServer(version = "22.0.0.12", jdk = "11") + static class LibertyServletOnly22Jdk11 extends LibertyServletOnlySmokeTest {} + + @AppServer(version = "23.0.0.12", jdk = "11") + static class LibertyServletOnly23Jdk11 extends LibertyServletOnlySmokeTest {} +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/LibertySmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/LibertySmokeTest.java new file mode 100644 index 000000000000..8f0bb93912cd --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/LibertySmokeTest.java @@ -0,0 +1,111 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest.appserver; + +import io.opentelemetry.smoketest.SmokeTestOptions; +import io.opentelemetry.smoketest.TargetWaitStrategy; +import java.time.Duration; + +abstract class LibertySmokeTest extends AppServerTest { + + @Override + protected void configure(SmokeTestOptions options) { + configureOptions(options); + } + + static SmokeTestOptions configureOptions( + SmokeTestOptions options) { + return options + .image( + appServerImage( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-liberty")) + .waitStrategy( + new TargetWaitStrategy.Log( + Duration.ofMinutes(3), ".*server is ready to run a smarter planet.*")); + } + + @AppServer(version = "20.0.0.12", jdk = "8") + static class Liberty20Jdk8 extends LibertySmokeTest {} + + @AppServer(version = "20.0.0.12", jdk = "8-openj9") + static class Liberty20Jdk8Openj9 extends LibertySmokeTest {} + + @AppServer(version = "20.0.0.12", jdk = "11") + static class Liberty20Jdk11 extends LibertySmokeTest {} + + @AppServer(version = "20.0.0.12", jdk = "11-openj9") + static class Liberty20Jdk11Openj9 extends LibertySmokeTest {} + + @AppServer(version = "21.0.0.12", jdk = "8") + static class Liberty21Jdk8 extends LibertySmokeTest {} + + @AppServer(version = "21.0.0.12", jdk = "8-openj9") + static class Liberty21Jdk8Openj9 extends LibertySmokeTest {} + + @AppServer(version = "21.0.0.12", jdk = "11") + static class Liberty21Jdk11 extends LibertySmokeTest {} + + @AppServer(version = "21.0.0.12", jdk = "11-openj9") + static class Liberty21Jdk11Openj9 extends LibertySmokeTest {} + + @AppServer(version = "21.0.0.12", jdk = "17") + static class Liberty21Jdk17 extends LibertySmokeTest {} + + @AppServer(version = "21.0.0.12", jdk = "17-openj9") + static class Liberty21Jdk17Openj9 extends LibertySmokeTest {} + + @AppServer(version = "22.0.0.12", jdk = "8") + static class Liberty22Jdk8 extends LibertySmokeTest {} + + @AppServer(version = "22.0.0.12", jdk = "8-openj9") + static class Liberty22Jdk8Openj9 extends LibertySmokeTest {} + + @AppServer(version = "22.0.0.12", jdk = "11") + static class Liberty22Jdk11 extends LibertySmokeTest {} + + @AppServer(version = "22.0.0.12", jdk = "11-openj9") + static class Liberty22Jdk11Openj9 extends LibertySmokeTest {} + + @AppServer(version = "22.0.0.12", jdk = "17") + static class Liberty22Jdk17 extends LibertySmokeTest {} + + @AppServer(version = "22.0.0.12", jdk = "17-openj9") + static class Liberty22Jdk17Openj9 extends LibertySmokeTest {} + + @AppServer(version = "23.0.0.12", jdk = "8") + static class Liberty23Jdk8 extends LibertySmokeTest { + @Override + protected boolean testJsp() { + return false; + } + } + + @AppServer(version = "23.0.0.12", jdk = "8-openj9") + static class Liberty23Jdk8Openj9 extends LibertySmokeTest { + @Override + protected boolean testJsp() { + return false; + } + } + + @AppServer(version = "23.0.0.12", jdk = "11") + static class Liberty23Jdk11 extends LibertySmokeTest {} + + @AppServer(version = "23.0.0.12", jdk = "11-openj9") + static class Liberty23Jdk11Openj9 extends LibertySmokeTest {} + + @AppServer(version = "23.0.0.12", jdk = "17") + static class Liberty23Jdk17 extends LibertySmokeTest {} + + @AppServer(version = "23.0.0.12", jdk = "17-openj9") + static class Liberty23Jdk17Openj9 extends LibertySmokeTest {} + + @AppServer(version = "23.0.0.12", jdk = "20") + static class Liberty23Jdk20 extends LibertySmokeTest {} + + @AppServer(version = "23.0.0.12", jdk = "20-openj9") + static class Liberty23Jdk20Openj9 extends LibertySmokeTest {} +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/PayaraSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/PayaraSmokeTest.java new file mode 100644 index 000000000000..cbee50daa37a --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/PayaraSmokeTest.java @@ -0,0 +1,74 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest.appserver; + +import io.opentelemetry.smoketest.SmokeTestOptions; +import io.opentelemetry.smoketest.TargetWaitStrategy; +import java.time.Duration; + +abstract class PayaraSmokeTest extends AppServerTest { + + @Override + protected void configure(SmokeTestOptions options) { + options + .image( + appServerImage( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-payara")) + .waitStrategy( + new TargetWaitStrategy.Log( + Duration.ofMinutes(3), + ".*(app was successfully deployed|deployed with name app).*")) + .jvmArgsEnvVarName("JVM_ARGS") + .env("HZ_PHONE_HOME_ENABLED", "false"); + } + + @Override + protected String getSpanName(String path) { + if ("/this-is-definitely-not-there-but-there-should-be-a-trace-nevertheless".equals(path)) { + return "GET /*"; + } + return super.getSpanName(path); + } + + @AppServer(version = "5.2020.6", jdk = "8") + static class Payara52020Jdk8 extends PayaraSmokeTest {} + + @AppServer(version = "5.2020.6", jdk = "8-openj9") + static class Payara52020Jdk8Openj9 extends PayaraSmokeTest {} + + @AppServer(version = "5.2020.6", jdk = "11") + static class Payara52020Jdk11 extends PayaraSmokeTest {} + + @AppServer(version = "5.2020.6", jdk = "11-openj9") + static class Payara52020Jdk11Openj9 extends PayaraSmokeTest {} + + @AppServer(version = "5.2021.8", jdk = "8") + static class Payara52021Jdk8 extends PayaraSmokeTest {} + + @AppServer(version = "5.2021.8", jdk = "8-openj9") + static class Payara52021Jdk8Openj9 extends PayaraSmokeTest {} + + @AppServer(version = "5.2021.8", jdk = "11") + static class Payara52021Jdk11 extends PayaraSmokeTest {} + + @AppServer(version = "5.2021.8", jdk = "11-openj9") + static class Payara52021Jdk11Openj9 extends PayaraSmokeTest {} + + @AppServer(version = "6.2023.12", jdk = "11") + static class Payara6Jdk11 extends PayaraSmokeTest {} + + @AppServer(version = "6.2023.12", jdk = "11-openj9") + static class Payara6Jdk11Openj9 extends PayaraSmokeTest {} + + @AppServer(version = "6.2023.12", jdk = "17") + static class Payara6Jdk17 extends PayaraSmokeTest {} + + @AppServer(version = "6.2023.12", jdk = "17-openj9") + static class Payara6Jdk17Openj9 extends PayaraSmokeTest {} + + @AppServer(version = "6.2023.12", jdk = "21-openj9") + static class Payara6Jdk21Openj9 extends PayaraSmokeTest {} +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/TomcatSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/TomcatSmokeTest.java new file mode 100644 index 000000000000..1e6157b08196 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/TomcatSmokeTest.java @@ -0,0 +1,117 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest.appserver; + +import io.opentelemetry.smoketest.SmokeTestOptions; +import io.opentelemetry.smoketest.TargetWaitStrategy; +import java.time.Duration; + +abstract class TomcatSmokeTest extends AppServerTest { + + @Override + protected void configure(SmokeTestOptions options) { + options + .image( + appServerImage( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-tomcat")) + .waitStrategy(new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Server startup in.*")); + } + + @Override + protected boolean expectServerSpan() { + return !"7.0.109".equals(serverVersion); + } + + @AppServer(version = "7.0.109", jdk = "8") + static class Tomcat7Jdk8 extends TomcatSmokeTest {} + + @AppServer(version = "7.0.109", jdk = "8-openj9") + static class Tomcat7Jdk8Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "8.5.98", jdk = "8") + static class Tomcat8Jdk8 extends TomcatSmokeTest {} + + @AppServer(version = "8.5.98", jdk = "8-openj9") + static class Tomcat8Jdk8Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "8.5.98", jdk = "11") + static class Tomcat8Jdk11 extends TomcatSmokeTest {} + + @AppServer(version = "8.5.98", jdk = "11-openj9") + static class Tomcat8Jdk11Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "8.5.98", jdk = "17") + static class Tomcat8Jdk17 extends TomcatSmokeTest {} + + @AppServer(version = "8.5.98", jdk = "17-openj9") + static class Tomcat8Jdk17Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "8.5.98", jdk = "21") + static class Tomcat8Jdk21 extends TomcatSmokeTest {} + + @AppServer(version = "8.5.98", jdk = "21-openj9") + static class Tomcat8Jdk21Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "8.5.98", jdk = "23") + static class Tomcat8Jdk23 extends TomcatSmokeTest {} + + @AppServer(version = "8.5.98", jdk = "23-openj9") + static class Tomcat8Jdk23Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "9.0.85", jdk = "8") + static class Tomcat9Jdk8 extends TomcatSmokeTest {} + + @AppServer(version = "9.0.85", jdk = "8-openj9") + static class Tomcat9Jdk8Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "9.0.85", jdk = "11") + static class Tomcat9Jdk11 extends TomcatSmokeTest {} + + @AppServer(version = "9.0.85", jdk = "11-openj9") + static class Tomcat9Jdk11Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "9.0.85", jdk = "17") + static class Tomcat9Jdk17 extends TomcatSmokeTest {} + + @AppServer(version = "9.0.85", jdk = "17-openj9") + static class Tomcat9Jdk17Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "9.0.85", jdk = "21") + static class Tomcat9Jdk21 extends TomcatSmokeTest {} + + @AppServer(version = "9.0.85", jdk = "21-openj9") + static class Tomcat9Jdk21Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "9.0.85", jdk = "23") + static class Tomcat9Jdk23 extends TomcatSmokeTest {} + + @AppServer(version = "9.0.85", jdk = "23-openj9") + static class Tomcat9Jdk23Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "10.1.18", jdk = "11") + static class Tomcat10Jdk11 extends TomcatSmokeTest {} + + @AppServer(version = "10.1.18", jdk = "11-openj9") + static class Tomcat10Jdk11Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "10.1.18", jdk = "17") + static class Tomcat10Jdk17 extends TomcatSmokeTest {} + + @AppServer(version = "10.1.18", jdk = "17-openj9") + static class Tomcat10Jdk17Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "10.1.18", jdk = "21") + static class Tomcat10Jdk21 extends TomcatSmokeTest {} + + @AppServer(version = "10.1.18", jdk = "21-openj9") + static class Tomcat10Jdk21Openj9 extends TomcatSmokeTest {} + + @AppServer(version = "10.1.18", jdk = "23") + static class Tomcat10Jdk23 extends TomcatSmokeTest {} + + @AppServer(version = "10.1.18", jdk = "23-openj9") + static class Tomcat10Jdk23Openj9 extends TomcatSmokeTest {} +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/TomeeSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/TomeeSmokeTest.java new file mode 100644 index 000000000000..f51d46de3b77 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/TomeeSmokeTest.java @@ -0,0 +1,96 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest.appserver; + +import io.opentelemetry.smoketest.SmokeTestOptions; +import io.opentelemetry.smoketest.TargetWaitStrategy; +import java.time.Duration; + +abstract class TomeeSmokeTest extends AppServerTest { + + @Override + protected void configure(SmokeTestOptions options) { + options + .image( + appServerImage( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-tomee")) + .waitStrategy(new TargetWaitStrategy.Log(Duration.ofMinutes(3), ".*Server startup in.*")); + } + + @Override + protected String getSpanName(String path) { + if ("/this-is-definitely-not-there-but-there-should-be-a-trace-nevertheless".equals(path)) { + return "GET /*"; + } + return super.getSpanName(path); + } + + @AppServer(version = "7.0.9", jdk = "8") + static class Tomee70Jdk8 extends TomeeSmokeTest {} + + @AppServer(version = "7.0.9", jdk = "8-openj9") + static class Tomee70Jdk8Openj9 extends TomeeSmokeTest {} + + @AppServer(version = "7.1.4", jdk = "8") + static class Tomee71Jdk8 extends TomeeSmokeTest {} + + @AppServer(version = "7.1.4", jdk = "8-openj9") + static class Tomee71Jdk8Openj9 extends TomeeSmokeTest {} + + @AppServer(version = "8.0.16", jdk = "8") + static class Tomee8Jdk8 extends TomeeSmokeTest {} + + @AppServer(version = "8.0.16", jdk = "8-openj9") + static class Tomee8Jdk8Openj9 extends TomeeSmokeTest {} + + @AppServer(version = "8.0.16", jdk = "11") + static class Tomee8Jdk11 extends TomeeSmokeTest {} + + @AppServer(version = "8.0.16", jdk = "11-openj9") + static class Tomee8Jdk11Openj9 extends TomeeSmokeTest {} + + @AppServer(version = "8.0.16", jdk = "17") + static class Tomee8Jdk17 extends TomeeSmokeTest {} + + @AppServer(version = "8.0.16", jdk = "17-openj9") + static class Tomee8Jdk17Openj9 extends TomeeSmokeTest {} + + @AppServer(version = "8.0.16", jdk = "21") + static class Tomee8Jdk21 extends TomeeSmokeTest {} + + @AppServer(version = "8.0.16", jdk = "21-openj9") + static class Tomee8Jdk21Openj9 extends TomeeSmokeTest {} + + @AppServer(version = "8.0.16", jdk = "23") + static class Tomee8Jdk23 extends TomeeSmokeTest {} + + @AppServer(version = "8.0.16", jdk = "23-openj9") + static class Tomee8Jdk23Openj9 extends TomeeSmokeTest {} + + @AppServer(version = "9.1.2", jdk = "11") + static class Tomee9Jdk11 extends TomeeSmokeTest {} + + @AppServer(version = "9.1.2", jdk = "11-openj9") + static class Tomee9Jdk11Openj9 extends TomeeSmokeTest {} + + @AppServer(version = "9.1.2", jdk = "17") + static class Tomee9Jdk17 extends TomeeSmokeTest {} + + @AppServer(version = "9.1.2", jdk = "17-openj9") + static class Tomee9Jdk17Openj9 extends TomeeSmokeTest {} + + @AppServer(version = "9.1.2", jdk = "21") + static class Tomee9Jdk21 extends TomeeSmokeTest {} + + @AppServer(version = "9.1.2", jdk = "21-openj9") + static class Tomee9Jdk21Openj9 extends TomeeSmokeTest {} + + @AppServer(version = "9.1.2", jdk = "23") + static class Tomee9Jdk23 extends TomeeSmokeTest {} + + @AppServer(version = "9.1.2", jdk = "23-openj9") + static class Tomee9Jdk23Openj9 extends TomeeSmokeTest {} +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/WebsphereSmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/WebsphereSmokeTest.java new file mode 100644 index 000000000000..5f85cdf01bf9 --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/WebsphereSmokeTest.java @@ -0,0 +1,43 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest.appserver; + +import io.opentelemetry.smoketest.SmokeTestOptions; +import io.opentelemetry.smoketest.TargetWaitStrategy; +import java.time.Duration; + +abstract class WebsphereSmokeTest extends AppServerTest { + + @Override + protected void configure(SmokeTestOptions options) { + options + .image( + appServerImage( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-websphere")) + .waitStrategy( + new TargetWaitStrategy.Log( + Duration.ofMinutes(3), ".*Server server1 open for e-business.*")); + } + + @Override + protected String getSpanName(String path) { + if ("/app/hello.txt".equals(path) || "/app/file-that-does-not-exist".equals(path)) { + return "GET"; + } + return super.getSpanName(path); + } + + @Override + protected boolean testRequestOutsideDeployedApp() { + return false; + } + + @AppServer(version = "8.5.5.22", jdk = "8-openj9") + static class Websphere8Jdk8Openj9 extends WebsphereSmokeTest {} + + @AppServer(version = "9.0.5.14", jdk = "8-openj9") + static class Websphere9Jdk8Openj9 extends WebsphereSmokeTest {} +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/WildflySmokeTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/WildflySmokeTest.java new file mode 100644 index 000000000000..c13f4a0bd06a --- /dev/null +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/appserver/WildflySmokeTest.java @@ -0,0 +1,148 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.smoketest.appserver; + +import io.opentelemetry.smoketest.SmokeTestOptions; +import io.opentelemetry.smoketest.TargetWaitStrategy; +import java.time.Duration; + +abstract class WildflySmokeTest extends AppServerTest { + + @Override + protected void configure(SmokeTestOptions options) { + options + .image( + appServerImage( + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-wildfly")) + .waitStrategy(new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*started in.*")); + } + + @AppServer(version = "13.0.0.Final", jdk = "8") + static class Wildfly13Jdk8 extends WildflySmokeTest {} + + @AppServer(version = "13.0.0.Final", jdk = "8-openj9") + static class Wildfly13Jdk8Openj9 extends WildflySmokeTest {} + + @AppServer(version = "17.0.1.Final", jdk = "8") + static class Wildfly17Jdk8 extends WildflySmokeTest {} + + @AppServer(version = "17.0.1.Final", jdk = "8-openj9") + static class Wildfly17Jdk8Openj9 extends WildflySmokeTest {} + + @AppServer(version = "17.0.1.Final", jdk = "11") + static class Wildfly17Jdk11 extends WildflySmokeTest {} + + @AppServer(version = "17.0.1.Final", jdk = "11-openj9") + static class Wildfly17Jdk11Openj9 extends WildflySmokeTest {} + + @AppServer(version = "17.0.1.Final", jdk = "17") + static class Wildfly17Jdk17 extends WildflySmokeTest {} + + @AppServer(version = "17.0.1.Final", jdk = "17-openj9") + static class Wildfly17Jdk17Openj9 extends WildflySmokeTest {} + + @AppServer(version = "17.0.1.Final", jdk = "21") + static class Wildfly17Jdk21 extends WildflySmokeTest {} + + @AppServer(version = "17.0.1.Final", jdk = "21-openj9") + static class Wildfly17Jdk21Openj9 extends WildflySmokeTest {} + + @AppServer(version = "21.0.0.Final", jdk = "8") + static class Wildfly21Jdk8 extends WildflySmokeTest {} + + @AppServer(version = "21.0.0.Final", jdk = "8-openj9") + static class Wildfly21Jdk8Openj9 extends WildflySmokeTest {} + + @AppServer(version = "21.0.0.Final", jdk = "11") + static class Wildfly21Jdk11 extends WildflySmokeTest {} + + @AppServer(version = "21.0.0.Final", jdk = "11-openj9") + static class Wildfly21Jdk11Openj9 extends WildflySmokeTest {} + + @AppServer(version = "21.0.0.Final", jdk = "17") + static class Wildfly21Jdk17 extends WildflySmokeTest {} + + @AppServer(version = "21.0.0.Final", jdk = "17-openj9") + static class Wildfly21Jdk17Openj9 extends WildflySmokeTest {} + + @AppServer(version = "21.0.0.Final", jdk = "21") + static class Wildfly21Jdk21 extends WildflySmokeTest {} + + @AppServer(version = "21.0.0.Final", jdk = "21-openj9") + static class Wildfly21Jdk21Openj9 extends WildflySmokeTest {} + + @AppServer(version = "28.0.1.Final", jdk = "11") + static class Wildfly28Jdk11 extends WildflySmokeTest {} + + @AppServer(version = "28.0.1.Final", jdk = "11-openj9") + static class Wildfly28Jdk11Openj9 extends WildflySmokeTest {} + + @AppServer(version = "28.0.1.Final", jdk = "17") + static class Wildfly28Jdk17 extends WildflySmokeTest {} + + @AppServer(version = "28.0.1.Final", jdk = "17-openj9") + static class Wildfly28Jdk17Openj9 extends WildflySmokeTest {} + + @AppServer(version = "28.0.1.Final", jdk = "21") + static class Wildfly28Jdk21 extends WildflySmokeTest {} + + @AppServer(version = "28.0.1.Final", jdk = "21-openj9") + static class Wildfly28Jdk21Openj9 extends WildflySmokeTest {} + + @AppServer(version = "28.0.1.Final", jdk = "23") + static class Wildfly28Jdk23 extends WildflySmokeTest {} + + @AppServer(version = "28.0.1.Final", jdk = "23-openj9") + static class Wildfly28Jdk23Openj9 extends WildflySmokeTest {} + + @AppServer(version = "29.0.1.Final", jdk = "11") + static class Wildfly29Jdk11 extends WildflySmokeTest {} + + @AppServer(version = "29.0.1.Final", jdk = "11-openj9") + static class Wildfly29Jdk11Openj9 extends WildflySmokeTest {} + + @AppServer(version = "29.0.1.Final", jdk = "17") + static class Wildfly29Jdk17 extends WildflySmokeTest {} + + @AppServer(version = "29.0.1.Final", jdk = "17-openj9") + static class Wildfly29Jdk17Openj9 extends WildflySmokeTest {} + + @AppServer(version = "29.0.1.Final", jdk = "21") + static class Wildfly29Jdk21 extends WildflySmokeTest {} + + @AppServer(version = "29.0.1.Final", jdk = "21-openj9") + static class Wildfly29Jdk21Openj9 extends WildflySmokeTest {} + + @AppServer(version = "29.0.1.Final", jdk = "23") + static class Wildfly29Jdk23 extends WildflySmokeTest {} + + @AppServer(version = "29.0.1.Final", jdk = "23-openj9") + static class Wildfly29Jdk23Openj9 extends WildflySmokeTest {} + + @AppServer(version = "30.0.1.Final", jdk = "11") + static class Wildfly30Jdk11 extends WildflySmokeTest {} + + @AppServer(version = "30.0.1.Final", jdk = "11-openj9") + static class Wildfly30Jdk11Openj9 extends WildflySmokeTest {} + + @AppServer(version = "30.0.1.Final", jdk = "17") + static class Wildfly30Jdk17 extends WildflySmokeTest {} + + @AppServer(version = "30.0.1.Final", jdk = "17-openj9") + static class Wildfly30Jdk17Openj9 extends WildflySmokeTest {} + + @AppServer(version = "30.0.1.Final", jdk = "21") + static class Wildfly30Jdk21 extends WildflySmokeTest {} + + @AppServer(version = "30.0.1.Final", jdk = "21-openj9") + static class Wildfly30Jdk21Openj9 extends WildflySmokeTest {} + + @AppServer(version = "30.0.1.Final", jdk = "23") + static class Wildfly30Jdk23 extends WildflySmokeTest {} + + @AppServer(version = "30.0.1.Final", jdk = "23-openj9") + static class Wildfly30Jdk23Openj9 extends WildflySmokeTest {} +} diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/B3MultiPropagationTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/B3MultiPropagationTest.java index db814482335c..31424deed6a0 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/B3MultiPropagationTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/B3MultiPropagationTest.java @@ -5,13 +5,15 @@ package io.opentelemetry.smoketest.propagation; -import java.util.Map; +import io.opentelemetry.smoketest.SmokeTestOptions; import org.junit.jupiter.api.condition.DisabledIf; @DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") class B3MultiPropagationTest extends PropagationTest { + @Override - protected Map getExtraEnv() { - return Map.of("otel.propagators", "b3multi"); + protected void configure(SmokeTestOptions options) { + super.configure(options); + options.env("otel.propagators", "b3multi"); } } diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/B3PropagationTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/B3PropagationTest.java index 73fc15912935..fd9a0ce9aab0 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/B3PropagationTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/B3PropagationTest.java @@ -5,13 +5,15 @@ package io.opentelemetry.smoketest.propagation; -import java.util.Map; +import io.opentelemetry.smoketest.SmokeTestOptions; import org.junit.jupiter.api.condition.DisabledIf; @DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") class B3PropagationTest extends PropagationTest { + @Override - protected Map getExtraEnv() { - return Map.of("otel.propagators", "b3"); + protected void configure(SmokeTestOptions options) { + super.configure(options); + options.env("otel.propagators", "b3"); } } diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/OtTracePropagationTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/OtTracePropagationTest.java index 698f5980b0a6..398a141edfce 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/OtTracePropagationTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/OtTracePropagationTest.java @@ -7,40 +7,26 @@ import static org.assertj.core.api.Assertions.assertThat; -import io.opentelemetry.smoketest.JavaSmokeTest; -import io.opentelemetry.smoketest.TargetWaitStrategy; +import io.opentelemetry.smoketest.AbstractSmokeTest; +import io.opentelemetry.smoketest.SmokeTestOptions; import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse; -import java.time.Duration; -import java.util.Map; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledIf; @DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") -class OtTracePropagationTest extends JavaSmokeTest { - @Override - protected String getTargetImage(String jdk) { - return "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk" - + jdk - + "-20211213.1570880324"; - } +class OtTracePropagationTest extends AbstractSmokeTest { @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log( - Duration.ofMinutes(1), ".*Started SpringbootApplication in.*"); + protected void configure(SmokeTestOptions options) { + options.springBoot("20211213.1570880324").env("otel.propagators", "ottrace"); } @Test - public void shouldPropagate() { - startTarget(11); + void shouldPropagate() { + start(11); AggregatedHttpResponse response = client().get("/front").aggregate().join(); var traceId = testing.waitForTraces(1).get(0).get(0).getTraceId().substring(16); assertThat(response.contentUtf8()).matches("[0-9a-f]{16}" + traceId + ";[0]{16}" + traceId); } - - @Override - protected Map getExtraEnv() { - return Map.of("otel.propagators", "ottrace"); - } } diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/PropagationTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/PropagationTest.java index ab4ef67aa6e9..ec1863df0e6c 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/PropagationTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/PropagationTest.java @@ -7,30 +7,21 @@ import static org.assertj.core.api.Assertions.assertThat; -import io.opentelemetry.smoketest.JavaSmokeTest; -import io.opentelemetry.smoketest.TargetWaitStrategy; +import io.opentelemetry.smoketest.AbstractSmokeTest; +import io.opentelemetry.smoketest.SmokeTestOptions; import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse; -import java.time.Duration; import org.junit.jupiter.api.Test; -public abstract class PropagationTest extends JavaSmokeTest { +abstract class PropagationTest extends AbstractSmokeTest { @Override - protected String getTargetImage(String jdk) { - return "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk" - + jdk - + "-20211213.1570880324"; - } - - @Override - protected TargetWaitStrategy getWaitStrategy() { - return new TargetWaitStrategy.Log( - Duration.ofMinutes(1), ".*Started SpringbootApplication in.*"); + protected void configure(SmokeTestOptions options) { + options.springBoot("20211213.1570880324"); } @Test - public void shouldPropagate() { - startTarget(11); + void shouldPropagate() { + start(11); AggregatedHttpResponse response = client().get("/front").aggregate().join(); var traceId = testing.waitForTraces(1).get(0).get(0).getTraceId(); diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/W3CPropagationTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/W3CPropagationTest.java index 5bb4b70da593..84413331bd3c 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/W3CPropagationTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/W3CPropagationTest.java @@ -5,13 +5,15 @@ package io.opentelemetry.smoketest.propagation; -import java.util.Map; +import io.opentelemetry.smoketest.SmokeTestOptions; import org.junit.jupiter.api.condition.DisabledIf; @DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") class W3CPropagationTest extends PropagationTest { + @Override - protected Map getExtraEnv() { - return Map.of("otel.propagators", "tracecontext"); + protected void configure(SmokeTestOptions options) { + super.configure(options); + options.env("otel.propagators", "tracecontext"); } } diff --git a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/XRayPropagationTest.java b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/XRayPropagationTest.java index 71d2968457d5..89d6bb1ecb00 100644 --- a/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/XRayPropagationTest.java +++ b/smoke-tests/src/test/java/io/opentelemetry/smoketest/propagation/XRayPropagationTest.java @@ -5,13 +5,15 @@ package io.opentelemetry.smoketest.propagation; -import java.util.Map; +import io.opentelemetry.smoketest.SmokeTestOptions; import org.junit.jupiter.api.condition.DisabledIf; @DisabledIf("io.opentelemetry.smoketest.TestContainerManager#useWindowsContainers") class XRayPropagationTest extends PropagationTest { + @Override - protected Map getExtraEnv() { - return Map.of("otel.propagators", "xray"); + protected void configure(SmokeTestOptions options) { + super.configure(options); + options.env("otel.propagators", "xray"); } }