InstrumentationConfig part 2 (#6292)

This commit is contained in:
Mateusz Rzeszutek 2022-07-11 09:47:19 +02:00 committed by GitHub
parent 177f0aec7c
commit 7bbe918008
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
54 changed files with 154 additions and 94 deletions

View File

@ -7,8 +7,8 @@ package io.opentelemetry.javaagent.instrumentation.dropwizardviews;
import io.dropwizard.views.View;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public final class DropwizardSingletons {

View File

@ -26,7 +26,7 @@ muzzle {
dependencies {
compileOnly("org.elasticsearch.client:transport:5.0.0")
implementation(project(":instrumentation:elasticsearch:elasticsearch-transport-common:library"))
implementation(project(":instrumentation:elasticsearch:elasticsearch-transport-common:javaagent"))
// Ensure no cross interference
testInstrumentation(project(":instrumentation:elasticsearch:elasticsearch-rest-5.0:javaagent"))

View File

@ -32,7 +32,7 @@ dependencies {
isTransitive = false
}
implementation(project(":instrumentation:elasticsearch:elasticsearch-transport-common:library"))
implementation(project(":instrumentation:elasticsearch:elasticsearch-transport-common:javaagent"))
testInstrumentation(project(":instrumentation:apache-httpasyncclient-4.1:javaagent"))
testInstrumentation(project(":instrumentation:netty:netty-4.1:javaagent"))

View File

@ -26,7 +26,7 @@ muzzle {
dependencies {
library("org.elasticsearch.client:transport:6.0.0")
implementation(project(":instrumentation:elasticsearch:elasticsearch-transport-common:library"))
implementation(project(":instrumentation:elasticsearch:elasticsearch-transport-common:javaagent"))
// Ensure no cross interference
testInstrumentation(project(":instrumentation:elasticsearch:elasticsearch-rest-5.0:javaagent"))

View File

@ -1,5 +1,5 @@
plugins {
id("otel.library-instrumentation")
id("otel.javaagent-instrumentation")
}
dependencies {

View File

@ -6,18 +6,18 @@
package io.opentelemetry.javaagent.instrumentation.elasticsearch.transport;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientSpanNameExtractor;
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
import org.elasticsearch.action.ActionResponse;
public final class ElasticsearchTransportInstrumenterFactory {
private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES =
Config.get()
InstrumentationConfig.get()
.getBoolean("otel.instrumentation.elasticsearch.experimental-span-attributes", false);
public static Instrumenter<ElasticTransportRequest, ActionResponse> create(

View File

@ -6,8 +6,8 @@
package io.opentelemetry.javaagent.instrumentation.grails;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public final class GrailsSingletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.grails-3.0";

View File

@ -6,10 +6,10 @@
package io.opentelemetry.javaagent.instrumentation.jaxrs.v1_0;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeSpanNameExtractor;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public final class JaxrsSingletons {

View File

@ -6,10 +6,10 @@
package io.opentelemetry.javaagent.instrumentation.jaxrs;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeSpanNameExtractor;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public final class JaxrsInstrumenterFactory {

View File

@ -6,8 +6,8 @@
package io.opentelemetry.javaagent.instrumentation.axis2;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public class Axis2Singletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jaxws-2.0-axis2-1.6";

View File

@ -6,8 +6,8 @@
package io.opentelemetry.javaagent.instrumentation.cxf;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public class CxfSingletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jaxws-2.0-cxf-3.0";

View File

@ -6,8 +6,8 @@
package io.opentelemetry.javaagent.instrumentation.metro;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public class MetroSingletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jaxws-2.0-metro-2.2";

View File

@ -12,5 +12,5 @@ muzzle {
dependencies {
library("javax.xml.ws:jaxws-api:2.0")
implementation(project(":instrumentation:jaxws:jaxws-common:library"))
implementation(project(":instrumentation:jaxws:jaxws-common:javaagent"))
}

View File

@ -0,0 +1,3 @@
plugins {
id("otel.javaagent-instrumentation")
}

View File

@ -6,10 +6,10 @@
package io.opentelemetry.javaagent.instrumentation.jaxws.common;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeSpanNameExtractor;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public final class JaxWsInstrumenterFactory {

View File

@ -1,3 +0,0 @@
plugins {
id("otel.library-instrumentation")
}

View File

@ -12,5 +12,5 @@ muzzle {
dependencies {
library("javax.jws:javax.jws-api:1.1")
implementation(project(":instrumentation:jaxws:jaxws-common:library"))
implementation(project(":instrumentation:jaxws:jaxws-common:javaagent"))
}

View File

@ -6,12 +6,12 @@
package io.opentelemetry.javaagent.instrumentation.jms;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessageOperation;
import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingSpanNameExtractor;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public final class JmsSingletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jms-1.1";

View File

@ -6,8 +6,8 @@
package io.opentelemetry.javaagent.instrumentation.mojarra;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import io.opentelemetry.javaagent.instrumentation.jsf.JsfErrorCauseExtractor;
import io.opentelemetry.javaagent.instrumentation.jsf.JsfRequest;

View File

@ -6,8 +6,8 @@
package io.opentelemetry.javaagent.instrumentation.myfaces;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import io.opentelemetry.javaagent.instrumentation.jsf.JsfRequest;
public class MyFacesSingletons {

View File

@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.kafkaclients;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.kafka.internal.KafkaInstrumenterFactory;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
@ -30,7 +31,9 @@ public final class KafkaSingletons {
.setCaptureExperimentalSpanAttributes(
InstrumentationConfig.get()
.getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false))
.setPropagationEnabled(PROPAGATION_ENABLED);
.setPropagationEnabled(PROPAGATION_ENABLED)
.setMessagingReceiveInstrumentationEnabled(
ExperimentalConfig.get().messagingReceiveInstrumentationEnabled());
PRODUCER_INSTRUMENTER = instrumenterFactory.createProducerInstrumenter();
CONSUMER_RECEIVE_INSTRUMENTER = instrumenterFactory.createConsumerReceiveInstrumenter();
CONSUMER_PROCESS_INSTRUMENTER = instrumenterFactory.createConsumerProcessInstrumenter();

View File

@ -6,7 +6,6 @@
package io.opentelemetry.instrumentation.kafka.internal;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.ErrorCauseExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
@ -32,6 +31,7 @@ public final class KafkaInstrumenterFactory {
private ErrorCauseExtractor errorCauseExtractor = ErrorCauseExtractor.jdk();
private boolean captureExperimentalSpanAttributes = false;
private boolean propagationEnabled = true;
private boolean messagingReceiveInstrumentationEnabled = false;
public KafkaInstrumenterFactory(OpenTelemetry openTelemetry, String instrumentationName) {
this.openTelemetry = openTelemetry;
@ -54,6 +54,12 @@ public final class KafkaInstrumenterFactory {
return this;
}
public KafkaInstrumenterFactory setMessagingReceiveInstrumentationEnabled(
boolean messagingReceiveInstrumentationEnabled) {
this.messagingReceiveInstrumentationEnabled = messagingReceiveInstrumentationEnabled;
return this;
}
public Instrumenter<ProducerRecord<?, ?>, Void> createProducerInstrumenter() {
return createProducerInstrumenter(Collections.emptyList());
}
@ -85,7 +91,7 @@ public final class KafkaInstrumenterFactory {
MessagingSpanNameExtractor.create(getter, operation))
.addAttributesExtractor(MessagingAttributesExtractor.create(getter, operation))
.setErrorCauseExtractor(errorCauseExtractor)
.setEnabled(ExperimentalConfig.get().messagingReceiveInstrumentationEnabled())
.setEnabled(messagingReceiveInstrumentationEnabled)
.newInstrumenter(SpanKindExtractor.alwaysConsumer());
}
@ -114,7 +120,7 @@ public final class KafkaInstrumenterFactory {
if (!propagationEnabled) {
return builder.newInstrumenter(SpanKindExtractor.alwaysConsumer());
} else if (ExperimentalConfig.get().messagingReceiveInstrumentationEnabled()) {
} else if (messagingReceiveInstrumentationEnabled) {
builder.addSpanLinksExtractor(
SpanLinksExtractor.extractFromRequest(
openTelemetry.getPropagators().getTextMapPropagator(),

View File

@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.kafkastreams;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.kafka.internal.KafkaInstrumenterFactory;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
@ -23,6 +24,8 @@ public final class KafkaStreamsSingletons {
.setPropagationEnabled(
InstrumentationConfig.get()
.getBoolean("otel.instrumentation.kafka.client-propagation.enabled", true))
.setMessagingReceiveInstrumentationEnabled(
ExperimentalConfig.get().messagingReceiveInstrumentationEnabled())
.createConsumerProcessInstrumenter();
public static Instrumenter<ConsumerRecord<?, ?>, Void> instrumenter() {

View File

@ -6,9 +6,9 @@
package io.opentelemetry.javaagent.instrumentation.netty.v4_0.client;
import io.netty.handler.codec.http.HttpResponse;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.internal.DeprecatedConfigPropertyWarning;
import io.opentelemetry.javaagent.bootstrap.internal.DeprecatedConfigPropertyWarning;
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
import io.opentelemetry.javaagent.instrumentation.netty.v4.common.HttpRequestAndChannel;
import io.opentelemetry.javaagent.instrumentation.netty.v4.common.client.NettyClientInstrumenterFactory;
import io.opentelemetry.javaagent.instrumentation.netty.v4.common.client.NettyConnectionInstrumenter;
@ -20,7 +20,7 @@ public final class NettyClientSingletons {
private static final boolean sslTelemetryEnabled;
static {
Config config = Config.get();
InstrumentationConfig config = InstrumentationConfig.get();
DeprecatedConfigPropertyWarning.warnIfUsed(
config,
"otel.instrumentation.netty.always-create-connect-span",

View File

@ -7,9 +7,9 @@ package io.opentelemetry.javaagent.instrumentation.netty.v4_1.client;
import io.netty.handler.codec.http.HttpResponse;
import io.netty.util.AttributeKey;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.internal.DeprecatedConfigPropertyWarning;
import io.opentelemetry.javaagent.bootstrap.internal.DeprecatedConfigPropertyWarning;
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
import io.opentelemetry.javaagent.instrumentation.netty.v4.common.HttpRequestAndChannel;
import io.opentelemetry.javaagent.instrumentation.netty.v4.common.client.NettyClientInstrumenterFactory;
import io.opentelemetry.javaagent.instrumentation.netty.v4.common.client.NettyConnectionInstrumenter;
@ -26,7 +26,7 @@ public final class NettyClientSingletons {
private static final boolean sslTelemetryEnabled;
static {
Config config = Config.get();
InstrumentationConfig config = InstrumentationConfig.get();
DeprecatedConfigPropertyWarning.warnIfUsed(
config,
"otel.instrumentation.netty.always-create-connect-span",

View File

@ -6,7 +6,6 @@
package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
@ -15,7 +14,8 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.instrumentation.api.internal.DeprecatedConfigPropertyWarning;
import io.opentelemetry.javaagent.bootstrap.internal.DeprecatedConfigPropertyWarning;
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
import io.opentelemetry.javaagent.instrumentation.netty.v4.common.client.NettyClientInstrumenterFactory;
import io.opentelemetry.javaagent.instrumentation.netty.v4.common.client.NettyConnectionInstrumenter;
import reactor.netty.http.client.HttpClientConfig;
@ -28,7 +28,7 @@ public final class ReactorNettySingletons {
private static final boolean connectionTelemetryEnabled;
static {
Config config = Config.get();
InstrumentationConfig config = InstrumentationConfig.get();
DeprecatedConfigPropertyWarning.warnIfUsed(
config,
"otel.instrumentation.reactor-netty.always-create-connect-span",

View File

@ -22,7 +22,12 @@ public final class SpringIntegrationSingletons {
singletonList("*"));
private static final ChannelInterceptor INTERCEPTOR =
SpringIntegrationTelemetry.create(GlobalOpenTelemetry.get()).newChannelInterceptor();
SpringIntegrationTelemetry.builder(GlobalOpenTelemetry.get())
.setProducerSpanEnabled(
InstrumentationConfig.get()
.getBoolean("otel.instrumentation.spring-integration.producer.enabled", false))
.build()
.newChannelInterceptor();
public static String[] patterns() {
return PATTERNS.toArray(new String[0]);

View File

@ -17,26 +17,8 @@ dependencies {
}
tasks {
val testWithProducerInstrumentation by registering(Test::class) {
filter {
includeTestsMatching("SpringCloudStreamProducerTest")
}
include("**/SpringCloudStreamProducerTest.*")
jvmArgs("-Dotel.instrumentation.spring-integration.producer.enabled=true")
}
test {
filter {
excludeTestsMatching("SpringCloudStreamProducerTest")
}
}
check {
dependsOn(testWithProducerInstrumentation)
}
withType<Test>().configureEach {
systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean)
usesService(gradle.sharedServices.registrations["testcontainersBuildService"].getService())
usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service)
}
}

View File

@ -34,14 +34,17 @@ public final class SpringIntegrationTelemetry {
private final ContextPropagators propagators;
private final Instrumenter<MessageWithChannel, Void> consumerInstrumenter;
private final Instrumenter<MessageWithChannel, Void> producerInstrumenter;
private final boolean producerSpanEnabled;
SpringIntegrationTelemetry(
ContextPropagators propagators,
Instrumenter<MessageWithChannel, Void> consumerInstrumenter,
Instrumenter<MessageWithChannel, Void> producerInstrumenter) {
Instrumenter<MessageWithChannel, Void> producerInstrumenter,
boolean producerSpanEnabled) {
this.propagators = propagators;
this.consumerInstrumenter = consumerInstrumenter;
this.producerInstrumenter = producerInstrumenter;
this.producerSpanEnabled = producerSpanEnabled;
}
/**
@ -54,6 +57,7 @@ public final class SpringIntegrationTelemetry {
* @see org.springframework.integration.config.GlobalChannelInterceptor
*/
public ChannelInterceptor newChannelInterceptor() {
return new TracingChannelInterceptor(propagators, consumerInstrumenter, producerInstrumenter);
return new TracingChannelInterceptor(
propagators, consumerInstrumenter, producerInstrumenter, producerSpanEnabled);
}
}

View File

@ -6,6 +6,7 @@
package io.opentelemetry.instrumentation.spring.integration;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
@ -22,6 +23,8 @@ public final class SpringIntegrationTelemetryBuilder {
private final List<AttributesExtractor<MessageWithChannel, Void>> additionalAttributeExtractors =
new ArrayList<>();
private boolean producerSpanEnabled = false;
SpringIntegrationTelemetryBuilder(OpenTelemetry openTelemetry) {
this.openTelemetry = openTelemetry;
}
@ -36,6 +39,15 @@ public final class SpringIntegrationTelemetryBuilder {
return this;
}
/**
* Sets whether additional {@link SpanKind#PRODUCER PRODUCER} span should be emitted by this
* instrumentation.
*/
public SpringIntegrationTelemetryBuilder setProducerSpanEnabled(boolean producerSpanEnabled) {
this.producerSpanEnabled = producerSpanEnabled;
return this;
}
private static String consumerSpanName(MessageWithChannel messageWithChannel) {
return messageWithChannel.getChannelName() + " process";
}
@ -71,6 +83,9 @@ public final class SpringIntegrationTelemetryBuilder {
SpringMessagingAttributesGetter.INSTANCE, MessageOperation.SEND))
.newInstrumenter(SpanKindExtractor.alwaysProducer());
return new SpringIntegrationTelemetry(
openTelemetry.getPropagators(), consumerInstrumenter, producerInstrumenter);
openTelemetry.getPropagators(),
consumerInstrumenter,
producerInstrumenter,
producerSpanEnabled);
}
}

View File

@ -8,7 +8,6 @@ package io.opentelemetry.instrumentation.spring.integration;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
@ -29,23 +28,23 @@ import org.springframework.util.LinkedMultiValueMap;
final class TracingChannelInterceptor implements ExecutorChannelInterceptor {
private static final boolean PRODUCER_SPAN_ENABLED =
Config.get().getBoolean("otel.instrumentation.spring-integration.producer.enabled", false);
private static final ThreadLocal<Map<MessageChannel, ContextAndScope>> LOCAL_CONTEXT_AND_SCOPE =
ThreadLocal.withInitial(IdentityHashMap::new);
private final ContextPropagators propagators;
private final Instrumenter<MessageWithChannel, Void> consumerInstrumenter;
private final Instrumenter<MessageWithChannel, Void> producerInstrumenter;
private final boolean producerSpanEnabled;
TracingChannelInterceptor(
ContextPropagators propagators,
Instrumenter<MessageWithChannel, Void> consumerInstrumenter,
Instrumenter<MessageWithChannel, Void> producerInstrumenter) {
Instrumenter<MessageWithChannel, Void> producerInstrumenter,
boolean producerSpanEnabled) {
this.propagators = propagators;
this.consumerInstrumenter = consumerInstrumenter;
this.producerInstrumenter = producerInstrumenter;
this.producerSpanEnabled = producerSpanEnabled;
}
@Override
@ -230,8 +229,8 @@ final class TracingChannelInterceptor implements ExecutorChannelInterceptor {
}
}
private static boolean createProducerSpan(MessageChannel messageChannel) {
if (!PRODUCER_SPAN_ENABLED) {
private boolean createProducerSpan(MessageChannel messageChannel) {
if (!producerSpanEnabled) {
return false;
}

View File

@ -0,0 +1,24 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
import io.opentelemetry.api.GlobalOpenTelemetry
import io.opentelemetry.instrumentation.spring.integration.SpringIntegrationTelemetry
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.integration.config.GlobalChannelInterceptor
import org.springframework.messaging.support.ChannelInterceptor
@Configuration
class GlobalInterceptorWithProducerSpanSpringConfig {
@GlobalChannelInterceptor
@Bean
ChannelInterceptor otelInterceptor() {
SpringIntegrationTelemetry.builder(GlobalOpenTelemetry.get())
.setProducerSpanEnabled(true)
.build()
.newChannelInterceptor()
}
}

View File

@ -8,6 +8,6 @@ import io.opentelemetry.instrumentation.test.LibraryTestTrait
class SpringCloudStreamProducerTest extends AbstractSpringCloudStreamProducerTest implements LibraryTestTrait {
@Override
Class<?> additionalContextClass() {
GlobalInterceptorSpringConfig
GlobalInterceptorWithProducerSpanSpringConfig
}
}

View File

@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.spring.kafka;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.kafka.internal.KafkaInstrumenterFactory;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
@ -28,6 +29,8 @@ public final class SpringKafkaSingletons {
.setPropagationEnabled(
InstrumentationConfig.get()
.getBoolean("otel.instrumentation.kafka.client-propagation.enabled", true))
.setMessagingReceiveInstrumentationEnabled(
ExperimentalConfig.get().messagingReceiveInstrumentationEnabled())
.setErrorCauseExtractor(SpringKafkaErrorCauseExtractor.INSTANCE);
BATCH_PROCESS_INSTRUMENTER = factory.createBatchProcessInstrumenter();
PROCESS_INSTRUMENTER = factory.createConsumerProcessInstrumenter();

View File

@ -7,13 +7,19 @@ package io.opentelemetry.javaagent.instrumentation.spring.webflux.client;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.spring.webflux.client.SpringWebfluxTelemetry;
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
import java.util.List;
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
public class WebClientHelper {
private static final SpringWebfluxTelemetry INSTRUMENTATION =
SpringWebfluxTelemetry.create(GlobalOpenTelemetry.get());
SpringWebfluxTelemetry.builder(GlobalOpenTelemetry.get())
.setCaptureExperimentalSpanAttributes(
InstrumentationConfig.get()
.getBoolean(
"otel.instrumentation.spring-webflux.experimental-span-attributes", false))
.build();
public static void addFilter(List<ExchangeFilterFunction> exchangeFilterFunctions) {
INSTRUMENTATION.addClientTracingFilter(exchangeFilterFunctions);

View File

@ -6,10 +6,10 @@
package io.opentelemetry.javaagent.instrumentation.spring.webflux.server;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import io.opentelemetry.javaagent.instrumentation.spring.webflux.SpringWebfluxConfig;
import org.springframework.web.reactive.HandlerMapping;
import org.springframework.web.server.ServerWebExchange;

View File

@ -10,7 +10,6 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import javax.annotation.Nullable;
import org.springframework.web.reactive.function.client.ClientRequest;
@ -24,11 +23,6 @@ final class SpringWebfluxExperimentalAttributesExtractor
private static final AttributeKey<String> SPRING_WEBFLUX_MESSAGE =
stringKey("spring-webflux.message");
public static boolean enabled() {
return Config.get()
.getBoolean("otel.instrumentation.spring-webflux.experimental-span-attributes", false);
}
@Override
public void onStart(AttributesBuilder attributes, Context parentContext, ClientRequest request) {}

View File

@ -33,6 +33,8 @@ public final class SpringWebfluxTelemetryBuilder {
httpAttributesExtractorBuilder =
HttpClientAttributesExtractor.builder(SpringWebfluxHttpAttributesGetter.INSTANCE);
private boolean captureExperimentalSpanAttributes = false;
SpringWebfluxTelemetryBuilder(OpenTelemetry openTelemetry) {
this.openTelemetry = openTelemetry;
}
@ -67,6 +69,17 @@ public final class SpringWebfluxTelemetryBuilder {
return this;
}
/**
* Sets whether experimental attributes should be set to spans. These attributes may be changed or
* removed in the future, so only enable this if you know you do not require attributes filled by
* this instrumentation to be stable across versions.
*/
public SpringWebfluxTelemetryBuilder setCaptureExperimentalSpanAttributes(
boolean captureExperimentalSpanAttributes) {
this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes;
return this;
}
/**
* Returns a new {@link SpringWebfluxTelemetry} with the settings of this {@link
* SpringWebfluxTelemetryBuilder}.
@ -90,7 +103,7 @@ public final class SpringWebfluxTelemetryBuilder {
.addAttributesExtractors(additionalExtractors)
.addOperationMetrics(HttpClientMetrics.get());
if (SpringWebfluxExperimentalAttributesExtractor.enabled()) {
if (captureExperimentalSpanAttributes) {
builder.addAttributesExtractor(new SpringWebfluxExperimentalAttributesExtractor());
}

View File

@ -6,8 +6,8 @@
package io.opentelemetry.javaagent.instrumentation.springwebmvc;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import org.springframework.web.servlet.ModelAndView;
public final class SpringWebMvcSingletons {

View File

@ -6,10 +6,10 @@
package io.opentelemetry.javaagent.instrumentation.spring.ws;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeSpanNameExtractor;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public class SpringWsSingletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-ws-2.0";

View File

@ -7,10 +7,10 @@ package io.opentelemetry.javaagent.instrumentation.struts2;
import com.opensymphony.xwork2.ActionInvocation;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeSpanNameExtractor;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public class StrutsSingletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.struts-2.3";

View File

@ -6,9 +6,9 @@
package io.opentelemetry.javaagent.instrumentation.tapestry;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.ErrorCauseExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import org.apache.tapestry5.runtime.ComponentEventException;
public class TapestrySingletons {

View File

@ -8,11 +8,11 @@ package io.opentelemetry.javaagent.instrumentation.vaadin;
import com.vaadin.flow.server.communication.rpc.RpcInvocationHandler;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.context.ContextKey;
import io.opentelemetry.instrumentation.api.config.ExperimentalConfig;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeSpanNameExtractor;
import io.opentelemetry.instrumentation.api.util.SpanNames;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
public class VaadinSingletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.vaadin-14.2";

View File

@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.vertx.kafka.v3_6;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.kafka.internal.KafkaInstrumenterFactory;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
@ -27,7 +28,9 @@ public final class VertxKafkaSingletons {
.getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false))
.setPropagationEnabled(
InstrumentationConfig.get()
.getBoolean("otel.instrumentation.kafka.client-propagation.enabled", true));
.getBoolean("otel.instrumentation.kafka.client-propagation.enabled", true))
.setMessagingReceiveInstrumentationEnabled(
ExperimentalConfig.get().messagingReceiveInstrumentationEnabled());
BATCH_PROCESS_INSTRUMENTER = factory.createBatchProcessInstrumenter();
PROCESS_INSTRUMENTER = factory.createConsumerProcessInstrumenter();
}

View File

@ -3,25 +3,23 @@
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.api.internal;
package io.opentelemetry.javaagent.bootstrap.internal;
import static java.util.logging.Level.WARNING;
import io.opentelemetry.instrumentation.api.config.Config;
import java.util.logging.Logger;
/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
// TODO: move to javaagent-extension-api internal package
public final class DeprecatedConfigPropertyWarning {
private static final Logger logger =
Logger.getLogger(DeprecatedConfigPropertyWarning.class.getName());
public static void warnIfUsed(
Config config, String deprecatedPropertyName, String newPropertyName) {
InstrumentationConfig config, String deprecatedPropertyName, String newPropertyName) {
if (config.getString(deprecatedPropertyName) != null) {
logger.log(
WARNING,

View File

@ -3,23 +3,25 @@
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.api.config;
package io.opentelemetry.javaagent.bootstrap.internal;
import io.opentelemetry.instrumentation.api.internal.DeprecatedConfigPropertyWarning;
// TODO: move to javaagent-extension-api internal package
/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
public final class ExperimentalConfig {
private static final ExperimentalConfig instance = new ExperimentalConfig(Config.get());
private static final ExperimentalConfig instance =
new ExperimentalConfig(InstrumentationConfig.get());
private final Config config;
private final InstrumentationConfig config;
/** Returns the global agent configuration. */
public static ExperimentalConfig get() {
return instance;
}
public ExperimentalConfig(Config config) {
public ExperimentalConfig(InstrumentationConfig config) {
this.config = config;
}

View File

@ -208,7 +208,7 @@ include(":instrumentation:elasticsearch:elasticsearch-rest-common:javaagent")
include(":instrumentation:elasticsearch:elasticsearch-rest-5.0:javaagent")
include(":instrumentation:elasticsearch:elasticsearch-rest-6.4:javaagent")
include(":instrumentation:elasticsearch:elasticsearch-rest-7.0:javaagent")
include(":instrumentation:elasticsearch:elasticsearch-transport-common:library")
include(":instrumentation:elasticsearch:elasticsearch-transport-common:javaagent")
include(":instrumentation:elasticsearch:elasticsearch-transport-common:testing")
include(":instrumentation:elasticsearch:elasticsearch-transport-5.0:javaagent")
include(":instrumentation:elasticsearch:elasticsearch-transport-5.3:javaagent")
@ -273,7 +273,7 @@ include(":instrumentation:jaxws:jaxws-2.0-metro-2.2:javaagent")
include(":instrumentation:jaxws:jaxws-2.0-common-testing")
include(":instrumentation:jaxws:jaxws-2.0-tomee-testing")
include(":instrumentation:jaxws:jaxws-2.0-wildfly-testing")
include(":instrumentation:jaxws:jaxws-common:library")
include(":instrumentation:jaxws:jaxws-common:javaagent")
include(":instrumentation:jaxws:jaxws-jws-api-1.1:javaagent")
include(":instrumentation:jboss-logmanager:jboss-logmanager-appender-1.1:javaagent")
include(":instrumentation:jboss-logmanager:jboss-logmanager-mdc-1.1:javaagent")