From 773467f61c4792ab9f5aba560d46a05e9b79758e Mon Sep 17 00:00:00 2001 From: Nikita Salnikov-Tarnovski Date: Wed, 12 Aug 2020 13:53:41 +0300 Subject: [PATCH 1/2] Run smoke tests on different java versions --- .github/workflows/build-play-smoke-dist.yaml | 13 +-- .../build-springboot-smoke-dist.yaml | 13 +-- smoke-tests/play/build.gradle | 8 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../smoketest/PlaySmokeTest.groovy | 67 --------------- smoke-tests/springboot/build.gradle | 14 ++- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../smoketest/SpringBootSmokeTest.groovy | 66 -------------- ...ngBootSmokeWithEmbeddedExporterTest.groovy | 68 --------------- .../SpringBootWithSamplingSmokeTest.groovy | 67 --------------- .../smoketest/AbstractServerSmokeTest.groovy | 44 ---------- .../smoketest/AbstractSmokeTest.groovy | 86 ------------------- .../smoketest/SpanCounter.groovy | 72 ---------------- .../smoketest/PlaySmokeTest.groovy | 13 ++- .../opentelemetry/smoketest/SmokeTest.groovy | 55 +++++++----- .../smoketest/SpringBootSmokeTest.groovy | 16 +++- .../SpringBootWithSamplingSmokeTest.groovy | 13 ++- .../smoketest/WildflySmokeTest.groovy | 6 +- 18 files changed, 102 insertions(+), 523 deletions(-) delete mode 100644 smoke-tests/play/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy delete mode 100644 smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy delete mode 100644 smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeWithEmbeddedExporterTest.groovy delete mode 100644 smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy delete mode 100644 smoke-tests/src/main/groovy/io/opentelemetry/smoketest/AbstractServerSmokeTest.groovy delete mode 100644 smoke-tests/src/main/groovy/io/opentelemetry/smoketest/AbstractSmokeTest.groovy delete mode 100644 smoke-tests/src/main/groovy/io/opentelemetry/smoketest/SpanCounter.groovy diff --git a/.github/workflows/build-play-smoke-dist.yaml b/.github/workflows/build-play-smoke-dist.yaml index e615d9b1881..0c89d04989c 100644 --- a/.github/workflows/build-play-smoke-dist.yaml +++ b/.github/workflows/build-play-smoke-dist.yaml @@ -8,7 +8,7 @@ on: branches: 'master' jobs: - test: + publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -20,10 +20,11 @@ jobs: - name: Cache gradle dependencies uses: burrunan/gradle-cache-action@v1 with: - job-id: jdk11 - - - name: Login to GitHub Package Registry - run: echo ${{ secrets.GITHUB_TOKEN }} | docker login docker.pkg.github.com -u ${{ github.repository }} --password-stdin + job-id: play-smoke - name: Build Docker Image - run: cd smoke-tests/play && ./gradlew jib \ No newline at end of file + run: | + ./gradlew jib -PtargetJDK=8 -Djib.httpTimeout=120000 -Djib.console=plain + ./gradlew jib -PtargetJDK=11 -Djib.httpTimeout=120000 -Djib.console=plain + ./gradlew jib -PtargetJDK=14 -Djib.httpTimeout=120000 -Djib.console=plain + working-directory: smoke-tests/play \ No newline at end of file diff --git a/.github/workflows/build-springboot-smoke-dist.yaml b/.github/workflows/build-springboot-smoke-dist.yaml index 66096e9fb91..140549dcce8 100644 --- a/.github/workflows/build-springboot-smoke-dist.yaml +++ b/.github/workflows/build-springboot-smoke-dist.yaml @@ -8,7 +8,7 @@ on: branches: 'master' jobs: - test: + publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -20,10 +20,11 @@ jobs: - name: Cache gradle dependencies uses: burrunan/gradle-cache-action@v1 with: - job-id: jdk11 - - - name: Login to GitHub Package Registry - run: echo ${{ secrets.GITHUB_TOKEN }} | docker login docker.pkg.github.com -u ${{ github.repository }} --password-stdin + job-id: springboot-smoke - name: Build Docker Image - run: cd smoke-tests/springboot && ./gradlew jib \ No newline at end of file + run: | + ./gradlew jib -PtargetJDK=8 -Djib.httpTimeout=120000 -Djib.console=plain + ./gradlew jib -PtargetJDK=11 -Djib.httpTimeout=120000 -Djib.console=plain + ./gradlew jib -PtargetJDK=14 -Djib.httpTimeout=120000 -Djib.console=plain + working-directory: smoke-tests/springboot \ No newline at end of file diff --git a/smoke-tests/play/build.gradle b/smoke-tests/play/build.gradle index 73853756765..0c0b195537d 100644 --- a/smoke-tests/play/build.gradle +++ b/smoke-tests/play/build.gradle @@ -1,6 +1,6 @@ plugins { id "org.gradle.playframework" version "0.9" - id 'com.google.cloud.tools.jib' version '2.4.0' + id 'com.google.cloud.tools.jib' version '2.5.0' } ext { @@ -35,8 +35,10 @@ dependencies { implementation "com.typesafe.play:filters-helpers_$scalaVersion:$playVersion" } +def targetJDK = project.hasProperty("targetJDK") ? project.targetJDK : 11 + jib { - from.image = "bellsoft/liberica-openjdk-alpine:11" - to.image = "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-play" + from.image = "bellsoft/liberica-openjdk-alpine:$targetJDK" + to.image = "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-play-$targetJDK" container.mainClass = "play.core.server.ProdServerStart" } \ No newline at end of file diff --git a/smoke-tests/play/gradle/wrapper/gradle-wrapper.properties b/smoke-tests/play/gradle/wrapper/gradle-wrapper.properties index 622ab64a3cb..6c9a2247756 100644 --- a/smoke-tests/play/gradle/wrapper/gradle-wrapper.properties +++ b/smoke-tests/play/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/smoke-tests/play/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy b/smoke-tests/play/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy deleted file mode 100644 index c7c50d4c9f5..00000000000 --- a/smoke-tests/play/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.smoketest - -import okhttp3.Request -import spock.lang.Shared - -class PlaySmokeTest extends AbstractServerSmokeTest { - - static final HTTP_REQUEST_SPAN = 'LOGGED_SPAN GET /welcome' - - @Shared - File playDirectory = new File("${buildDirectory}/stage/main") - - @Override - ProcessBuilder createProcessBuilder() { - String ext = System.getProperty("os.name").startsWith("Windows") ? ".bat" : "" - ProcessBuilder processBuilder = - new ProcessBuilder("${playDirectory}/bin/main" + ext) - processBuilder.directory(playDirectory) - - processBuilder.environment().put("JAVA_OPTS", - defaultJavaProperties.join(" ") - + " -Dotel.exporter.jar=${exporterPath}" - + " -Dotel.exporter.logging.prefix=LOGGED_SPAN" - + " -Dconfig.file=${workingDirectory}/conf/application.conf -Dhttp.port=${httpPort}" - + " -Dhttp.address=127.0.0.1") - return processBuilder - } - - def "welcome endpoint #n th time"() { - setup: - def spanCounter = new SpanCounter(logfile, [ - (HTTP_REQUEST_SPAN): 2, - ], 10000) - String url = "http://localhost:$httpPort/welcome?id=$n" - def request = new Request.Builder().url(url).get().build() - - when: - def response = client.newCall(request).execute() - def spans = spanCounter.countSpans() - - then: - def responseBodyStr = response.body().string() - responseBodyStr == "Welcome $n." - response.code() == 200 - // A 'play-action' span and an 'akka-http-server' span - spans[HTTP_REQUEST_SPAN] == 2 - - where: - n << (1..200) - } -} diff --git a/smoke-tests/springboot/build.gradle b/smoke-tests/springboot/build.gradle index 50a0dee2810..daae95c8e2f 100644 --- a/smoke-tests/springboot/build.gradle +++ b/smoke-tests/springboot/build.gradle @@ -2,12 +2,11 @@ plugins { id 'org.springframework.boot' version '2.3.2.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java' - id 'com.google.cloud.tools.jib' version '2.4.0' + id 'com.google.cloud.tools.jib' version '2.5.0' } group = 'io.opentelemetry' version = '0.0.1-SNAPSHOT' -sourceCompatibility = '8' repositories { jcenter() @@ -15,9 +14,16 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'io.opentelemetry:opentelemetry-extension-auto-annotations:0.7.0' } +compileJava { + options.release = 8 +} + +def targetJDK = project.hasProperty("targetJDK") ? project.targetJDK : 11 + jib { - from.image = "bellsoft/liberica-openjdk-alpine:11" - to.image = "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot" + from.image = "bellsoft/liberica-openjdk-alpine:$targetJDK" + to.image = "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot-$targetJDK" } \ No newline at end of file diff --git a/smoke-tests/springboot/gradle/wrapper/gradle-wrapper.properties b/smoke-tests/springboot/gradle/wrapper/gradle-wrapper.properties index 622ab64a3cb..6c9a2247756 100644 --- a/smoke-tests/springboot/gradle/wrapper/gradle-wrapper.properties +++ b/smoke-tests/springboot/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy b/smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy deleted file mode 100644 index 137efefc78e..00000000000 --- a/smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.smoketest - -import okhttp3.Request - -class SpringBootSmokeTest extends AbstractServerSmokeTest { - - static final SERVLET_SPAN = "LOGGED_SPAN /greeting" - static final HANDLER_SPAN = "LOGGED_SPAN WebController.greeting" - static final WITH_SPAN = "LOGGED_SPAN WebController.withSpan" - - @Override - ProcessBuilder createProcessBuilder() { - String springBootShadowJar = System.getProperty("io.opentelemetry.smoketest.springboot.shadowJar.path") - - List command = new ArrayList<>() - command.add(javaPath()) - command.addAll(defaultJavaProperties) - command.addAll((String[]) ["-Dotel.exporter.jar=${exporterPath}", "-Dotel.exporter.logging.prefix=LOGGED_SPAN", "-jar", springBootShadowJar, "--server.port=${httpPort}"]) - ProcessBuilder processBuilder = new ProcessBuilder(command) - processBuilder.directory(new File(buildDirectory)) - } - - def "default home page #n th time"() { - setup: - def spanCounter = new SpanCounter(logfile, [ - (SERVLET_SPAN): 1, - (HANDLER_SPAN): 1, - (WITH_SPAN) : 1 - ], 10000) - String url = "http://localhost:${httpPort}/greeting" - def request = new Request.Builder().url(url).get().build() - - when: - def response = client.newCall(request).execute() - def spans = spanCounter.countSpans() - - then: - def responseBodyStr = response.body().string() - responseBodyStr != null - responseBodyStr.contains("Hi!") - response.body().contentType().toString().contains("text/plain") - response.code() == 200 - spans[SERVLET_SPAN] == 1 - spans[HANDLER_SPAN] == 1 - spans[WITH_SPAN] == 1 - - where: - n << (1..200) - } -} diff --git a/smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeWithEmbeddedExporterTest.groovy b/smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeWithEmbeddedExporterTest.groovy deleted file mode 100644 index 796520357f6..00000000000 --- a/smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeWithEmbeddedExporterTest.groovy +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.smoketest - -import okhttp3.Request - -/** - * This is almost an exact copy of {@link SpringBootSmokeTest}. - * The only difference is that this test does not use external exporter jar. - * It thus verifies that agent has embedded exporter and can use it. - */ -class SpringBootSmokeWithEmbeddedExporterTest extends AbstractServerSmokeTest { - - static final SERVLET_SPAN = "LOGGED_SPAN /greeting" - static final HANDLER_SPAN = "LOGGED_SPAN WebController.greeting" - static final WITH_SPAN = "LOGGED_SPAN WebController.withSpan" - - @Override - ProcessBuilder createProcessBuilder() { - String springBootShadowJar = System.getProperty("io.opentelemetry.smoketest.springboot.shadowJar.path") - - List command = new ArrayList<>() - command.add(javaPath()) - command.addAll(defaultJavaProperties) - command.addAll((String[]) ["-Dotel.exporter=logging", "-Dotel.exporter.logging.prefix=LOGGED_SPAN", "-jar", springBootShadowJar, "--server.port=${httpPort}"]) - ProcessBuilder processBuilder = new ProcessBuilder(command) - processBuilder.directory(new File(buildDirectory)) - } - - def "can monitor default home page"() { - setup: - def spanCounter = new SpanCounter(logfile, [ - (SERVLET_SPAN): 1, - (HANDLER_SPAN): 1, - (WITH_SPAN) : 1 - ], 10000) - String url = "http://localhost:${httpPort}/greeting" - def request = new Request.Builder().url(url).get().build() - - when: - def response = client.newCall(request).execute() - def spans = spanCounter.countSpans() - - then: - def responseBodyStr = response.body().string() - responseBodyStr != null - responseBodyStr.contains("Hi!") - response.body().contentType().toString().contains("text/plain") - response.code() == 200 - spans[SERVLET_SPAN] == 1 - spans[HANDLER_SPAN] == 1 - spans[WITH_SPAN] == 1 - } -} diff --git a/smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy b/smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy deleted file mode 100644 index b8bc762532e..00000000000 --- a/smoke-tests/springboot/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.smoketest - -import okhttp3.Request - -class SpringBootWithSamplingSmokeTest extends AbstractServerSmokeTest { - - static final SERVLET_SPAN = "LOGGED_SPAN /greeting" - static final HANDLER_SPAN = "LOGGED_SPAN WebController.greeting" - static final WITH_SPAN = "LOGGED_SPAN WebController.withSpan" - - static final double SAMPLER_PROBABILITY = 0.2 - static final int NUM_TRIES = 1000 - static final int ALLOWED_DEVIATION = 0.1 * NUM_TRIES - - @Override - ProcessBuilder createProcessBuilder() { - String springBootShadowJar = System.getProperty("io.opentelemetry.smoketest.springboot.shadowJar.path") - - List command = new ArrayList<>() - command.add(javaPath()) - command.addAll(defaultJavaProperties) - command.addAll((String[]) ["-Dotel.exporter.jar=${exporterPath}", "-Dotel.exporter.logging.prefix=LOGGED_SPAN", "-jar", springBootShadowJar, "--server.port=${httpPort}"]) - ProcessBuilder processBuilder = new ProcessBuilder(command) - processBuilder.environment().put("OTEL_CONFIG_SAMPLER_PROBABILITY", "${SAMPLER_PROBABILITY}") - processBuilder.directory(new File(buildDirectory)) - } - - def "default home page with probability sampling enabled"() { - setup: - // since sampling is enabled, not really expecting to receive NUM_TRIES spans, - // instead giving it 10 seconds and then checking below how many spans were received - def spanCounter = new SpanCounter(logfile, [ - (SERVLET_SPAN): NUM_TRIES, - (HANDLER_SPAN): NUM_TRIES, - (WITH_SPAN) : NUM_TRIES - ], 10000) - String url = "http://localhost:${httpPort}/greeting" - def request = new Request.Builder().url(url).get().build() - - when: - for (int i = 1; i <= NUM_TRIES; i++) { - client.newCall(request).execute() - } - def spans = spanCounter.countSpans() - - then: - Math.abs(spans[SERVLET_SPAN] - (SAMPLER_PROBABILITY * NUM_TRIES)) <= ALLOWED_DEVIATION - Math.abs(spans[HANDLER_SPAN] - (SAMPLER_PROBABILITY * NUM_TRIES)) <= ALLOWED_DEVIATION - Math.abs(spans[WITH_SPAN] - (SAMPLER_PROBABILITY * NUM_TRIES)) <= ALLOWED_DEVIATION - } -} diff --git a/smoke-tests/src/main/groovy/io/opentelemetry/smoketest/AbstractServerSmokeTest.groovy b/smoke-tests/src/main/groovy/io/opentelemetry/smoketest/AbstractServerSmokeTest.groovy deleted file mode 100644 index 9d5db770192..00000000000 --- a/smoke-tests/src/main/groovy/io/opentelemetry/smoketest/AbstractServerSmokeTest.groovy +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.smoketest - - -import io.opentelemetry.auto.test.utils.OkHttpUtils -import io.opentelemetry.auto.test.utils.PortUtils -import okhttp3.OkHttpClient -import spock.lang.Shared - -import java.util.concurrent.TimeUnit - -abstract class AbstractServerSmokeTest extends AbstractSmokeTest { - - @Shared - int httpPort = PortUtils.randomOpenPort() - - - protected OkHttpClient client = OkHttpUtils.client() - - def setupSpec() { - try { - PortUtils.waitForPortToOpen(httpPort, 240, TimeUnit.SECONDS, testedProcess) - } catch (e) { - System.err.println(logfile.text) - throw e - } - } - -} diff --git a/smoke-tests/src/main/groovy/io/opentelemetry/smoketest/AbstractSmokeTest.groovy b/smoke-tests/src/main/groovy/io/opentelemetry/smoketest/AbstractSmokeTest.groovy deleted file mode 100644 index fb78e9c5b5a..00000000000 --- a/smoke-tests/src/main/groovy/io/opentelemetry/smoketest/AbstractSmokeTest.groovy +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.smoketest - - -import spock.lang.Shared -import spock.lang.Specification - -abstract class AbstractSmokeTest extends Specification { - - @Shared - protected String workingDirectory = System.getProperty("user.dir") - @Shared - protected String buildDirectory = System.getProperty("io.opentelemetry.smoketest.builddir") - @Shared - protected String shadowJarPath = System.getProperty("io.opentelemetry.smoketest.agent.shadowJar.path") - - @Shared - protected String[] defaultJavaProperties - @Shared - protected Process testedProcess - - @Shared - protected String exporterPath = System.getProperty("otel.exporter.jar") - - @Shared - protected File logfile - - def countSpans(prefix) { - return logfile.text.tokenize('\n').count { - it.startsWith prefix - } - } - - def setupSpec() { - if (buildDirectory == null || shadowJarPath == null) { - throw new AssertionError("Expected system properties not found. Smoke tests have to be run from Gradle. Please make sure that is the case.") - } - - defaultJavaProperties = [ - "-javaagent:${shadowJarPath}", - "-Dio.opentelemetry.auto.slf4j.simpleLogger.defaultLogLevel=debug", - "-Dorg.slf4j.simpleLogger.defaultLogLevel=debug" - ] - - ProcessBuilder processBuilder = createProcessBuilder() - - processBuilder.environment().put("JAVA_HOME", System.getProperty("java.home")) - - // Setting configuration variables of batch span processor through env vars - // This config is to immediately flush a batch of 1 span with delay of 10ms - processBuilder.environment().put("OTEL_BSP_MAX_EXPORT_BATCH", "1") - processBuilder.environment().put("OTEL_BSP_SCHEDULE_DELAY", "10") - - processBuilder.redirectErrorStream(true) - logfile = new File("${buildDirectory}/reports/testProcess.${this.getClass().getName()}.log") - processBuilder.redirectOutput(ProcessBuilder.Redirect.to(logfile)) - - testedProcess = processBuilder.start() - } - - String javaPath() { - String separator = System.getProperty("file.separator") - return System.getProperty("java.home") + separator + "bin" + separator + "java" - } - - def cleanupSpec() { - testedProcess?.waitForOrKill(1) - } - - abstract ProcessBuilder createProcessBuilder() -} diff --git a/smoke-tests/src/main/groovy/io/opentelemetry/smoketest/SpanCounter.groovy b/smoke-tests/src/main/groovy/io/opentelemetry/smoketest/SpanCounter.groovy deleted file mode 100644 index 10e56b1e5fc..00000000000 --- a/smoke-tests/src/main/groovy/io/opentelemetry/smoketest/SpanCounter.groovy +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.smoketest - -class SpanCounter { - - long expiration - - final Map targets - - int totalTargets = 0 - - final Reader reader - - final Map counters - - SpanCounter(File file, Map targets, long timeout) { - reader = file.newReader() - reader.skip(file.length()) - - expiration = System.currentTimeMillis() + timeout - this.targets = targets - counters = new HashMap<>(targets.size()) - targets.keySet().each({ - totalTargets += targets[it] - counters[it] = 0 - }) - } - - Map countSpans() { - try { - def line - while (System.currentTimeMillis() < expiration) { - line = reader.readLine() - if (line) { - println line - for (def key : counters.keySet()) { - if (line.startsWith(key)) { - counters[key]++ - if (--totalTargets == 0) { - // We hit our total target. We may or may not have gotten the right - // number for each tag, but we're letting the caller sort that out! - return counters - } - } - } - } else { - Thread.sleep(10) - } - } - } - finally { - reader?.close() - } - return counters - } -} - diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy index 0203131e8d1..b4f9f2e5f5b 100644 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy +++ b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy @@ -21,12 +21,13 @@ import okhttp3.Request class PlaySmokeTest extends SmokeTest { - protected String getTargetImage() { - "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-play:latest" + protected String getTargetImage(int jdk) { + "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-play-$jdk:latest" } - def "play smoke test"() { + def "play smoke test on JDK #jdk"(int jdk) { setup: + startTarget(jdk) String url = "http://localhost:${target.getMappedPort(8080)}/welcome?id=1" def request = new Request.Builder().url(url).get().build() @@ -39,6 +40,12 @@ class PlaySmokeTest extends SmokeTest { //Both play and akka-http support produce spans with the same name. //One internal, one SERVER countSpansByName(traces, 'GET /welcome') == 2 + + cleanup: + stopTarget() + + where: + jdk << [8, 11, 14] } } diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SmokeTest.groovy index e8aed035853..cbd2cde51a2 100644 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SmokeTest.groovy +++ b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SmokeTest.groovy @@ -44,18 +44,9 @@ abstract class SmokeTest extends Specification { protected String agentPath = System.getProperty("io.opentelemetry.smoketest.agent.shadowJar.path") @Shared - protected GenericContainer target = new GenericContainer<>(getTargetImage()) - .withExposedPorts(8080) - .withNetwork(network) - .withLogConsumer(new Slf4jLogConsumer(logger)) - .withCopyFileToContainer(MountableFile.forHostPath(agentPath), "/opentelemetry-javaagent-all.jar") - .withEnv("JAVA_TOOL_OPTIONS", "-javaagent:/opentelemetry-javaagent-all.jar") - .withEnv("OTEL_BSP_MAX_EXPORT_BATCH", "1") - .withEnv("OTEL_BSP_SCHEDULE_DELAY", "10") - .withEnv("OTEL_OTLP_ENDPOINT", "collector:55680") - .withEnv(extraEnv) - - protected abstract String getTargetImage() + protected GenericContainer target + + protected abstract String getTargetImage(int jdk) /** * Subclasses can override this method to customise target application's environment @@ -65,20 +56,42 @@ abstract class SmokeTest extends Specification { } @Shared - protected GenericContainer collector = new GenericContainer<>("otel/opentelemetry-collector-dev") - .withNetwork(network) - .withNetworkAliases("collector") - .withLogConsumer(new Slf4jLogConsumer(logger)) - .withCopyFileToContainer(MountableFile.forClasspathResource("/otel.yaml"), "/etc/otel.yaml") - .withCommand("--config /etc/otel.yaml") - - def setupSpec() { + private GenericContainer collector + + def setup() { + //We have to recreate collector for every test to wipe exported file with traces + collector = new GenericContainer<>("otel/opentelemetry-collector-dev") + .withNetwork(network) + .withNetworkAliases("collector") + .withLogConsumer(new Slf4jLogConsumer(logger)) + .withCopyFileToContainer(MountableFile.forClasspathResource("/otel.yaml"), "/etc/otel.yaml") + .withCommand("--config /etc/otel.yaml") collector.start() + } + + def startTarget(int jdk) { + target = new GenericContainer<>(getTargetImage(jdk)) + .withExposedPorts(8080) + .withNetwork(network) + .withLogConsumer(new Slf4jLogConsumer(logger)) + .withCopyFileToContainer(MountableFile.forHostPath(agentPath), "/opentelemetry-javaagent-all.jar") + .withEnv("JAVA_TOOL_OPTIONS", "-javaagent:/opentelemetry-javaagent-all.jar") + .withEnv("OTEL_BSP_MAX_EXPORT_BATCH", "1") + .withEnv("OTEL_BSP_SCHEDULE_DELAY", "10") + .withEnv("OTEL_OTLP_ENDPOINT", "collector:55680") + .withEnv(extraEnv) target.start() } - def cleanupSpec() { + def cleanup() { + collector.stop() + } + + def stopTarget() { target.stop() + } + + def cleanupSpec() { collector.stop() } diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy index 8cde39fd640..08e2dc1d4f1 100644 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy +++ b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy @@ -21,12 +21,13 @@ import okhttp3.Request class SpringBootSmokeTest extends SmokeTest { - protected String getTargetImage() { - "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot:latest" + protected String getTargetImage(int jdk) { + "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot-$jdk:latest" } - def "spring boot smoke test"() { + def "spring boot smoke test on JDK #jdk"(int jdk) { setup: + startTarget(jdk) String url = "http://localhost:${target.getMappedPort(8080)}/greeting" def request = new Request.Builder().url(url).get().build() @@ -35,9 +36,16 @@ class SpringBootSmokeTest extends SmokeTest { Collection traces = waitForTraces() then: - response.body().string() == "Sup Dawg" + response.body().string() == "Hi!" countSpansByName(traces, '/greeting') == 1 countSpansByName(traces, 'WebController.greeting') == 1 + countSpansByName(traces, 'WebController.withSpan') == 1 + + cleanup: + stopTarget() + + where: + jdk << [8, 11, 14] } } diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy index fde413fa27e..ec83dc1c923 100644 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy +++ b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy @@ -25,8 +25,8 @@ class SpringBootWithSamplingSmokeTest extends SmokeTest { static final int NUM_TRIES = 1000 static final int ALLOWED_DEVIATION = 0.1 * NUM_TRIES - protected String getTargetImage() { - "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot:latest" + protected String getTargetImage(int jdk) { + "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot-$jdk:latest" } @Override @@ -34,8 +34,9 @@ class SpringBootWithSamplingSmokeTest extends SmokeTest { return ["OTEL_CONFIG_SAMPLER_PROBABILITY": String.valueOf(SAMPLER_PROBABILITY)] } - def "default home page with probability sampling enabled"() { + def "spring boot with probability sampling enabled on JDK #jdk"(int jdk) { setup: + startTarget(jdk) String url = "http://localhost:${target.getMappedPort(8080)}/greeting" def request = new Request.Builder().url(url).get().build() @@ -49,5 +50,11 @@ class SpringBootWithSamplingSmokeTest extends SmokeTest { // since sampling is enabled, not really expecting to receive NUM_TRIES spans Math.abs(countSpansByName(traces, 'WebController.greeting') - (SAMPLER_PROBABILITY * NUM_TRIES)) <= ALLOWED_DEVIATION Math.abs(countSpansByName(traces, '/greeting') - (SAMPLER_PROBABILITY * NUM_TRIES)) <= ALLOWED_DEVIATION + + cleanup: + stopTarget() + + where: + jdk << [8, 11, 14] } } diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/WildflySmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/WildflySmokeTest.groovy index c57be0a1e03..0db639b61b2 100644 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/WildflySmokeTest.groovy +++ b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/WildflySmokeTest.groovy @@ -21,7 +21,7 @@ import okhttp3.Request class WildflySmokeTest extends SmokeTest { - protected String getTargetImage() { + protected String getTargetImage(int jdk) { "jboss/wildfly:latest" } @@ -29,6 +29,7 @@ class WildflySmokeTest extends SmokeTest { //So this test just verifies that Wildfly has come up. def "wildfly smoke test"() { setup: + startTarget(11) // does not actually matter String url = "http://localhost:${target.getMappedPort(8080)}" def request = new Request.Builder().url(url).get().build() @@ -41,6 +42,9 @@ class WildflySmokeTest extends SmokeTest { responseBodyStr.contains("Your WildFly instance is running.") response.body().contentType().toString().contains("text/html") response.code() == 200 + + cleanup: + stopTarget() } } From 5c5e0437aaf7b02f0be10200426464a637aa8015 Mon Sep 17 00:00:00 2001 From: Nikita Salnikov-Tarnovski Date: Wed, 12 Aug 2020 20:11:19 +0300 Subject: [PATCH 2/2] Cleaner Docker images names --- smoke-tests/play/build.gradle | 2 +- smoke-tests/springboot/build.gradle | 2 +- .../test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy | 2 +- .../io/opentelemetry/smoketest/SpringBootSmokeTest.groovy | 2 +- .../smoketest/SpringBootWithSamplingSmokeTest.groovy | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/smoke-tests/play/build.gradle b/smoke-tests/play/build.gradle index 0c0b195537d..08dae70edf3 100644 --- a/smoke-tests/play/build.gradle +++ b/smoke-tests/play/build.gradle @@ -39,6 +39,6 @@ def targetJDK = project.hasProperty("targetJDK") ? project.targetJDK : 11 jib { from.image = "bellsoft/liberica-openjdk-alpine:$targetJDK" - to.image = "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-play-$targetJDK" + to.image = "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-play-jdk$targetJDK" container.mainClass = "play.core.server.ProdServerStart" } \ No newline at end of file diff --git a/smoke-tests/springboot/build.gradle b/smoke-tests/springboot/build.gradle index daae95c8e2f..75bdb2a5e33 100644 --- a/smoke-tests/springboot/build.gradle +++ b/smoke-tests/springboot/build.gradle @@ -25,5 +25,5 @@ def targetJDK = project.hasProperty("targetJDK") ? project.targetJDK : 11 jib { from.image = "bellsoft/liberica-openjdk-alpine:$targetJDK" - to.image = "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot-$targetJDK" + to.image = "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot-jdk$targetJDK" } \ No newline at end of file diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy index b4f9f2e5f5b..87fa7a1d411 100644 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy +++ b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PlaySmokeTest.groovy @@ -22,7 +22,7 @@ import okhttp3.Request class PlaySmokeTest extends SmokeTest { protected String getTargetImage(int jdk) { - "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-play-$jdk:latest" + "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-play-jdk$jdk:latest" } def "play smoke test on JDK #jdk"(int jdk) { diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy index 08e2dc1d4f1..b29e03432f8 100644 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy +++ b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy @@ -22,7 +22,7 @@ import okhttp3.Request class SpringBootSmokeTest extends SmokeTest { protected String getTargetImage(int jdk) { - "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot-$jdk:latest" + "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot-jdk$jdk:latest" } def "spring boot smoke test on JDK #jdk"(int jdk) { diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy index ec83dc1c923..3e68af2fdaf 100644 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy +++ b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootWithSamplingSmokeTest.groovy @@ -26,7 +26,7 @@ class SpringBootWithSamplingSmokeTest extends SmokeTest { static final int ALLOWED_DEVIATION = 0.1 * NUM_TRIES protected String getTargetImage(int jdk) { - "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot-$jdk:latest" + "docker.pkg.github.com/open-telemetry/opentelemetry-java-instrumentation/smoke-springboot-jdk$jdk:latest" } @Override