From 2c5233c5edaf0d7e9dbf574430ae37cba4b5e100 Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Thu, 13 Jan 2022 14:55:43 +0200 Subject: [PATCH] Ensure that the presence of OpenTelemetry does not break Jib builds Fixes: #22864 --- .../image/jib/deployment/JibProcessor.java | 20 +++++++++++++++++++ .../src/it/container-build-jib/pom.xml | 13 ++++++++++++ 2 files changed, 33 insertions(+) diff --git a/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibProcessor.java b/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibProcessor.java index 3f18c666897408..3201af4240fd07 100644 --- a/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibProcessor.java +++ b/extensions/container-image/container-image-jib/deployment/src/main/java/io/quarkus/container/image/jib/deployment/JibProcessor.java @@ -4,6 +4,9 @@ import java.io.IOException; import java.io.UncheckedIOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.nio.charset.StandardCharsets; import java.nio.file.DirectoryStream; import java.nio.file.Files; @@ -82,6 +85,8 @@ public class JibProcessor { private static final String JAVA_17_BASE_IMAGE = "registry.access.redhat.com/ubi8/openjdk-17-runtime:1.10"; private static final String JAVA_11_BASE_IMAGE = "registry.access.redhat.com/ubi8/openjdk-11-runtime:1.10"; + private static final String OPENTELEMETRY_CONTEXT_CONTEXT_STORAGE_PROVIDER_SYS_PROP = "io.opentelemetry.context.contextStorageProvider"; + @BuildStep public AvailableContainerImageExtensionBuildItem availability() { return new AvailableContainerImageExtensionBuildItem(JIB); @@ -205,11 +210,20 @@ public void buildFromNative(ContainerImageConfig containerImageConfig, JibConfig private JibContainer containerize(ContainerImageConfig containerImageConfig, JibConfig jibConfig, ContainerImageInfoBuildItem containerImage, JibContainerBuilder jibContainerBuilder, boolean pushRequested) { + Containerizer containerizer = createContainerizer(containerImageConfig, jibConfig, containerImage, pushRequested); for (String additionalTag : containerImage.getAdditionalTags()) { containerizer.withAdditionalTag(additionalTag); } + String previousContextStorageSysProp = null; try { + // Jib uses the Google HTTP Client under the hood which attempts to record traces via OpenCensus which is wired + // to delegate to OpenTelemetry. + // This can lead to problems with the Quarkus OpenTelemetry extension which expects Vert.x to be running, + // something that is not the case at build time, see https://github.com/quarkusio/quarkus/issues/22864. + previousContextStorageSysProp = System.setProperty(OPENTELEMETRY_CONTEXT_CONTEXT_STORAGE_PROVIDER_SYS_PROP, + "default"); + log.info("Starting container image build"); JibContainer container = jibContainerBuilder.containerize(containerizer); log.infof("%s container image %s (%s)\n", @@ -219,6 +233,12 @@ private JibContainer containerize(ContainerImageConfig containerImageConfig, return container; } catch (Exception e) { throw new RuntimeException("Unable to create container image", e); + } finally { + if (previousContextStorageSysProp == null) { + System.clearProperty(OPENTELEMETRY_CONTEXT_CONTEXT_STORAGE_PROVIDER_SYS_PROP); + } else { + System.setProperty(OPENTELEMETRY_CONTEXT_CONTEXT_STORAGE_PROVIDER_SYS_PROP, previousContextStorageSysProp); + } } } diff --git a/integration-tests/container-image/maven-invoker-way/src/it/container-build-jib/pom.xml b/integration-tests/container-image/maven-invoker-way/src/it/container-build-jib/pom.xml index 9a53152b1a407c..2058eca2a97e59 100644 --- a/integration-tests/container-image/maven-invoker-way/src/it/container-build-jib/pom.xml +++ b/integration-tests/container-image/maven-invoker-way/src/it/container-build-jib/pom.xml @@ -32,6 +32,19 @@ io.quarkus quarkus-container-image-jib + + + + + io.quarkus + quarkus-opentelemetry-exporter-otlp + + + io.opentelemetry.instrumentation + opentelemetry-grpc-1.6 + 1.9.2-alpha + + io.quarkus quarkus-junit5