Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.instrumentation.api.incubator.config.internal;

import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty;

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.incubator.ExtendedOpenTelemetry;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;

/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
public final class DeclarativeConfigUtil {

private DeclarativeConfigUtil() {}

public static ExtendedDeclarativeConfigProperties get(OpenTelemetry openTelemetry) {
DeclarativeConfigProperties javaConfig = empty();
if (openTelemetry instanceof ExtendedOpenTelemetry) {
ExtendedOpenTelemetry extendedOpenTelemetry = (ExtendedOpenTelemetry) openTelemetry;
DeclarativeConfigProperties instrumentationConfig =
extendedOpenTelemetry.getConfigProvider().getInstrumentationConfig();
if (instrumentationConfig != null) {
javaConfig = instrumentationConfig.getStructured("java", empty());
}
}
return new ExtendedDeclarativeConfigProperties(javaConfig);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.instrumentation.api.incubator.config.internal;

import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.common.ComponentLoader;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import javax.annotation.Nullable;

/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
public final class ExtendedDeclarativeConfigProperties implements DeclarativeConfigProperties {

private final DeclarativeConfigProperties delegate;

ExtendedDeclarativeConfigProperties(DeclarativeConfigProperties delegate) {
this.delegate = delegate;
}

@Nullable
@Override
public String getString(String name) {
return delegate.getString(name);
}

public Optional<Boolean> getBoolean(String... path) {
if (path.length == 0) {
return Optional.empty();
}
DeclarativeConfigProperties current = delegate;
for (int i = 0; i < path.length - 1; i++) {
current = current.getStructured(path[i]);
if (current == null) {
return Optional.empty();
}
}
return Optional.ofNullable(current.getBoolean(path[path.length - 1]));
}

public <T> Optional<List<T>> getScalarList(Class<T> scalarType, String... path) {
if (path.length == 0) {
return Optional.empty();
}
DeclarativeConfigProperties current = delegate;
for (int i = 0; i < path.length - 1; i++) {
current = current.getStructured(path[i]);
if (current == null) {
return Optional.empty();
}
}
return Optional.ofNullable(current.getScalarList(path[path.length - 1], scalarType));
}

@Nullable
@Override
public Boolean getBoolean(String name) {
return delegate.getBoolean(name);
}

@Nullable
@Override
public Integer getInt(String name) {
return delegate.getInt(name);
}

@Nullable
@Override
public Long getLong(String name) {
return delegate.getLong(name);
}

@Nullable
@Override
public Double getDouble(String name) {
return delegate.getDouble(name);
}

@Nullable
@Override
public <T> List<T> getScalarList(String name, Class<T> scalarType) {
return delegate.getScalarList(name, scalarType);
}

@Nullable
@Override
public DeclarativeConfigProperties getStructured(String name) {
return delegate.getStructured(name);
}

@Nullable
@Override
public List<DeclarativeConfigProperties> getStructuredList(String name) {
return delegate.getStructuredList(name);
}

@Override
public Set<String> getPropertyKeys() {
return delegate.getPropertyKeys();
}

@Override
public ComponentLoader getComponentLoader() {
return delegate.getComponentLoader();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
package io.opentelemetry.javaagent.instrumentation.jms.v1_1;

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
import io.opentelemetry.instrumentation.api.incubator.config.internal.ExtendedDeclarativeConfigProperties;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import io.opentelemetry.javaagent.instrumentation.jms.JmsInstrumenterFactory;
import io.opentelemetry.javaagent.instrumentation.jms.MessageWithDestination;
import java.util.Collections;

public final class JmsSingletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jms-1.1";
Expand All @@ -19,11 +21,18 @@ public final class JmsSingletons {
private static final Instrumenter<MessageWithDestination, Void> CONSUMER_PROCESS_INSTRUMENTER;

static {
ExtendedDeclarativeConfigProperties config =
DeclarativeConfigUtil.get(GlobalOpenTelemetry.get());
JmsInstrumenterFactory factory =
new JmsInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME)
.setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders())
.setCapturedHeaders(
config
.getScalarList(String.class, "messaging", "capture_headers/development")
.orElse(Collections.emptyList()))
.setMessagingReceiveInstrumentationEnabled(
ExperimentalConfig.get().messagingReceiveInstrumentationEnabled());
config
.getBoolean("messaging", "receive_telemetry/development", "enabled")
.orElse(false));

PRODUCER_INSTRUMENTER = factory.createProducerInstrumenter();
CONSUMER_RECEIVE_INSTRUMENTER = factory.createConsumerReceiveInstrumenter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
package io.opentelemetry.javaagent.instrumentation.jms.v3_0;

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
import io.opentelemetry.instrumentation.api.incubator.config.internal.ExtendedDeclarativeConfigProperties;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import io.opentelemetry.javaagent.instrumentation.jms.JmsInstrumenterFactory;
import io.opentelemetry.javaagent.instrumentation.jms.MessageWithDestination;
import java.util.Collections;

public final class JmsSingletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jms-3.0";
Expand All @@ -19,11 +21,18 @@ public final class JmsSingletons {
private static final Instrumenter<MessageWithDestination, Void> CONSUMER_PROCESS_INSTRUMENTER;

static {
ExtendedDeclarativeConfigProperties config =
DeclarativeConfigUtil.get(GlobalOpenTelemetry.get());
JmsInstrumenterFactory factory =
new JmsInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME)
.setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders())
.setCapturedHeaders(
config
.getScalarList(String.class, "messaging", "capture_headers/development")
.orElse(Collections.emptyList()))
.setMessagingReceiveInstrumentationEnabled(
ExperimentalConfig.get().messagingReceiveInstrumentationEnabled());
config
.getBoolean("messaging", "receive_telemetry/development", "enabled")
.orElse(false));

PRODUCER_INSTRUMENTER = factory.createProducerInstrumenter();
CONSUMER_RECEIVE_INSTRUMENTER = factory.createConsumerReceiveInstrumenter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,18 @@
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil;
import io.opentelemetry.instrumentation.api.internal.Timer;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import io.opentelemetry.javaagent.bootstrap.jms.JmsReceiveContextHolder;

public final class JmsReceiveSpanUtil {
private static final ContextPropagators propagators = GlobalOpenTelemetry.getPropagators();
private static final boolean receiveInstrumentationEnabled =
ExperimentalConfig.get().messagingReceiveInstrumentationEnabled();
DeclarativeConfigUtil.get(GlobalOpenTelemetry.get())
.getBoolean("messaging", "receive_telemetry/development", "enabled")
.orElse(false);

public static void createReceiveSpan(
Instrumenter<MessageWithDestination, Void> receiveInstrumenter,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,35 +6,43 @@
package io.opentelemetry.javaagent.instrumentation.kafkaclients.v0_11;

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
import io.opentelemetry.instrumentation.api.incubator.config.internal.ExtendedDeclarativeConfigProperties;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal.KafkaInstrumenterFactory;
import io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal.KafkaProcessRequest;
import io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal.KafkaProducerRequest;
import io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal.KafkaReceiveRequest;
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import java.util.Collections;
import org.apache.kafka.clients.producer.RecordMetadata;

public final class KafkaSingletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.kafka-clients-0.11";

private static final boolean PRODUCER_PROPAGATION_ENABLED =
AgentInstrumentationConfig.get()
.getBoolean("otel.instrumentation.kafka.producer-propagation.enabled", true);
DeclarativeConfigUtil.get(GlobalOpenTelemetry.get())
.getBoolean("kafka", "producer_propagation", "enabled")
.orElse(true);

private static final Instrumenter<KafkaProducerRequest, RecordMetadata> PRODUCER_INSTRUMENTER;
private static final Instrumenter<KafkaReceiveRequest, Void> CONSUMER_RECEIVE_INSTRUMENTER;
private static final Instrumenter<KafkaProcessRequest, Void> CONSUMER_PROCESS_INSTRUMENTER;

static {
ExtendedDeclarativeConfigProperties config =
DeclarativeConfigUtil.get(GlobalOpenTelemetry.get());
KafkaInstrumenterFactory instrumenterFactory =
new KafkaInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME)
.setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders())
.setCapturedHeaders(
config
.getScalarList(String.class, "messaging", "capture_headers/development")
.orElse(Collections.emptyList()))
.setCaptureExperimentalSpanAttributes(
AgentInstrumentationConfig.get()
.getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false))
config.getBoolean("kafka", "experimental_span_attributes").orElse(false))
.setMessagingReceiveInstrumentationEnabled(
ExperimentalConfig.get().messagingReceiveInstrumentationEnabled());
config
.getBoolean("messaging", "receive_telemetry/development", "enabled")
.orElse(false));
PRODUCER_INSTRUMENTER = instrumenterFactory.createProducerInstrumenter();
CONSUMER_RECEIVE_INSTRUMENTER = instrumenterFactory.createConsumerReceiveInstrumenter();
CONSUMER_PROCESS_INSTRUMENTER = instrumenterFactory.createConsumerProcessInstrumenter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,36 @@
package io.opentelemetry.javaagent.instrumentation.kafkastreams;

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
import io.opentelemetry.instrumentation.api.incubator.config.internal.ExtendedDeclarativeConfigProperties;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal.KafkaInstrumenterFactory;
import io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal.KafkaProcessRequest;
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import java.util.Collections;

