From 009cc6ad1efeaf41403da452c343f159b3155c45 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Cortez Date: Fri, 15 May 2020 01:57:52 +0200 Subject: [PATCH] Initial Propagators support. (#389) --- .../io/opentelemetry/auto/config/Config.java | 5 ++ agent-tooling/agent-tooling.gradle | 1 + .../auto/tooling/PropagatorsInitializer.java | 59 +++++++++++++++++++ .../auto/tooling/TracerInstaller.java | 2 + gradle/dependencies.gradle | 1 + 5 files changed, 68 insertions(+) create mode 100644 agent-tooling/src/main/java/io/opentelemetry/auto/tooling/PropagatorsInitializer.java diff --git a/agent-bootstrap/src/main/java/io/opentelemetry/auto/config/Config.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/config/Config.java index f6c0889fb7..3e2243edbf 100644 --- a/agent-bootstrap/src/main/java/io/opentelemetry/auto/config/Config.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/config/Config.java @@ -56,6 +56,7 @@ public class Config { public static final String EXPORTER_JAR = "exporter.jar"; public static final String SERVICE = "service"; + public static final String PROPAGATORS = "propagators"; public static final String CONFIGURATION_FILE = "trace.config"; public static final String TRACE_ENABLED = "trace.enabled"; public static final String INTEGRATIONS_ENABLED = "integrations.enabled"; @@ -104,6 +105,7 @@ public class Config { @Getter private final String exporterJar; @Getter private final String serviceName; + @Getter private final List propagators; @Getter private final boolean traceEnabled; @Getter private final boolean integrationsEnabled; @Getter private final List excludedClasses; @@ -150,6 +152,7 @@ public class Config { Config() { propertiesFromConfigFile = loadConfigurationFile(); + propagators = getListSettingFromEnvironment(PROPAGATORS, null); exporterJar = getSettingFromEnvironment(EXPORTER_JAR, null); serviceName = getSettingFromEnvironment(SERVICE, "(unknown)"); traceEnabled = getBooleanSettingFromEnvironment(TRACE_ENABLED, DEFAULT_TRACE_ENABLED); @@ -211,6 +214,8 @@ public class Config { exporterJar = properties.getProperty(EXPORTER_JAR, parent.exporterJar); serviceName = properties.getProperty(SERVICE, parent.serviceName); + propagators = getPropertyListValue(properties, PROPAGATORS, parent.propagators); + traceEnabled = getPropertyBooleanValue(properties, TRACE_ENABLED, parent.traceEnabled); integrationsEnabled = getPropertyBooleanValue(properties, INTEGRATIONS_ENABLED, parent.integrationsEnabled); diff --git a/agent-tooling/agent-tooling.gradle b/agent-tooling/agent-tooling.gradle index 06708b6e4f..3161b6a6ce 100644 --- a/agent-tooling/agent-tooling.gradle +++ b/agent-tooling/agent-tooling.gradle @@ -19,6 +19,7 @@ dependencies { compile deps.opentelemetryApi compile deps.opentelemetrySdk compile deps.opentelemetrySdkAutoConfig + compile deps.opentelemetryTraceProps // TODO: move the interface in exporter-support into opentelemetry-sdk-contrib-auto-config compile project(':exporter-support') diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/PropagatorsInitializer.java b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/PropagatorsInitializer.java new file mode 100644 index 0000000000..a04ebe3047 --- /dev/null +++ b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/PropagatorsInitializer.java @@ -0,0 +1,59 @@ +/* + * 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.auto.tooling; + +import com.google.common.collect.ImmutableMap; +import io.opentelemetry.OpenTelemetry; +import io.opentelemetry.context.propagation.DefaultContextPropagators; +import io.opentelemetry.context.propagation.HttpTextFormat; +import io.opentelemetry.contrib.trace.propagation.B3Propagator; +import io.opentelemetry.trace.propagation.HttpTraceContext; +import java.util.List; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class PropagatorsInitializer { + private static final String TRACE_CONTEXT = "tracecontext"; + private static final String B3 = "b3"; + + private static final Map TEXTMAP_PROPAGATORS = + ImmutableMap.of( + TRACE_CONTEXT, new HttpTraceContext(), + B3, new B3Propagator()); + + /** Initialize OpenTelemetry global Propagators with propagator list, if any. */ + public static void initializePropagators(List propagators) { + /* Only override the default propagators *if* the user specified any. */ + if (propagators.size() == 0) { + return; + } + + DefaultContextPropagators.Builder propagatorsBuilder = DefaultContextPropagators.builder(); + + for (String propagatorId : propagators) { + HttpTextFormat textPropagator = TEXTMAP_PROPAGATORS.get(propagatorId.trim().toLowerCase()); + if (textPropagator != null) { + propagatorsBuilder.addHttpTextFormat(textPropagator); + log.info("Added " + textPropagator + " propagator"); + } else { + log.warn("No matching propagator for " + propagatorId); + } + } + + OpenTelemetry.setPropagators(propagatorsBuilder.build()); + } +} diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/TracerInstaller.java b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/TracerInstaller.java index 530770ea1c..31b0f0664f 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/TracerInstaller.java +++ b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/TracerInstaller.java @@ -48,6 +48,8 @@ public class TracerInstaller { } else { log.info("Tracing is disabled."); } + + PropagatorsInitializer.initializePropagators(Config.get().getPropagators()); } @VisibleForTesting diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index ba9c672a5b..43f87dc90b 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -28,6 +28,7 @@ ext { // OpenTelemetry opentelemetryApi : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-api', version: versions.opentelemetry), opentelemetryApiAutoAnnotations: dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-contrib-auto-annotations', version: versions.opentelemetry), + opentelemetryTraceProps : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-contrib-trace-propagators', version: versions.opentelemetry), opentelemetrySdk : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-sdk', version: versions.opentelemetry), opentelemetrySdkAutoConfig : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-sdk-contrib-auto-config', version: versions.opentelemetry), opentelemetryJaeger : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-exporters-jaeger', version: versions.opentelemetry),