diff --git a/.github/workflows/build-graal.yml b/.github/workflows/build-graal.yml new file mode 100644 index 00000000000..dc0a75b27a5 --- /dev/null +++ b/.github/workflows/build-graal.yml @@ -0,0 +1,20 @@ +name: GraalVM Community Edition build +on: [push, pull_request] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: graalvm/setup-graalvm@v1 + with: + version: 'latest' + java-version: '11' + components: 'native-image' + - name: Running test + run: | + echo "GRAALVM_HOME: $GRAALVM_HOME" + echo "JAVA_HOME: $JAVA_HOME" + java --version + gu --version + native-image --version + ./gradlew nativeTest \ No newline at end of file diff --git a/integration-tests/graal/build.gradle.kts b/integration-tests/graal/build.gradle.kts new file mode 100644 index 00000000000..78095f8905e --- /dev/null +++ b/integration-tests/graal/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + id("otel.java-conventions") + id("org.graalvm.buildtools.native") +} + +description = "OpenTelemetry Graal Integration Tests" +otelJava.moduleName.set("io.opentelemetry.graal.integration.tests") + +sourceSets { + main { + // We need to ensure that we have the shadowed classes on the classpath, without this + // we will get the <:sdk:trace-shaded-deps> classes only, without the shadowed ones + val traceShadedDeps = project(":sdk:trace-shaded-deps") + output.dir(traceShadedDeps.file("build/extracted/shadow"), "builtBy" to ":sdk:trace-shaded-deps:extractShadowJar") + } +} + +dependencies { + implementation(project(path = ":sdk:trace-shaded-deps")) +} + +graalvmNative { + binaries { + named("main") { + verbose.set(true) + } + } + toolchainDetection.set(false) +} diff --git a/integration-tests/graal/src/main/resources/simplelogger.properties b/integration-tests/graal/src/main/resources/simplelogger.properties new file mode 100644 index 00000000000..a6233fa3461 --- /dev/null +++ b/integration-tests/graal/src/main/resources/simplelogger.properties @@ -0,0 +1,2 @@ +org.slf4j.simpleLogger.defaultLogLevel=info +org.slf4j.simpleLogger.log.org.eclipse.jetty=warn diff --git a/integration-tests/graal/src/test/java/io/opentelemetry/integrationtests/graal/JcToolsTest.java b/integration-tests/graal/src/test/java/io/opentelemetry/integrationtests/graal/JcToolsTest.java new file mode 100644 index 00000000000..55363a0487f --- /dev/null +++ b/integration-tests/graal/src/test/java/io/opentelemetry/integrationtests/graal/JcToolsTest.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.integrationtests.graal; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.sdk.trace.internal.JcTools; +import java.util.Queue; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledInNativeImage; + +class JcToolsTest { + + @Test + @EnabledInNativeImage + void insert_oneElementToTheQueue() { + Queue objects = JcTools.newFixedSizeQueue(10); + + objects.add(new Object()); + + assertThat(objects).hasSize(1); + } +} diff --git a/sdk/trace-shaded-deps/src/main/resources/META-INF/native-image/io.opentelemetry/opentelemetry-sdk-trace/reflect-config.json b/sdk/trace-shaded-deps/src/main/resources/META-INF/native-image/io.opentelemetry/opentelemetry-sdk-trace/reflect-config.json new file mode 100644 index 00000000000..12d6b7a64b8 --- /dev/null +++ b/sdk/trace-shaded-deps/src/main/resources/META-INF/native-image/io.opentelemetry/opentelemetry-sdk-trace/reflect-config.json @@ -0,0 +1,35 @@ +[ + { + "condition": { + "typeReachable": "io.opentelemetry.internal.shaded.jctools.queues.MpscArrayQueueConsumerIndexField" + }, + "name": "io.opentelemetry.internal.shaded.jctools.queues.MpscArrayQueueConsumerIndexField", + "fields": [ + { + "name": "consumerIndex" + } + ] + }, + { + "condition": { + "typeReachable": "io.opentelemetry.internal.shaded.jctools.queues.MpscArrayQueueProducerIndexField" + }, + "name": "io.opentelemetry.internal.shaded.jctools.queues.MpscArrayQueueProducerIndexField", + "fields": [ + { + "name": "producerIndex" + } + ] + }, + { + "condition": { + "typeReachable": "io.opentelemetry.internal.shaded.jctools.queues.MpscArrayQueueProducerLimitField" + }, + "name": "io.opentelemetry.internal.shaded.jctools.queues.MpscArrayQueueProducerLimitField", + "fields": [ + { + "name": "producerLimit" + } + ] + } +] diff --git a/settings.gradle.kts b/settings.gradle.kts index abfef5336db..1f0b887f197 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,6 +5,7 @@ pluginManagement { id("com.gradle.enterprise") version "3.11.1" id("io.github.gradle-nexus.publish-plugin") version "1.1.0" id("org.jetbrains.kotlin.jvm") version "1.7.20" + id("org.graalvm.buildtools.native") version "0.9.14" } } @@ -47,6 +48,7 @@ include(":exporters:zipkin") include(":integration-tests") include(":integration-tests:otlp") include(":integration-tests:tracecontext") +include(":integration-tests:graal") include(":opencensus-shim") include(":opentracing-shim") include(":perf-harness")