public final class KafkaStreamsSingletons {

private static final String INSTRUMENTATION_NAME = "io.opentelemetry.kafka-streams-0.11";

private static final Instrumenter<KafkaProcessRequest, Void> INSTRUMENTER =
new KafkaInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME)
.setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders())
.setCaptureExperimentalSpanAttributes(
AgentInstrumentationConfig.get()
.getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false))
.setMessagingReceiveInstrumentationEnabled(
ExperimentalConfig.get().messagingReceiveInstrumentationEnabled())
.createConsumerProcessInstrumenter();
private static final Instrumenter<KafkaProcessRequest, Void> INSTRUMENTER;

static {
ExtendedDeclarativeConfigProperties config =
DeclarativeConfigUtil.get(GlobalOpenTelemetry.get());
INSTRUMENTER =
new KafkaInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME)
.setCapturedHeaders(
config
.getScalarList(String.class, "messaging", "capture_headers/development")
.orElse(Collections.emptyList()))
.setCaptureExperimentalSpanAttributes(
config.getBoolean("kafka", "experimental_span_attributes").orElse(false))
.setMessagingReceiveInstrumentationEnabled(
config
.getBoolean("messaging", "receive_telemetry/development", "enabled")
.orElse(false))
.createConsumerProcessInstrumenter();
}

public static Instrumenter<KafkaProcessRequest, Void> instrumenter() {
return INSTRUMENTER;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,18 @@
import static io.opentelemetry.instrumentation.nats.v2_17.internal.NatsInstrumenterFactory.createProducerInstrumenter;

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.nats.v2_17.internal.NatsRequest;
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
import java.util.Collections;
import java.util.List;

public final class NatsSingletons {

private static final List<String> capturedHeaders =
ExperimentalConfig.get().getMessagingHeaders();
DeclarativeConfigUtil.get(GlobalOpenTelemetry.get())
.getScalarList(String.class, "messaging", "capture_headers/development")
.orElse(Collections.emptyList());

public static final Instrumenter<NatsRequest, NatsRequest> PRODUCER_INSTRUMENTER =
createProducerInstrumenter(GlobalOpenTelemetry.get(), capturedHeaders);
Expand Down
Loading