diff --git a/MAPPING.md b/MAPPING.md new file mode 100644 index 000000000000..735ef6cb8730 --- /dev/null +++ b/MAPPING.md @@ -0,0 +1,113 @@ +# Declarative Config to System Property Mapping + +This table documents the conversion from system properties (upstream/main) to declarative config paths (HEAD). + +| Declarative Config Path (HEAD) | System Property (upstream/main) | +| ------------------------------- | -------------------------------- | +| `general`, `db`, `statement_sanitizer`, `enabled` | `otel.instrumentation.common.db-statement-sanitizer.enabled` | +| `general`, `http`, `client`, `emit_experimental_telemetry` | `otel.instrumentation.http.client.emit-experimental-telemetry` | +| `general`, `http`, `client`, `redact_query_parameters/development` | `otel.instrumentation.http.client.experimental.redact-query-parameters` | +| `general`, `http`, `client`, `request_captured_headers` | `otel.instrumentation.http.client.capture-request-headers` | +| `general`, `http`, `client`, `response_captured_headers` | `otel.instrumentation.http.client.capture-response-headers` | +| `general`, `http`, `known_methods` | `otel.instrumentation.http.known-methods` | +| `general`, `http`, `server`, `emit_experimental_telemetry` | `otel.instrumentation.http.server.emit-experimental-telemetry` | +| `general`, `http`, `server`, `request_captured_headers` | `otel.instrumentation.http.server.capture-request-headers` | +| `general`, `http`, `server`, `response_captured_headers` | `otel.instrumentation.http.server.capture-response-headers` | +| `general`, `peer`, `service_mapping` | `otel.instrumentation.common.peer-service-mapping` | +| `java`, `agent`, `indy/development` | `otel.javaagent.experimental.indy` | +| `java`, `apache_elasticjob`, `experimental_span_attributes` | `otel.instrumentation.apache-elasticjob.experimental-span-attributes` | +| `java`, `aws_lambda`, `flush_timeout` | `otel.instrumentation.aws-lambda.flush-timeout` | +| `java`, `common`, `controller_telemetry/development`, `enabled` | `otel.instrumentation.common.experimental.controller-telemetry.enabled` | +| `java`, `common`, `db`, `sqlcommenter/development` | `otel.instrumentation.common.experimental.db-sqlcommenter.enabled` | +| `java`, `common`, `db`, `statement_sanitizer`, `enabled` | `otel.instrumentation.common.db-statement-sanitizer.enabled` | +| `java`, `common`, `default_enabled` | `otel.instrumentation.common.default-enabled` | +| `java`, `common`, `enduser`, `id`, `enabled` | `otel.instrumentation.common.enduser.id.enabled` | +| `java`, `common`, `enduser`, `role`, `enabled` | `otel.instrumentation.common.enduser.role.enabled` | +| `java`, `common`, `enduser`, `scope`, `enabled` | `otel.instrumentation.common.enduser.scope.enabled` | +| `java`, `common`, `logging`, `span_id` | `otel.instrumentation.common.logging.span-id` | +| `java`, `common`, `logging`, `trace_flags` | `otel.instrumentation.common.logging.trace-flags` | +| `java`, `common`, `logging`, `trace_id` | `otel.instrumentation.common.logging.trace-id` | +| `java`, `common`, `view_telemetry/development`, `enabled` | `otel.instrumentation.common.experimental.view-telemetry.enabled` | +| `java`, `elasticsearch`, `capture_search_query` | `otel.instrumentation.elasticsearch.capture-search-query` | +| `java`, `executors`, `include` | `otel.instrumentation.executors.include` | +| `java`, `executors`, `include_all` | `otel.instrumentation.executors.include-all` | +| `java`, `external_annotations`, `exclude_methods` | `otel.instrumentation.external-annotations.exclude-methods` | +| `java`, `external_annotations`, `include` | `otel.instrumentation.external-annotations.include` | +| `java`, `genai`, `capture_message_content` | `otel.instrumentation.genai.capture-message-content` | +| `java`, `graphql`, `add_operation_name_to_span_name`, `enabled` | `otel.instrumentation.graphql.add-operation-name-to-span-name.enabled` | +| `java`, `graphql`, `capture_query` | `otel.instrumentation.graphql.capture-query` | +| `java`, `graphql`, `query_sanitizer`, `enabled` | `otel.instrumentation.graphql.query-sanitizer.enabled` | +| `java`, `grpc`, `capture_metadata`, `client`, `request` | `otel.instrumentation.grpc.capture-metadata.client.request` | +| `java`, `grpc`, `capture_metadata`, `server`, `request` | `otel.instrumentation.grpc.capture-metadata.server.request` | +| `java`, `grpc`, `emit_message_events` | `otel.instrumentation.grpc.emit-message-events` | +| `java`, `grpc`, `experimental_span_attributes` | `otel.instrumentation.grpc.experimental-span-attributes` | +| `java`, `guava`, `experimental_span_attributes` | `otel.instrumentation.guava.experimental-span-attributes` | +| `java`, `hibernate`, `experimental_span_attributes` | `otel.instrumentation.hibernate.experimental-span-attributes` | +| `java`, `http`, `client`, `emit_experimental_telemetry` | `otel.instrumentation.http.client.emit-experimental-telemetry` | +| `java`, `http`, `client`, `emit_experimental_telemetry` | `otel.instrumentation.http.client.emit-experimental-telemetry` | +| `java`, `http`, `known_methods` | `otel.instrumentation.http.known-methods` | +| `java`, `hystrix`, `experimental_span_attributes` | `otel.instrumentation.hystrix.experimental-span-attributes` | +| `java`, `jaxrs`, `experimental_span_attributes` | `otel.instrumentation.jaxrs.experimental-span-attributes` | +| `java`, `jdbc`, `datasource`, `enabled` | `otel.instrumentation.jdbc.datasource.enabled` | +| `java`, `jdbc`, `experimental`, `capture_query_parameters` | `otel.instrumentation.jdbc.experimental.capture-query-parameters` | +| `java`, `jdbc`, `experimental`, `sqlcommenter`, `enabled` | `otel.instrumentation.jdbc.experimental.sqlcommenter.enabled` | +| `java`, `jdbc`, `experimental`, `transaction`, `enabled` | `otel.instrumentation.jdbc.experimental.transaction.enabled` | +| `java`, `jdbc`, `sqlcommenter`, `enabled` | `otel.instrumentation.jdbc.experimental.sqlcommenter.enabled` | +| `java`, `jdbc`, `statement_sanitizer`, `enabled` | `otel.instrumentation.jdbc.statement-sanitizer.enabled` | +| `java`, `jdbc`, `transaction`, `enabled` | `otel.instrumentation.jdbc.experimental.transaction.enabled` | +| `java`, `jmx`, `config` | `otel.jmx.config` | +| `java`, `jmx`, `discovery_delay` | `otel.jmx.discovery.delay` | +| `java`, `jmx`, `enabled` | `otel.jmx.enabled` | +| `java`, `jmx`, `target_system` | `otel.jmx.target.system` | +| `java`, `kafka`, `experimental_span_attributes` | `otel.instrumentation.kafka.experimental-span-attributes` | +| `java`, `kafka`, `producer_propagation`, `enabled` | `otel.instrumentation.kafka.producer-propagation.enabled` | +| `java`, `log4j-appender`, `experimental`, `capture_code_attributes` | `otel.instrumentation.log4j-appender.experimental.capture-code-attributes` | +| `java`, `log4j-appender`, `experimental`, `capture_event_name` | `otel.instrumentation.log4j-appender.experimental.capture-event-name` | +| `java`, `log4j-appender`, `experimental`, `capture_map_message_attributes` | `otel.instrumentation.log4j-appender.experimental.capture-map-message-attributes` | +| `java`, `log4j-appender`, `experimental`, `capture_marker_attribute` | `otel.instrumentation.log4j-appender.experimental.capture-marker-attribute` | +| `java`, `log4j-appender`, `experimental`, `capture_mdc_attributes` | `otel.instrumentation.log4j-appender.experimental.capture-mdc-attributes` | +| `java`, `log4j_appender`, `experimental_log_attributes` | `otel.instrumentation.log4j-appender.experimental-log-attributes` | +| `java`, `logback_appender`, `experimental`, `capture_arguments` | `otel.instrumentation.logback-appender.experimental.capture-arguments` | +| `java`, `logback_appender`, `experimental`, `capture_code_attributes` | `otel.instrumentation.logback-appender.experimental.capture-code-attributes` | +| `java`, `logback_appender`, `experimental`, `capture_event_name` | `otel.instrumentation.logback-appender.experimental.capture-event-name` | +| `java`, `logback_appender`, `experimental`, `capture_key_value_pair_attributes` | `otel.instrumentation.logback-appender.experimental.capture-key-value-pair-attributes` | +| `java`, `logback_appender`, `experimental`, `capture_logger_context_attributes` | `otel.instrumentation.logback-appender.experimental.capture-logger-context-attributes` | +| `java`, `logback_appender`, `experimental`, `capture_logstash_marker_attributes` | `otel.instrumentation.logback-appender.experimental.capture-logstash-marker-attributes` | +| `java`, `logback_appender`, `experimental`, `capture_logstash_structured_arguments` | `otel.instrumentation.logback-appender.experimental.capture-logstash-structured-arguments` | +| `java`, `logback_appender`, `experimental`, `capture_marker_attribute` | `otel.instrumentation.logback-appender.experimental.capture-marker-attribute` | +| `java`, `logback_appender`, `experimental`, `capture_mdc_attributes` | `otel.instrumentation.logback-appender.experimental.capture-mdc-attributes` | +| `java`, `logback_appender`, `experimental`, `capture_template` | `otel.instrumentation.logback-appender.experimental.capture-template` | +| `java`, `logback_appender`, `experimental_log_attributes` | `otel.instrumentation.logback-appender.experimental-log-attributes` | +| `java`, `logback_mdc`, `add_baggage` | `otel.instrumentation.logback-mdc.add-baggage` | +| `java`, `messaging`, `capture_headers/development` | `otel.instrumentation.messaging.experimental.capture-headers` | +| `java`, `messaging`, `receive_telemetry/development`, `enabled` | `otel.instrumentation.messaging.experimental.receive-telemetry.enabled` | +| `java`, `methods`, `include` | `otel.instrumentation.methods.include` | +| `java`, `micrometer`, `base_time_unit` | `otel.instrumentation.micrometer.base-time-unit` | +| `java`, `micrometer`, `histogram_gauges`, `enabled` | `otel.instrumentation.micrometer.histogram-gauges.enabled` | +| `java`, `micrometer`, `prometheus_mode`, `enabled` | `otel.instrumentation.micrometer.prometheus-mode.enabled` | +| `java`, `mongo`, `statement_sanitizer`, `enabled` | `otel.instrumentation.mongo.statement-sanitizer.enabled` | +| `java`, `netty`, `connection_telemetry`, `enabled` | `otel.instrumentation.netty.connection-telemetry.enabled` | +| `java`, `netty`, `ssl_telemetry`, `enabled` | `otel.instrumentation.netty.ssl-telemetry.enabled` | +| `java`, `opentelemetry-instrumentation-annotations`, `exclude_methods` | `otel.instrumentation.opentelemetry-instrumentation-annotations.exclude-methods` | +| `java`, `oshi`, `enabled` | `otel.instrumentation.oshi.enabled` | +| `java`, `powerjob`, `experimental_span_attributes` | `otel.instrumentation.powerjob.experimental-span-attributes` | +| `java`, `pulsar`, `experimental_span_attributes` | `otel.instrumentation.pulsar.experimental-span-attributes` | +| `java`, `quartz`, `experimental_span_attributes` | `otel.instrumentation.quartz.experimental-span-attributes` | +| `java`, `r2dbc`, `experimental`, `sqlcommenter`, `enabled` | `otel.instrumentation.r2dbc.experimental.sqlcommenter.enabled` | +| `java`, `r2dbc`, `statement_sanitizer`, `enabled` | `otel.instrumentation.r2dbc.statement-sanitizer.enabled` | +| `java`, `rabbitmq`, `experimental_span_attributes` | `otel.instrumentation.rabbitmq.experimental-span-attributes` | +| `java`, `reactor`, `experimental_span_attributes` | `otel.instrumentation.reactor.experimental-span-attributes` | +| `java`, `runtime_telemetry`, `capture_gc_cause` | `otel.instrumentation.runtime-telemetry.capture-gc-cause` | +| `java`, `runtime_telemetry`, `emit_experimental_telemetry` | `otel.instrumentation.runtime-telemetry.emit-experimental-telemetry` | +| `java`, `runtime_telemetry`, `enabled` | `otel.instrumentation.runtime-telemetry.enabled` | +| `java`, `rxjava`, `experimental_span_attributes` | `otel.instrumentation.rxjava.experimental-span-attributes` | +| `java`, `servlet`, `experimental`, `add_trace_id_request_attribute` | `otel.instrumentation.servlet.experimental.add-trace-id-request-attribute` | +| `java`, `servlet`, `experimental`, `capture_request_parameters` | `otel.instrumentation.servlet.experimental.capture-request-parameters` | +| `java`, `spring_batch`, `chunk/development`, `new_trace` | `otel.instrumentation.spring-batch.experimental.chunk.new-trace` | +| `java`, `spring_batch`, `item`, `enabled` | `otel.instrumentation.spring-batch.item.enabled` | +| `java`, `spring_scheduling`, `experimental_span_attributes` | `otel.instrumentation.spring-scheduling.experimental-span-attributes` | +| `java`, `spring_security`, `enduser`, `role`, `granted_authority_prefix` | `otel.instrumentation.spring-security.enduser.role.granted-authority-prefix` | +| `java`, `spring_security`, `enduser`, `scope`, `granted_authority_prefix` | `otel.instrumentation.spring-security.enduser.scope.granted-authority-prefix` | +| `java`, `spymemcached`, `experimental_span_attributes` | `otel.instrumentation.spymemcached.experimental-span-attributes` | +| `java`, `twilio`, `experimental_span_attributes` | `otel.instrumentation.twilio.experimental-span-attributes` | +| `java`, `xxl_job`, `experimental_span_attributes` | `otel.instrumentation.xxl-job.experimental-span-attributes` | diff --git a/declarative-config-bridge/README.md b/declarative-config-bridge/README.md index f54964e1605a..a4b40bc30242 100644 --- a/declarative-config-bridge/README.md +++ b/declarative-config-bridge/README.md @@ -1,84 +1,9 @@ # Declarative Config Bridge -Declarative Config Bridge allows instrumentation authors to access configuration in a uniform way, -regardless of the configuration source. +This module provides utilities for bridging between declarative configuration (YAML-based) and +the traditional `ConfigProperties` interface. -The bridge allows you to read configuration using the system property style when dealing with -declarative configuration. +The main classes are: -## Example - -As an example, let's look at the inferred spans configuration. -First, there is a configuration method that reads the properties and is unaware of the source of the -configuration: - -```java -class InferredSpansConfig { - static SpanProcessor create(ConfigProperties properties) { - // read properties here - boolean backupDiagnosticFiles = - properties.getBoolean("otel.inferred.spans.backup.diagnostic.files", false); - } -} -``` - -The auto configuration **without declarative config** passes the provided properties directly: - -```java - -@AutoService(AutoConfigurationCustomizerProvider.class) -public class InferredSpansAutoConfig implements AutoConfigurationCustomizerProvider { - - @Override - public void customize(AutoConfigurationCustomizer config) { - config.addTracerProviderCustomizer( - (providerBuilder, properties) -> { - providerBuilder.addSpanProcessor(InferredSpansConfig.create(properties)); - return providerBuilder; - }); - } -} -``` - -The auto configuration **with declarative config** uses the Declarative Config Bridge to be able to -use common configuration method: - -Let's first look at the yaml file that is used to configure the inferred spans processor: - -```yaml -file_format: 1.0-rc.1 -tracer_provider: - processors: - - inferred_spans: - backup: - diagnostic: - files: true -``` - -And now the component provider that uses the Declarative Config Bridge: - -```java - -@AutoService(ComponentProvider.class) -public class InferredSpansComponentProvider implements ComponentProvider { - - @Override - public String getName() { - return "inferred_spans"; - } - - @Override - public SpanProcessor create(DeclarativeConfigProperties config) { - return InferredSpansConfig.create( - new DeclarativeConfigPropertiesBridgeBuilder() - // crop the prefix, because the properties are under the "inferred_spans" processor - .addMapping("otel.inferred.spans.", "") - .build(config)); - } - - @Override - public Class getType() { - return SpanProcessor.class; - } -} -``` +- `ConfigPropertiesBackedConfigProvider`: Creates a `ConfigProvider` backed by `ConfigProperties` +- `ConfigPropertiesBackedDeclarativeConfigProperties`: Adapts `ConfigProperties` to `DeclarativeConfigProperties` diff --git a/declarative-config-bridge/build.gradle.kts b/declarative-config-bridge/build.gradle.kts index b5ac9ec9c1c3..c23668de1e4d 100644 --- a/declarative-config-bridge/build.gradle.kts +++ b/declarative-config-bridge/build.gradle.kts @@ -7,13 +7,9 @@ plugins { group = "io.opentelemetry.instrumentation" dependencies { - compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") implementation("io.opentelemetry:opentelemetry-api-incubator") - testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator") - testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") - compileOnly("com.google.code.findbugs:annotations") testCompileOnly("com.google.code.findbugs:annotations") } diff --git a/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedConfigProvider.java b/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedConfigProvider.java new file mode 100644 index 000000000000..8358057bb3d8 --- /dev/null +++ b/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedConfigProvider.java @@ -0,0 +1,48 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.config.bridge; + +import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import javax.annotation.Nullable; + +/** + * A {@link ConfigProvider} implementation backed by {@link ConfigProperties}. + * + *

This is used when the user configured with system properties (not YAML), so we create a + * ConfigProvider that provides access to the configuration through the declarative config API. + * + *

This allows instrumentations to always use {@code ExtendedOpenTelemetry.getConfigProvider()} + * regardless of whether the user started with system properties or YAML. + */ +public final class ConfigPropertiesBackedConfigProvider implements ConfigProvider { + + private final DeclarativeConfigProperties instrumentationConfig; + + /** + * Creates a ConfigProvider backed by the given ConfigProperties. + * + * @param configProperties the ConfigProperties from SDK autoconfiguration + * @return a new ConfigProvider instance + */ + public static ConfigProvider create(ConfigProperties configProperties) { + return new ConfigPropertiesBackedConfigProvider(configProperties); + } + + private ConfigPropertiesBackedConfigProvider(ConfigProperties configProperties) { + // The instrumentation config is rooted at "otel.instrumentation." + this.instrumentationConfig = + ConfigPropertiesBackedDeclarativeConfigProperties.createInstrumentationConfig( + configProperties); + } + + @Nullable + @Override + public DeclarativeConfigProperties getInstrumentationConfig() { + return instrumentationConfig; + } +} diff --git a/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedDeclarativeConfigProperties.java b/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedDeclarativeConfigProperties.java new file mode 100644 index 000000000000..1d8301e80893 --- /dev/null +++ b/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedDeclarativeConfigProperties.java @@ -0,0 +1,374 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.config.bridge; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.common.ComponentLoader; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nullable; + +/** + * Implementation of {@link DeclarativeConfigProperties} backed by {@link ConfigProperties}. + * + *

This allows instrumentations to use the declarative config API even when the user configured + * with system properties (not YAML). It uses a dynamic bridge approach that tracks the navigation + * path and only resolves to system properties at the leaf node when a value is actually requested. + */ +public final class ConfigPropertiesBackedDeclarativeConfigProperties + implements DeclarativeConfigProperties { + + private final ConfigProperties configProperties; + private final List path; + + /** + * Structured list mapping definition. Maps a declarative config path to a system property key and + * defines how to convert each map entry to DeclarativeConfigProperties field names. + */ + private static final class StructuredListMapping { + final String systemPropertyKey; + final String keyFieldName; + final String valueFieldName; + + StructuredListMapping(String systemPropertyKey, String keyFieldName, String valueFieldName) { + this.systemPropertyKey = systemPropertyKey; + this.keyFieldName = keyFieldName; + this.valueFieldName = valueFieldName; + } + } + + // Mapping from declarative config paths to system property keys + // Path format: "segment1.segment2.propertyName" (excludes "java" segment) + private static final Map PROPERTY_MAPPINGS; + private static final Map LIST_MAPPINGS; + private static final Map STRUCTURED_LIST_MAPPINGS; + + static { + PROPERTY_MAPPINGS = new HashMap<>(); + + LIST_MAPPINGS = new HashMap<>(); + LIST_MAPPINGS.put( + "general.http.client.request_captured_headers", + "otel.instrumentation.http.client.capture-request-headers"); + LIST_MAPPINGS.put( + "general.http.client.response_captured_headers", + "otel.instrumentation.http.client.capture-response-headers"); + LIST_MAPPINGS.put( + "general.http.server.request_captured_headers", + "otel.instrumentation.http.server.capture-request-headers"); + LIST_MAPPINGS.put( + "general.http.server.response_captured_headers", + "otel.instrumentation.http.server.capture-response-headers"); + + STRUCTURED_LIST_MAPPINGS = new HashMap<>(); + STRUCTURED_LIST_MAPPINGS.put( + "general.peer.service_mapping", + new StructuredListMapping( + "otel.instrumentation.common.peer-service-mapping", "peer", "service")); + } + + /** + * Creates a root DeclarativeConfigProperties instance backed by ConfigProperties. + * + * @param configProperties the ConfigProperties to read from + * @return a new DeclarativeConfigProperties instance + */ + public static DeclarativeConfigProperties createInstrumentationConfig( + ConfigProperties configProperties) { + return new ConfigPropertiesBackedDeclarativeConfigProperties( + configProperties, Collections.emptyList()); + } + + private ConfigPropertiesBackedDeclarativeConfigProperties( + ConfigProperties configProperties, List path) { + this.configProperties = configProperties; + this.path = path; + } + + private String currentPath() { + return String.join(".", path); + } + + private String pathWithName(String name) { + if (path.isEmpty()) { + return name; + } + return currentPath() + "." + name; + } + + /** + * Converts a declarative config path to a system property key. + * + *

The declarative config path (e.g., "common.enabled") is converted to a system property key + * (e.g., "otel.instrumentation.common.enabled") by: + * + *

    + *
  1. Checking explicit mappings first + *
  2. Falling back to standard conversion: prefix + kebab-case path + *
+ * + *

Special handling for "javaagent" prefix: paths starting with "javaagent." are mapped to + * "otel.javaagent." instead of "otel.instrumentation.javaagent.". + */ + private static String toPropertyKey(String fullPath) { + // Check explicit mappings first + String mapped = PROPERTY_MAPPINGS.get(fullPath); + if (mapped != null) { + return mapped; + } + + String translatedPath = translatePath(fullPath); + + // Handle agent prefix specially: java.agent.* → otel.javaagent.* + if (translatedPath.startsWith("agent.")) { + return "otel.java" + translatedPath; + } + + // Handle jmx prefix specially: java.jmx.* → otel.jmx.* + if (translatedPath.startsWith("jmx.")) { + return "otel." + translatedPath; + } + + // Standard conversion: otel.instrumentation. + kebab-case path + return "otel.instrumentation." + translatedPath; + } + + /** + * Translates a declarative config path to a system property path segment. + * + *

Handles: + * + *

+ */ + private static String translatePath(String path) { + StringBuilder result = new StringBuilder(); + String[] segments = path.split("\\."); + boolean first = true; + for (String segment : segments) { + // Skip "java" segment - it doesn't exist in system properties + if ("java".equals(segment)) { + continue; + } + if (!first) { + result.append("."); + } + first = false; + result.append(translateName(segment)); + } + return result.toString(); + } + + /** + * Translates a single declarative config name segment to system property format. + * + *

Handles the "/development" suffix convention used for experimental properties in declarative + * config, translating it to the "experimental." prefix used in flat properties. + */ + private static String translateName(String name) { + // Handle /development suffix → experimental. prefix + // e.g., "controller_telemetry/development" → "experimental.controller-telemetry" + if (name.endsWith("/development")) { + return "experimental." + + name.substring(0, name.length() - "/development".length()).replace('_', '-'); + } + // Convert snake_case to kebab-case (the convention for flat properties) + return name.replace('_', '-'); + } + + @Nullable + @Override + public String getString(String name) { + String fullPath = pathWithName(name); + return configProperties.getString(toPropertyKey(fullPath)); + } + + @Nullable + @Override + public Boolean getBoolean(String name) { + String fullPath = pathWithName(name); + return configProperties.getBoolean(toPropertyKey(fullPath)); + } + + @Nullable + @Override + public Integer getInt(String name) { + String fullPath = pathWithName(name); + return configProperties.getInt(toPropertyKey(fullPath)); + } + + @Nullable + @Override + public Long getLong(String name) { + String fullPath = pathWithName(name); + return configProperties.getLong(toPropertyKey(fullPath)); + } + + @Nullable + @Override + public Double getDouble(String name) { + String fullPath = pathWithName(name); + return configProperties.getDouble(toPropertyKey(fullPath)); + } + + @Override + public DeclarativeConfigProperties getStructured(String name) { + // Extend the path and return a new instance + List newPath = new ArrayList<>(path); + newPath.add(name); + return new ConfigPropertiesBackedDeclarativeConfigProperties(configProperties, newPath); + } + + @Nullable + @Override + // Safe cast: we verified scalarType == String.class before casting + @SuppressWarnings("unchecked") + public List getScalarList(String name, Class scalarType) { + if (scalarType != String.class) { + return null; + } + String fullPath = pathWithName(name); + + // Check explicit list mappings first + String mappedKey = LIST_MAPPINGS.get(fullPath); + if (mappedKey != null) { + List list = configProperties.getList(mappedKey); + if (!list.isEmpty()) { + return (List) list; + } + return null; + } + + // Fall back to standard property key + List list = configProperties.getList(toPropertyKey(fullPath)); + if (list.isEmpty()) { + return null; + } + return (List) list; + } + + @Nullable + @Override + public List getStructuredList(String name) { + String fullPath = pathWithName(name); + + // Check explicit structured list mappings + StructuredListMapping mapping = STRUCTURED_LIST_MAPPINGS.get(fullPath); + if (mapping != null) { + Map map = configProperties.getMap(mapping.systemPropertyKey); + if (map.isEmpty()) { + return null; + } + List result = new ArrayList<>(); + for (Map.Entry entry : map.entrySet()) { + Map fields = new HashMap<>(); + fields.put(mapping.keyFieldName, entry.getKey()); + fields.put(mapping.valueFieldName, entry.getValue()); + result.add(new MapBackedDeclarativeConfig(fields)); + } + return result; + } + + // Not supported for other paths when backed by flat properties + return null; + } + + @Override + public Set getPropertyKeys() { + // Would need to scan all ConfigProperties keys with this prefix + // and extract immediate child names - not easily supported + return Collections.emptySet(); + } + + @Override + public ComponentLoader getComponentLoader() { + // ComponentLoader is used during SDK setup to load SPI components. + // When using system properties (not YAML), component loading happens through + // ServiceLoader instead of declarative config, so this method is not expected + // to be called from instrumentation code. + throw new UnsupportedOperationException( + "ComponentLoader is not available when using system property configuration. " + + "This method is only used during SDK setup with YAML configuration."); + } + + /** + * Generic map-backed DeclarativeConfigProperties for structured list entries. + * + *

This allows any key-value structure to be represented without hardcoding field names. + */ + private static final class MapBackedDeclarativeConfig implements DeclarativeConfigProperties { + private final Map fields; + + MapBackedDeclarativeConfig(Map fields) { + this.fields = fields; + } + + @Nullable + @Override + public String getString(String name) { + return fields.get(name); + } + + @Nullable + @Override + public Boolean getBoolean(String name) { + return null; + } + + @Nullable + @Override + public Integer getInt(String name) { + return null; + } + + @Nullable + @Override + public Long getLong(String name) { + return null; + } + + @Nullable + @Override + public Double getDouble(String name) { + return null; + } + + @Override + public DeclarativeConfigProperties getStructured(String name) { + return DeclarativeConfigProperties.empty(); + } + + @Nullable + @Override + public List getScalarList(String name, Class scalarType) { + return null; + } + + @Nullable + @Override + public List getStructuredList(String name) { + return null; + } + + @Override + public Set getPropertyKeys() { + return fields.keySet(); + } + + @Override + public ComponentLoader getComponentLoader() { + throw new UnsupportedOperationException(); + } + } +} diff --git a/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesUtil.java b/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesUtil.java deleted file mode 100644 index cc7fb351ea3c..000000000000 --- a/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesUtil.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.config.bridge; - -public final class ConfigPropertiesUtil { - private ConfigPropertiesUtil() {} - - public static String propertyYamlPath(String propertyName) { - return yamlPath(propertyName); - } - - static String yamlPath(String property) { - String[] segments = DeclarativeConfigPropertiesBridge.getSegments(property); - if (segments.length == 0) { - throw new IllegalArgumentException("Invalid property: " + property); - } - - return "'instrumentation/development' / 'java' / '" + String.join("' / '", segments) + "'"; - } -} diff --git a/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesUtilTest.java b/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesUtilTest.java deleted file mode 100644 index db62912fd572..000000000000 --- a/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesUtilTest.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.config.bridge; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.jupiter.api.Test; - -class ConfigPropertiesUtilTest { - @Test - void propertyYamlPath() { - assertThat(ConfigPropertiesUtil.propertyYamlPath("google.otel.auth.target.signals")) - .isEqualTo( - "'instrumentation/development' / 'java' / 'google' / 'otel' / 'auth' / 'target' / 'signals'"); - } -} diff --git a/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridgeBuilderTest.java b/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridgeBuilderTest.java deleted file mode 100644 index d3058e0b888f..000000000000 --- a/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridgeBuilderTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.config.bridge; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import io.opentelemetry.api.incubator.config.ConfigProvider; -import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; -import org.mockito.Mockito; - -@SuppressWarnings("DoNotMockAutoValue") -class DeclarativeConfigPropertiesBridgeBuilderTest { - @Test - void shouldUseConfigPropertiesForAutoConfiguration() { - ConfigProperties configPropertiesMock = mock(ConfigProperties.class); - AutoConfiguredOpenTelemetrySdk sdkMock = mock(AutoConfiguredOpenTelemetrySdk.class); - try (MockedStatic autoConfigureUtilMock = - Mockito.mockStatic(AutoConfigureUtil.class)) { - autoConfigureUtilMock - .when(() -> AutoConfigureUtil.getConfig(sdkMock)) - .thenReturn(configPropertiesMock); - - ConfigProperties configProperties = - new DeclarativeConfigPropertiesBridgeBuilder().build(sdkMock); - - assertThat(configProperties).isSameAs(configPropertiesMock); - } - } - - @Test - void shouldUseConfigProviderForDeclarativeConfiguration() { - String propertyName = "testProperty"; - String expectedValue = "the value"; - DeclarativeConfigProperties javaNodeMock = mock(DeclarativeConfigProperties.class); - when(javaNodeMock.getString(propertyName)).thenReturn(expectedValue); - - DeclarativeConfigProperties instrumentationConfigMock = mock(DeclarativeConfigProperties.class); - when(instrumentationConfigMock.getStructured(eq("java"))).thenReturn(javaNodeMock); - - ConfigProvider configProviderMock = mock(ConfigProvider.class); - when(configProviderMock.getInstrumentationConfig()).thenReturn(instrumentationConfigMock); - - AutoConfiguredOpenTelemetrySdk sdkMock = mock(AutoConfiguredOpenTelemetrySdk.class); - - try (MockedStatic autoConfigureUtilMock = - Mockito.mockStatic(AutoConfigureUtil.class)) { - autoConfigureUtilMock.when(() -> AutoConfigureUtil.getConfig(sdkMock)).thenReturn(null); - autoConfigureUtilMock - .when(() -> AutoConfigureUtil.getConfigProvider(sdkMock)) - .thenReturn(configProviderMock); - - ConfigProperties configProperties = - new DeclarativeConfigPropertiesBridgeBuilder().build(sdkMock); - - assertThat(configProperties.getString(propertyName)).isEqualTo(expectedValue); - } - } - - @Test - void shouldUseConfigProviderForDeclarativeConfiguration_noInstrumentationConfig() { - AutoConfiguredOpenTelemetrySdk sdkMock = mock(AutoConfiguredOpenTelemetrySdk.class); - ConfigProvider configProviderMock = mock(ConfigProvider.class); - when(configProviderMock.getInstrumentationConfig()).thenReturn(null); - - try (MockedStatic autoConfigureUtilMock = - Mockito.mockStatic(AutoConfigureUtil.class)) { - autoConfigureUtilMock.when(() -> AutoConfigureUtil.getConfig(sdkMock)).thenReturn(null); - autoConfigureUtilMock - .when(() -> AutoConfigureUtil.getConfigProvider(sdkMock)) - .thenReturn(configProviderMock); - - ConfigProperties configProperties = - new DeclarativeConfigPropertiesBridgeBuilder().build(sdkMock); - - assertThat(configProperties.getString("testProperty")).isNull(); - } - } -} diff --git a/examples/distro/custom/src/main/java/com/example/javaagent/DemoBootstrapPackagesProvider.java b/examples/distro/custom/src/main/java/com/example/javaagent/DemoBootstrapPackagesProvider.java index b83cd153d998..d90d6e857b85 100644 --- a/examples/distro/custom/src/main/java/com/example/javaagent/DemoBootstrapPackagesProvider.java +++ b/examples/distro/custom/src/main/java/com/example/javaagent/DemoBootstrapPackagesProvider.java @@ -8,7 +8,6 @@ import com.example.javaagent.bootstrap.AgentApi; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesBuilder; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; /** * To ensure that the classes we add to bootstrap class loader are available in class loaders that @@ -20,7 +19,7 @@ public class DemoBootstrapPackagesProvider implements BootstrapPackagesConfigurer { @Override - public void configure(BootstrapPackagesBuilder builder, ConfigProperties config) { + public void configure(BootstrapPackagesBuilder builder) { builder.add(AgentApi.class.getPackage().getName()); } } diff --git a/examples/extension/src/main/java/com/example/javaagent/DemoIgnoredTypesConfigurer.java b/examples/extension/src/main/java/com/example/javaagent/DemoIgnoredTypesConfigurer.java index 353084fb2aba..e86617828e93 100644 --- a/examples/extension/src/main/java/com/example/javaagent/DemoIgnoredTypesConfigurer.java +++ b/examples/extension/src/main/java/com/example/javaagent/DemoIgnoredTypesConfigurer.java @@ -8,7 +8,6 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; /** * Custom {@link IgnoredTypesConfigurer} which exists currently only to verify correct shading. @@ -19,5 +18,5 @@ public class DemoIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) {} + public void configure(IgnoredTypesBuilder builder) {} } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java index d73e350503f4..5f736e3844d7 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java @@ -10,7 +10,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapSetter; -import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; @@ -36,7 +36,6 @@ import java.util.List; import java.util.Objects; import java.util.function.Consumer; -import java.util.function.Supplier; import java.util.function.UnaryOperator; import javax.annotation.Nullable; @@ -265,22 +264,25 @@ InstrumenterBuilder instrumenterBuilder( } @CanIgnoreReturnValue - public DefaultHttpClientInstrumenterBuilder configure(CommonConfig config) { - set(config::getKnownHttpRequestMethods, this::setKnownMethods); - set(config::getClientRequestHeaders, this::setCapturedRequestHeaders); - set(config::getClientResponseHeaders, this::setCapturedResponseHeaders); - set(config::getPeerServiceResolver, this::setPeerServiceResolver); - set( - config::shouldEmitExperimentalHttpClientTelemetry, - this::setEmitExperimentalHttpClientTelemetry); - set(config::redactQueryParameters, this::setRedactQueryParameters); + public DefaultHttpClientInstrumenterBuilder configure( + OpenTelemetry openTelemetry) { + DeclarativeConfigUtil.getList(openTelemetry, "java", "http", "known_methods") + .ifPresent(this::setKnownMethods); + DeclarativeConfigUtil.getList( + openTelemetry, "general", "http", "client", "request_captured_headers") + .ifPresent(this::setCapturedRequestHeaders); + DeclarativeConfigUtil.getList( + openTelemetry, "general", "http", "client", "response_captured_headers") + .ifPresent(this::setCapturedResponseHeaders); + setPeerServiceResolver(PeerServiceResolver.create(openTelemetry)); + setEmitExperimentalHttpClientTelemetry( + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "http", "client", "emit_experimental_telemetry") + .orElse(false)); + setRedactQueryParameters( + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "http", "client", "redact_query_parameters/development") + .orElse(true)); return this; } - - private static void set(Supplier supplier, Consumer consumer) { - T t = supplier.get(); - if (t != null) { - consumer.accept(t); - } - } } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java index ffb48a61a9c5..575eb21d35a9 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java @@ -8,7 +8,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.context.propagation.TextMapGetter; -import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; @@ -32,7 +32,6 @@ import java.util.List; import java.util.Objects; import java.util.function.Consumer; -import java.util.function.Supplier; import java.util.function.UnaryOperator; import javax.annotation.Nullable; @@ -224,20 +223,20 @@ public InstrumenterBuilder instrumenterBuilder() { } @CanIgnoreReturnValue - public DefaultHttpServerInstrumenterBuilder configure(CommonConfig config) { - set(config::getKnownHttpRequestMethods, this::setKnownMethods); - set(config::getServerRequestHeaders, this::setCapturedRequestHeaders); - set(config::getServerResponseHeaders, this::setCapturedResponseHeaders); - set( - config::shouldEmitExperimentalHttpServerTelemetry, - this::setEmitExperimentalHttpServerTelemetry); + public DefaultHttpServerInstrumenterBuilder configure( + OpenTelemetry openTelemetry) { + DeclarativeConfigUtil.getList(openTelemetry, "java", "http", "known_methods") + .ifPresent(this::setKnownMethods); + DeclarativeConfigUtil.getList( + openTelemetry, "general", "http", "server", "request_captured_headers") + .ifPresent(this::setCapturedRequestHeaders); + DeclarativeConfigUtil.getList( + openTelemetry, "general", "http", "server", "response_captured_headers") + .ifPresent(this::setCapturedResponseHeaders); + setEmitExperimentalHttpServerTelemetry( + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "http", "server", "emit_experimental_telemetry") + .orElse(false)); return this; } - - private static void set(Supplier supplier, Consumer consumer) { - T t = supplier.get(); - if (t != null) { - consumer.accept(t); - } - } } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/CommonConfig.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/CommonConfig.java deleted file mode 100644 index abf1485fd3c4..000000000000 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/CommonConfig.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.incubator.config.internal; - -import static java.util.Collections.emptyList; -import static java.util.Collections.emptyMap; - -import io.opentelemetry.api.incubator.config.ConfigProvider; -import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil; -import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants; -import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; -import io.opentelemetry.instrumentation.api.internal.HttpConstants; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.function.Supplier; -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 CommonConfig { - - private final PeerServiceResolver peerServiceResolver; - private final List clientRequestHeaders; - private final List clientResponseHeaders; - private final List serverRequestHeaders; - private final List serverResponseHeaders; - private final Set knownHttpRequestMethods; - private final EnduserConfig enduserConfig; - private final boolean statementSanitizationEnabled; - private final boolean sqlCommenterEnabled; - private final boolean emitExperimentalHttpClientTelemetry; - private final boolean emitExperimentalHttpServerTelemetry; - private final boolean redactQueryParameters; - private final String loggingTraceIdKey; - private final String loggingSpanIdKey; - private final String loggingTraceFlagsKey; - - interface ValueProvider { - @Nullable - T get(ConfigProvider configProvider); - } - - public CommonConfig(InstrumentationConfig config) { - peerServiceResolver = - PeerServiceResolver.create( - getFromConfigProviderOrFallback( - config, - InstrumentationConfigUtil::peerServiceMapping, - emptyMap(), - () -> - config.getMap("otel.instrumentation.common.peer-service-mapping", emptyMap()))); - - clientRequestHeaders = - getFromConfigProviderOrFallback( - config, - InstrumentationConfigUtil::httpClientRequestCapturedHeaders, - emptyList(), - () -> config.getList("otel.instrumentation.http.client.capture-request-headers")); - clientResponseHeaders = - getFromConfigProviderOrFallback( - config, - InstrumentationConfigUtil::httpClientResponseCapturedHeaders, - emptyList(), - () -> config.getList("otel.instrumentation.http.client.capture-response-headers")); - serverRequestHeaders = - getFromConfigProviderOrFallback( - config, - InstrumentationConfigUtil::httpServerRequestCapturedHeaders, - emptyList(), - () -> config.getList("otel.instrumentation.http.server.capture-request-headers")); - serverResponseHeaders = - getFromConfigProviderOrFallback( - config, - InstrumentationConfigUtil::httpServerResponseCapturedHeaders, - emptyList(), - () -> config.getList("otel.instrumentation.http.server.capture-response-headers")); - knownHttpRequestMethods = - new HashSet<>( - config.getList( - "otel.instrumentation.http.known-methods", - new ArrayList<>(HttpConstants.KNOWN_METHODS))); - statementSanitizationEnabled = - config.getBoolean("otel.instrumentation.common.db-statement-sanitizer.enabled", true); - sqlCommenterEnabled = - config.getBoolean( - "otel.instrumentation.common.experimental.db-sqlcommenter.enabled", false); - emitExperimentalHttpClientTelemetry = - config.getBoolean("otel.instrumentation.http.client.emit-experimental-telemetry", false); - redactQueryParameters = - config.getBoolean( - "otel.instrumentation.http.client.experimental.redact-query-parameters", true); - emitExperimentalHttpServerTelemetry = - config.getBoolean("otel.instrumentation.http.server.emit-experimental-telemetry", false); - enduserConfig = new EnduserConfig(config); - loggingTraceIdKey = - config.getString( - "otel.instrumentation.common.logging.trace-id", LoggingContextConstants.TRACE_ID); - loggingSpanIdKey = - config.getString( - "otel.instrumentation.common.logging.span-id", LoggingContextConstants.SPAN_ID); - loggingTraceFlagsKey = - config.getString( - "otel.instrumentation.common.logging.trace-flags", LoggingContextConstants.TRACE_FLAGS); - } - - public PeerServiceResolver getPeerServiceResolver() { - return peerServiceResolver; - } - - public List getClientRequestHeaders() { - return clientRequestHeaders; - } - - public List getClientResponseHeaders() { - return clientResponseHeaders; - } - - public List getServerRequestHeaders() { - return serverRequestHeaders; - } - - public List getServerResponseHeaders() { - return serverResponseHeaders; - } - - public Set getKnownHttpRequestMethods() { - return knownHttpRequestMethods; - } - - public EnduserConfig getEnduserConfig() { - return enduserConfig; - } - - public boolean isStatementSanitizationEnabled() { - return statementSanitizationEnabled; - } - - public boolean isSqlCommenterEnabled() { - return sqlCommenterEnabled; - } - - public boolean shouldEmitExperimentalHttpClientTelemetry() { - return emitExperimentalHttpClientTelemetry; - } - - public boolean shouldEmitExperimentalHttpServerTelemetry() { - return emitExperimentalHttpServerTelemetry; - } - - public boolean redactQueryParameters() { - return redactQueryParameters; - } - - public String getTraceIdKey() { - return loggingTraceIdKey; - } - - public String getSpanIdKey() { - return loggingSpanIdKey; - } - - public String getTraceFlagsKey() { - return loggingTraceFlagsKey; - } - - private static T getFromConfigProviderOrFallback( - InstrumentationConfig config, - ValueProvider getFromConfigProvider, - T defaultValue, - Supplier fallback) { - ConfigProvider configProvider = config.getConfigProvider(); - if (configProvider != null) { - T value = getFromConfigProvider.get(configProvider); - return value != null ? value : defaultValue; - } - // fallback doesn't return null, so we can safely call it - return fallback.get(); - } -} diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/DeclarativeConfigUtil.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/DeclarativeConfigUtil.java new file mode 100644 index 000000000000..e992e64b78da --- /dev/null +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/DeclarativeConfigUtil.java @@ -0,0 +1,123 @@ +/* + * 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.ConfigProvider; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import java.time.Duration; +import java.util.List; +import java.util.Optional; +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 DeclarativeConfigUtil { + + public static Optional getBoolean(OpenTelemetry openTelemetry, String... propertyPath) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyPath); + return Optional.ofNullable(node != null ? node.getBoolean(leaf(propertyPath)) : null); + } + + public static Optional getString(OpenTelemetry openTelemetry, String... propertyPath) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyPath); + return Optional.ofNullable(node != null ? node.getString(leaf(propertyPath)) : null); + } + + public static Optional getInt(OpenTelemetry openTelemetry, String... propertyPath) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyPath); + return Optional.ofNullable(node != null ? node.getInt(leaf(propertyPath)) : null); + } + + public static Optional getLong(OpenTelemetry openTelemetry, String... propertyPath) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyPath); + return Optional.ofNullable(node != null ? node.getLong(leaf(propertyPath)) : null); + } + + public static Optional getDuration( + OpenTelemetry openTelemetry, String... propertyPath) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyPath); + if (node == null) { + return Optional.empty(); + } + String leaf = leaf(propertyPath); + + // First try as Long (milliseconds) - typical for YAML config + Long millis = node.getLong(leaf); + if (millis != null) { + return Optional.of(Duration.ofMillis(millis)); + } + + // Fall back to String parsing - typical for system properties like "1m", "10s" + String value = node.getString(leaf); + if (value == null || value.isEmpty()) { + return Optional.empty(); + } + return Optional.of(DurationParser.parseDuration(value)); + } + + public static Optional> getList( + OpenTelemetry openTelemetry, String... propertyPath) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyPath); + if (node != null) { + List list = node.getScalarList(leaf(propertyPath), String.class); + return Optional.ofNullable(list); + } + return Optional.empty(); + } + + public static Optional getStructuredConfig( + OpenTelemetry openTelemetry, String... propertyPath) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyPath); + return Optional.ofNullable(node != null ? node.getStructured(leaf(propertyPath)) : null); + } + + public static Optional> getStructuredList( + OpenTelemetry openTelemetry, String... propertyPath) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyPath); + return Optional.ofNullable(node != null ? node.getStructuredList(leaf(propertyPath)) : null); + } + + @Nullable + private static DeclarativeConfigProperties getDeclarativeConfigNode( + OpenTelemetry openTelemetry, String... propertyPath) { + + if (!(openTelemetry instanceof ExtendedOpenTelemetry)) { + return null; + } + ExtendedOpenTelemetry extendedOpenTelemetry = (ExtendedOpenTelemetry) openTelemetry; + ConfigProvider configProvider = extendedOpenTelemetry.getConfigProvider(); + if (configProvider == null) { + return null; + } + return getConfigNode(configProvider, propertyPath); + } + + private static DeclarativeConfigProperties getConfigNode( + ConfigProvider configProvider, String... propertyPath) { + + DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig(); + if (instrumentationConfig == null) { + return empty(); + } + DeclarativeConfigProperties node = instrumentationConfig; + for (int i = 0; i < propertyPath.length - 1; i++) { + node = node.getStructured(propertyPath[i], empty()); + } + return node; + } + + private static String leaf(String[] propertyPath) { + return propertyPath[propertyPath.length - 1]; + } + + private DeclarativeConfigUtil() {} +} diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/DurationParser.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/DurationParser.java new file mode 100644 index 000000000000..8ebf97c1dd18 --- /dev/null +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/DurationParser.java @@ -0,0 +1,72 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.incubator.config.internal; + +import java.time.Duration; +import java.util.concurrent.TimeUnit; + +/** + * Duration parsing copied from + * https://github.com/open-telemetry/opentelemetry-java/blob/b9f98a87941dcbd578ef518685d5fe699f2f8c8f/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/DefaultConfigProperties.java + * + *

This class is internal and is hence not for public use. Its APIs are unstable and can change + * at any time. + */ +final class DurationParser { + + static Duration parseDuration(String value) { + String unitString = getUnitString(value); + // TODO: Environment variables have unknown encoding. `trim()` may cut codepoints oddly + // but likely we'll fail for malformed unit string either way. + String numberString = value.substring(0, value.length() - unitString.length()); + long rawNumber = Long.parseLong(numberString.trim()); + TimeUnit unit = getDurationUnit(unitString.trim()); + return Duration.ofNanos(TimeUnit.NANOSECONDS.convert(rawNumber, unit)); + } + + /** Returns the TimeUnit associated with a unit string. Defaults to milliseconds. */ + private static TimeUnit getDurationUnit(String unitString) { + switch (unitString) { + case "us": + return TimeUnit.MICROSECONDS; + case "ns": + return TimeUnit.NANOSECONDS; + case "": // Fallthrough expected + case "ms": + return TimeUnit.MILLISECONDS; + case "s": + return TimeUnit.SECONDS; + case "m": + return TimeUnit.MINUTES; + case "h": + return TimeUnit.HOURS; + case "d": + return TimeUnit.DAYS; + default: + throw new IllegalArgumentException("Invalid duration string, found: " + unitString); + } + } + + /** + * Fragments the 'units' portion of a config value from the 'value' portion. + * + *

E.g. "1ms" would return the string "ms". + */ + private static String getUnitString(String rawValue) { + int lastDigitIndex = rawValue.length() - 1; + while (lastDigitIndex >= 0) { + char c = rawValue.charAt(lastDigitIndex); + if (Character.isDigit(c)) { + break; + } + lastDigitIndex -= 1; + } + // Pull everything after the last digit. + return rawValue.substring(lastDigitIndex + 1); + } + + private DurationParser() {} +} diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/EnduserConfig.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/EnduserConfig.java deleted file mode 100644 index b44057c75f90..000000000000 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/EnduserConfig.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.incubator.config.internal; - -import java.util.Objects; - -/** - * Configuration that controls capturing the {@code enduser.*} semantic attributes. - * - *

The {@code enduser.*} semantic attributes are not captured by default, due to this text in the - * specification: - * - *

- * - * Given the sensitive nature of this information, SDKs and exporters SHOULD drop these attributes - * by default and then provide a configuration parameter to turn on retention for use cases where - * the information is required and would not violate any policies or regulations. - * - *
- * - *

Capturing of the {@code enduser.*} semantic attributes can be individually enabled by - * configured the following properties: - * - *

- * otel.instrumentation.common.enduser.id.enabled=true
- * otel.instrumentation.common.enduser.role.enabled=true
- * otel.instrumentation.common.enduser.scope.enabled=true
- * 
- * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -public class EnduserConfig { - - private final boolean idEnabled; - private final boolean roleEnabled; - private final boolean scopeEnabled; - - EnduserConfig(InstrumentationConfig instrumentationConfig) { - Objects.requireNonNull(instrumentationConfig, "instrumentationConfig must not be null"); - - /* - * Capturing enduser.* attributes is disabled by default, because of this requirement in the specification: - * - * Given the sensitive nature of this information, SDKs and exporters SHOULD drop these attributes by default and then provide a configuration parameter to turn on retention for use cases where the information is required and would not violate any policies or regulations. - * - * https://github.com/open-telemetry/semantic-conventions/blob/main/docs/general/attributes.md#general-identity-attributes - */ - this.idEnabled = - instrumentationConfig.getBoolean("otel.instrumentation.common.enduser.id.enabled", false); - this.roleEnabled = - instrumentationConfig.getBoolean("otel.instrumentation.common.enduser.role.enabled", false); - this.scopeEnabled = - instrumentationConfig.getBoolean( - "otel.instrumentation.common.enduser.scope.enabled", false); - } - - /** - * Returns true if capturing of any {@code enduser.*} semantic attribute is enabled. - * - *

This flag can be used by capturing instrumentations to bypass all {@code enduser.*} - * attribute capturing. - */ - public boolean isAnyEnabled() { - return this.idEnabled || this.roleEnabled || this.scopeEnabled; - } - - /** - * Returns true if capturing the {@code enduser.id} semantic attribute is enabled. - * - * @return true if capturing the {@code enduser.id} semantic attribute is enabled. - */ - public boolean isIdEnabled() { - return this.idEnabled; - } - - /** - * Returns true if capturing the {@code enduser.role} semantic attribute is enabled. - * - * @return true if capturing the {@code enduser.role} semantic attribute is enabled. - */ - public boolean isRoleEnabled() { - return this.roleEnabled; - } - - /** - * Returns true if capturing the {@code enduser.scope} semantic attribute is enabled. - * - * @return true if capturing the {@code enduser.scope} semantic attribute is enabled. - */ - public boolean isScopeEnabled() { - return this.scopeEnabled; - } -} diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/InstrumentationConfig.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/InstrumentationConfig.java deleted file mode 100644 index ab1bb761aa22..000000000000 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/InstrumentationConfig.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.incubator.config.internal; - -import static java.util.Collections.emptyList; - -import io.opentelemetry.api.incubator.config.ConfigProvider; -import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import java.time.Duration; -import java.util.List; -import java.util.Map; -import javax.annotation.Nullable; - -/** - * Represents the global instrumentation configuration consisting of system properties, environment - * variables, contents of the agent configuration file and properties defined by the {@code - * ConfigPropertySource} SPI implementations. - * - *

In case any {@code get*()} method variant gets called for the same property more than once - * (e.g. each time an advice class executes) it is suggested to cache the result instead of - * repeatedly calling {@link InstrumentationConfig}. Instrumentation configuration does not change - * during the runtime so retrieving the property once and storing its result in a static final field - * allows JIT to do its magic and remove some code branches. - * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -public interface InstrumentationConfig { - - /** - * Returns a string-valued configuration property or {@code null} if a property with name {@code - * name} has not been configured. - */ - @Nullable - String getString(String name); - - /** - * Returns a string-valued configuration property or {@code defaultValue} if a property with name - * {@code name} has not been configured. - */ - String getString(String name, String defaultValue); - - /** - * Returns a boolean-valued configuration property or {@code defaultValue} if a property with name - * {@code name} has not been configured. - */ - boolean getBoolean(String name, boolean defaultValue); - - /** - * Returns an integer-valued configuration property or {@code defaultValue} if a property with - * name {@code name} has not been configured or when parsing has failed. - */ - int getInt(String name, int defaultValue); - - /** - * Returns a long-valued configuration property or {@code defaultValue} if a property with name - * {@code name} has not been configured or when parsing has failed. - */ - long getLong(String name, long defaultValue); - - /** - * Returns a double-valued configuration property or {@code defaultValue} if a property with name - * {@code name} has not been configured or when parsing has failed. - */ - double getDouble(String name, double defaultValue); - - /** - * Returns a duration-valued configuration property or {@code defaultValue} if a property with - * name {@code name} has not been configured or when parsing has failed. - * - *

Durations can be of the form "{number}{unit}", where unit is one of: - * - *

- * - *

If no unit is specified, milliseconds is the assumed duration unit. - * - *

Examples: 10s, 20ms, 5000 - */ - Duration getDuration(String name, Duration defaultValue); - - /** - * This is the same as calling {@code getList(String, List)} with the defaultValue equal to the - * emptyList()/ - */ - default List getList(String name) { - return getList(name, emptyList()); - } - - /** - * Returns a list-valued configuration property or {@code defaultValue} if a property with name - * {@code name} has not been configured. The format of the original value must be comma-separated, - * e.g. {@code one,two,three}. The returned list is unmodifiable. - */ - List getList(String name, List defaultValue); - - /** - * Returns a map-valued configuration property or {@code defaultValue} if a property with name - * {@code name} has not been configured or when parsing has failed. The format of the original - * value must be comma-separated for each key, with an '=' separating the key and value, e.g. - * {@code key=value,anotherKey=anotherValue}. The returned map is unmodifiable. - */ - Map getMap(String name, Map defaultValue); - - /** Returns {@code true} if declarative configuration is used in this configuration. */ - boolean isDeclarative(); - - /** - * Returns a {@link DeclarativeConfigProperties} for the given node name, which is usually an - * instrumentation name - * - *

Call {@link #isDeclarative()} first to check if declarative configuration is used. - * - *

Declarative configuration is used to configure instrumentation properties in a declarative - * way, such as through YAML or JSON files. - * - * @param node the name of the instrumentation (e.g. "log4j"), the vendor name (e.g. "google"), or - * "common" for common Java settings that don't apply to other languages. - * @return the declarative configuration properties for the given node name - * @throws IllegalStateException if {@link #isDeclarative()} returns {@code false} - */ - DeclarativeConfigProperties getDeclarativeConfig(String node); - - /** - * Returns the {@link ConfigProvider} if declarative configuration is used. - * - * @return the {@link ConfigProvider} or {@code null} if no provider is available - */ - @Nullable - ConfigProvider getConfigProvider(); -} diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolver.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolver.java index 81523e8061e4..bf4d39f8b237 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolver.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolver.java @@ -5,7 +5,13 @@ package io.opentelemetry.instrumentation.api.incubator.semconv.net; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; +import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.Supplier; import javax.annotation.Nullable; @@ -19,4 +25,24 @@ public interface PeerServiceResolver { static PeerServiceResolver create(Map mapping) { return new PeerServiceResolverImpl(mapping); } + + static PeerServiceResolver create(OpenTelemetry openTelemetry) { + Map peerServiceMap = new HashMap<>(); + + Optional> mappingList = + DeclarativeConfigUtil.getStructuredList( + openTelemetry, "general", "peer", "service_mapping"); + + if (mappingList.isPresent()) { + for (DeclarativeConfigProperties mapping : mappingList.get()) { + String peer = mapping.getString("peer"); + String service = mapping.getString("service"); + if (peer != null && service != null) { + peerServiceMap.put(peer, service); + } + } + } + + return new PeerServiceResolverImpl(peerServiceMap); + } } diff --git a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaIgnoredTypesConfigurer.java b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaIgnoredTypesConfigurer.java index 37bace28bb6c..199edb6d75bb 100644 --- a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaIgnoredTypesConfigurer.java +++ b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class AkkaIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // This is a Mailbox created by akka.dispatch.Dispatcher#createMailbox. We must not add // a context to it as context should only be carried by individual envelopes in the queue // of this mailbox. diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaServerIgnoredTypesConfigurer.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaServerIgnoredTypesConfigurer.java index a38b76cf6924..2425cbeb9810 100644 --- a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaServerIgnoredTypesConfigurer.java +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaServerIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class AkkaServerIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // in AkkaHttpServerInstrumentationTestAsync http pipeline test sending this message trigger // processing next request, we don't want to propagate context there builder.ignoreTaskClass("akka.stream.impl.fusing.ActorGraphInterpreter$AsyncInput"); diff --git a/instrumentation/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboSingletons.java b/instrumentation/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboSingletons.java index 034d739dc82c..4fa983102561 100644 --- a/instrumentation/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboSingletons.java +++ b/instrumentation/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboSingletons.java @@ -9,7 +9,7 @@ import io.opentelemetry.instrumentation.apachedubbo.v2_7.DubboTelemetry; import io.opentelemetry.instrumentation.apachedubbo.v2_7.internal.DubboClientNetworkAttributesGetter; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import org.apache.dubbo.rpc.Filter; public final class DubboSingletons { @@ -22,7 +22,7 @@ public final class DubboSingletons { .addAttributesExtractor( PeerServiceAttributesExtractor.create( new DubboClientNetworkAttributesGetter(), - AgentCommonConfig.get().getPeerServiceResolver())) + PeerServiceResolver.create(GlobalOpenTelemetry.get()))) .build(); CLIENT_FILTER = telemetry.newClientFilter(); SERVER_FILTER = telemetry.newServerFilter(); diff --git a/instrumentation/apache-elasticjob-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apacheelasticjob/v3_0/ElasticJobSingletons.java b/instrumentation/apache-elasticjob-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apacheelasticjob/v3_0/ElasticJobSingletons.java index 4baeb2c9f3d3..4f5b141c463c 100644 --- a/instrumentation/apache-elasticjob-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apacheelasticjob/v3_0/ElasticJobSingletons.java +++ b/instrumentation/apache-elasticjob-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apacheelasticjob/v3_0/ElasticJobSingletons.java @@ -7,18 +7,22 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class ElasticJobSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-elasticjob-3.0"; private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.apache-elasticjob.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "apache_elasticjob", + "experimental_span_attributes") + .orElse(false); private static final Instrumenter INSTRUMENTER = createInstrumenter(); diff --git a/instrumentation/apache-shenyu-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apacheshenyu/v2_4/MetaDataHelper.java b/instrumentation/apache-shenyu-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apacheshenyu/v2_4/MetaDataHelper.java index 4414e6eeb628..c839e5c822ba 100644 --- a/instrumentation/apache-shenyu-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apacheshenyu/v2_4/MetaDataHelper.java +++ b/instrumentation/apache-shenyu-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apacheshenyu/v2_4/MetaDataHelper.java @@ -5,11 +5,12 @@ package io.opentelemetry.javaagent.instrumentation.apacheshenyu.v2_4; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import org.apache.shenyu.common.dto.MetaData; public final class MetaDataHelper { @@ -58,8 +59,9 @@ public final class MetaDataHelper { static { CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.apache-shenyu.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "apache_shenyu", "experimental_span_attributes") + .orElse(false); } private MetaDataHelper() {} diff --git a/instrumentation/armeria/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaSingletons.java b/instrumentation/armeria/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaSingletons.java index 8d1fe03762ea..8290f7c2e237 100644 --- a/instrumentation/armeria/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaSingletons.java +++ b/instrumentation/armeria/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaSingletons.java @@ -8,13 +8,11 @@ import com.linecorp.armeria.client.HttpClient; import com.linecorp.armeria.server.HttpService; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaClientTelemetry; import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaClientTelemetryBuilder; import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaServerTelemetry; import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaServerTelemetryBuilder; import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaInstrumenterBuilderUtil; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import java.util.function.Function; // Holds singleton references to decorators to match against during suppression. @@ -25,20 +23,18 @@ public final class ArmeriaSingletons { public static final Function SERVER_DECORATOR; static { - CommonConfig config = AgentCommonConfig.get(); - ArmeriaClientTelemetryBuilder clientBuilder = ArmeriaClientTelemetry.builder(GlobalOpenTelemetry.get()); ArmeriaInstrumenterBuilderUtil.getClientBuilderExtractor() .apply(clientBuilder) - .configure(config); + .configure(GlobalOpenTelemetry.get()); ArmeriaClientTelemetry clientTelemetry = clientBuilder.build(); ArmeriaServerTelemetryBuilder serverBuilder = ArmeriaServerTelemetry.builder(GlobalOpenTelemetry.get()); ArmeriaInstrumenterBuilderUtil.getServerBuilderExtractor() .apply(serverBuilder) - .configure(config); + .configure(GlobalOpenTelemetry.get()); ArmeriaServerTelemetry serverTelemetry = serverBuilder.build(); CLIENT_DECORATOR = clientTelemetry.newDecorator(); diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaSingletons.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaSingletons.java index 5cef0f369635..1de79f61d377 100644 --- a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaSingletons.java +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaSingletons.java @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.awslambdacore.v1_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenter; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenterFactory; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrapperConfiguration; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.time.Duration; public final class AwsLambdaSingletons { @@ -18,10 +18,9 @@ public final class AwsLambdaSingletons { AwsLambdaFunctionInstrumenterFactory.createInstrumenter(GlobalOpenTelemetry.get()); private static final Duration FLUSH_TIMEOUT = Duration.ofMillis( - AgentInstrumentationConfig.get() - .getLong( - "otel.instrumentation.aws-lambda.flush-timeout", - WrapperConfiguration.OTEL_LAMBDA_FLUSH_TIMEOUT_DEFAULT.toMillis())); + DeclarativeConfigUtil.getInt( + GlobalOpenTelemetry.get(), "java", "aws_lambda", "flush_timeout") + .orElse((int) WrapperConfiguration.OTEL_LAMBDA_FLUSH_TIMEOUT_DEFAULT.toMillis())); public static AwsLambdaFunctionInstrumenter functionInstrumenter() { return FUNCTION_INSTRUMENTER; diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaSingletons.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaSingletons.java index 8ffd8f7a10bd..332a3f0d08cd 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaSingletons.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaSingletons.java @@ -7,30 +7,26 @@ import com.amazonaws.services.lambda.runtime.events.SQSEvent; 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.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenter; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrapperConfiguration; import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.AwsLambdaEventsInstrumenterFactory; import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.AwsLambdaSqsInstrumenterFactory; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.time.Duration; public final class AwsLambdaSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.aws-lambda-events-2.2"; private static final AwsLambdaFunctionInstrumenter FUNCTION_INSTRUMENTER = AwsLambdaEventsInstrumenterFactory.createInstrumenter( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - AgentCommonConfig.get().getKnownHttpRequestMethods()); + GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME); private static final Instrumenter MESSAGE_TRACER = AwsLambdaSqsInstrumenterFactory.forEvent(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME); private static final Duration FLUSH_TIMEOUT = Duration.ofMillis( - AgentInstrumentationConfig.get() - .getLong( - "otel.instrumentation.aws-lambda.flush-timeout", - WrapperConfiguration.OTEL_LAMBDA_FLUSH_TIMEOUT_DEFAULT.toMillis())); + DeclarativeConfigUtil.getInt( + GlobalOpenTelemetry.get(), "java", "aws_lambda", "flush_timeout") + .orElse((int) WrapperConfiguration.OTEL_LAMBDA_FLUSH_TIMEOUT_DEFAULT.toMillis())); public static AwsLambdaFunctionInstrumenter functionInstrumenter() { return FUNCTION_INSTRUMENTER; diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapperBase.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapperBase.java index a34faa73f4eb..92f9b61bd770 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapperBase.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapperBase.java @@ -7,7 +7,6 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.awslambdacore.v1_0.TracingRequestHandler; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.MapUtils; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrappedLambda; @@ -49,7 +48,7 @@ protected TracingRequestWrapperBase(BiFunction, Object> parameterMap openTelemetrySdk, WrapperConfiguration.flushTimeout(), AwsLambdaEventsInstrumenterFactory.createInstrumenter( - openTelemetrySdk, INSTRUMENTATION_NAME, HttpConstants.KNOWN_METHODS)); + openTelemetrySdk, INSTRUMENTATION_NAME)); this.wrappedLambda = wrappedLambda; this.targetMethod = wrappedLambda.getRequestTargetMethod(); this.parameterMapper = parameterMapper; diff --git a/instrumentation/aws-lambda/aws-lambda-events-3.11/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v3_11/TracingRequestWrapperBase.java b/instrumentation/aws-lambda/aws-lambda-events-3.11/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v3_11/TracingRequestWrapperBase.java index 5b72ded55821..46d8aaad6e41 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-3.11/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v3_11/TracingRequestWrapperBase.java +++ b/instrumentation/aws-lambda/aws-lambda-events-3.11/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v3_11/TracingRequestWrapperBase.java @@ -7,7 +7,6 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.awslambdacore.v1_0.TracingRequestHandler; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.MapUtils; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrappedLambda; @@ -49,7 +48,7 @@ protected TracingRequestWrapperBase(BiFunction, Object> parameterMap openTelemetrySdk, WrapperConfiguration.flushTimeout(), AwsLambdaEventsInstrumenterFactory.createInstrumenter( - openTelemetrySdk, INSTRUMENTATION_NAME, HttpConstants.KNOWN_METHODS)); + openTelemetrySdk, INSTRUMENTATION_NAME)); this.wrappedLambda = wrappedLambda; this.targetMethod = wrappedLambda.getRequestTargetMethod(); this.parameterMapper = parameterMapper; diff --git a/instrumentation/aws-lambda/aws-lambda-events-common-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/common/v2_2/internal/AwsLambdaEventsInstrumenterFactory.java b/instrumentation/aws-lambda/aws-lambda-events-common-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/common/v2_2/internal/AwsLambdaEventsInstrumenterFactory.java index e5d615113253..7b8c5d16f200 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-common-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/common/v2_2/internal/AwsLambdaEventsInstrumenterFactory.java +++ b/instrumentation/aws-lambda/aws-lambda-events-common-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/common/v2_2/internal/AwsLambdaEventsInstrumenterFactory.java @@ -7,11 +7,14 @@ import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.awslambdacore.v1_0.AwsLambdaRequest; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionAttributesExtractor; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenter; +import java.util.HashSet; import java.util.Set; /** @@ -21,16 +24,23 @@ public final class AwsLambdaEventsInstrumenterFactory { public static AwsLambdaFunctionInstrumenter createInstrumenter( - OpenTelemetry openTelemetry, String instrumentationName, Set knownMethods) { + OpenTelemetry openTelemetry, String instrumentationName) { return new AwsLambdaFunctionInstrumenter( openTelemetry, Instrumenter.builder( openTelemetry, instrumentationName, AwsLambdaEventsInstrumenterFactory::spanName) .addAttributesExtractor(new AwsLambdaFunctionAttributesExtractor()) - .addAttributesExtractor(new ApiGatewayProxyAttributesExtractor(knownMethods)) + .addAttributesExtractor( + new ApiGatewayProxyAttributesExtractor(getKnownHttpMethods(openTelemetry))) .buildInstrumenter(SpanKindExtractor.alwaysServer())); } + private static Set getKnownHttpMethods(OpenTelemetry openTelemetry) { + return DeclarativeConfigUtil.getList(openTelemetry, "java", "http", "known_methods") + .map(HashSet::new) + .orElse(new HashSet<>(HttpConstants.KNOWN_METHODS)); + } + private static String spanName(AwsLambdaRequest input) { if (input.getInput() instanceof APIGatewayProxyRequestEvent) { APIGatewayProxyRequestEvent request = (APIGatewayProxyRequestEvent) input.getInput(); diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java index 872c7303507a..66fef5c93688 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java @@ -13,9 +13,9 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.awssdk.v1_11.AwsSdkTelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.Collections; /** * A {@link RequestHandler2} for use in the agent. Unlike library instrumentation, the agent will @@ -36,11 +36,21 @@ public class TracingRequestHandler extends RequestHandler2 { public static final RequestHandler2 tracingHandler = AwsSdkTelemetry.builder(GlobalOpenTelemetry.get()) .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.aws-sdk.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "aws_sdk", "experimental_span_attributes") + .orElse(false)) .setMessagingReceiveInstrumentationEnabled( - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled()) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false)) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "messaging", "capture_headers/development") + .orElse(Collections.emptyList())) .build() .newRequestHandler(); diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java index f84cd5590e99..f4970ead7075 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java @@ -5,10 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.awssdk.v2_2; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkTelemetry; import io.opentelemetry.instrumentation.awssdk.v2_2.internal.AbstractAwsSdkTelemetryFactory; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.Collections; import java.util.List; public final class AwsSdkSingletons { @@ -23,17 +24,31 @@ private static class AwsSdkTelemetryFactory extends AbstractAwsSdkTelemetryFacto @Override protected List getCapturedHeaders() { - return ExperimentalConfig.get().getMessagingHeaders(); + return DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "messaging", "capture_headers/development") + .orElse(Collections.emptyList()); } @Override protected boolean messagingReceiveInstrumentationEnabled() { - return ExperimentalConfig.get().messagingReceiveInstrumentationEnabled(); + return DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false); } @Override protected boolean getBoolean(String name, boolean defaultValue) { - return AgentInstrumentationConfig.get().getBoolean(name, defaultValue); + // Convert otel.instrumentation.xxx.yyy to java/xxx/yyy format + // e.g. otel.instrumentation.aws-sdk.experimental-span-attributes -> + // java/aws_sdk/experimental_span_attributes + String[] parts = + name.replace("otel.instrumentation.", "java.").replace("-", "_").split("\\."); + return DeclarativeConfigUtil.getBoolean(GlobalOpenTelemetry.get(), parts) + .orElse(defaultValue); } } diff --git a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/BaseSpanDecorator.java b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/BaseSpanDecorator.java index 1fe50b3abbda..09ddc5ebf7f5 100644 --- a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/BaseSpanDecorator.java +++ b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/BaseSpanDecorator.java @@ -23,10 +23,11 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel.decorators; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.instrumentation.apachecamel.CamelDirection; import io.opentelemetry.javaagent.instrumentation.apachecamel.SpanDecorator; import java.util.Collections; @@ -41,8 +42,9 @@ class BaseSpanDecorator implements SpanDecorator { static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.camel.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "camel", "experimental_span_attributes") + .orElse(false); static final String DEFAULT_OPERATION_NAME = "CamelOperation"; diff --git a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java index 5146ef2d30a8..dfcda922b9d6 100644 --- a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java +++ b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java @@ -23,10 +23,11 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel.decorators; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementSanitizer; import io.opentelemetry.instrumentation.api.internal.SemconvStability; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.instrumentation.apachecamel.CamelDirection; import io.opentelemetry.semconv.DbAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; @@ -38,7 +39,15 @@ class DbSpanDecorator extends BaseSpanDecorator { private static final SqlStatementSanitizer sanitizer = - SqlStatementSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + SqlStatementSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); private final String component; private final String system; diff --git a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/HttpSpanDecorator.java b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/HttpSpanDecorator.java index 8e1c8b49f3fb..89e170c6db4e 100644 --- a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/HttpSpanDecorator.java +++ b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/HttpSpanDecorator.java @@ -26,16 +26,19 @@ import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; import static io.opentelemetry.instrumentation.api.internal.HttpConstants._OTHER; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; +import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.instrumentation.apachecamel.CamelDirection; import io.opentelemetry.semconv.HttpAttributes; import io.opentelemetry.semconv.UrlAttributes; import java.net.MalformedURLException; import java.net.URL; +import java.util.HashSet; import java.util.Set; import javax.annotation.Nullable; import org.apache.camel.Endpoint; @@ -45,13 +48,18 @@ class HttpSpanDecorator extends BaseSpanDecorator { private static final String POST_METHOD = "POST"; private static final String GET_METHOD = "GET"; - private static final Set knownMethods = - AgentCommonConfig.get().getKnownHttpRequestMethods(); + private static final Set knownMethods = getKnownHttpMethods(); protected String getProtocol() { return "http"; } + private static Set getKnownHttpMethods() { + return DeclarativeConfigUtil.getList(GlobalOpenTelemetry.get(), "java", "http", "known_methods") + .map(HashSet::new) + .orElse(new HashSet<>(HttpConstants.KNOWN_METHODS)); + } + protected static String getHttpMethod(Exchange exchange, Endpoint endpoint) { // 1. Use method provided in header. Object method = exchange.getIn().getHeader(Exchange.HTTP_METHOD); diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java index 12bbc464d562..d5a1afb53a18 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java @@ -7,12 +7,12 @@ import com.datastax.driver.core.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; @SuppressWarnings("deprecation") // using deprecated semconv @@ -35,7 +35,13 @@ public final class CassandraSingletons { SqlClientAttributesExtractor.builder(attributesGetter) .setTableAttribute(DbIncubatingAttributes.DB_CASSANDRA_TABLE) .setStatementSanitizationEnabled( - AgentCommonConfig.get().isStatementSanitizationEnabled()) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "general", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)) .build()) .addAttributesExtractor(new CassandraAttributesExtractor()) .addOperationMetrics(DbClientMetrics.get()) diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java index cb59a22ccc54..da1a486e3237 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -7,12 +7,12 @@ import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; @SuppressWarnings("deprecation") // using deprecated semconv @@ -34,7 +34,13 @@ public final class CassandraSingletons { SqlClientAttributesExtractor.builder(attributesGetter) .setTableAttribute(DbIncubatingAttributes.DB_CASSANDRA_TABLE) .setStatementSanitizationEnabled( - AgentCommonConfig.get().isStatementSanitizationEnabled()) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "general", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)) .build()) .addAttributesExtractor(new CassandraAttributesExtractor()) .addOperationMetrics(DbClientMetrics.get()) diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java index d7151d1b5722..dcaa0fcba546 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java @@ -6,14 +6,22 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.cassandra.v4_4.CassandraTelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; final class CassandraSingletons { static final CassandraTelemetry telemetry = CassandraTelemetry.builder(GlobalOpenTelemetry.get()) - .setStatementSanitizationEnabled(AgentCommonConfig.get().isStatementSanitizationEnabled()) + .setStatementSanitizationEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)) .build(); private CassandraSingletons() {} diff --git a/instrumentation/clickhouse/clickhouse-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/common/ClickHouseDbRequest.java b/instrumentation/clickhouse/clickhouse-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/common/ClickHouseDbRequest.java index 35753981cb9b..5f464a6b0110 100644 --- a/instrumentation/clickhouse/clickhouse-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/common/ClickHouseDbRequest.java +++ b/instrumentation/clickhouse/clickhouse-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/common/ClickHouseDbRequest.java @@ -6,16 +6,25 @@ package io.opentelemetry.javaagent.instrumentation.clickhouse.common; import com.google.auto.value.AutoValue; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementInfo; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementSanitizer; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import javax.annotation.Nullable; @AutoValue public abstract class ClickHouseDbRequest { private static final SqlStatementSanitizer sanitizer = - SqlStatementSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + SqlStatementSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); public static ClickHouseDbRequest create( @Nullable String host, @Nullable Integer port, @Nullable String dbName, String sql) { diff --git a/instrumentation/couchbase/couchbase-2-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseQuerySanitizer.java b/instrumentation/couchbase/couchbase-2-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseQuerySanitizer.java index 2fa42b1ca6bb..da0feddf40db 100644 --- a/instrumentation/couchbase/couchbase-2-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseQuerySanitizer.java +++ b/instrumentation/couchbase/couchbase-2-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseQuerySanitizer.java @@ -5,10 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.couchbase.v2_0; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlDialect; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementInfo; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementSanitizer; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -17,7 +18,15 @@ public final class CouchbaseQuerySanitizer { private static final SqlStatementSanitizer sanitizer = - SqlStatementSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + SqlStatementSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); @Nullable private static final Class QUERY_CLASS; @Nullable private static final Class STATEMENT_CLASS; diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseSingletons.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseSingletons.java index 2da19976743f..14c29e41b2f2 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseSingletons.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseSingletons.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.couchbase.v2_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; @@ -13,7 +14,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class CouchbaseSingletons { @@ -35,8 +35,9 @@ public final class CouchbaseSingletons { CouchbaseRequestInfo.init(context, couchbaseRequest)) .addOperationMetrics(DbClientMetrics.get()); - if (AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.couchbase.experimental-span-attributes", false)) { + if (DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "couchbase", "experimental_span_attributes") + .orElse(false)) { builder.addAttributesExtractor(new ExperimentalAttributesExtractor()); } diff --git a/instrumentation/dropwizard/dropwizard-metrics-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardmetrics/DropwizardMetricsInstrumentationModule.java b/instrumentation/dropwizard/dropwizard-metrics-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardmetrics/DropwizardMetricsInstrumentationModule.java index fdbd19a42ebe..8724eab94b70 100644 --- a/instrumentation/dropwizard/dropwizard-metrics-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardmetrics/DropwizardMetricsInstrumentationModule.java +++ b/instrumentation/dropwizard/dropwizard-metrics-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardmetrics/DropwizardMetricsInstrumentationModule.java @@ -13,7 +13,6 @@ import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @@ -32,7 +31,7 @@ public ElementMatcher.Junction classLoaderMatcher() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // the Dropwizard metrics API does not have a concept of metric labels/tags/attributes, thus the // data produced by this integration might be of very low quality, depending on how the API is // used in the instrumented application diff --git a/instrumentation/dropwizard/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardSingletons.java b/instrumentation/dropwizard/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardSingletons.java index d9902baa96ab..146c73ba8186 100644 --- a/instrumentation/dropwizard/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardSingletons.java +++ b/instrumentation/dropwizard/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardSingletons.java @@ -7,8 +7,8 @@ import io.dropwizard.views.View; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; public final class DropwizardSingletons { @@ -17,7 +17,14 @@ public final class DropwizardSingletons { private static final Instrumenter INSTRUMENTER = Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, DropwizardSingletons::spanName) - .setEnabled(ExperimentalConfig.get().viewTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "view_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); private static String spanName(View view) { diff --git a/instrumentation/elasticsearch/elasticsearch-rest-common-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestJavaagentInstrumenterFactory.java b/instrumentation/elasticsearch/elasticsearch-rest-common-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestJavaagentInstrumenterFactory.java index 6b6ebe20ccf6..4ffa8c0fd150 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-common-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestJavaagentInstrumenterFactory.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-common-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestJavaagentInstrumenterFactory.java @@ -6,20 +6,23 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.rest; 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.api.internal.HttpConstants; import io.opentelemetry.instrumentation.elasticsearch.rest.common.v5_0.internal.ElasticsearchRestInstrumenterFactory; import io.opentelemetry.instrumentation.elasticsearch.rest.common.v5_0.internal.ElasticsearchRestRequest; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import java.util.function.Function; import org.elasticsearch.client.Response; public final class ElasticsearchRestJavaagentInstrumenterFactory { private static final boolean CAPTURE_SEARCH_QUERY = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.elasticsearch.capture-search-query", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "elasticsearch", "capture_search_query") + .orElse(false); private ElasticsearchRestJavaagentInstrumenterFactory() {} @@ -30,7 +33,13 @@ public static Instrumenter create( instrumentationName, Collections.emptyList(), Function.identity(), - AgentCommonConfig.get().getKnownHttpRequestMethods(), + getKnownHttpMethods(), CAPTURE_SEARCH_QUERY); } + + private static Set getKnownHttpMethods() { + return DeclarativeConfigUtil.getList(GlobalOpenTelemetry.get(), "java", "http", "known_methods") + .map(HashSet::new) + .orElse(new HashSet<>(HttpConstants.KNOWN_METHODS)); + } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportInstrumenterFactory.java b/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportInstrumenterFactory.java index 488ac51bb16e..e604990104b4 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportInstrumenterFactory.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportInstrumenterFactory.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.transport; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; @@ -13,13 +14,13 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import org.elasticsearch.action.ActionResponse; public final class ElasticsearchTransportInstrumenterFactory { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.elasticsearch.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "elasticsearch", "experimental_span_attributes") + .orElse(false); public static Instrumenter create( String instrumentationName, diff --git a/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorMatchers.java b/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorMatchers.java index 717f088e4fcd..ea5722d7e0b9 100644 --- a/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorMatchers.java +++ b/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorMatchers.java @@ -12,7 +12,8 @@ import static net.bytebuddy.matcher.ElementMatchers.any; import static net.bytebuddy.matcher.ElementMatchers.named; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -98,16 +99,17 @@ final class ExecutorMatchers { "scala.concurrent.Future$InternalCallbackExecutor$", "scala.concurrent.impl.ExecutionContextImpl")); combined.addAll( - AgentInstrumentationConfig.get() - .getList("otel.instrumentation.executors.include", emptyList())); + DeclarativeConfigUtil.getList(GlobalOpenTelemetry.get(), "java", "executors", "include") + .orElse(emptyList())); INSTRUMENTED_EXECUTOR_NAMES = Collections.unmodifiableSet(combined); INSTRUMENTED_EXECUTOR_PREFIXES = Collections.singletonList("slick.util.AsyncExecutor$"); } static ElementMatcher.Junction executorNameMatcher() { - if (AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.executors.include-all", false)) { + if (DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "executors", "include_all") + .orElse(false)) { return any(); } diff --git a/instrumentation/external-annotations/javaagent-unit-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/extannotations/IncludeTest.java b/instrumentation/external-annotations/javaagent-unit-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/extannotations/IncludeTest.java index 9f717b107392..f0bb10f3818c 100644 --- a/instrumentation/external-annotations/javaagent-unit-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/extannotations/IncludeTest.java +++ b/instrumentation/external-annotations/javaagent-unit-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/extannotations/IncludeTest.java @@ -7,32 +7,22 @@ import static io.opentelemetry.javaagent.instrumentation.extannotations.ExternalAnnotationInstrumentation.DEFAULT_ANNOTATIONS; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.stream.Stream; -import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -@ExtendWith(MockitoExtension.class) class IncludeTest { - @Mock InstrumentationConfig config; - @ParameterizedTest @MethodSource("provideArguments") void testConfiguration(String value, List expected) { - when(config.getString("otel.instrumentation.external-annotations.include")).thenReturn(value); - - assertThat(ExternalAnnotationInstrumentation.configureAdditionalTraceAnnotations(config)) + assertThat(ExternalAnnotationInstrumentation.configureAdditionalTraceAnnotations(value)) .isEqualTo(new HashSet<>(expected)); } diff --git a/instrumentation/external-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extannotations/ExternalAnnotationInstrumentation.java b/instrumentation/external-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extannotations/ExternalAnnotationInstrumentation.java index 5c39fc2bcbb2..4f9e4d575365 100644 --- a/instrumentation/external-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extannotations/ExternalAnnotationInstrumentation.java +++ b/instrumentation/external-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extannotations/ExternalAnnotationInstrumentation.java @@ -16,11 +16,11 @@ import static net.bytebuddy.matcher.ElementMatchers.none; import static net.bytebuddy.matcher.ElementMatchers.not; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.util.ClassAndMethod; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.tooling.config.MethodsConfigurationParser; @@ -67,11 +67,6 @@ public class ExternalAnnotationInstrumentation implements TypeInstrumentation { "kamon.annotation.api.Trace", "org.springframework.cloud.sleuth.annotation.NewSpan"); - private static final String TRACE_ANNOTATIONS_CONFIG = - "otel.instrumentation.external-annotations.include"; - private static final String TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG = - "otel.instrumentation.external-annotations.exclude-methods"; - private final ElementMatcher.Junction classLoaderOptimization; private final ElementMatcher.Junction traceAnnotationMatcher; @@ -79,8 +74,11 @@ public class ExternalAnnotationInstrumentation implements TypeInstrumentation { private final ElementMatcher.Junction excludedMethodsMatcher; public ExternalAnnotationInstrumentation() { - Set additionalTraceAnnotations = - configureAdditionalTraceAnnotations(AgentInstrumentationConfig.get()); + String configString = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "external_annotations", "include") + .orElse(null); + Set additionalTraceAnnotations = configureAdditionalTraceAnnotations(configString); if (additionalTraceAnnotations.isEmpty()) { classLoaderOptimization = none(); @@ -115,8 +113,7 @@ public void transform(TypeTransformer transformer) { } // visible for testing - static Set configureAdditionalTraceAnnotations(InstrumentationConfig config) { - String configString = config.getString(TRACE_ANNOTATIONS_CONFIG); + static Set configureAdditionalTraceAnnotations(String configString) { if (configString == null) { return Collections.unmodifiableSet(new HashSet<>(DEFAULT_ANNOTATIONS)); } else if (configString.isEmpty()) { @@ -148,7 +145,9 @@ private static ElementMatcher.Junction configureExcludedMetho Map> excludedMethods = MethodsConfigurationParser.parse( - AgentInstrumentationConfig.get().getString(TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG)); + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "external_annotations", "exclude_methods") + .orElse(null)); for (Map.Entry> entry : excludedMethods.entrySet()) { String className = entry.getKey(); ElementMatcher.Junction classMather = diff --git a/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraSingletons.java b/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraSingletons.java index bc08b04d5435..938ecd735859 100644 --- a/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraSingletons.java +++ b/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraSingletons.java @@ -10,13 +10,13 @@ import com.twitter.finatra.http.internal.routing.Route; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.internal.ClassNames; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource; import io.opentelemetry.instrumentation.api.util.VirtualField; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; public final class FinatraSingletons { @@ -36,7 +36,14 @@ public final class FinatraSingletons { ? ClassNames.simpleName(request.controllerClass()) : "") .addAttributesExtractor(CodeAttributesExtractor.create(codeAttributesGetter)) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/geode-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/geode/GeodeDbAttributesGetter.java b/instrumentation/geode-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/geode/GeodeDbAttributesGetter.java index 6ede8c66ff5c..ffe653209a68 100644 --- a/instrumentation/geode-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/geode/GeodeDbAttributesGetter.java +++ b/instrumentation/geode-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/geode/GeodeDbAttributesGetter.java @@ -5,16 +5,25 @@ package io.opentelemetry.javaagent.instrumentation.geode; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesGetter; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementSanitizer; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import javax.annotation.Nullable; final class GeodeDbAttributesGetter implements DbClientAttributesGetter { private static final SqlStatementSanitizer sanitizer = - SqlStatementSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + SqlStatementSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); @SuppressWarnings("deprecation") // using deprecated DbSystemIncubatingValues @Override diff --git a/instrumentation/grails-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grails/GrailsSingletons.java b/instrumentation/grails-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grails/GrailsSingletons.java index e12b8418aa3f..a3727cf21539 100644 --- a/instrumentation/grails-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grails/GrailsSingletons.java +++ b/instrumentation/grails-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grails/GrailsSingletons.java @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.grails; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; 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"; @@ -25,7 +25,14 @@ public final class GrailsSingletons { INSTRUMENTATION_NAME, CodeSpanNameExtractor.create(codeAttributesGetter)) .addAttributesExtractor(CodeAttributesExtractor.create(codeAttributesGetter)) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/graphql-java/graphql-java-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/graphql/v12_0/GraphqlSingletons.java b/instrumentation/graphql-java/graphql-java-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/graphql/v12_0/GraphqlSingletons.java index 79e0130d3129..c19964325788 100644 --- a/instrumentation/graphql-java/graphql-java-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/graphql/v12_0/GraphqlSingletons.java +++ b/instrumentation/graphql-java/graphql-java-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/graphql/v12_0/GraphqlSingletons.java @@ -7,22 +7,28 @@ import graphql.execution.instrumentation.Instrumentation; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.graphql.internal.InstrumentationUtil; import io.opentelemetry.instrumentation.graphql.v12_0.GraphQLTelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class GraphqlSingletons { private static final boolean CAPTURE_QUERY = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.graphql.capture-query", true); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "graphql", "capture_query") + .orElse(true); private static final boolean QUERY_SANITIZATION_ENABLED = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.graphql.query-sanitizer.enabled", true); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "graphql", "query_sanitizer", "enabled") + .orElse(true); private static final boolean ADD_OPERATION_NAME_TO_SPAN_NAME = - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.graphql.add-operation-name-to-span-name.enabled", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "graphql", + "add_operation_name_to_span_name", + "enabled") + .orElse(false); private static final GraphQLTelemetry TELEMETRY = GraphQLTelemetry.builder(GlobalOpenTelemetry.get()) diff --git a/instrumentation/graphql-java/graphql-java-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/graphql/v20_0/GraphqlSingletons.java b/instrumentation/graphql-java/graphql-java-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/graphql/v20_0/GraphqlSingletons.java index 99845529f985..16edbb83705a 100644 --- a/instrumentation/graphql-java/graphql-java-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/graphql/v20_0/GraphqlSingletons.java +++ b/instrumentation/graphql-java/graphql-java-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/graphql/v20_0/GraphqlSingletons.java @@ -7,28 +7,36 @@ import graphql.execution.instrumentation.Instrumentation; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.graphql.internal.InstrumentationUtil; import io.opentelemetry.instrumentation.graphql.v20_0.GraphQLTelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class GraphqlSingletons { private static final boolean CAPTURE_QUERY = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.graphql.capture-query", true); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "graphql", "capture_query") + .orElse(true); private static final boolean QUERY_SANITIZATION_ENABLED = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.graphql.query-sanitizer.enabled", true); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "graphql", "query_sanitizer", "enabled") + .orElse(true); private static final boolean DATA_FETCHER_ENABLED = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.graphql.data-fetcher.enabled", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "graphql", "data_fetcher", "enabled") + .orElse(false); private static final boolean TRIVIAL_DATA_FETCHER_ENABLED = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.graphql.trivial-data-fetcher.enabled", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "graphql", "trivial_data_fetcher", "enabled") + .orElse(false); private static final boolean ADD_OPERATION_NAME_TO_SPAN_NAME = - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.graphql.add-operation-name-to-span-name.enabled", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "graphql", + "add_operation_name_to_span_name", + "enabled") + .orElse(false); private static final GraphQLTelemetry TELEMETRY = GraphQLTelemetry.builder(GlobalOpenTelemetry.get()) diff --git a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcSingletons.java b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcSingletons.java index 987e55d0116f..c421693d6547 100644 --- a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcSingletons.java +++ b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcSingletons.java @@ -13,10 +13,10 @@ import io.grpc.ServerBuilder; import io.grpc.ServerInterceptor; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.instrumentation.grpc.v1_6.GrpcTelemetry; import io.opentelemetry.instrumentation.grpc.v1_6.internal.ContextStorageBridge; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.util.List; import java.util.concurrent.atomic.AtomicReference; @@ -38,19 +38,23 @@ public final class GrpcSingletons { static { boolean emitMessageEvents = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.grpc.emit-message-events", true); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "grpc", "emit_message_events") + .orElse(true); boolean experimentalSpanAttributes = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.grpc.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "grpc", "experimental_span_attributes") + .orElse(false); List clientRequestMetadata = - AgentInstrumentationConfig.get() - .getList("otel.instrumentation.grpc.capture-metadata.client.request", emptyList()); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "grpc", "capture_metadata", "client", "request") + .orElse(emptyList()); List serverRequestMetadata = - AgentInstrumentationConfig.get() - .getList("otel.instrumentation.grpc.capture-metadata.server.request", emptyList()); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "grpc", "capture_metadata", "server", "request") + .orElse(emptyList()); GrpcTelemetry telemetry = GrpcTelemetry.builder(GlobalOpenTelemetry.get()) diff --git a/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java b/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java index d1d8bbc637f0..871468fed716 100644 --- a/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java +++ b/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java @@ -5,17 +5,19 @@ package io.opentelemetry.javaagent.instrumentation.guava.v10_0; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.guava.v10_0.GuavaAsyncOperationEndStrategy; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class InstrumentationHelper { static { asyncOperationEndStrategy = GuavaAsyncOperationEndStrategy.builder() .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.guava.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "guava", "experimental_span_attributes") + .orElse(false)) .build(); registerAsyncSpanEndStrategy(); diff --git a/instrumentation/helidon-4.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/helidon/v4_3/HelidonSingletons.java b/instrumentation/helidon-4.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/helidon/v4_3/HelidonSingletons.java index c5ad2275ddde..5818ad9499b9 100644 --- a/instrumentation/helidon-4.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/helidon/v4_3/HelidonSingletons.java +++ b/instrumentation/helidon-4.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/helidon/v4_3/HelidonSingletons.java @@ -9,7 +9,6 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.helidon.v4_3.HelidonTelemetry; import io.opentelemetry.instrumentation.helidon.v4_3.internal.HelidonInstrumenterBuilderUtil; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import java.util.List; public final class HelidonSingletons { @@ -20,7 +19,7 @@ public final class HelidonSingletons { var serverBuilder = HelidonTelemetry.builder(GlobalOpenTelemetry.get()); HelidonInstrumenterBuilderUtil.getServerBuilderExtractor() .apply(serverBuilder) - .configure(AgentCommonConfig.get()); + .configure(GlobalOpenTelemetry.get()); var serverTelemetry = serverBuilder.build(); FILTERS = List.of(serverTelemetry.createFilter(), new ResponseCustomizingFilter()); diff --git a/instrumentation/hibernate/hibernate-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/HibernateInstrumenterFactory.java b/instrumentation/hibernate/hibernate-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/HibernateInstrumenterFactory.java index 217454ef1c8f..e68b346ee288 100644 --- a/instrumentation/hibernate/hibernate-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/HibernateInstrumenterFactory.java +++ b/instrumentation/hibernate/hibernate-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/HibernateInstrumenterFactory.java @@ -6,14 +6,15 @@ package io.opentelemetry.javaagent.instrumentation.hibernate; 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.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class HibernateInstrumenterFactory { static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.hibernate.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "hibernate", "experimental_span_attributes") + .orElse(false); public static Instrumenter createInstrumenter( String instrumentationName) { diff --git a/instrumentation/hibernate/hibernate-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/OperationNameUtil.java b/instrumentation/hibernate/hibernate-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/OperationNameUtil.java index 60783d0822d3..b04c680487b4 100644 --- a/instrumentation/hibernate/hibernate-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/OperationNameUtil.java +++ b/instrumentation/hibernate/hibernate-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/OperationNameUtil.java @@ -5,15 +5,24 @@ package io.opentelemetry.javaagent.instrumentation.hibernate; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementInfo; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementSanitizer; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import java.util.function.Function; public final class OperationNameUtil { private static final SqlStatementSanitizer sanitizer = - SqlStatementSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + SqlStatementSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); public static String getOperationNameForQuery(String query) { // set operation to default value that is used when sql sanitizer fails to extract diff --git a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpMethodAttributeExtractor.java b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpMethodAttributeExtractor.java index 3c522826d044..08e23a15e53f 100644 --- a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpMethodAttributeExtractor.java +++ b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpMethodAttributeExtractor.java @@ -11,9 +11,9 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientUrlTemplate; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.semconv.HttpAttributes; import java.net.HttpURLConnection; import java.util.Set; @@ -29,7 +29,13 @@ public class HttpMethodAttributeExtractor< private HttpMethodAttributeExtractor(Set knownMethods) { this.knownMethods = knownMethods; emitExperimentalHttpClientTelemetry = - AgentCommonConfig.get().shouldEmitExperimentalHttpClientTelemetry(); + DeclarativeConfigUtil.getBoolean( + io.opentelemetry.api.GlobalOpenTelemetry.get(), + "java", + "http", + "client", + "emit_experimental_telemetry") + .orElse(false); } public static AttributesExtractor create( diff --git a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionSingletons.java b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionSingletons.java index 3c502e3f838f..5c8f8ac694c6 100644 --- a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionSingletons.java +++ b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionSingletons.java @@ -5,11 +5,15 @@ package io.opentelemetry.javaagent.instrumentation.httpurlconnection; +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.api.internal.HttpConstants; import io.opentelemetry.instrumentation.api.util.VirtualField; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import java.net.HttpURLConnection; +import java.util.HashSet; +import java.util.Set; public final class HttpUrlConnectionSingletons { @@ -27,8 +31,7 @@ public final class HttpUrlConnectionSingletons { builder -> builder .addAttributesExtractor( - HttpMethodAttributeExtractor.create( - AgentCommonConfig.get().getKnownHttpRequestMethods())) + HttpMethodAttributeExtractor.create(getKnownHttpMethods())) .addContextCustomizer( (context, httpRequestPacket, startAttributes) -> GetOutputStreamContext.init(context))); @@ -38,5 +41,11 @@ public static Instrumenter instrumenter() { return INSTRUMENTER; } + private static Set getKnownHttpMethods() { + return DeclarativeConfigUtil.getList(GlobalOpenTelemetry.get(), "java", "http", "known_methods") + .map(HashSet::new) + .orElse(new HashSet<>(HttpConstants.KNOWN_METHODS)); + } + private HttpUrlConnectionSingletons() {} } diff --git a/instrumentation/hystrix-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hystrix/HystrixSingletons.java b/instrumentation/hystrix-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hystrix/HystrixSingletons.java index 8a5ea9b501c4..db8fa2615417 100644 --- a/instrumentation/hystrix-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hystrix/HystrixSingletons.java +++ b/instrumentation/hystrix-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hystrix/HystrixSingletons.java @@ -6,9 +6,9 @@ package io.opentelemetry.javaagent.instrumentation.hystrix; 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.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class HystrixSingletons { @@ -21,8 +21,9 @@ public final class HystrixSingletons { Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, HystrixRequest::spanName); - if (AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.hystrix.experimental-span-attributes", false)) { + if (DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "hystrix", "experimental_span_attributes") + .orElse(false)) { builder.addAttributesExtractor(new ExperimentalAttributesExtractor()); } diff --git a/instrumentation/influxdb-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbRequest.java b/instrumentation/influxdb-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbRequest.java index 560993c266d4..78f41701b26a 100644 --- a/instrumentation/influxdb-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbRequest.java +++ b/instrumentation/influxdb-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbRequest.java @@ -6,16 +6,25 @@ package io.opentelemetry.javaagent.instrumentation.influxdb.v2_4; import com.google.auto.value.AutoValue; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementInfo; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementSanitizer; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import javax.annotation.Nullable; @AutoValue public abstract class InfluxDbRequest { private static final SqlStatementSanitizer sanitizer = - SqlStatementSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + SqlStatementSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); public static InfluxDbRequest create( String host, int port, String dbName, String operation, String sql) { diff --git a/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingIgnoredTypesConfigurer.java b/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingIgnoredTypesConfigurer.java index ba72c20c3049..1e1335971af5 100644 --- a/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingIgnoredTypesConfigurer.java +++ b/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public final class ApplicationLoggingIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { builder.allowClass("org.slf4j.LoggerFactory"); builder.allowClass("org.springframework.boot.SpringApplication"); builder.allowClass("org.springframework.boot.logging.LoggingApplicationListener"); diff --git a/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java b/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java index b9a728f7d2ed..2d4fd07a8146 100644 --- a/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java +++ b/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java @@ -8,9 +8,10 @@ import static java.util.Arrays.asList; import com.google.auto.service.AutoService; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @AutoService(InstrumentationModule.class) @@ -21,10 +22,21 @@ public ApplicationLoggingInstrumentationModule() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // only enable this instrumentation if the application logger is enabled - return super.defaultEnabled(config) - && "application".equals(config.getString("otel.javaagent.logging")); + return superDefaultEnabled() + && DeclarativeConfigUtil.getString(GlobalOpenTelemetry.get(), "java", "agent", "logging") + .map(value -> "application".equals(value)) + .orElse(false); + } + + // This method can be removed and super.defaultEnabled() can be used instead once the deprecated + // InstrumentationModule.defaultEnabled(ConfigProperties) is removed, at which point + // InstrumentationModule.defaultEnabled() will no longer need to throw an exception. + private static boolean superDefaultEnabled() { + return DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "default_enabled") + .orElse(true); } @Override diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderIgnoredTypesConfigurer.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderIgnoredTypesConfigurer.java index 727423673347..8ab4956e98ff 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderIgnoredTypesConfigurer.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class ClassLoaderIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { builder.allowClass("jdk.internal.loader.BuiltinClassLoader"); builder.allowClass("sun.misc.Launcher$AppClassLoader"); } diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java index ffbda5b61949..bdc22c0ac5bb 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java @@ -11,7 +11,6 @@ import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @AutoService(InstrumentationModule.class) @@ -22,7 +21,7 @@ public ClassLoaderInstrumentationModule() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // internal instrumentations are always enabled by default return true; } diff --git a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java index 8def552c2518..2ad4cd966fc6 100644 --- a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java +++ b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java @@ -11,7 +11,6 @@ import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @AutoService(InstrumentationModule.class) @@ -22,7 +21,7 @@ public EclipseOsgiInstrumentationModule() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // internal instrumentations are always enabled by default return true; } diff --git a/instrumentation/internal/internal-lambda/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/lambda/LambdaInstrumentationModule.java b/instrumentation/internal/internal-lambda/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/lambda/LambdaInstrumentationModule.java index 41a903f8baf0..980916d37c2d 100644 --- a/instrumentation/internal/internal-lambda/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/lambda/LambdaInstrumentationModule.java +++ b/instrumentation/internal/internal-lambda/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/lambda/LambdaInstrumentationModule.java @@ -11,7 +11,6 @@ import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.Collections; import java.util.List; @@ -23,7 +22,7 @@ public LambdaInstrumentationModule() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // internal instrumentations are always enabled by default return true; } diff --git a/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionIgnoredTypesConfigurer.java b/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionIgnoredTypesConfigurer.java index 426d0a618ed1..e8ca37cee760 100644 --- a/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionIgnoredTypesConfigurer.java +++ b/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class ReflectionIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { builder.allowClass("jdk.internal.reflect.Reflection"); builder.allowClass("sun.reflect.Reflection"); builder.allowClass("java.lang.Class"); diff --git a/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionInstrumentationModule.java b/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionInstrumentationModule.java index b22464b81215..5725dc1e8a48 100644 --- a/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionInstrumentationModule.java +++ b/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionInstrumentationModule.java @@ -13,7 +13,6 @@ import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.ClassInjector; import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.InjectionMode; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @AutoService(InstrumentationModule.class) @@ -24,7 +23,7 @@ public ReflectionInstrumentationModule() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // internal instrumentations are always enabled by default return true; } diff --git a/instrumentation/internal/internal-url-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/urlclassloader/UrlClassLoaderInstrumentationModule.java b/instrumentation/internal/internal-url-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/urlclassloader/UrlClassLoaderInstrumentationModule.java index a4cd602e602b..03f92be72deb 100644 --- a/instrumentation/internal/internal-url-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/urlclassloader/UrlClassLoaderInstrumentationModule.java +++ b/instrumentation/internal/internal-url-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/urlclassloader/UrlClassLoaderInstrumentationModule.java @@ -10,7 +10,6 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @AutoService(InstrumentationModule.class) @@ -20,7 +19,7 @@ public UrlClassLoaderInstrumentationModule() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // internal instrumentations are always enabled by default return true; } diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerSingletons.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerSingletons.java index 997b325f6410..5bf14569922b 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerSingletons.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerSingletons.java @@ -7,11 +7,9 @@ import com.sun.net.httpserver.Filter; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; import io.opentelemetry.instrumentation.javahttpserver.JavaHttpServerTelemetry; import io.opentelemetry.instrumentation.javahttpserver.JavaHttpServerTelemetryBuilder; import io.opentelemetry.instrumentation.javahttpserver.internal.JavaHttpServerInstrumenterBuilderUtil; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import java.util.Arrays; import java.util.List; @@ -20,13 +18,11 @@ public final class JavaHttpServerSingletons { public static final List FILTERS; static { - CommonConfig config = AgentCommonConfig.get(); - JavaHttpServerTelemetryBuilder serverBuilder = JavaHttpServerTelemetry.builder(GlobalOpenTelemetry.get()); JavaHttpServerInstrumenterBuilderUtil.getServerBuilderExtractor() .apply(serverBuilder) - .configure(config); + .configure(GlobalOpenTelemetry.get()); JavaHttpServerTelemetry serverTelemetry = serverBuilder.build(); FILTERS = Arrays.asList(serverTelemetry.newFilter(), new ResponseCustomizingFilter()); diff --git a/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java b/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java index dfc29d6ad673..25a0d8b4a2a6 100644 --- a/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java +++ b/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java @@ -13,7 +13,7 @@ import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import java.util.concurrent.TimeUnit; import java.util.logging.Formatter; @@ -25,8 +25,9 @@ public final class JavaUtilLoggingHelper { private static final Formatter FORMATTER = new AccessibleFormatter(); private static final boolean captureExperimentalAttributes = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.java-util-logging.experimental-log-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "java_util_logging", "experimental_log_attributes") + .orElse(false); public static void capture(Logger logger, LogRecord logRecord) { diff --git a/instrumentation/jaxrs/jaxrs-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxrsInstrumentationModule.java b/instrumentation/jaxrs/jaxrs-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxrsInstrumentationModule.java index 3e43025d9209..7c1fe5efc057 100644 --- a/instrumentation/jaxrs/jaxrs-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxrsInstrumentationModule.java +++ b/instrumentation/jaxrs/jaxrs-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxrsInstrumentationModule.java @@ -10,11 +10,11 @@ import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @@ -37,11 +37,27 @@ public List typeInstrumentations() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // This instrumentation produces controller telemetry and sets http route. Http route is set by // this instrumentation only when it was not already set by a jax-rs framework instrumentation. // This instrumentation uses complex type matcher, disabling it can improve startup performance. - return super.defaultEnabled(config) && ExperimentalConfig.get().controllerTelemetryEnabled(); + return superDefaultEnabled() + && DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false); + } + + // This method can be removed and super.defaultEnabled() can be used instead once the deprecated + // InstrumentationModule.defaultEnabled(ConfigProperties) is removed, at which point + // InstrumentationModule.defaultEnabled() will no longer need to throw an exception. + private static boolean superDefaultEnabled() { + return DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "default_enabled") + .orElse(true); } @Override diff --git a/instrumentation/jaxrs/jaxrs-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxrsSingletons.java b/instrumentation/jaxrs/jaxrs-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxrsSingletons.java index 8a4bc94451be..d58f1030c73f 100644 --- a/instrumentation/jaxrs/jaxrs-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxrsSingletons.java +++ b/instrumentation/jaxrs/jaxrs-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxrsSingletons.java @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs.v1_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; public final class JaxrsSingletons { @@ -26,7 +26,14 @@ public final class JaxrsSingletons { INSTRUMENTATION_NAME, CodeSpanNameExtractor.create(codeAttributesGetter)) .addAttributesExtractor(CodeAttributesExtractor.create(codeAttributesGetter)) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxrsAnnotationsInstrumentationModule.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxrsAnnotationsInstrumentationModule.java index 91c849d8bea4..52989b95563e 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxrsAnnotationsInstrumentationModule.java +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxrsAnnotationsInstrumentationModule.java @@ -9,11 +9,11 @@ import static java.util.Arrays.asList; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @@ -40,11 +40,27 @@ public List typeInstrumentations() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // This instrumentation produces controller telemetry and sets http route. Http route is set by // this instrumentation only when it was not already set by a jax-rs framework instrumentation. // This instrumentation uses complex type matcher, disabling it can improve startup performance. - return super.defaultEnabled(config) && ExperimentalConfig.get().controllerTelemetryEnabled(); + return superDefaultEnabled() + && DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false); + } + + // This method can be removed and super.defaultEnabled() can be used instead once the deprecated + // InstrumentationModule.defaultEnabled(ConfigProperties) is removed, at which point + // InstrumentationModule.defaultEnabled() will no longer need to throw an exception. + private static boolean superDefaultEnabled() { + return DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "default_enabled") + .orElse(true); } @Override diff --git a/instrumentation/jaxrs/jaxrs-3.0/jaxrs-3.0-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v3_0/JaxrsAnnotationsInstrumentationModule.java b/instrumentation/jaxrs/jaxrs-3.0/jaxrs-3.0-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v3_0/JaxrsAnnotationsInstrumentationModule.java index 388dc34a907f..8443cd18e715 100644 --- a/instrumentation/jaxrs/jaxrs-3.0/jaxrs-3.0-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v3_0/JaxrsAnnotationsInstrumentationModule.java +++ b/instrumentation/jaxrs/jaxrs-3.0/jaxrs-3.0-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v3_0/JaxrsAnnotationsInstrumentationModule.java @@ -9,11 +9,11 @@ import static java.util.Arrays.asList; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @@ -40,11 +40,27 @@ public List typeInstrumentations() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // This instrumentation produces controller telemetry and sets http route. Http route is set by // this instrumentation only when it was not already set by a jax-rs framework instrumentation. // This instrumentation uses complex type matcher, disabling it can improve startup performance. - return super.defaultEnabled(config) && ExperimentalConfig.get().controllerTelemetryEnabled(); + return superDefaultEnabled() + && DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false); + } + + // This method can be removed and super.defaultEnabled() can be used instead once the deprecated + // InstrumentationModule.defaultEnabled(ConfigProperties) is removed, at which point + // InstrumentationModule.defaultEnabled() will no longer need to throw an exception. + private static boolean superDefaultEnabled() { + return DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "default_enabled") + .orElse(true); } @Override diff --git a/instrumentation/jaxrs/jaxrs-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/JaxrsConfig.java b/instrumentation/jaxrs/jaxrs-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/JaxrsConfig.java index 3457cfba7f24..596b46bde44a 100644 --- a/instrumentation/jaxrs/jaxrs-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/JaxrsConfig.java +++ b/instrumentation/jaxrs/jaxrs-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/JaxrsConfig.java @@ -5,13 +5,15 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; public final class JaxrsConfig { public static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.jaxrs.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "jaxrs", "experimental_span_attributes") + .orElse(false); private JaxrsConfig() {} } diff --git a/instrumentation/jaxrs/jaxrs-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/JaxrsInstrumenterFactory.java b/instrumentation/jaxrs/jaxrs-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/JaxrsInstrumenterFactory.java index ae2096cbdaab..8006e11f71f9 100644 --- a/instrumentation/jaxrs/jaxrs-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/JaxrsInstrumenterFactory.java +++ b/instrumentation/jaxrs/jaxrs-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/JaxrsInstrumenterFactory.java @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; public final class JaxrsInstrumenterFactory { @@ -21,7 +21,14 @@ public static Instrumenter createInstrumenter(String instrume instrumentationName, CodeSpanNameExtractor.create(codeAttributesGetter)) .addAttributesExtractor(CodeAttributesExtractor.create(codeAttributesGetter)) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/jaxws/jaxws-2.0-axis2-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/axis2/Axis2Singletons.java b/instrumentation/jaxws/jaxws-2.0-axis2-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/axis2/Axis2Singletons.java index 1ffb4e74b6e1..a59dbd3045f9 100644 --- a/instrumentation/jaxws/jaxws-2.0-axis2-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/axis2/Axis2Singletons.java +++ b/instrumentation/jaxws/jaxws-2.0-axis2-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/axis2/Axis2Singletons.java @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.axis2; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; 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"; @@ -18,7 +18,14 @@ public class Axis2Singletons { INSTRUMENTER = Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, Axis2Request::spanName) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/jaxws/jaxws-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxws/common/JaxWsInstrumenterFactory.java b/instrumentation/jaxws/jaxws-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxws/common/JaxWsInstrumenterFactory.java index 0a3502758ec0..05ebbeb8c39a 100644 --- a/instrumentation/jaxws/jaxws-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxws/common/JaxWsInstrumenterFactory.java +++ b/instrumentation/jaxws/jaxws-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxws/common/JaxWsInstrumenterFactory.java @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.jaxws.common; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; public final class JaxWsInstrumenterFactory { @@ -21,7 +21,14 @@ public static Instrumenter createInstrumenter(String instrum instrumentationName, CodeSpanNameExtractor.create(codeAttributesGetter)) .addAttributesExtractor(CodeAttributesExtractor.create(codeAttributesGetter)) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/jaxws/jaxws-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/CxfSingletons.java b/instrumentation/jaxws/jaxws-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/CxfSingletons.java index b048d97985b8..9f206a43b692 100644 --- a/instrumentation/jaxws/jaxws-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/CxfSingletons.java +++ b/instrumentation/jaxws/jaxws-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/CxfSingletons.java @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.cxf; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; 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-cxf-3.0"; @@ -18,7 +18,14 @@ public class CxfSingletons { INSTRUMENTER = Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, CxfRequest::spanName) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/jaxws/jaxws-jws-api-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxws/jws/v1_1/JwsInstrumentationModule.java b/instrumentation/jaxws/jaxws-jws-api-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxws/jws/v1_1/JwsInstrumentationModule.java index 414ef6fd8295..080b8b796901 100644 --- a/instrumentation/jaxws/jaxws-jws-api-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxws/jws/v1_1/JwsInstrumentationModule.java +++ b/instrumentation/jaxws/jaxws-jws-api-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxws/jws/v1_1/JwsInstrumentationModule.java @@ -6,11 +6,11 @@ package io.opentelemetry.javaagent.instrumentation.jaxws.jws.v1_1; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.Collections; import java.util.List; @@ -28,9 +28,25 @@ public List typeInstrumentations() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // this instrumentation only produces controller telemetry - return super.defaultEnabled(config) && ExperimentalConfig.get().controllerTelemetryEnabled(); + return superDefaultEnabled() + && DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false); + } + + // This method can be removed and super.defaultEnabled() can be used instead once the deprecated + // InstrumentationModule.defaultEnabled(ConfigProperties) is removed, at which point + // InstrumentationModule.defaultEnabled() will no longer need to throw an exception. + private static boolean superDefaultEnabled() { + return DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "default_enabled") + .orElse(true); } @Override diff --git a/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroSingletons.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroSingletons.java index aa6ef3858d56..3f58cd07958d 100644 --- a/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroSingletons.java +++ b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroSingletons.java @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.metro; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; 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-metro-2.2"; @@ -18,7 +18,14 @@ public class MetroSingletons { INSTRUMENTER = Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, MetroRequest::spanName) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java index c9df4e328c04..86bc14830a01 100644 --- a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java +++ b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java @@ -14,8 +14,8 @@ import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.internal.cache.Cache; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import java.util.List; import java.util.Map; @@ -36,23 +36,31 @@ public final class LoggingEventMapper { private final List captureMdcAttributes; private static final boolean captureExperimentalAttributes = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.jboss-logmanager.experimental-log-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "jboss_logmanager", "experimental_log_attributes") + .orElse(false); // cached as an optimization private final boolean captureAllMdcAttributes; private final boolean captureEventName = - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.jboss-logmanager.experimental.capture-event-name", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "jboss_logmanager", + "experimental", + "capture_event_name") + .orElse(false); private LoggingEventMapper() { this.captureMdcAttributes = - AgentInstrumentationConfig.get() - .getList( - "otel.instrumentation.jboss-logmanager.experimental.capture-mdc-attributes", - emptyList()); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "jboss_logmanager", + "experimental", + "capture_mdc_attributes") + .orElse(emptyList()); this.captureAllMdcAttributes = captureMdcAttributes.size() == 1 && captureMdcAttributes.get(0).equals("*"); } diff --git a/instrumentation/jboss-logmanager/jboss-logmanager-mdc-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/mdc/v1_1/JbossExtLogRecordInstrumentation.java b/instrumentation/jboss-logmanager/jboss-logmanager-mdc-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/mdc/v1_1/JbossExtLogRecordInstrumentation.java index d78750cb16c2..2f5e2d649c14 100644 --- a/instrumentation/jboss-logmanager/jboss-logmanager-mdc-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/mdc/v1_1/JbossExtLogRecordInstrumentation.java +++ b/instrumentation/jboss-logmanager/jboss-logmanager-mdc-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/mdc/v1_1/JbossExtLogRecordInstrumentation.java @@ -11,8 +11,10 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.SpanContext; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; +import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import java.util.Map; @@ -57,9 +59,21 @@ public static String onExit( @Advice.Argument(0) String key, @Advice.Return @Nullable String value) { - boolean traceId = AgentCommonConfig.get().getTraceIdKey().equals(key); - boolean spanId = AgentCommonConfig.get().getSpanIdKey().equals(key); - boolean traceFlags = AgentCommonConfig.get().getTraceFlagsKey().equals(key); + String traceIdKey = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "trace_id") + .orElse(LoggingContextConstants.TRACE_ID); + String spanIdKey = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "span_id") + .orElse(LoggingContextConstants.SPAN_ID); + String traceFlagsKey = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "trace_flags") + .orElse(LoggingContextConstants.TRACE_FLAGS); + boolean traceId = traceIdKey.equals(key); + boolean spanId = spanIdKey.equals(key); + boolean traceFlags = traceFlagsKey.equals(key); if (!traceId && !spanId && !traceFlags) { return value; @@ -93,9 +107,22 @@ public static class GetMdcCopyAdvice { public static Map onExit( @Advice.This ExtLogRecord record, @Advice.Return Map value) { - if (value.containsKey(AgentCommonConfig.get().getTraceIdKey()) - && value.containsKey(AgentCommonConfig.get().getSpanIdKey()) - && value.containsKey(AgentCommonConfig.get().getTraceFlagsKey())) { + String traceIdKey = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "trace_id") + .orElse(LoggingContextConstants.TRACE_ID); + String spanIdKey = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "span_id") + .orElse(LoggingContextConstants.SPAN_ID); + String traceFlagsKey = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "trace_flags") + .orElse(LoggingContextConstants.TRACE_FLAGS); + + if (value.containsKey(traceIdKey) + && value.containsKey(spanIdKey) + && value.containsKey(traceFlagsKey)) { return value; } @@ -104,16 +131,16 @@ public static Map onExit( return value; } - if (!value.containsKey(AgentCommonConfig.get().getTraceIdKey())) { - value.put(AgentCommonConfig.get().getTraceIdKey(), spanContext.getTraceId()); + if (!value.containsKey(traceIdKey)) { + value.put(traceIdKey, spanContext.getTraceId()); } - if (!value.containsKey(AgentCommonConfig.get().getSpanIdKey())) { - value.put(AgentCommonConfig.get().getSpanIdKey(), spanContext.getSpanId()); + if (!value.containsKey(spanIdKey)) { + value.put(spanIdKey, spanContext.getSpanId()); } - if (!value.containsKey(AgentCommonConfig.get().getTraceFlagsKey())) { - value.put(AgentCommonConfig.get().getTraceFlagsKey(), spanContext.getTraceFlags().asHex()); + if (!value.containsKey(traceFlagsKey)) { + value.put(traceFlagsKey, spanContext.getTraceFlags().asHex()); } return value; } diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcIgnoredTypesConfigurer.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcIgnoredTypesConfigurer.java index 4301a3352588..1de16fe496dd 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcIgnoredTypesConfigurer.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class JdbcIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/5946 builder.ignoreClass("org.jboss.jca.adapters.jdbc."); // see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/8109 diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcSingletons.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcSingletons.java index 30bfbfffc9d5..f5bba72d5fb8 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcSingletons.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcSingletons.java @@ -8,17 +8,17 @@ import static io.opentelemetry.instrumentation.jdbc.internal.JdbcInstrumenterFactory.createDataSourceInstrumenter; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.SqlCommenter; import io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.SqlCommenterBuilder; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.internal.cache.Cache; import io.opentelemetry.instrumentation.jdbc.internal.DbRequest; import io.opentelemetry.instrumentation.jdbc.internal.JdbcAttributesGetter; import io.opentelemetry.instrumentation.jdbc.internal.JdbcInstrumenterFactory; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.bootstrap.internal.sqlcommenter.SqlCommenterCustomizerHolder; import io.opentelemetry.javaagent.bootstrap.jdbc.DbInfo; import java.sql.Connection; @@ -39,29 +39,47 @@ public final class JdbcSingletons { static { AttributesExtractor peerServiceExtractor = PeerServiceAttributesExtractor.create( - JdbcAttributesGetter.INSTANCE, AgentCommonConfig.get().getPeerServiceResolver()); + JdbcAttributesGetter.INSTANCE, PeerServiceResolver.create(GlobalOpenTelemetry.get())); CAPTURE_QUERY_PARAMETERS = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.jdbc.experimental.capture-query-parameters", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "jdbc", + "experimental", + "capture_query_parameters") + .orElse(false); STATEMENT_INSTRUMENTER = JdbcInstrumenterFactory.createStatementInstrumenter( GlobalOpenTelemetry.get(), Collections.singletonList(peerServiceExtractor), true, - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.jdbc.statement-sanitizer.enabled", - AgentCommonConfig.get().isStatementSanitizationEnabled()), + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "jdbc", "statement_sanitizer", "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)), CAPTURE_QUERY_PARAMETERS); TRANSACTION_INSTRUMENTER = JdbcInstrumenterFactory.createTransactionInstrumenter( GlobalOpenTelemetry.get(), Collections.singletonList(peerServiceExtractor), - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.jdbc.experimental.transaction.enabled", false)); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "jdbc", + "experimental", + "transaction", + "enabled") + .orElse(false)); } public static Instrumenter transactionInstrumenter() { @@ -105,10 +123,22 @@ private static boolean isWrapperInternal(T object, Class private static SqlCommenter configureSqlCommenter() { SqlCommenterBuilder builder = SqlCommenter.builder(); builder.setEnabled( - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.jdbc.experimental.sqlcommenter.enabled", - AgentCommonConfig.get().isSqlCommenterEnabled())); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "jdbc", + "experimental", + "sqlcommenter", + "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "sqlcommenter/development") + .orElse(false))); SqlCommenterCustomizerHolder.getCustomizer().customize(builder); return builder.build(); } diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/datasource/DataSourceInstrumentationModule.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/datasource/DataSourceInstrumentationModule.java index f52a10fe869c..36f012ad2d83 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/datasource/DataSourceInstrumentationModule.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/datasource/DataSourceInstrumentationModule.java @@ -11,7 +11,6 @@ import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @AutoService(InstrumentationModule.class) @@ -27,7 +26,7 @@ public List typeInstrumentations() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { return false; } diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisDbAttributesGetter.java b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisDbAttributesGetter.java index 7d0c1ae3e9f8..c0821adfa157 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisDbAttributesGetter.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisDbAttributesGetter.java @@ -5,15 +5,24 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v1_4; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesGetter; import io.opentelemetry.instrumentation.api.incubator.semconv.db.RedisCommandSanitizer; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; final class JedisDbAttributesGetter implements DbClientAttributesGetter { private static final RedisCommandSanitizer sanitizer = - RedisCommandSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + RedisCommandSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); @Override public String getDbSystem(JedisRequest request) { diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisSingletons.java b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisSingletons.java index b80041cc3b77..c3175074765a 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisSingletons.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisSingletons.java @@ -10,10 +10,10 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; public final class JedisSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jedis-1.4"; @@ -33,7 +33,7 @@ public final class JedisSingletons { .addAttributesExtractor(ServerAttributesExtractor.create(netAttributesGetter)) .addAttributesExtractor( PeerServiceAttributesExtractor.create( - netAttributesGetter, AgentCommonConfig.get().getPeerServiceResolver())) + netAttributesGetter, PeerServiceResolver.create(GlobalOpenTelemetry.get()))) .addOperationMetrics(DbClientMetrics.get()) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } diff --git a/instrumentation/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisRequest.java b/instrumentation/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisRequest.java index 36b71513660e..349363100fdd 100644 --- a/instrumentation/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisRequest.java +++ b/instrumentation/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisRequest.java @@ -6,8 +6,9 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v3_0; import com.google.auto.value.AutoValue; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.RedisCommandSanitizer; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import java.nio.charset.StandardCharsets; import java.util.List; import redis.clients.jedis.Connection; @@ -18,7 +19,15 @@ public abstract class JedisRequest { private static final RedisCommandSanitizer sanitizer = - RedisCommandSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + RedisCommandSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); public static JedisRequest create( Connection connection, ProtocolCommand command, List args) { diff --git a/instrumentation/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisSingletons.java b/instrumentation/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisSingletons.java index dc0fb845e436..3f990d87eec5 100644 --- a/instrumentation/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisSingletons.java +++ b/instrumentation/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisSingletons.java @@ -10,11 +10,11 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; public final class JedisSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jedis-3.0"; @@ -35,7 +35,7 @@ public final class JedisSingletons { .addAttributesExtractor(NetworkAttributesExtractor.create(netAttributesGetter)) .addAttributesExtractor( PeerServiceAttributesExtractor.create( - netAttributesGetter, AgentCommonConfig.get().getPeerServiceResolver())) + netAttributesGetter, PeerServiceResolver.create(GlobalOpenTelemetry.get()))) .addOperationMetrics(DbClientMetrics.get()) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } diff --git a/instrumentation/jedis/jedis-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/JedisRequest.java b/instrumentation/jedis/jedis-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/JedisRequest.java index a8c26bfaabbb..57523fac9d07 100644 --- a/instrumentation/jedis/jedis-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/JedisRequest.java +++ b/instrumentation/jedis/jedis-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/JedisRequest.java @@ -6,8 +6,9 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v4_0; import com.google.auto.value.AutoValue; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.RedisCommandSanitizer; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import java.net.Socket; import java.net.SocketAddress; import java.nio.charset.StandardCharsets; @@ -22,7 +23,15 @@ public abstract class JedisRequest { private static final RedisCommandSanitizer sanitizer = - RedisCommandSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + RedisCommandSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); public static JedisRequest create(ProtocolCommand command, List args) { return new AutoValue_JedisRequest(command, args); diff --git a/instrumentation/jetty/jetty-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12IgnoredTypesConfigurer.java b/instrumentation/jetty/jetty-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12IgnoredTypesConfigurer.java index 24b5d7d45bf2..323f0fc11dfd 100644 --- a/instrumentation/jetty/jetty-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12IgnoredTypesConfigurer.java +++ b/instrumentation/jetty/jetty-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12IgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class Jetty12IgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // handling pipelined request sends HttpConnection instance (implements Runnable) to executor // while scope from the previous request is still active builder.ignoreTaskClass("org.eclipse.jetty.server.internal.HttpConnection"); diff --git a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java index cfcc9aaf6675..fcf3f37f26b6 100644 --- a/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java +++ b/instrumentation/jfinal-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jfinal/v3_2/JFinalSingletons.java @@ -9,6 +9,7 @@ import com.jfinal.render.JsonRender; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesGetter; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; @@ -16,7 +17,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; public final class JFinalSingletons { @@ -34,7 +34,14 @@ public final class JFinalSingletons { GlobalOpenTelemetry.get(), "io.opentelemetry.jfinal-3.2", CodeSpanNameExtractor.create(codedAttributesGetter)) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .addAttributesExtractor(CodeAttributesExtractor.create(codedAttributesGetter)) .buildInstrumenter(); } diff --git a/instrumentation/jms/jms-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/JmsIgnoredTypesConfigurer.java b/instrumentation/jms/jms-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/JmsIgnoredTypesConfigurer.java index 72cfd512d628..66260d8580b9 100644 --- a/instrumentation/jms/jms-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/JmsIgnoredTypesConfigurer.java +++ b/instrumentation/jms/jms-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/JmsIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class JmsIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // Avoid instrumenting internal OrderedExecutor worker class builder.ignoreTaskClass("org.hornetq.utils.OrderedExecutorFactory$OrderedExecutor$"); } diff --git a/instrumentation/jms/jms-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/JmsSingletons.java b/instrumentation/jms/jms-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/JmsSingletons.java index d68de50afb9c..53b112f2f087 100644 --- a/instrumentation/jms/jms-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/JmsSingletons.java +++ b/instrumentation/jms/jms-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/JmsSingletons.java @@ -6,10 +6,11 @@ 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.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"; @@ -21,9 +22,21 @@ public final class JmsSingletons { static { JmsInstrumenterFactory factory = new JmsInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "capture_headers/development") + .orElse(Collections.emptyList())) .setMessagingReceiveInstrumentationEnabled( - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled()); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false)); PRODUCER_INSTRUMENTER = factory.createProducerInstrumenter(); CONSUMER_RECEIVE_INSTRUMENTER = factory.createConsumerReceiveInstrumenter(); diff --git a/instrumentation/jms/jms-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/JmsSingletons.java b/instrumentation/jms/jms-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/JmsSingletons.java index d5595e75899f..edae49a3b2d0 100644 --- a/instrumentation/jms/jms-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/JmsSingletons.java +++ b/instrumentation/jms/jms-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/JmsSingletons.java @@ -6,10 +6,11 @@ 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.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"; @@ -21,9 +22,21 @@ public final class JmsSingletons { static { JmsInstrumenterFactory factory = new JmsInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "capture_headers/development") + .orElse(Collections.emptyList())) .setMessagingReceiveInstrumentationEnabled( - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled()); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false)); PRODUCER_INSTRUMENTER = factory.createProducerInstrumenter(); CONSUMER_RECEIVE_INSTRUMENTER = factory.createConsumerReceiveInstrumenter(); diff --git a/instrumentation/jms/jms-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JmsReceiveSpanUtil.java b/instrumentation/jms/jms-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JmsReceiveSpanUtil.java index be0bbd88b243..0885804c857c 100644 --- a/instrumentation/jms/jms-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JmsReceiveSpanUtil.java +++ b/instrumentation/jms/jms-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JmsReceiveSpanUtil.java @@ -8,16 +8,22 @@ 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.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false); public static void createReceiveSpan( Instrumenter receiveInstrumenter, diff --git a/instrumentation/jmx-metrics/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jmx/JmxMetricInsightInstaller.java b/instrumentation/jmx-metrics/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jmx/JmxMetricInsightInstaller.java index 3a67fc0da0c1..16624f42bc70 100644 --- a/instrumentation/jmx-metrics/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jmx/JmxMetricInsightInstaller.java +++ b/instrumentation/jmx-metrics/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jmx/JmxMetricInsightInstaller.java @@ -7,6 +7,8 @@ import com.google.auto.service.AutoService; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.jmx.JmxTelemetry; import io.opentelemetry.instrumentation.jmx.JmxTelemetryBuilder; import io.opentelemetry.javaagent.extension.AgentListener; @@ -17,6 +19,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.time.Duration; +import java.util.Collections; import java.util.logging.Level; import java.util.logging.Logger; @@ -28,17 +31,28 @@ public class JmxMetricInsightInstaller implements AgentListener { @Override public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) { + OpenTelemetry openTelemetry = autoConfiguredSdk.getOpenTelemetrySdk(); ConfigProperties config = AutoConfigureUtil.getConfig(autoConfiguredSdk); - if (config.getBoolean("otel.jmx.enabled", true)) { + boolean defaultEnabled = + DeclarativeConfigUtil.getBoolean(openTelemetry, "java", "common", "default_enabled") + .orElse(true); + boolean enabled = + DeclarativeConfigUtil.getBoolean(openTelemetry, "java", "jmx", "enabled") + .orElse(defaultEnabled); + if (enabled) { JmxTelemetryBuilder jmx = JmxTelemetry.builder(GlobalOpenTelemetry.get()) - .beanDiscoveryDelay(beanDiscoveryDelay(config)); + .beanDiscoveryDelay(beanDiscoveryDelay(openTelemetry, config)); - config.getList("otel.jmx.config").stream() + DeclarativeConfigUtil.getList(openTelemetry, "java", "jmx", "config") + .orElse(Collections.emptyList()) + .stream() .map(Paths::get) .forEach(path -> addFileRules(path, jmx)); - config.getList("otel.jmx.target.system").forEach(target -> addClasspathRules(target, jmx)); + DeclarativeConfigUtil.getList(openTelemetry, "java", "jmx", "target_system") + .orElse(Collections.emptyList()) + .forEach(target -> addClasspathRules(target, jmx)); jmx.build().start(); } @@ -66,14 +80,16 @@ private static void addClasspathRules(String target, JmxTelemetryBuilder builder } } - private static Duration beanDiscoveryDelay(ConfigProperties configProperties) { - Duration discoveryDelay = configProperties.getDuration("otel.jmx.discovery.delay"); + private static Duration beanDiscoveryDelay( + OpenTelemetry openTelemetry, ConfigProperties configProperties) { + Duration discoveryDelay = + DeclarativeConfigUtil.getDuration(openTelemetry, "java", "jmx", "discovery_delay") + .orElse(null); if (discoveryDelay != null) { return discoveryDelay; } - // If discovery delay has not been configured, have a peek at the metric export interval. - // It makes sense for both of these values to be similar. + // TODO remove this fallback because it's not available via declarative configuration API return configProperties.getDuration("otel.metric.export.interval", Duration.ofMinutes(1)); } } diff --git a/instrumentation/jsf/jsf-mojarra-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mojarra/MojarraSingletons.java b/instrumentation/jsf/jsf-mojarra-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mojarra/MojarraSingletons.java index 5cd44f713c39..7899dc144f72 100644 --- a/instrumentation/jsf/jsf-mojarra-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mojarra/MojarraSingletons.java +++ b/instrumentation/jsf/jsf-mojarra-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mojarra/MojarraSingletons.java @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.mojarra; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import io.opentelemetry.javaagent.instrumentation.jsf.javax.JsfErrorCauseExtractor; import io.opentelemetry.javaagent.instrumentation.jsf.javax.JsfRequest; @@ -21,7 +21,14 @@ public class MojarraSingletons { Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, JsfRequest::spanName) .setErrorCauseExtractor(new JsfErrorCauseExtractor()) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/jsf/jsf-mojarra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mojarra/v3_0/MojarraSingletons.java b/instrumentation/jsf/jsf-mojarra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mojarra/v3_0/MojarraSingletons.java index 3957e3fa5587..058c853e348b 100644 --- a/instrumentation/jsf/jsf-mojarra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mojarra/v3_0/MojarraSingletons.java +++ b/instrumentation/jsf/jsf-mojarra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mojarra/v3_0/MojarraSingletons.java @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.mojarra.v3_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import io.opentelemetry.javaagent.instrumentation.jsf.jakarta.JsfErrorCauseExtractor; import io.opentelemetry.javaagent.instrumentation.jsf.jakarta.JsfRequest; @@ -21,7 +21,14 @@ public class MojarraSingletons { Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, JsfRequest::spanName) .setErrorCauseExtractor(new JsfErrorCauseExtractor()) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/jsf/jsf-myfaces-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/myfaces/MyFacesSingletons.java b/instrumentation/jsf/jsf-myfaces-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/myfaces/MyFacesSingletons.java index 9be3ba91893c..fbc74d43b677 100644 --- a/instrumentation/jsf/jsf-myfaces-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/myfaces/MyFacesSingletons.java +++ b/instrumentation/jsf/jsf-myfaces-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/myfaces/MyFacesSingletons.java @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.myfaces; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import io.opentelemetry.javaagent.instrumentation.jsf.javax.JsfRequest; public class MyFacesSingletons { @@ -20,7 +20,14 @@ public class MyFacesSingletons { Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, JsfRequest::spanName) .setErrorCauseExtractor(new MyFacesErrorCauseExtractor()) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/jsf/jsf-myfaces-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/myfaces/v3_0/MyFacesSingletons.java b/instrumentation/jsf/jsf-myfaces-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/myfaces/v3_0/MyFacesSingletons.java index 6f82d5c74efe..a71f2c3ac708 100644 --- a/instrumentation/jsf/jsf-myfaces-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/myfaces/v3_0/MyFacesSingletons.java +++ b/instrumentation/jsf/jsf-myfaces-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/myfaces/v3_0/MyFacesSingletons.java @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.myfaces.v3_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import io.opentelemetry.javaagent.instrumentation.jsf.jakarta.JsfRequest; public class MyFacesSingletons { @@ -20,7 +20,14 @@ public class MyFacesSingletons { Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, JsfRequest::spanName) .setErrorCauseExtractor(new MyFacesErrorCauseExtractor()) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/HttpJspPageInstrumentationSingletons.java b/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/HttpJspPageInstrumentationSingletons.java index fd8c74030f81..d103a8aff10c 100644 --- a/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/HttpJspPageInstrumentationSingletons.java +++ b/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/HttpJspPageInstrumentationSingletons.java @@ -10,11 +10,10 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import java.net.URI; import java.net.URISyntaxException; import java.util.logging.Logger; @@ -25,8 +24,9 @@ public class HttpJspPageInstrumentationSingletons { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.jsp.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "jsp", "experimental_span_attributes") + .orElse(false); private static final Instrumenter INSTRUMENTER; @@ -37,7 +37,14 @@ public class HttpJspPageInstrumentationSingletons { "io.opentelemetry.jsp-2.3", HttpJspPageInstrumentationSingletons::spanNameOnRender) .addAttributesExtractor(new RenderAttributesExtractor()) - .setEnabled(ExperimentalConfig.get().viewTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "view_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(SpanKindExtractor.alwaysInternal()); } diff --git a/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspCompilationContextInstrumentationSingletons.java b/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspCompilationContextInstrumentationSingletons.java index ddb24d33023a..f9efc4da1bdf 100644 --- a/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspCompilationContextInstrumentationSingletons.java +++ b/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspCompilationContextInstrumentationSingletons.java @@ -8,19 +8,19 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import javax.annotation.Nullable; import org.apache.jasper.JspCompilationContext; import org.apache.jasper.compiler.Compiler; public class JspCompilationContextInstrumentationSingletons { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.jsp.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "jsp", "experimental_span_attributes") + .orElse(false); private static final Instrumenter INSTRUMENTER; @@ -31,7 +31,14 @@ public class JspCompilationContextInstrumentationSingletons { "io.opentelemetry.jsp-2.3", JspCompilationContextInstrumentationSingletons::spanNameOnCompile) .addAttributesExtractor(new CompilationAttributesExtractor()) - .setEnabled(ExperimentalConfig.get().viewTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "view_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(SpanKindExtractor.alwaysInternal()); } diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/KafkaSingletons.java b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/KafkaSingletons.java index fa181e8dbb24..1d87e96ea434 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/KafkaSingletons.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/KafkaSingletons.java @@ -6,21 +6,22 @@ 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.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.getBoolean( + GlobalOpenTelemetry.get(), "java", "kafka", "producer_propagation", "enabled") + .orElse(true); private static final Instrumenter PRODUCER_INSTRUMENTER; private static final Instrumenter CONSUMER_RECEIVE_INSTRUMENTER; @@ -29,12 +30,25 @@ public final class KafkaSingletons { static { KafkaInstrumenterFactory instrumenterFactory = new KafkaInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "capture_headers/development") + .orElse(Collections.emptyList())) .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "kafka", "experimental_span_attributes") + .orElse(false)) .setMessagingReceiveInstrumentationEnabled( - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled()); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false)); PRODUCER_INSTRUMENTER = instrumenterFactory.createProducerInstrumenter(); CONSUMER_RECEIVE_INSTRUMENTER = instrumenterFactory.createConsumerReceiveInstrumenter(); CONSUMER_PROCESS_INSTRUMENTER = instrumenterFactory.createConsumerProcessInstrumenter(); diff --git a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsSingletons.java b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsSingletons.java index b39a610a3a6d..99b0de613181 100644 --- a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsSingletons.java +++ b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsSingletons.java @@ -6,11 +6,11 @@ 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.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 { @@ -18,12 +18,22 @@ public final class KafkaStreamsSingletons { private static final Instrumenter INSTRUMENTER = new KafkaInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "messaging", "capture_headers/development") + .orElse(Collections.emptyList())) .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "kafka", "experimental_span_attributes") + .orElse(false)) .setMessagingReceiveInstrumentationEnabled( - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled()) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false)) .createConsumerProcessInstrumenter(); public static Instrumenter instrumenter() { diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/KotlinCoroutinesIgnoredTypesConfigurer.java b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/KotlinCoroutinesIgnoredTypesConfigurer.java index 1ee607fb8dc9..444a4bd941d5 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/KotlinCoroutinesIgnoredTypesConfigurer.java +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/KotlinCoroutinesIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class KotlinCoroutinesIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { builder.allowClass("kotlin.coroutines.jvm.internal.CompletedContinuation"); } } diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java index bf8c9bdfb1e9..0bcbe80ec370 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java @@ -14,9 +14,10 @@ import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.errorprone.annotations.CanIgnoreReturnValue; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.extension.instrumentation.internal.AsmApi; @@ -54,10 +55,13 @@ class WithSpanInstrumentation implements TypeInstrumentation { // whether to check the transformed bytecode with asm CheckClassAdapter private static final boolean CHECK_CLASS = - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.kotlinx-coroutines.check-class", - AgentInstrumentationConfig.get().getBoolean("otel.javaagent.debug", false)); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "kotlinx_coroutines", "check_class") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "agent", "debug") // FIXME + .orElse(false)); private final ElementMatcher.Junction annotatedMethodMatcher; // this matcher matches all methods that should be excluded from transformation diff --git a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java index 8a5276c6d695..10c7b49a90b1 100644 --- a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java +++ b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java @@ -16,7 +16,6 @@ import io.opentelemetry.instrumentation.ktor.v2_0.KtorClientTelemetry; import io.opentelemetry.instrumentation.ktor.v2_0.KtorClientTelemetryBuilder; import io.opentelemetry.instrumentation.ktor.v2_0.common.internal.KtorBuilderUtil; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import kotlin.Unit; @@ -55,7 +54,7 @@ public static class SetupFunction implements Function1> INSTRUMENTER; private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.kubernetes-client.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "kubernetes_client", + "experimental_span_attributes") + .orElse(false); private static final ContextPropagators CONTEXT_PROPAGATORS; static { @@ -29,7 +32,7 @@ public class KubernetesClientSingletons { "io.opentelemetry.kubernetes-client-7.0", GlobalOpenTelemetry.get(), new KubernetesHttpAttributesGetter()) - .configure(AgentCommonConfig.get()) + .configure(GlobalOpenTelemetry.get()) .setBuilderCustomizer( instrumenterBuilder -> { if (CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES) { diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/InstrumentationPoints.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/InstrumentationPoints.java index 514379987135..2fecda6d275c 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/InstrumentationPoints.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/InstrumentationPoints.java @@ -14,9 +14,10 @@ import com.lambdaworks.redis.protocol.CommandType; import com.lambdaworks.redis.protocol.ProtocolKeyword; import com.lambdaworks.redis.protocol.RedisCommand; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import java.util.EnumSet; import java.util.Set; import java.util.concurrent.CancellationException; @@ -24,8 +25,9 @@ public final class InstrumentationPoints { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.lettuce.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "lettuce", "experimental_span_attributes") + .orElse(false); private static final Set NON_INSTRUMENTING_COMMANDS = EnumSet.of(SHUTDOWN, DEBUG); diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSingletons.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSingletons.java index 44b55c613347..5352ea115bd2 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSingletons.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSingletons.java @@ -11,16 +11,16 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; import io.opentelemetry.context.ContextKey; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor; import io.opentelemetry.instrumentation.api.util.VirtualField; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class LettuceSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.lettuce-4.0"; @@ -55,11 +55,16 @@ public final class LettuceSingletons { .addAttributesExtractor(ServerAttributesExtractor.create(netAttributesGetter)) .addAttributesExtractor( PeerServiceAttributesExtractor.create( - netAttributesGetter, AgentCommonConfig.get().getPeerServiceResolver())) + netAttributesGetter, PeerServiceResolver.create(GlobalOpenTelemetry.get()))) .addAttributesExtractor(new LettuceConnectAttributesExtractor()) .setEnabled( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.lettuce.connection-telemetry.enabled", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "lettuce", + "connection_telemetry", + "enabled") + .orElse(false)) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndCommandAsyncBiFunction.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndCommandAsyncBiFunction.java index 2baad6fd0692..e26fb76b08db 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndCommandAsyncBiFunction.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndCommandAsyncBiFunction.java @@ -8,9 +8,10 @@ import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceSingletons.instrumenter; import io.lettuce.core.protocol.RedisCommand; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import java.util.concurrent.CancellationException; import java.util.function.BiFunction; @@ -27,8 +28,9 @@ public class EndCommandAsyncBiFunction implements BiFunction { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.lettuce.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "lettuce", "experimental_span_attributes") + .orElse(false); private final Context context; private final RedisCommand command; diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndConnectAsyncBiFunction.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndConnectAsyncBiFunction.java index d179605e5ccc..9c363bf8d3cd 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndConnectAsyncBiFunction.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndConnectAsyncBiFunction.java @@ -8,9 +8,10 @@ import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceSingletons.connectInstrumenter; import io.lettuce.core.RedisURI; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import java.util.concurrent.CancellationException; import java.util.function.BiFunction; @@ -27,8 +28,9 @@ public class EndConnectAsyncBiFunction implements BiFunction { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.lettuce.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "lettuce", "experimental_span_attributes") + .orElse(false); private final Context context; private final RedisURI redisUri; diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDbAttributesGetter.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDbAttributesGetter.java index ca3025b4a6c1..0d24562d76fb 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDbAttributesGetter.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDbAttributesGetter.java @@ -6,10 +6,11 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; import io.lettuce.core.protocol.RedisCommand; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesGetter; import io.opentelemetry.instrumentation.api.incubator.semconv.db.RedisCommandSanitizer; import io.opentelemetry.instrumentation.lettuce.common.LettuceArgSplitter; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Collections; import java.util.List; @@ -19,7 +20,15 @@ final class LettuceDbAttributesGetter implements DbClientAttributesGetter, Void> { private static final RedisCommandSanitizer sanitizer = - RedisCommandSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + RedisCommandSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); @SuppressWarnings("deprecation") // using deprecated DbSystemIncubatingValues @Override diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSingletons.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSingletons.java index e8661ad8a8cd..2f4290e76581 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSingletons.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSingletons.java @@ -11,16 +11,16 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; import io.opentelemetry.context.ContextKey; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor; import io.opentelemetry.instrumentation.api.util.VirtualField; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class LettuceSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.lettuce-5.0"; @@ -57,11 +57,16 @@ public final class LettuceSingletons { .addAttributesExtractor( PeerServiceAttributesExtractor.create( connectNetworkAttributesGetter, - AgentCommonConfig.get().getPeerServiceResolver())) + PeerServiceResolver.create(GlobalOpenTelemetry.get()))) .addAttributesExtractor(new LettuceConnectAttributesExtractor()) .setEnabled( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.lettuce.connection-telemetry.enabled", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "lettuce", + "connection_telemetry", + "enabled") + .orElse(false)) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java index af20fc892495..d89bea70c4e9 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java @@ -8,9 +8,10 @@ import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceSingletons.instrumenter; import io.lettuce.core.protocol.RedisCommand; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import java.util.function.Consumer; import java.util.logging.Logger; import org.reactivestreams.Subscription; @@ -21,8 +22,9 @@ public class LettuceFluxTerminationRunnable implements Consumer>, Runnable { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.lettuce.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "lettuce", "experimental_span_attributes") + .orElse(false); private Context context; private int numResults; diff --git a/instrumentation/lettuce/lettuce-5.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/TracingHolder.java b/instrumentation/lettuce/lettuce-5.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/TracingHolder.java index f8444f0e0ed1..3c411ed489db 100644 --- a/instrumentation/lettuce/lettuce-5.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/TracingHolder.java +++ b/instrumentation/lettuce/lettuce-5.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/TracingHolder.java @@ -7,20 +7,32 @@ import io.lettuce.core.tracing.Tracing; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.lettuce.v5_1.LettuceTelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class TracingHolder { private static final boolean CAPTURE_COMMAND_ENCODING_EVENTS = - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.lettuce.experimental.command-encoding-events.enabled", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "lettuce", + "experimental", + "command_encoding_events", + "enabled") + .orElse(false); public static final Tracing TRACING = LettuceTelemetry.builder(GlobalOpenTelemetry.get()) - .setStatementSanitizationEnabled(AgentCommonConfig.get().isStatementSanitizationEnabled()) + .setStatementSanitizationEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)) .setEncodingSpanEventsEnabled(CAPTURE_COMMAND_ENCODING_EVENTS) .build() .newTracing(); diff --git a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java index 22c28ad19fbb..eb9b08bdfbc5 100644 --- a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java +++ b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java @@ -13,9 +13,9 @@ import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.instrumentation.api.internal.cache.Cache; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.semconv.CodeAttributes; import io.opentelemetry.semconv.ExceptionAttributes; import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; @@ -48,8 +48,9 @@ public final class LogEventMapper { private static final int TRACE_INT = 5000; private static final boolean captureExperimentalAttributes = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.log4j-appender.experimental-log-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "log4j_appender", "experimental_log_attributes") + .orElse(false); private final Map> captureMdcAttributes; @@ -57,15 +58,23 @@ public final class LogEventMapper { private final boolean captureAllMdcAttributes; private final boolean captureEventName = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.log4j-appender.experimental.capture-event-name", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "log4j-appender", + "experimental", + "capture_event_name") + .orElse(false); private LogEventMapper() { List captureMdcAttributes = - AgentInstrumentationConfig.get() - .getList( - "otel.instrumentation.log4j-appender.experimental.capture-mdc-attributes", - emptyList()); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "log4j-appender", + "experimental", + "capture_mdc_attributes") + .orElse(emptyList()); this.captureMdcAttributes = captureMdcAttributes.stream() .collect(Collectors.toMap(attr -> attr, LogEventMapper::getMdcAttributeKey)); @@ -74,9 +83,13 @@ private LogEventMapper() { } boolean captureCodeAttributes = - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.log4j-appender.experimental.capture-code-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "log4j-appender", + "experimental", + "capture_code_attributes") + .orElse(false); public void capture( String fqcn, Category logger, Priority level, Object message, Throwable throwable) { diff --git a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java index ee35aaa184a4..7470c31371b4 100644 --- a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java +++ b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java @@ -10,10 +10,9 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.ContextDataAccessor; import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.LogEventMapper; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -35,26 +34,50 @@ public final class Log4jHelper { private static final MethodHandle stackTraceMethodHandle = getStackTraceMethodHandle(); static { - InstrumentationConfig config = AgentInstrumentationConfig.get(); - captureExperimentalAttributes = - config.getBoolean("otel.instrumentation.log4j-appender.experimental-log-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "log4j_appender", "experimental_log_attributes") + .orElse(false); boolean captureCodeAttributes = - config.getBoolean( - "otel.instrumentation.log4j-appender.experimental.capture-code-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "log4j-appender", + "experimental", + "capture_code_attributes") + .orElse(false); boolean captureMapMessageAttributes = - config.getBoolean( - "otel.instrumentation.log4j-appender.experimental.capture-map-message-attributes", - false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "log4j-appender", + "experimental", + "capture_map_message_attributes") + .orElse(false); boolean captureMarkerAttribute = - config.getBoolean( - "otel.instrumentation.log4j-appender.experimental.capture-marker-attribute", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "log4j-appender", + "experimental", + "capture_marker_attribute") + .orElse(false); List captureContextDataAttributes = - config.getList( - "otel.instrumentation.log4j-appender.experimental.capture-mdc-attributes", emptyList()); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "log4j-appender", + "experimental", + "capture_mdc_attributes") + .orElse(emptyList()); boolean captureEventName = - config.getBoolean( - "otel.instrumentation.log4j-appender.experimental.capture-event-name", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "log4j-appender", + "experimental", + "capture_event_name") + .orElse(false); mapper = new LogEventMapper<>( diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java index 8cd437da9d38..fec6fb12799f 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java @@ -5,13 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.log4j.contextdata.v2_7; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.baggage.Baggage; import io.opentelemetry.api.baggage.BaggageEntry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; +import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants; import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder; import java.util.List; import java.util.Map; @@ -23,11 +24,21 @@ public final class SpanDecoratingContextDataInjector implements ContextDataInjector { private static final boolean BAGGAGE_ENABLED = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.log4j-context-data.add-baggage", false); - private static final String TRACE_ID_KEY = AgentCommonConfig.get().getTraceIdKey(); - private static final String SPAN_ID_KEY = AgentCommonConfig.get().getSpanIdKey(); - private static final String TRACE_FLAGS_KEY = AgentCommonConfig.get().getTraceFlagsKey(); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "log4j_context_data", "add_baggage") + .orElse(false); + private static final String TRACE_ID_KEY = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "trace_id") + .orElse(LoggingContextConstants.TRACE_ID); + private static final String SPAN_ID_KEY = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "span_id") + .orElse(LoggingContextConstants.SPAN_ID); + private static final String TRACE_FLAGS_KEY = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "trace_flags") + .orElse(LoggingContextConstants.TRACE_FLAGS); private static final StringMap staticContextData = getStaticContextData(); diff --git a/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java b/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java index ea9f0a21d0f8..272972c0bc08 100644 --- a/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java +++ b/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java @@ -11,10 +11,12 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; +import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -55,9 +57,21 @@ public static Object onExit( if (returnValue != null) { return returnValue; } - boolean traceId = AgentCommonConfig.get().getTraceIdKey().equals(key); - boolean spanId = AgentCommonConfig.get().getSpanIdKey().equals(key); - boolean traceFlags = AgentCommonConfig.get().getTraceFlagsKey().equals(key); + String traceIdKey = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "trace_id") + .orElse(LoggingContextConstants.TRACE_ID); + String spanIdKey = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "span_id") + .orElse(LoggingContextConstants.SPAN_ID); + String traceFlagsKey = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "trace_flags") + .orElse(LoggingContextConstants.TRACE_FLAGS); + boolean traceId = traceIdKey.equals(key); + boolean spanId = spanIdKey.equals(key); + boolean traceFlags = traceFlagsKey.equals(key); if (!traceId && !spanId && !traceFlags) { return ConfiguredResourceAttributesHolder.getAttributeValue(key); diff --git a/instrumentation/logback/logback-appender-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/appender/v1_0/LogbackSingletons.java b/instrumentation/logback/logback-appender-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/appender/v1_0/LogbackSingletons.java index 903605643e39..23a83c20c927 100644 --- a/instrumentation/logback/logback-appender-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/appender/v1_0/LogbackSingletons.java +++ b/instrumentation/logback/logback-appender-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/appender/v1_0/LogbackSingletons.java @@ -7,10 +7,9 @@ import static java.util.Collections.emptyList; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.logback.appender.v1_0.internal.LoggingEventMapper; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.DeprecatedConfigProperties; import java.util.List; public final class LogbackSingletons { @@ -18,48 +17,93 @@ public final class LogbackSingletons { private static final LoggingEventMapper mapper; static { - InstrumentationConfig config = AgentInstrumentationConfig.get(); - boolean captureExperimentalAttributes = - config.getBoolean( - "otel.instrumentation.logback-appender.experimental-log-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "logback_appender", + "experimental_log_attributes") + .orElse(false); boolean captureCodeAttributes = - config.getBoolean( - "otel.instrumentation.logback-appender.experimental.capture-code-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "logback_appender", + "experimental", + "capture_code_attributes") + .orElse(false); boolean captureMarkerAttribute = - config.getBoolean( - "otel.instrumentation.logback-appender.experimental.capture-marker-attribute", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "logback_appender", + "experimental", + "capture_marker_attribute") + .orElse(false); boolean captureKeyValuePairAttributes = - config.getBoolean( - "otel.instrumentation.logback-appender.experimental.capture-key-value-pair-attributes", - false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "logback_appender", + "experimental", + "capture_key_value_pair_attributes") + .orElse(false); boolean captureLoggerContext = - config.getBoolean( - "otel.instrumentation.logback-appender.experimental.capture-logger-context-attributes", - false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "logback_appender", + "experimental", + "capture_logger_context_attributes") + .orElse(false); boolean captureTemplate = - config.getBoolean( - "otel.instrumentation.logback-appender.experimental.capture-template", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "logback_appender", + "experimental", + "capture_template") + .orElse(false); boolean captureArguments = - config.getBoolean( - "otel.instrumentation.logback-appender.experimental.capture-arguments", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "logback_appender", + "experimental", + "capture_arguments") + .orElse(false); boolean captureLogstashMarkerAttributes = - DeprecatedConfigProperties.getBoolean( - config, - "otel.instrumentation.logback-appender.experimental.capture-logstash-attributes", - "otel.instrumentation.logback-appender.experimental.capture-logstash-marker-attributes", - false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "logback_appender", + "experimental", + "capture_logstash_marker_attributes") + .orElse(false); boolean captureLogstashStructuredArguments = - config.getBoolean( - "otel.instrumentation.logback-appender.experimental.capture-logstash-structured-arguments", - false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "logback_appender", + "experimental", + "capture_logstash_structured_arguments") + .orElse(false); List captureMdcAttributes = - config.getList( - "otel.instrumentation.logback-appender.experimental.capture-mdc-attributes", - emptyList()); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "logback_appender", + "experimental", + "capture_mdc_attributes") + .orElse(emptyList()); boolean captureEventName = - config.getBoolean( - "otel.instrumentation.logback-appender.experimental.capture-event-name", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "logback_appender", + "experimental", + "capture_event_name") + .orElse(false); mapper = LoggingEventMapper.builder() diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LogbackSingletons.java b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LogbackSingletons.java index c025f59d25dc..ac6a3024a9c6 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LogbackSingletons.java +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LogbackSingletons.java @@ -6,18 +6,29 @@ package io.opentelemetry.javaagent.instrumentation.logback.mdc.v1_0; import ch.qos.logback.classic.spi.ILoggingEvent; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; +import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants; import io.opentelemetry.instrumentation.api.util.VirtualField; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class LogbackSingletons { private static final boolean ADD_BAGGAGE = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.logback-mdc.add-baggage", false); - private static final String TRACE_ID_KEY = AgentCommonConfig.get().getTraceIdKey(); - private static final String SPAN_ID_KEY = AgentCommonConfig.get().getSpanIdKey(); - private static final String TRACE_FLAGS_KEY = AgentCommonConfig.get().getTraceFlagsKey(); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "logback_mdc", "add_baggage") + .orElse(false); + private static final String TRACE_ID_KEY = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "trace_id") + .orElse(LoggingContextConstants.TRACE_ID); + private static final String SPAN_ID_KEY = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "span_id") + .orElse(LoggingContextConstants.SPAN_ID); + private static final String TRACE_FLAGS_KEY = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "trace_flags") + .orElse(LoggingContextConstants.TRACE_FLAGS); public static final VirtualField CONTEXT = VirtualField.find(ILoggingEvent.class, Context.class); diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java index 38065c9adfac..36de3f755cce 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java @@ -17,12 +17,14 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import ch.qos.logback.classic.spi.ILoggingEvent; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.baggage.Baggage; import io.opentelemetry.api.baggage.BaggageEntry; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; +import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -63,7 +65,11 @@ public static Map onExit( @Advice.This ILoggingEvent event, @Advice.Return(typing = Typing.DYNAMIC) Map contextData) { - if (contextData != null && contextData.containsKey(AgentCommonConfig.get().getTraceIdKey())) { + String traceIdKey = + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "common", "logging", "trace_id") + .orElse(LoggingContextConstants.TRACE_ID); + if (contextData != null && contextData.containsKey(traceIdKey)) { // Assume already instrumented event if traceId is present. return contextData; } diff --git a/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentationModule.java b/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentationModule.java index 71fe619da4db..2137433f06bd 100644 --- a/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentationModule.java +++ b/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentationModule.java @@ -10,24 +10,21 @@ import static java.util.Collections.singletonMap; import com.google.auto.service.AutoService; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import io.opentelemetry.javaagent.tooling.config.MethodsConfigurationParser; import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.Optional; import java.util.stream.Collectors; @AutoService(InstrumentationModule.class) public class MethodInstrumentationModule extends InstrumentationModule implements ExperimentalInstrumentationModule { - private static final String TRACE_METHODS_CONFIG = "otel.instrumentation.methods.include"; - private final List typeInstrumentations; public MethodInstrumentationModule() { @@ -36,32 +33,38 @@ public MethodInstrumentationModule() { } private static List createInstrumentations() { - InstrumentationConfig config = AgentInstrumentationConfig.get(); - List list = - config.isDeclarative() - ? MethodsConfig.parseDeclarativeConfig(config.getDeclarativeConfig("methods")) - : parseConfigProperties(); - // ensure that there is at least one instrumentation so that muzzle reference collection could - // work - if (list.isEmpty()) { - return singletonList( - new MethodInstrumentation(null, singletonMap(SpanKind.INTERNAL, emptyList()))); + // First try structured declarative config (YAML format) + Optional> structured = + DeclarativeConfigUtil.getStructuredList( + GlobalOpenTelemetry.get(), "java", "methods", "include") + .map(MethodsConfig::parseDeclarativeConfig); + if (structured.isPresent()) { + return structured.get(); } - return list; - } - private static List parseConfigProperties() { - Map> classMethodsToTrace = - MethodsConfigurationParser.parse( - AgentInstrumentationConfig.get().getString(TRACE_METHODS_CONFIG)); + // fall back to old string property format + Optional> legacy = parseConfigProperties(); + if (legacy.isPresent()) { + return legacy.get(); + } + + // ensure at least one instrumentation for muzzle reference collection + return singletonList( + new MethodInstrumentation(null, singletonMap(SpanKind.INTERNAL, emptyList()))); + } - return classMethodsToTrace.entrySet().stream() - .filter(e -> !e.getValue().isEmpty()) + private static Optional> parseConfigProperties() { + return DeclarativeConfigUtil.getString(GlobalOpenTelemetry.get(), "java", "methods", "include") + .map(MethodsConfigurationParser::parse) .map( - e -> - new MethodInstrumentation( - e.getKey(), singletonMap(SpanKind.INTERNAL, e.getValue()))) - .collect(Collectors.toList()); + classMethodsToTrace -> + classMethodsToTrace.entrySet().stream() + .filter(e -> !e.getValue().isEmpty()) + .map( + e -> + new MethodInstrumentation( + e.getKey(), singletonMap(SpanKind.INTERNAL, e.getValue()))) + .collect(Collectors.toList())); } @Override diff --git a/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodsConfig.java b/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodsConfig.java index 692ede856414..6eb02dde4a91 100644 --- a/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodsConfig.java +++ b/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodsConfig.java @@ -27,8 +27,9 @@ public class MethodsConfig { private MethodsConfig() {} - static List parseDeclarativeConfig(DeclarativeConfigProperties methods) { - return methods.getStructuredList("include", emptyList()).stream() + static List parseDeclarativeConfig( + List include) { + return include.stream() .flatMap(MethodsConfig::parseMethodInstrumentation) .collect(Collectors.toList()); } diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerInstrumentationModule.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerInstrumentationModule.java index 138bf7f5b315..e908a26d4018 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerInstrumentationModule.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerInstrumentationModule.java @@ -14,7 +14,6 @@ import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.ClassInjector; import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.InjectionMode; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @@ -27,7 +26,7 @@ public MicrometerInstrumentationModule() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // produces a lot of metrics that are already captured - e.g. JVM memory usage return false; } diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerSingletons.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerSingletons.java index bba50e52d4a2..99d6fbf52226 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerSingletons.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerSingletons.java @@ -7,10 +7,9 @@ import io.micrometer.core.instrument.MeterRegistry; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.micrometer.v1_5.OpenTelemetryMeterRegistry; import io.opentelemetry.instrumentation.micrometer.v1_5.internal.OpenTelemetryInstrument; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.util.Iterator; public final class MicrometerSingletons { @@ -18,17 +17,29 @@ public final class MicrometerSingletons { private static final MeterRegistry METER_REGISTRY; static { - InstrumentationConfig config = AgentInstrumentationConfig.get(); METER_REGISTRY = OpenTelemetryMeterRegistry.builder(GlobalOpenTelemetry.get()) .setPrometheusMode( - config.getBoolean("otel.instrumentation.micrometer.prometheus-mode.enabled", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "micrometer", + "prometheus_mode", + "enabled") + .orElse(false)) .setBaseTimeUnit( TimeUnitParser.parseConfigValue( - config.getString("otel.instrumentation.micrometer.base-time-unit"))) + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), "java", "micrometer", "base_time_unit") + .orElse(null))) .setMicrometerHistogramGaugesEnabled( - config.getBoolean( - "otel.instrumentation.micrometer.histogram-gauges.enabled", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "micrometer", + "histogram_gauges", + "enabled") + .orElse(false)) .build(); } diff --git a/instrumentation/mongo/mongo-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_1/MongoInstrumentationSingletons.java b/instrumentation/mongo/mongo-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_1/MongoInstrumentationSingletons.java index 8ae547d85d2a..35a2995d221a 100644 --- a/instrumentation/mongo/mongo-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_1/MongoInstrumentationSingletons.java +++ b/instrumentation/mongo/mongo-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_1/MongoInstrumentationSingletons.java @@ -8,11 +8,10 @@ import com.mongodb.event.CommandListener; import com.mongodb.event.CommandStartedEvent; 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.mongo.v3_1.internal.MongoInstrumenterFactory; import io.opentelemetry.instrumentation.mongo.v3_1.internal.TracingCommandListener; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class MongoInstrumentationSingletons { @@ -20,10 +19,17 @@ public final class MongoInstrumentationSingletons { MongoInstrumenterFactory.createInstrumenter( GlobalOpenTelemetry.get(), "io.opentelemetry.mongo-3.1", - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.mongo.statement-sanitizer.enabled", - AgentCommonConfig.get().isStatementSanitizationEnabled())); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "mongo", "statement_sanitizer", "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "db", + "statement_sanitizer", + "enabled") + .orElse(true))); public static final CommandListener LISTENER = new TracingCommandListener(INSTRUMENTER); diff --git a/instrumentation/mongo/mongo-3.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoInstrumentationSingletons.java b/instrumentation/mongo/mongo-3.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoInstrumentationSingletons.java index e8928e5f93a6..0ac795a4f846 100644 --- a/instrumentation/mongo/mongo-3.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoInstrumentationSingletons.java +++ b/instrumentation/mongo/mongo-3.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoInstrumentationSingletons.java @@ -8,11 +8,10 @@ import com.mongodb.event.CommandListener; import com.mongodb.event.CommandStartedEvent; 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.mongo.v3_1.internal.MongoInstrumenterFactory; import io.opentelemetry.instrumentation.mongo.v3_1.internal.TracingCommandListener; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class MongoInstrumentationSingletons { @@ -20,10 +19,17 @@ public final class MongoInstrumentationSingletons { MongoInstrumenterFactory.createInstrumenter( GlobalOpenTelemetry.get(), "io.opentelemetry.mongo-3.7", - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.mongo.statement-sanitizer.enabled", - AgentCommonConfig.get().isStatementSanitizationEnabled())); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "mongo", "statement_sanitizer", "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "db", + "statement_sanitizer", + "enabled") + .orElse(true))); public static final CommandListener LISTENER = new TracingCommandListener(INSTRUMENTER); diff --git a/instrumentation/mongo/mongo-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v4_0/MongoInstrumentationSingletons.java b/instrumentation/mongo/mongo-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v4_0/MongoInstrumentationSingletons.java index 20dcba7da5bb..a548dc04d36d 100644 --- a/instrumentation/mongo/mongo-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v4_0/MongoInstrumentationSingletons.java +++ b/instrumentation/mongo/mongo-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v4_0/MongoInstrumentationSingletons.java @@ -8,11 +8,10 @@ import com.mongodb.event.CommandListener; import com.mongodb.event.CommandStartedEvent; 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.mongo.v3_1.internal.MongoInstrumenterFactory; import io.opentelemetry.instrumentation.mongo.v3_1.internal.TracingCommandListener; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class MongoInstrumentationSingletons { @@ -20,10 +19,17 @@ public final class MongoInstrumentationSingletons { MongoInstrumenterFactory.createInstrumenter( GlobalOpenTelemetry.get(), "io.opentelemetry.mongo-4.0", - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.mongo.statement-sanitizer.enabled", - AgentCommonConfig.get().isStatementSanitizationEnabled())); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "mongo", "statement_sanitizer", "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "db", + "statement_sanitizer", + "enabled") + .orElse(true))); public static final CommandListener LISTENER = new TracingCommandListener(INSTRUMENTER); diff --git a/instrumentation/mongo/mongo-async-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongoasync/v3_3/MongoInstrumentationSingletons.java b/instrumentation/mongo/mongo-async-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongoasync/v3_3/MongoInstrumentationSingletons.java index 2cb3352cdbc8..5bd50ea102c4 100644 --- a/instrumentation/mongo/mongo-async-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongoasync/v3_3/MongoInstrumentationSingletons.java +++ b/instrumentation/mongo/mongo-async-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongoasync/v3_3/MongoInstrumentationSingletons.java @@ -8,11 +8,10 @@ import com.mongodb.event.CommandListener; import com.mongodb.event.CommandStartedEvent; 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.mongo.v3_1.internal.MongoInstrumenterFactory; import io.opentelemetry.instrumentation.mongo.v3_1.internal.TracingCommandListener; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class MongoInstrumentationSingletons { @@ -20,10 +19,17 @@ public final class MongoInstrumentationSingletons { MongoInstrumenterFactory.createInstrumenter( GlobalOpenTelemetry.get(), "io.opentelemetry.mongo-async-3.3", - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.mongo.statement-sanitizer.enabled", - AgentCommonConfig.get().isStatementSanitizationEnabled())); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "mongo", "statement_sanitizer", "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "db", + "statement_sanitizer", + "enabled") + .orElse(true))); public static final CommandListener LISTENER = new TracingCommandListener(INSTRUMENTER); diff --git a/instrumentation/mybatis-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mybatis/v3_2/MyBatisInstrumentationModule.java b/instrumentation/mybatis-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mybatis/v3_2/MyBatisInstrumentationModule.java index 8915a7d62159..00d89d76ba40 100644 --- a/instrumentation/mybatis-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mybatis/v3_2/MyBatisInstrumentationModule.java +++ b/instrumentation/mybatis-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mybatis/v3_2/MyBatisInstrumentationModule.java @@ -11,7 +11,6 @@ import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @AutoService(InstrumentationModule.class) @@ -28,7 +27,7 @@ public List typeInstrumentations() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { return false; } diff --git a/instrumentation/nats/nats-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/nats/v2_17/NatsIgnoredTypesConfigurer.java b/instrumentation/nats/nats-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/nats/v2_17/NatsIgnoredTypesConfigurer.java index 9789bca6af21..300ae0b43673 100644 --- a/instrumentation/nats/nats-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/nats/v2_17/NatsIgnoredTypesConfigurer.java +++ b/instrumentation/nats/nats-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/nats/v2_17/NatsIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class NatsIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { builder.ignoreTaskClass("io.nats.client.impl.NatsDispatcher"); } } diff --git a/instrumentation/nats/nats-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/nats/v2_17/NatsSingletons.java b/instrumentation/nats/nats-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/nats/v2_17/NatsSingletons.java index 13e95063e94c..e36e63d53dee 100644 --- a/instrumentation/nats/nats-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/nats/v2_17/NatsSingletons.java +++ b/instrumentation/nats/nats-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/nats/v2_17/NatsSingletons.java @@ -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 capturedHeaders = - ExperimentalConfig.get().getMessagingHeaders(); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "messaging", "capture_headers/development") + .orElse(Collections.emptyList()); public static final Instrumenter PRODUCER_INSTRUMENTER = createProducerInstrumenter(GlobalOpenTelemetry.get(), capturedHeaders); diff --git a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/NettyClientSingletons.java b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/NettyClientSingletons.java index 9807756bd015..487de004254a 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/NettyClientSingletons.java +++ b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/NettyClientSingletons.java @@ -7,12 +7,12 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; import io.opentelemetry.instrumentation.netty.common.internal.NettyConnectionRequest; import io.opentelemetry.instrumentation.netty.common.internal.NettyErrorHolder; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import io.opentelemetry.javaagent.instrumentation.netty.v3_8.NettyRequest; import io.opentelemetry.semconv.SchemaUrls; @@ -45,7 +45,7 @@ public final class NettyClientSingletons { .addAttributesExtractor( HttpClientPeerServiceAttributesExtractor.create( NettyConnectHttpAttributesGetter.INSTANCE, - AgentCommonConfig.get().getPeerServiceResolver())) + PeerServiceResolver.create(GlobalOpenTelemetry.get()))) .setSchemaUrl(SchemaUrls.V1_37_0) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } diff --git a/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/NettyClientSingletons.java b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/NettyClientSingletons.java index a296af531281..cc99a97dc11d 100644 --- a/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/NettyClientSingletons.java +++ b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/NettyClientSingletons.java @@ -10,23 +10,25 @@ import io.netty.handler.codec.http.HttpResponse; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.netty.common.v4_0.NettyRequest; import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettyClientInstrumenterBuilderFactory; import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettyClientInstrumenterFactory; import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettyConnectionInstrumenter; import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettySslInstrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class NettyClientSingletons { private static final boolean connectionTelemetryEnabled = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.netty.connection-telemetry.enabled", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "netty", "connection_telemetry", "enabled") + .orElse(false); private static final boolean sslTelemetryEnabled = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.netty.ssl-telemetry.enabled", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "netty", "ssl_telemetry", "enabled") + .orElse(false); private static final Instrumenter INSTRUMENTER; private static final NettyConnectionInstrumenter CONNECTION_INSTRUMENTER; @@ -36,7 +38,7 @@ public final class NettyClientSingletons { DefaultHttpClientInstrumenterBuilder builder = NettyClientInstrumenterBuilderFactory.create( "io.opentelemetry.netty-4.0", GlobalOpenTelemetry.get()) - .configure(AgentCommonConfig.get()); + .configure(GlobalOpenTelemetry.get()); NettyClientInstrumenterFactory factory = new NettyClientInstrumenterFactory( @@ -45,7 +47,7 @@ public final class NettyClientSingletons { enabledOrErrorOnly(sslTelemetryEnabled)); INSTRUMENTER = factory.instrumenter(); CONNECTION_INSTRUMENTER = - factory.createConnectionInstrumenter(AgentCommonConfig.get().getPeerServiceResolver()); + factory.createConnectionInstrumenter(PeerServiceResolver.create(GlobalOpenTelemetry.get())); SSL_INSTRUMENTER = factory.createSslInstrumenter(); } diff --git a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyClientSingletons.java b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyClientSingletons.java index 9631080b63cb..b236b77ff203 100644 --- a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyClientSingletons.java +++ b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyClientSingletons.java @@ -10,6 +10,8 @@ import io.netty.handler.codec.http.HttpResponse; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.netty.common.v4_0.NettyRequest; import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettyClientInstrumenterBuilderFactory; @@ -17,17 +19,17 @@ import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettyConnectionInstrumenter; import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettySslInstrumenter; import io.opentelemetry.instrumentation.netty.v4_1.internal.client.NettyClientHandlerFactory; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class NettyClientSingletons { private static final boolean connectionTelemetryEnabled = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.netty.connection-telemetry.enabled", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "netty", "connection_telemetry", "enabled") + .orElse(false); private static final boolean sslTelemetryEnabled = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.netty.ssl-telemetry.enabled", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "netty", "ssl_telemetry", "enabled") + .orElse(false); private static final Instrumenter INSTRUMENTER; private static final NettyConnectionInstrumenter CONNECTION_INSTRUMENTER; @@ -38,7 +40,7 @@ public final class NettyClientSingletons { DefaultHttpClientInstrumenterBuilder builder = NettyClientInstrumenterBuilderFactory.create( "io.opentelemetry.netty-4.1", GlobalOpenTelemetry.get()) - .configure(AgentCommonConfig.get()); + .configure(GlobalOpenTelemetry.get()); NettyClientInstrumenterFactory factory = new NettyClientInstrumenterFactory( builder, @@ -46,11 +48,18 @@ public final class NettyClientSingletons { enabledOrErrorOnly(sslTelemetryEnabled)); INSTRUMENTER = factory.instrumenter(); CONNECTION_INSTRUMENTER = - factory.createConnectionInstrumenter(AgentCommonConfig.get().getPeerServiceResolver()); + factory.createConnectionInstrumenter(PeerServiceResolver.create(GlobalOpenTelemetry.get())); SSL_INSTRUMENTER = factory.createSslInstrumenter(); CLIENT_HANDLER_FACTORY = new NettyClientHandlerFactory( - INSTRUMENTER, AgentCommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()); + INSTRUMENTER, + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "http", + "client", + "emit_experimental_telemetry") + .orElse(false)); } public static Instrumenter instrumenter() { diff --git a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyServerSingletons.java b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyServerSingletons.java index cfbb438564b1..7c53f38c7ed5 100644 --- a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyServerSingletons.java +++ b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyServerSingletons.java @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.netty.v4_1; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.netty.v4_1.NettyServerTelemetry; import io.opentelemetry.instrumentation.netty.v4_1.NettyServerTelemetryBuilder; import io.opentelemetry.instrumentation.netty.v4_1.internal.server.NettyServerInstrumenterBuilderUtil; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; public final class NettyServerSingletons { @@ -17,8 +17,10 @@ public final class NettyServerSingletons { NettyServerTelemetryBuilder builder = NettyServerTelemetry.builder(GlobalOpenTelemetry.get()); NettyServerInstrumenterBuilderUtil.getBuilderExtractor() .apply(builder) - .configure(AgentCommonConfig.get()); - if (AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) { + .configure(GlobalOpenTelemetry.get()); + if (DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "http", "server", "emit_experimental_telemetry") + .orElse(false)) { // this logic is only used in agent builder.setEmitExperimentalHttpServerEvents(true); } diff --git a/instrumentation/okhttp/okhttp-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttpIgnoredTypesConfigurer.java b/instrumentation/okhttp/okhttp-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttpIgnoredTypesConfigurer.java index 8823c36cf44b..e47ee7bdc1a2 100644 --- a/instrumentation/okhttp/okhttp-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttpIgnoredTypesConfigurer.java +++ b/instrumentation/okhttp/okhttp-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttpIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class OkHttpIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // OkHttp connection pool lazily initializes a long running task to detect expired // connections and should not itself be instrumented. builder.ignoreTaskClass("com.squareup.okhttp.ConnectionPool$"); diff --git a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3IgnoredTypesConfigurer.java b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3IgnoredTypesConfigurer.java index 6198a2e84523..934c0d834ea0 100644 --- a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3IgnoredTypesConfigurer.java +++ b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3IgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class OkHttp3IgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // OkHttp task runner is a lazily-initialized shared pool of continuously running threads // similar to an event loop. The submitted tasks themselves should already be // instrumented to allow async propagation. diff --git a/instrumentation/openai/openai-java-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/openai/v1_1/OpenAiSingletons.java b/instrumentation/openai/openai-java-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/openai/v1_1/OpenAiSingletons.java index 2e956eddc0e3..70415b228a17 100644 --- a/instrumentation/openai/openai-java-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/openai/v1_1/OpenAiSingletons.java +++ b/instrumentation/openai/openai-java-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/openai/v1_1/OpenAiSingletons.java @@ -6,15 +6,16 @@ package io.opentelemetry.javaagent.instrumentation.openai.v1_1; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.openai.v1_1.OpenAITelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class OpenAiSingletons { public static final OpenAITelemetry TELEMETRY = OpenAITelemetry.builder(GlobalOpenTelemetry.get()) .setCaptureMessageContent( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.genai.capture-message-content", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "genai", "capture_message_content") + .orElse(false)) .build(); private OpenAiSingletons() {} diff --git a/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java b/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java index c6b8fc0c83de..91dc93cd7b9e 100644 --- a/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java +++ b/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java @@ -17,11 +17,12 @@ import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.whereAny; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.tooling.config.MethodsConfigurationParser; @@ -41,9 +42,6 @@ public class WithSpanInstrumentation implements TypeInstrumentation { - private static final String TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG = - "otel.instrumentation.opentelemetry-annotations.exclude-methods"; - private final ElementMatcher.Junction annotatedMethodMatcher; private final ElementMatcher.Junction annotatedParametersMatcher; // this matcher matches all methods that should be excluded from transformation @@ -100,7 +98,12 @@ static ElementMatcher.Junction configureExcludedMethods() { Map> excludedMethods = MethodsConfigurationParser.parse( - AgentInstrumentationConfig.get().getString(TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG)); + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), + "java", + "opentelemetry-annotations", + "exclude_methods") + .orElse(null)); for (Map.Entry> entry : excludedMethods.entrySet()) { String className = entry.getKey(); ElementMatcher.Junction matcher = diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationExcludedMethods.java b/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationExcludedMethods.java index 9bec0120fe70..c9305de792df 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationExcludedMethods.java +++ b/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationExcludedMethods.java @@ -9,7 +9,8 @@ import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; import static net.bytebuddy.matcher.ElementMatchers.none; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.tooling.config.MethodsConfigurationParser; import java.util.Map; import java.util.Set; @@ -20,9 +21,6 @@ public final class AnnotationExcludedMethods { - private static final String TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG = - "otel.instrumentation.opentelemetry-instrumentation-annotations.exclude-methods"; - /* Returns a matcher for all methods that should be excluded from auto-instrumentation by annotation-based advices. @@ -32,7 +30,12 @@ public static ElementMatcher.Junction configureExcludedMethod Map> excludedMethods = MethodsConfigurationParser.parse( - AgentInstrumentationConfig.get().getString(TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG)); + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), + "java", + "opentelemetry-instrumentation-annotations", + "exclude_methods") + .orElse(null)); for (Map.Entry> entry : excludedMethods.entrySet()) { String className = entry.getKey(); ElementMatcher.Junction matcher = diff --git a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/MetricsRegistration.java b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/MetricsRegistration.java index 742e20909781..b900e639156e 100644 --- a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/MetricsRegistration.java +++ b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/MetricsRegistration.java @@ -6,9 +6,9 @@ package io.opentelemetry.javaagent.instrumentation.oshi; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.oshi.ProcessMetrics; import io.opentelemetry.instrumentation.oshi.SystemMetrics; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -23,8 +23,9 @@ public static void register() { observables.addAll(SystemMetrics.registerObservers(GlobalOpenTelemetry.get())); // ProcessMetrics don't follow the spec - if (AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.oshi.experimental-metrics.enabled", false)) { + if (DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "oshi", "experimental_metrics", "enabled") + .orElse(false)) { observables.addAll(ProcessMetrics.registerObservers(GlobalOpenTelemetry.get())); } Thread cleanupTelemetry = new Thread(() -> MetricsRegistration.closeObservables(observables)); diff --git a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiMetricsInstaller.java b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiMetricsInstaller.java index 5a5b04443d2e..c2fb94d474f7 100644 --- a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiMetricsInstaller.java +++ b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiMetricsInstaller.java @@ -6,10 +6,9 @@ package io.opentelemetry.javaagent.instrumentation.oshi; import com.google.auto.service.AutoService; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.AgentListener; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.lang.reflect.Method; /** @@ -21,10 +20,18 @@ public class OshiMetricsInstaller implements AgentListener { @Override public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) { - ConfigProperties config = AutoConfigureUtil.getConfig(autoConfiguredSdk); - - boolean defaultEnabled = config.getBoolean("otel.instrumentation.common.default-enabled", true); - if (!config.getBoolean("otel.instrumentation.oshi.enabled", defaultEnabled)) { + boolean enabled = + DeclarativeConfigUtil.getBoolean( + autoConfiguredSdk.getOpenTelemetrySdk(), "java", "oshi", "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + autoConfiguredSdk.getOpenTelemetrySdk(), + "java", + "common", + "default_enabled") + .orElse(true)); + if (!enabled) { return; } diff --git a/instrumentation/pekko/pekko-actor-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkoactor/v1_0/PekkoIgnoredTypesConfigurer.java b/instrumentation/pekko/pekko-actor-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkoactor/v1_0/PekkoIgnoredTypesConfigurer.java index da2ee3dff985..fd87b86e43aa 100644 --- a/instrumentation/pekko/pekko-actor-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkoactor/v1_0/PekkoIgnoredTypesConfigurer.java +++ b/instrumentation/pekko/pekko-actor-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkoactor/v1_0/PekkoIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class PekkoIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // This is a Mailbox created by org.apache.pekko.dispatch.Dispatcher#createMailbox. We must not // add a context to it as context should only be carried by individual envelopes in the queue // of this mailbox. diff --git a/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/server/PekkoServerIgnoredTypesConfigurer.java b/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/server/PekkoServerIgnoredTypesConfigurer.java index d8dc971ee5a0..dc446d10084f 100644 --- a/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/server/PekkoServerIgnoredTypesConfigurer.java +++ b/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/server/PekkoServerIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class PekkoServerIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // in PekkoHttpServerInstrumentationTestAsync http pipeline test sending this message trigger // processing next request, we don't want to propagate context there builder.ignoreTaskClass("org.apache.pekko.stream.impl.fusing.ActorGraphInterpreter$AsyncInput"); diff --git a/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/Play24Singletons.java b/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/Play24Singletons.java index 26c9581ddb36..bac14312b94a 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/Play24Singletons.java +++ b/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/Play24Singletons.java @@ -8,10 +8,10 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import play.api.mvc.Request; import scala.Option; @@ -21,7 +21,14 @@ public final class Play24Singletons { private static final Instrumenter INSTRUMENTER = Instrumenter.builder( GlobalOpenTelemetry.get(), "io.opentelemetry.play-mvc-2.4", s -> SPAN_NAME) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); public static Instrumenter instrumenter() { diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/Play26Singletons.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/Play26Singletons.java index 3b72dab6282a..67a3010454cd 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/Play26Singletons.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/Play26Singletons.java @@ -8,10 +8,10 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import javax.annotation.Nullable; @@ -27,7 +27,14 @@ public final class Play26Singletons { private static final Instrumenter INSTRUMENTER = Instrumenter.builder( GlobalOpenTelemetry.get(), "io.opentelemetry.play-mvc-2.6", s -> SPAN_NAME) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); @Nullable private static final Method typedKeyGetUnderlying; diff --git a/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/PowerJobSingletons.java b/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/PowerJobSingletons.java index cf49c5d333a3..fee98ba19126 100644 --- a/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/PowerJobSingletons.java +++ b/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/PowerJobSingletons.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; @@ -15,15 +16,15 @@ import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import tech.powerjob.worker.core.processor.ProcessResult; public final class PowerJobSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.powerjob-4.0"; private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.powerjob.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "powerjob", "experimental_span_attributes") + .orElse(false); private static final Instrumenter INSTRUMENTER = create(); public static Instrumenter instrumenter() { diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java index c26022efea02..76ce798cf06b 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java @@ -10,6 +10,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessageOperation; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesGetter; @@ -25,9 +26,8 @@ import io.opentelemetry.instrumentation.api.internal.PropagatorBasedSpanLinksExtractor; import io.opentelemetry.instrumentation.api.internal.Timer; import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import io.opentelemetry.javaagent.instrumentation.pulsar.v2_8.VirtualFieldStore; +import java.util.Collections; import java.util.List; import java.util.concurrent.CompletableFuture; import org.apache.pulsar.client.api.Consumer; @@ -41,9 +41,17 @@ public final class PulsarSingletons { private static final TextMapPropagator PROPAGATOR = TELEMETRY.getPropagators().getTextMapPropagator(); private static final List capturedHeaders = - ExperimentalConfig.get().getMessagingHeaders(); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "messaging", "capture_headers/development") + .orElse(Collections.emptyList()); private static final boolean receiveInstrumentationEnabled = - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled(); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false); private static final Instrumenter CONSUMER_PROCESS_INSTRUMENTER = createConsumerProcessInstrumenter(); @@ -143,8 +151,9 @@ private static Instrumenter createProducerInstrumenter() { ServerAttributesExtractor.create(new PulsarNetClientAttributesGetter())) .addOperationMetrics(MessagingProducerMetrics.get()); - if (AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.pulsar.experimental-span-attributes", false)) { + if (DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "pulsar", "experimental_span_attributes") + .orElse(false)) { builder.addAttributesExtractor(ExperimentalProducerAttributesExtractor.INSTANCE); } diff --git a/instrumentation/quartz-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quartz/v2_0/QuartzIgnoredTypesConfigurer.java b/instrumentation/quartz-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quartz/v2_0/QuartzIgnoredTypesConfigurer.java index 9eb02928b99c..edff6559062b 100644 --- a/instrumentation/quartz-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quartz/v2_0/QuartzIgnoredTypesConfigurer.java +++ b/instrumentation/quartz-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quartz/v2_0/QuartzIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class QuartzIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // Quartz executes jobs themselves in a synchronous way, there's no reason to propagate context // between its scheduler threads. builder.ignoreTaskClass("org.quartz"); diff --git a/instrumentation/quartz-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quartz/v2_0/QuartzSingletons.java b/instrumentation/quartz-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quartz/v2_0/QuartzSingletons.java index 6d0b5c046575..a787a1346488 100644 --- a/instrumentation/quartz-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quartz/v2_0/QuartzSingletons.java +++ b/instrumentation/quartz-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quartz/v2_0/QuartzSingletons.java @@ -6,16 +6,17 @@ package io.opentelemetry.javaagent.instrumentation.quartz.v2_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.quartz.v2_0.QuartzTelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class QuartzSingletons { public static final QuartzTelemetry TELEMETRY = QuartzTelemetry.builder(GlobalOpenTelemetry.get()) .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.quartz.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "quartz", "experimental_span_attributes") + .orElse(false)) .build(); private QuartzSingletons() {} diff --git a/instrumentation/r2dbc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/r2dbc/v1_0/R2dbcSingletons.java b/instrumentation/r2dbc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/r2dbc/v1_0/R2dbcSingletons.java index 3ac92e48a5f8..7c44950a9997 100644 --- a/instrumentation/r2dbc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/r2dbc/v1_0/R2dbcSingletons.java +++ b/instrumentation/r2dbc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/r2dbc/v1_0/R2dbcSingletons.java @@ -6,13 +6,13 @@ package io.opentelemetry.javaagent.instrumentation.r2dbc.v1_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.r2dbc.v1_0.internal.shaded.R2dbcTelemetry; import io.opentelemetry.instrumentation.r2dbc.v1_0.internal.shaded.R2dbcTelemetryBuilder; import io.opentelemetry.instrumentation.r2dbc.v1_0.internal.shaded.internal.Experimental; import io.opentelemetry.instrumentation.r2dbc.v1_0.internal.shaded.internal.R2dbcSqlAttributesGetter; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.bootstrap.internal.sqlcommenter.SqlCommenterCustomizerHolder; public final class R2dbcSingletons { @@ -23,20 +23,43 @@ public final class R2dbcSingletons { R2dbcTelemetryBuilder builder = R2dbcTelemetry.builder(GlobalOpenTelemetry.get()) .setStatementSanitizationEnabled( - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.r2dbc.statement-sanitizer.enabled", - AgentCommonConfig.get().isStatementSanitizationEnabled())) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "r2dbc", + "statement_sanitizer", + "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "db", + "statement_sanitizer", + "enabled") + .orElse(true))) .addAttributesExtractor( PeerServiceAttributesExtractor.create( R2dbcSqlAttributesGetter.INSTANCE, - AgentCommonConfig.get().getPeerServiceResolver())); + PeerServiceResolver.create(GlobalOpenTelemetry.get()))); Experimental.setEnableSqlCommenter( builder, - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.r2dbc.experimental.sqlcommenter.enabled", - AgentCommonConfig.get().isSqlCommenterEnabled())); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "r2dbc", + "experimental", + "sqlcommenter", + "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "sqlcommenter/development") + .orElse(false))); Experimental.customizeSqlCommenter( builder, sqlCommenterBuilder -> diff --git a/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitInstrumenterHelper.java b/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitInstrumenterHelper.java index 2f0c77addc01..06e19257a413 100644 --- a/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitInstrumenterHelper.java +++ b/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitInstrumenterHelper.java @@ -13,7 +13,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.util.Map; @@ -21,8 +21,9 @@ public class RabbitInstrumenterHelper { static final AttributeKey RABBITMQ_COMMAND = AttributeKey.stringKey("rabbitmq.command"); private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.rabbitmq.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "rabbitmq", "experimental_span_attributes") + .orElse(false); private static final RabbitInstrumenterHelper INSTRUMENTER_HELPER = new RabbitInstrumenterHelper(); diff --git a/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitSingletons.java b/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitSingletons.java index c8af3a8784d6..5a94eb5957c8 100644 --- a/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitSingletons.java +++ b/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitSingletons.java @@ -11,6 +11,7 @@ import com.rabbitmq.client.GetResponse; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.ContextKey; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessageOperation; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesGetter; @@ -19,16 +20,16 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.internal.PropagatorBasedSpanLinksExtractor; import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public final class RabbitSingletons { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.rabbitmq.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "rabbitmq", "experimental_span_attributes") + .orElse(false); private static final String instrumentationName = "io.opentelemetry.rabbitmq-2.7"; private static final Instrumenter channelInstrumenter = createChannelInstrumenter(false); @@ -83,7 +84,14 @@ private static Instrumenter createReceiveInstrument return Instrumenter.builder( GlobalOpenTelemetry.get(), instrumentationName, ReceiveRequest::spanName) .addAttributesExtractors(extractors) - .setEnabled(ExperimentalConfig.get().messagingReceiveInstrumentationEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false)) .addSpanLinksExtractor( new PropagatorBasedSpanLinksExtractor<>( GlobalOpenTelemetry.getPropagators().getTextMapPropagator(), @@ -111,7 +119,10 @@ private static Instrumenter createDeliverInstrumenter() { private static AttributesExtractor buildMessagingAttributesExtractor( MessagingAttributesGetter getter, MessageOperation operation) { return MessagingAttributesExtractor.builder(getter, operation) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "messaging", "capture_headers/development") + .orElse(Collections.emptyList())) .build(); } diff --git a/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackIgnoredTypesConfigurer.java b/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackIgnoredTypesConfigurer.java index 165c21f1d6d9..0b3dcd2d813f 100644 --- a/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackIgnoredTypesConfigurer.java +++ b/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class RatpackIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // Context is passed through Netty channels in Ratpack as executor instrumentation is // not suitable. As the context that would be propagated via executor would be // incorrect, skip the propagation. Not checking for concrete class names as this covers diff --git a/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackSingletons.java b/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackSingletons.java index 6796026d6dfd..a5fee6378dae 100644 --- a/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackSingletons.java +++ b/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackSingletons.java @@ -8,19 +8,28 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.ErrorCauseExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import ratpack.handling.Context; public final class RatpackSingletons { + private static final boolean CONTROLLER_TELEMETRY_ENABLED = + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false); + private static final Instrumenter INSTRUMENTER = Instrumenter.builder( GlobalOpenTelemetry.get(), "io.opentelemetry.ratpack-1.4", s -> s) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled(CONTROLLER_TELEMETRY_ENABLED) .buildInstrumenter(); public static Instrumenter instrumenter() { @@ -30,7 +39,7 @@ public static Instrumenter instrumenter() { public static void updateSpanNames(io.opentelemetry.context.Context otelContext, Context ctx) { String matchedRoute = updateServerSpanName(otelContext, ctx); // update ratpack span name - if (ExperimentalConfig.get().controllerTelemetryEnabled()) { + if (CONTROLLER_TELEMETRY_ENABLED) { Span.fromContext(otelContext).updateName(matchedRoute); } } diff --git a/instrumentation/ratpack/ratpack-1.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/v1_7/RatpackSingletons.java b/instrumentation/ratpack/ratpack-1.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/v1_7/RatpackSingletons.java index 8c0adac4ba75..b9944ef88b56 100644 --- a/instrumentation/ratpack/ratpack-1.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/v1_7/RatpackSingletons.java +++ b/instrumentation/ratpack/ratpack-1.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/v1_7/RatpackSingletons.java @@ -12,7 +12,6 @@ import io.opentelemetry.instrumentation.ratpack.v1_7.internal.ContextHolder; import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryHttpClient; import io.opentelemetry.instrumentation.ratpack.v1_7.internal.RatpackClientInstrumenterBuilderFactory; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import ratpack.exec.Execution; public final class RatpackSingletons { @@ -22,7 +21,7 @@ public final class RatpackSingletons { new OpenTelemetryHttpClient( RatpackClientInstrumenterBuilderFactory.create( "io.opentelemetry.ratpack-1.7", GlobalOpenTelemetry.get()) - .configure(AgentCommonConfig.get()) + .configure(GlobalOpenTelemetry.get()) .build()); } diff --git a/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/HooksInstrumentation.java b/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/HooksInstrumentation.java index 0591db7569ea..0bca5472d787 100644 --- a/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/HooksInstrumentation.java +++ b/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/HooksInstrumentation.java @@ -9,8 +9,9 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.reactor.v3_1.ContextPropagationOperator; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; @@ -41,8 +42,9 @@ public static class ResetOnEachOperatorAdvice { public static void postStaticInitializer() { ContextPropagationOperator.builder() .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.reactor.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "reactor", "experimental_span_attributes") + .orElse(false)) .build() .registerOnEachOperator(); } diff --git a/instrumentation/reactor/reactor-kafka-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/kafka/v1_0/ReactorKafkaSingletons.java b/instrumentation/reactor/reactor-kafka-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/kafka/v1_0/ReactorKafkaSingletons.java index e965f84a05d5..e68f9af5bf28 100644 --- a/instrumentation/reactor/reactor-kafka-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/kafka/v1_0/ReactorKafkaSingletons.java +++ b/instrumentation/reactor/reactor-kafka-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/kafka/v1_0/ReactorKafkaSingletons.java @@ -6,11 +6,11 @@ package io.opentelemetry.javaagent.instrumentation.reactor.kafka.v1_0; 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.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; final class ReactorKafkaSingletons { @@ -18,12 +18,22 @@ final class ReactorKafkaSingletons { private static final Instrumenter PROCESS_INSTRUMENTER = new KafkaInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "messaging", "capture_headers/development") + .orElse(Collections.emptyList())) .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "kafka", "experimental_span_attributes") + .orElse(false)) .setMessagingReceiveInstrumentationEnabled( - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled()) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false)) .createConsumerProcessInstrumenter(); public static Instrumenter processInstrumenter() { diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java index 5bb4297c2a35..82ad6061c8bc 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java @@ -9,6 +9,8 @@ import io.netty.handler.codec.http.HttpResponse; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.instrumentation.netty.common.v4_0.NettyRequest; @@ -16,8 +18,6 @@ import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettyClientInstrumenterFactory; import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettyConnectionInstrumentationFlag; import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettyConnectionInstrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import reactor.netty.http.client.HttpClientRequest; import reactor.netty.http.client.HttpClientResponse; @@ -27,8 +27,9 @@ public final class ReactorNettySingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.reactor-netty-1.0"; private static final boolean connectionTelemetryEnabled = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.reactor-netty.connection-telemetry.enabled", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "reactor_netty", "connection_telemetry", "enabled") + .orElse(false); private static final Instrumenter INSTRUMENTER; private static final NettyConnectionInstrumenter CONNECTION_INSTRUMENTER; @@ -47,7 +48,7 @@ public final class ReactorNettySingletons { DefaultHttpClientInstrumenterBuilder builder = NettyClientInstrumenterBuilderFactory.create( INSTRUMENTATION_NAME, GlobalOpenTelemetry.get()) - .configure(AgentCommonConfig.get()); + .configure(GlobalOpenTelemetry.get()); NettyClientInstrumenterFactory instrumenterFactory = new NettyClientInstrumenterFactory( builder, @@ -57,7 +58,7 @@ public final class ReactorNettySingletons { NettyConnectionInstrumentationFlag.DISABLED); CONNECTION_INSTRUMENTER = instrumenterFactory.createConnectionInstrumenter( - AgentCommonConfig.get().getPeerServiceResolver()); + PeerServiceResolver.create(GlobalOpenTelemetry.get())); } public static Instrumenter instrumenter() { diff --git a/instrumentation/redisson/redisson-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonRequest.java b/instrumentation/redisson/redisson-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonRequest.java index 2bf432f4b0df..9344bd22d210 100644 --- a/instrumentation/redisson/redisson-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonRequest.java +++ b/instrumentation/redisson/redisson-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonRequest.java @@ -10,8 +10,9 @@ import com.google.auto.value.AutoValue; import io.netty.buffer.ByteBuf; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.RedisCommandSanitizer; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -29,7 +30,15 @@ public abstract class RedissonRequest { private static final RedisCommandSanitizer sanitizer = - RedisCommandSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + RedisCommandSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); public static RedissonRequest create(InetSocketAddress address, Object command) { return new AutoValue_RedissonRequest(address, command); diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v4_8/RocketMqClientHooks.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v4_8/RocketMqClientHooks.java index 7c2b958ca4f9..71ad134c7ad5 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v4_8/RocketMqClientHooks.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v4_8/RocketMqClientHooks.java @@ -6,9 +6,9 @@ package io.opentelemetry.javaagent.instrumentation.rocketmqclient.v4_8; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.rocketmqclient.v4_8.RocketMqTelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.Collections; import org.apache.rocketmq.client.hook.ConsumeMessageHook; import org.apache.rocketmq.client.hook.SendMessageHook; @@ -17,11 +17,17 @@ public final class RocketMqClientHooks { @SuppressWarnings("deprecation") // call to deprecated method will be removed in the future private static final RocketMqTelemetry TELEMETRY = RocketMqTelemetry.builder(GlobalOpenTelemetry.get()) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "messaging", "capture_headers/development") + .orElse(Collections.emptyList())) .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.rocketmq-client.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "rocketmq-client", + "experimental_span_attributes") + .orElse(false)) .build(); public static final ConsumeMessageHook CONSUME_MESSAGE_HOOK = diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqSingletons.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqSingletons.java index 605838c13c2a..3f669a997bd8 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqSingletons.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqSingletons.java @@ -8,8 +8,9 @@ import apache.rocketmq.v2.ReceiveMessageRequest; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.Collections; import java.util.List; import org.apache.rocketmq.client.apis.consumer.ConsumeResult; import org.apache.rocketmq.client.apis.message.MessageView; @@ -25,9 +26,18 @@ public final class RocketMqSingletons { static { OpenTelemetry openTelemetry = GlobalOpenTelemetry.get(); - List messagingHeaders = ExperimentalConfig.get().getMessagingHeaders(); + List messagingHeaders = + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "messaging", "capture_headers/development") + .orElse(Collections.emptyList()); boolean receiveInstrumentationEnabled = - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled(); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false); PRODUCER_INSTRUMENTER = RocketMqInstrumenterFactory.createProducerInstrumenter(openTelemetry, messagingHeaders); diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java17/Java17RuntimeMetricsInstaller.java b/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java17/Java17RuntimeMetricsInstaller.java index 0cd2cd3da663..bb5c1c61dd6d 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java17/Java17RuntimeMetricsInstaller.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java17/Java17RuntimeMetricsInstaller.java @@ -9,7 +9,6 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java17.internal.RuntimeMetricsConfigUtil; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.extension.AgentListener; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; @@ -21,7 +20,7 @@ public class Java17RuntimeMetricsInstaller implements AgentListener { public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) { RuntimeMetrics runtimeMetrics = RuntimeMetricsConfigUtil.configure( - RuntimeMetrics.builder(GlobalOpenTelemetry.get()), AgentInstrumentationConfig.get()); + RuntimeMetrics.builder(GlobalOpenTelemetry.get()), GlobalOpenTelemetry.get()); if (runtimeMetrics != null) { Runtime.getRuntime() .addShutdownHook( diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17/internal/RuntimeMetricsConfigUtil.java b/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17/internal/RuntimeMetricsConfigUtil.java index 8ddd5f5d8082..3912c722c6a0 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17/internal/RuntimeMetricsConfigUtil.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17/internal/RuntimeMetricsConfigUtil.java @@ -5,7 +5,8 @@ package io.opentelemetry.instrumentation.runtimemetrics.java17.internal; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetricsBuilder; import javax.annotation.Nullable; @@ -19,18 +20,25 @@ private RuntimeMetricsConfigUtil() {} @Nullable public static RuntimeMetrics configure( - RuntimeMetricsBuilder builder, InstrumentationConfig config) { + RuntimeMetricsBuilder builder, OpenTelemetry openTelemetry) { /* By default, don't use any JFR metrics. May change this once semantic conventions are updated. If enabled, default to only the metrics not already covered by runtime-telemetry-java8 */ - boolean defaultEnabled = config.getBoolean("otel.instrumentation.common.default-enabled", true); - if (config.getBoolean("otel.instrumentation.runtime-telemetry-java17.enable-all", false)) { + boolean defaultEnabled = + DeclarativeConfigUtil.getBoolean(openTelemetry, "java", "common", "default_enabled") + .orElse(true); + if (DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "runtime_telemetry_java17", "enable_all") + .orElse(false)) { builder.enableAllFeatures(); - } else if (config.getBoolean("otel.instrumentation.runtime-telemetry-java17.enabled", false)) { + } else if (DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "runtime_telemetry_java17", "enabled") + .orElse(false)) { // default configuration - } else if (config.getBoolean( - "otel.instrumentation.runtime-telemetry.enabled", defaultEnabled)) { + } else if (DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "runtime_telemetry", "enabled") + .orElse(defaultEnabled)) { // This only uses metrics gathered by JMX builder.disableAllFeatures(); } else { @@ -38,12 +46,15 @@ public static RuntimeMetrics configure( return null; } - if (config.getBoolean( - "otel.instrumentation.runtime-telemetry.emit-experimental-telemetry", false)) { + if (DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "runtime_telemetry", "emit_experimental_telemetry") + .orElse(false)) { builder.emitExperimentalTelemetry(); } - if (config.getBoolean("otel.instrumentation.runtime-telemetry.capture-gc-cause", false)) { + if (DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "runtime_telemetry", "capture_gc_cause") + .orElse(false)) { builder.captureGcCause(); } diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/JarAnalyzerInstaller.java b/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/JarAnalyzerInstaller.java index 3a064418a590..1ea54855a5fd 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/JarAnalyzerInstaller.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/JarAnalyzerInstaller.java @@ -6,11 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.runtimemetrics.java8; import com.google.auto.service.AutoService; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.bootstrap.InstrumentationHolder; import io.opentelemetry.javaagent.tooling.BeforeAgentListener; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.lang.instrument.Instrumentation; /** Installs the {@link JarAnalyzer}. */ @@ -19,10 +18,14 @@ public class JarAnalyzerInstaller implements BeforeAgentListener { @Override public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { - ConfigProperties config = AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk); - boolean enabled = - config.getBoolean("otel.instrumentation.runtime-telemetry.package-emitter.enabled", false); + DeclarativeConfigUtil.getBoolean( + autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk(), + "java", + "runtime_telemetry", + "package_emitter", + "enabled") + .orElse(false); if (!enabled) { return; } @@ -31,7 +34,13 @@ public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemet return; } int jarsPerSecond = - config.getInt("otel.instrumentation.runtime-telemetry.package-emitter.jars-per-second", 10); + DeclarativeConfigUtil.getInt( + autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk(), + "java", + "runtime_telemetry", + "package_emitter", + "jars_per_second") + .orElse(10); JarAnalyzer jarAnalyzer = JarAnalyzer.create(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk(), jarsPerSecond); inst.addTransformer(jarAnalyzer); diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/Java8RuntimeMetricsInstaller.java b/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/Java8RuntimeMetricsInstaller.java index 0713e0c6c7ef..c3041274197d 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/Java8RuntimeMetricsInstaller.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/Java8RuntimeMetricsInstaller.java @@ -9,7 +9,6 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.RuntimeMetricsConfigUtil; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.extension.AgentListener; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; @@ -25,7 +24,7 @@ public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) { RuntimeMetrics runtimeMetrics = RuntimeMetricsConfigUtil.configure( - RuntimeMetrics.builder(GlobalOpenTelemetry.get()), AgentInstrumentationConfig.get()); + RuntimeMetrics.builder(GlobalOpenTelemetry.get()), GlobalOpenTelemetry.get()); if (runtimeMetrics != null) { Runtime.getRuntime() .addShutdownHook( diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/internal/RuntimeMetricsConfigUtil.java b/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/internal/RuntimeMetricsConfigUtil.java index c0f3ef37afee..4fc42d8f9553 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/internal/RuntimeMetricsConfigUtil.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/internal/RuntimeMetricsConfigUtil.java @@ -5,7 +5,8 @@ package io.opentelemetry.instrumentation.runtimemetrics.java8.internal; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetricsBuilder; import javax.annotation.Nullable; @@ -19,19 +20,25 @@ private RuntimeMetricsConfigUtil() {} @Nullable public static RuntimeMetrics configure( - RuntimeMetricsBuilder builder, InstrumentationConfig config) { - boolean defaultEnabled = config.getBoolean("otel.instrumentation.common.default-enabled", true); - if (!config.getBoolean("otel.instrumentation.runtime-telemetry.enabled", defaultEnabled)) { + RuntimeMetricsBuilder builder, OpenTelemetry openTelemetry) { + boolean defaultEnabled = + DeclarativeConfigUtil.getBoolean(openTelemetry, "java", "common", "default_enabled") + .orElse(true); + if (!DeclarativeConfigUtil.getBoolean(openTelemetry, "java", "runtime_telemetry", "enabled") + .orElse(defaultEnabled)) { // nothing is enabled return null; } - if (config.getBoolean( - "otel.instrumentation.runtime-telemetry.emit-experimental-telemetry", false)) { + if (DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "runtime_telemetry", "emit_experimental_telemetry") + .orElse(false)) { builder.emitExperimentalTelemetry(); } - if (config.getBoolean("otel.instrumentation.runtime-telemetry.capture-gc-cause", false)) { + if (DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "runtime_telemetry", "capture_gc_cause") + .orElse(false)) { builder.captureGcCause(); } diff --git a/instrumentation/rxjava/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v2_0/RxJava2IgnoredTypesConfigurer.java b/instrumentation/rxjava/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v2_0/RxJava2IgnoredTypesConfigurer.java index 1ff5909a7620..1f86ccd7c3c4 100644 --- a/instrumentation/rxjava/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v2_0/RxJava2IgnoredTypesConfigurer.java +++ b/instrumentation/rxjava/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v2_0/RxJava2IgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class RxJava2IgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // ScheduledRunnable is a wrapper around a Runnable and doesn't itself need context. builder.ignoreTaskClass("io.reactivex.internal.schedulers.ScheduledRunnable"); } diff --git a/instrumentation/rxjava/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v2_0/TracingAssemblyActivation.java b/instrumentation/rxjava/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v2_0/TracingAssemblyActivation.java index 91f3b108b71a..43e178c862fc 100644 --- a/instrumentation/rxjava/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v2_0/TracingAssemblyActivation.java +++ b/instrumentation/rxjava/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v2_0/TracingAssemblyActivation.java @@ -5,8 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.rxjava.v2_0; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.rxjava.v2_0.TracingAssembly; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.util.concurrent.atomic.AtomicBoolean; public final class TracingAssemblyActivation { @@ -23,8 +24,9 @@ public static void activate(Class clz) { if (activated.get(clz).compareAndSet(false, true)) { TracingAssembly.builder() .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.rxjava.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "rxjava", "experimental_span_attributes") + .orElse(false)) .build() .enable(); } diff --git a/instrumentation/rxjava/rxjava-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v3_0/TracingAssemblyActivation.java b/instrumentation/rxjava/rxjava-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v3_0/TracingAssemblyActivation.java index 2dd5a0696be7..6d9d66d4ba9c 100644 --- a/instrumentation/rxjava/rxjava-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v3_0/TracingAssemblyActivation.java +++ b/instrumentation/rxjava/rxjava-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v3_0/TracingAssemblyActivation.java @@ -5,8 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.rxjava.v3_0; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.rxjava.v3_0.TracingAssembly; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.util.concurrent.atomic.AtomicBoolean; public final class TracingAssemblyActivation { @@ -23,8 +24,9 @@ public static void activate(Class clz) { if (activated.get(clz).compareAndSet(false, true)) { TracingAssembly.builder() .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.rxjava.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "rxjava", "experimental_span_attributes") + .orElse(false)) .build() .enable(); } diff --git a/instrumentation/rxjava/rxjava-3.1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v3_1_1/TracingAssemblyActivation.java b/instrumentation/rxjava/rxjava-3.1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v3_1_1/TracingAssemblyActivation.java index ca5126be9338..830b882c3fc6 100644 --- a/instrumentation/rxjava/rxjava-3.1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v3_1_1/TracingAssemblyActivation.java +++ b/instrumentation/rxjava/rxjava-3.1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rxjava/v3_1_1/TracingAssemblyActivation.java @@ -5,8 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.rxjava.v3_1_1; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.rxjava.v3_1_1.TracingAssembly; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.util.concurrent.atomic.AtomicBoolean; public final class TracingAssemblyActivation { @@ -23,8 +24,9 @@ public static void activate(Class clz) { if (activated.get(clz).compareAndSet(false, true)) { TracingAssembly.builder() .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.rxjava.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "rxjava", "experimental_span_attributes") + .orElse(false)) .build() .enable(); } diff --git a/instrumentation/servlet/servlet-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/Servlet2SpanNameExtractor.java b/instrumentation/servlet/servlet-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/Servlet2SpanNameExtractor.java index b6dd650f5a46..6d7b2d23f867 100644 --- a/instrumentation/servlet/servlet-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/Servlet2SpanNameExtractor.java +++ b/instrumentation/servlet/servlet-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/Servlet2SpanNameExtractor.java @@ -5,22 +5,31 @@ package io.opentelemetry.javaagent.instrumentation.servlet.v2_2; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; +import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.servlet.internal.ServletAccessor; import io.opentelemetry.instrumentation.servlet.internal.ServletRequestContext; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import java.util.HashSet; import java.util.Set; public class Servlet2SpanNameExtractor implements SpanNameExtractor> { private final ServletAccessor accessor; - private final Set knownMethods = AgentCommonConfig.get().getKnownHttpRequestMethods(); + private final Set knownMethods = getKnownHttpMethods(); public Servlet2SpanNameExtractor(ServletAccessor accessor) { this.accessor = accessor; } + private static Set getKnownHttpMethods() { + return DeclarativeConfigUtil.getList(GlobalOpenTelemetry.get(), "java", "http", "known_methods") + .map(HashSet::new) + .orElse(new HashSet<>(HttpConstants.KNOWN_METHODS)); + } + @Override public String extract(ServletRequestContext requestContext) { REQUEST request = requestContext.request(); diff --git a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/AgentServletInstrumenterBuilder.java b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/AgentServletInstrumenterBuilder.java index 8e2634fc54ce..c631d1220360 100644 --- a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/AgentServletInstrumenterBuilder.java +++ b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/AgentServletInstrumenterBuilder.java @@ -9,9 +9,11 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; +import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter; import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.servlet.internal.ServletAccessor; @@ -19,20 +21,25 @@ import io.opentelemetry.instrumentation.servlet.internal.ServletInstrumenterBuilder; import io.opentelemetry.instrumentation.servlet.internal.ServletRequestContext; import io.opentelemetry.instrumentation.servlet.internal.ServletResponseContext; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; public final class AgentServletInstrumenterBuilder { private static final List CAPTURE_REQUEST_PARAMETERS = - AgentInstrumentationConfig.get() - .getList( - "otel.instrumentation.servlet.experimental.capture-request-parameters", emptyList()); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "servlet", + "experimental", + "capture_request_parameters") + .orElse(emptyList()); private static final boolean CAPTURE_EXPERIMENTAL_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.servlet.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "servlet", "experimental_span_attributes") + .orElse(false); private AgentServletInstrumenterBuilder() {} @@ -69,7 +76,10 @@ public Instrumenter, ServletResponseContext> contextCustomizer : contextCustomizers) { builder.addContextCustomizer(contextCustomizer); @@ -77,7 +87,7 @@ public Instrumenter, ServletResponseContext, ServletResponseContext(accessor); SpanNameExtractor> spanNameExtractor = HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) + .setKnownMethods(getKnownHttpMethods()) .build(); return build(instrumentationName, accessor, spanNameExtractor, httpAttributesGetter); } + + private static Set getKnownHttpMethods() { + return DeclarativeConfigUtil.getList(GlobalOpenTelemetry.get(), "java", "http", "known_methods") + .map(HashSet::new) + .orElse(new HashSet<>(HttpConstants.KNOWN_METHODS)); + } } diff --git a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/BaseServletHelper.java b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/BaseServletHelper.java index e84ffcdeb663..5eda4dfd2fe0 100644 --- a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/BaseServletHelper.java +++ b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/BaseServletHelper.java @@ -9,9 +9,11 @@ import static io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource.SERVER_FILTER; import static java.util.Collections.emptyList; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; @@ -21,8 +23,6 @@ import io.opentelemetry.instrumentation.servlet.internal.ServletRequestContext; import io.opentelemetry.instrumentation.servlet.internal.ServletRequestParametersExtractor; import io.opentelemetry.instrumentation.servlet.internal.ServletResponseContext; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge; import io.opentelemetry.javaagent.bootstrap.servlet.ServletAsyncContext; import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath; @@ -33,13 +33,21 @@ public abstract class BaseServletHelper { private static final List CAPTURE_REQUEST_PARAMETERS = - AgentInstrumentationConfig.get() - .getList( - "otel.instrumentation.servlet.experimental.capture-request-parameters", emptyList()); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "servlet", + "experimental", + "capture_request_parameters") + .orElse(emptyList()); private static final boolean ADD_TRACE_ID_REQUEST_ATTRIBUTE = - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.servlet.experimental.add-trace-id-request-attribute", true); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "servlet", + "experimental", + "add_trace_id_request_attribute") + .orElse(true); protected final Instrumenter, ServletResponseContext> instrumenter; @@ -167,7 +175,9 @@ private void captureRequestParameters(Span serverSpan, REQUEST request) { * created by servlet instrumentation we call this method on exit from the last servlet or filter. */ private void captureEnduserId(Span serverSpan, REQUEST request) { - if (!AgentCommonConfig.get().getEnduserConfig().isIdEnabled()) { + if (!DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "enduser", "id", "enabled") + .orElse(false)) { return; } diff --git a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/SpringBatchInstrumentationConfig.java b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/SpringBatchInstrumentationConfig.java index 5dac88c313fa..264aa4719531 100644 --- a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/SpringBatchInstrumentationConfig.java +++ b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/SpringBatchInstrumentationConfig.java @@ -5,7 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.spring.batch.v3_0; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; public final class SpringBatchInstrumentationConfig { @@ -13,11 +14,14 @@ public final class SpringBatchInstrumentationConfig { // the item level instrumentation is very chatty so it's disabled by default private static final boolean ITEM_TRACING_ENABLED = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.spring-batch.item.enabled", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "spring_batch", "item", "enabled") + .orElse(false); + private static final boolean CREATE_ROOT_SPAN_FOR_CHUNK = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.spring-batch.experimental.chunk.new-trace", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "spring_batch", "chunk/development", "new_trace") + .orElse(false); public static String instrumentationName() { return INSTRUMENTATION_NAME; diff --git a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/SpringBatchInstrumentationModule.java b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/SpringBatchInstrumentationModule.java index 3f66214494cd..9956d5c06ba7 100644 --- a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/SpringBatchInstrumentationModule.java +++ b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/SpringBatchInstrumentationModule.java @@ -20,7 +20,6 @@ import io.opentelemetry.javaagent.instrumentation.spring.batch.v3_0.job.JobFactoryBeanInstrumentation; import io.opentelemetry.javaagent.instrumentation.spring.batch.v3_0.job.JobParserJobFactoryBeanInstrumentation; import io.opentelemetry.javaagent.instrumentation.spring.batch.v3_0.step.StepBuilderHelperInstrumentation; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.Arrays; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @@ -57,7 +56,7 @@ public List typeInstrumentations() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // TODO: replace this with an experimental flag return false; } diff --git a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/job/JobSingletons.java b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/job/JobSingletons.java index 1f75b22ea1b1..c9d181a0aaa9 100644 --- a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/job/JobSingletons.java +++ b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/job/JobSingletons.java @@ -9,17 +9,18 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import org.springframework.batch.core.JobExecution; public class JobSingletons { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.spring-batch.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "spring_batch", "experimental_span_attributes") + .orElse(false); private static final Instrumenter INSTRUMENTER; diff --git a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/SpringBootActuatorIgnoredTypesConfigurer.java b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/SpringBootActuatorIgnoredTypesConfigurer.java index d6691de913b8..6ce3441aad67 100644 --- a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/SpringBootActuatorIgnoredTypesConfigurer.java +++ b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/SpringBootActuatorIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class SpringBootActuatorIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { builder.allowClass("org.springframework.boot.autoconfigure.AutoConfigurationImportSelector"); } } diff --git a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/SpringBootActuatorInstrumentationModule.java b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/SpringBootActuatorInstrumentationModule.java index 3d47c10e3ba6..3a6d0305c14e 100644 --- a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/SpringBootActuatorInstrumentationModule.java +++ b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/SpringBootActuatorInstrumentationModule.java @@ -15,7 +15,6 @@ import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.ClassInjector; import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.InjectionMode; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @@ -65,7 +64,7 @@ public List typeInstrumentations() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // produces a lot of metrics that are already captured - e.g. JVM memory usage return false; } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFile.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFile.java index b2222baf489f..7da9cee2408a 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFile.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFile.java @@ -46,20 +46,24 @@ class EmbeddedConfigFile { private EmbeddedConfigFile() {} static OpenTelemetryConfigurationModel extractModel(ConfigurableEnvironment environment) { - Map props = extractSpringProperties(environment); + Map props = extractSpringProperties(environment); return convertToOpenTelemetryConfigurationModel(props); } - private static Map extractSpringProperties(ConfigurableEnvironment environment) { + private static Map extractSpringProperties(ConfigurableEnvironment environment) { MutablePropertySources propertySources = environment.getPropertySources(); - Map props = new HashMap<>(); + Map props = new HashMap<>(); for (PropertySource propertySource : propertySources) { if (propertySource instanceof EnumerablePropertySource) { for (String propertyName : ((EnumerablePropertySource) propertySource).getPropertyNames()) { if (propertyName.startsWith("otel.")) { - String property = environment.getProperty(propertyName); + Object property = propertySource.getProperty(propertyName); + // Resolve ${} placeholders in String values while preserving types for others + if (property instanceof String) { + property = environment.resolvePlaceholders((String) property); + } if (Objects.equals(property, "")) { property = null; // spring returns empty string for yaml null } @@ -75,6 +79,7 @@ private static Map extractSpringProperties(ConfigurableEnvironme .replace("]", "") .replace(".", "_") .toUpperCase(Locale.ROOT); + // Use environment.getProperty() to search all property sources for the env var String envVarValue = environment.getProperty(envVarName); if (envVarValue != null) { property = envVarValue; @@ -96,7 +101,7 @@ private static Map extractSpringProperties(ConfigurableEnvironme } static OpenTelemetryConfigurationModel convertToOpenTelemetryConfigurationModel( - Map flatProps) { + Map flatProps) { Map nested = convertFlatPropsToNested(flatProps); return getObjectMapper().convertValue(nested, OpenTelemetryConfigurationModel.class); @@ -112,12 +117,12 @@ static ObjectMapper getObjectMapper() { * ["one", "two"]}}}} */ @SuppressWarnings("unchecked") - static Map convertFlatPropsToNested(Map flatProps) { + static Map convertFlatPropsToNested(Map flatProps) { Map result = new HashMap<>(); - for (Map.Entry entry : flatProps.entrySet()) { + for (Map.Entry entry : flatProps.entrySet()) { String key = entry.getKey(); - String value = entry.getValue(); + Object value = entry.getValue(); // Split the key by dots String[] parts = key.split("\\."); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java index bbb40a59a2cb..b98ae1b0a582 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java @@ -5,25 +5,22 @@ package io.opentelemetry.instrumentation.spring.autoconfigure; -import static java.util.Objects.requireNonNull; - import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.config.ConfigProvider; import io.opentelemetry.api.trace.TracerProvider; import io.opentelemetry.common.ComponentLoader; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties; -import io.opentelemetry.instrumentation.config.bridge.DeclarativeConfigPropertiesBridgeBuilder; +import io.opentelemetry.instrumentation.config.bridge.ConfigPropertiesBackedConfigProvider; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.DeclarativeConfigDisabled; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.DeclarativeConfigEnabled; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.OtelDisabled; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.OtelEnabled; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.OtelMapConverter; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.OtelResourceProperties; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.OtelSpringProperties; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.OtlpExporterProperties; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.SpringConfigProperties; +import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.SpringOpenTelemetrySdk; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources.DistroComponentProvider; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources.DistroVersionResourceProvider; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources.ResourceCustomizerProvider; @@ -36,14 +33,13 @@ import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; +import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.function.Function; -import java.util.function.Supplier; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -123,30 +119,37 @@ public AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk( .build(); } + // TODO why is exposing this needed? @Bean - public OpenTelemetry openTelemetry( + public ConfigProperties otelProperties( AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { - logStart(); - return autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk(); + ConfigProperties configProperties = + AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk); + if (configProperties == null) { + throw new IllegalStateException( + "Expected configProperties to be non-null for properties-based configuration"); + } + return configProperties; } @Bean - public InstrumentationConfig instrumentationConfig(ConfigProperties properties) { - return new ConfigPropertiesBridge(properties); - } - - /** - * Expose the {@link ConfigProperties} bean for use in other auto-configurations. - * - *

Not using spring boot properties directly in order to support {@link - * io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer#addPropertiesCustomizer(Function)} - * and {@link - * io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer#addPropertiesSupplier(Supplier)}. - */ - @Bean - public ConfigProperties otelProperties( - AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { - return requireNonNull(AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk)); + public OpenTelemetrySdk openTelemetry( + AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk, + ConfigProperties otelProperties) { + logStart(); + OpenTelemetrySdk sdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk(); + // Extract ConfigProvider from the AutoConfiguredOpenTelemetrySdk + ConfigProvider configProvider = + AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk); + + if (configProvider == null) { + // Create ConfigProvider from ConfigProperties if not already present + configProvider = ConfigPropertiesBackedConfigProvider.create(otelProperties); + } + + // Wrap the SDK to provide ConfigProvider for DeclarativeConfigUtil + // SpringOpenTelemetrySdk extends OpenTelemetrySdk and implements ExtendedOpenTelemetry + return SpringOpenTelemetrySdk.create(sdk, configProvider); } } @@ -163,7 +166,7 @@ public OpenTelemetryConfigurationModel openTelemetryConfigurationModel( @Bean public OpenTelemetry openTelemetry( OpenTelemetryConfigurationModel model, ApplicationContext applicationContext) { - OpenTelemetrySdk sdk = + ExtendedOpenTelemetrySdk sdk = DeclarativeConfiguration.create( model, new OpenTelemetrySdkComponentLoader(applicationContext)); Runtime.getRuntime().addShutdownHook(new Thread(sdk::close)); @@ -171,29 +174,6 @@ public OpenTelemetry openTelemetry( return sdk; } - @Bean - public ConfigProvider configProvider(OpenTelemetryConfigurationModel model) { - return SpringConfigProvider.create(model); - } - - /** - * Expose the {@link ConfigProperties} bean for use in other auto-configurations. - * - *

Not using spring boot properties directly, because declarative configuration does not - * integrate with spring boot properties. - */ - @Bean - public ConfigProperties otelProperties(ConfigProvider configProvider) { - return new DeclarativeConfigPropertiesBridgeBuilder() - .buildFromInstrumentationConfig(configProvider.getInstrumentationConfig()); - } - - @Bean - public InstrumentationConfig instrumentationConfig( - ConfigProperties properties, ConfigProvider configProvider) { - return new ConfigPropertiesBridge(properties, configProvider); - } - @Bean public DeclarativeConfigurationCustomizerProvider distroConfigurationCustomizerProvider() { return new ResourceCustomizerProvider(); @@ -230,11 +210,6 @@ public ConfigProperties otelProperties() { return DefaultConfigProperties.createFromMap(Collections.emptyMap()); } - @Bean - public InstrumentationConfig instrumentationConfig(ConfigProperties properties) { - return new ConfigPropertiesBridge(properties, null); - } - @Configuration @Conditional(DeclarativeConfigDisabled.class) static class PropertiesConfig { @@ -262,16 +237,6 @@ public ConfigProperties otelProperties(ApplicationContext applicationContext) { } } - @Configuration - @ConditionalOnBean(OpenTelemetry.class) - @ConditionalOnMissingBean({InstrumentationConfig.class}) - static class FallbackInstrumentationConfig { - @Bean - public InstrumentationConfig instrumentationConfig(ConfigProperties properties) { - return new ConfigPropertiesBridge(properties, null); - } - } - /** * The {@link ComponentLoader} is used by the SDK autoconfiguration to load all components, e.g. * The entire class is a copy of SdkConfigProvider - * which uses {@link SpringDeclarativeConfigProperties} instead of {@link - * io.opentelemetry.sdk.extension.incubator.fileconfig.YamlDeclarativeConfigProperties}. - */ -final class SpringConfigProvider implements ConfigProvider { - - @Nullable private final DeclarativeConfigProperties instrumentationConfig; - - private SpringConfigProvider( - OpenTelemetryConfigurationModel model, ComponentLoader componentLoader) { - DeclarativeConfigProperties configProperties = toConfigProperties(model, componentLoader); - this.instrumentationConfig = configProperties.getStructured("instrumentation/development"); - } - - private static DeclarativeConfigProperties toConfigProperties( - Object model, ComponentLoader componentLoader) { - Map configurationMap = - EmbeddedConfigFile.getObjectMapper() - .convertValue(model, new TypeReference>() {}); - if (configurationMap == null) { - configurationMap = Collections.emptyMap(); - } - return SpringDeclarativeConfigProperties.create(configurationMap, componentLoader); - } - - /** - * Create a {@link SpringConfigProvider} from the {@code model}. - * - * @param model the configuration model - * @return the {@link SpringConfigProvider} - */ - static SpringConfigProvider create(OpenTelemetryConfigurationModel model) { - return new SpringConfigProvider( - model, ComponentLoader.forClassLoader(SpringConfigProvider.class.getClassLoader())); - } - - @Nullable - @Override - public DeclarativeConfigProperties getInstrumentationConfig() { - return instrumentationConfig; - } - - @Override - public String toString() { - return "SpringConfigProvider{" + "instrumentationConfig=" + instrumentationConfig + '}'; - } -} diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/SpringDeclarativeConfigProperties.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/SpringDeclarativeConfigProperties.java deleted file mode 100644 index 26b2e462c99f..000000000000 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/SpringDeclarativeConfigProperties.java +++ /dev/null @@ -1,319 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.spring.autoconfigure; - -import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.toList; - -import io.opentelemetry.api.incubator.config.DeclarativeConfigException; -import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.common.ComponentLoader; -import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.StringJoiner; -import javax.annotation.Nullable; - -/** - * Spring flavor of {@link - * io.opentelemetry.sdk.extension.incubator.fileconfig.YamlDeclarativeConfigProperties}, that tries - * to coerce types, because spring doesn't tell what the original type was. - * - *

The entire class is a copy of YamlDeclarativeConfigProperties - * with only minor modifications to type coercion logic. - */ -final class SpringDeclarativeConfigProperties implements DeclarativeConfigProperties { - - private static final Set> SUPPORTED_SCALAR_TYPES = - Collections.unmodifiableSet( - new LinkedHashSet<>( - Arrays.asList(String.class, Boolean.class, Long.class, Double.class))); - - /** Values are {@link #isPrimitive(Object)}, {@link List} of scalars. */ - private final Map simpleEntries; - - private final Map> listEntries; - private final Map mapEntries; - private final ComponentLoader componentLoader; - - private SpringDeclarativeConfigProperties( - Map simpleEntries, - Map> listEntries, - Map mapEntries, - ComponentLoader componentLoader) { - this.simpleEntries = simpleEntries; - this.listEntries = listEntries; - this.mapEntries = mapEntries; - this.componentLoader = componentLoader; - } - - /** - * Create a {@link SpringDeclarativeConfigProperties} from the {@code properties} map. - * - *

{@code properties} is expected to be the output of YAML parsing (i.e. with Jackson {@code - * com.fasterxml.jackson.databind.ObjectMapper}), and have values which are scalars, lists of - * scalars, lists of maps, and maps. - * - * @see DeclarativeConfiguration#toConfigProperties(Object) - */ - @SuppressWarnings("unchecked") - public static SpringDeclarativeConfigProperties create( - Map properties, ComponentLoader componentLoader) { - Map simpleEntries = new LinkedHashMap<>(); - Map> listEntries = new LinkedHashMap<>(); - Map mapEntries = new LinkedHashMap<>(); - for (Map.Entry entry : properties.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - if (isPrimitive(value) || value == null) { - simpleEntries.put(key, value); - continue; - } - if (isPrimitiveList(value)) { - simpleEntries.put(key, value); - continue; - } - if (isListOfMaps(value)) { - List list = - ((List>) value) - .stream() - .map(map -> SpringDeclarativeConfigProperties.create(map, componentLoader)) - .collect(toList()); - listEntries.put(key, list); - continue; - } - if (isMap(value)) { - SpringDeclarativeConfigProperties configProperties = - SpringDeclarativeConfigProperties.create((Map) value, componentLoader); - mapEntries.put(key, configProperties); - continue; - } - throw new DeclarativeConfigException( - "Unable to initialize ExtendedConfigProperties. Key \"" - + key - + "\" has unrecognized object type " - + value.getClass().getName()); - } - return new SpringDeclarativeConfigProperties( - simpleEntries, listEntries, mapEntries, componentLoader); - } - - private static boolean isPrimitiveList(Object object) { - if (object instanceof List) { - List list = (List) object; - return list.stream().allMatch(SpringDeclarativeConfigProperties::isPrimitive); - } - return false; - } - - private static boolean isPrimitive(Object object) { - return object instanceof String - || object instanceof Integer - || object instanceof Long - || object instanceof Float - || object instanceof Double - || object instanceof Boolean; - } - - private static boolean isListOfMaps(Object object) { - if (object instanceof List) { - List list = (List) object; - return list.stream() - .allMatch( - entry -> - entry instanceof Map - && ((Map) entry) - .keySet().stream().allMatch(key -> key instanceof String)); - } - return false; - } - - private static boolean isMap(Object object) { - if (object instanceof Map) { - Map map = (Map) object; - return map.keySet().stream().allMatch(entry -> entry instanceof String); - } - return false; - } - - @Nullable - @Override - public String getString(String name) { - return stringOrNull(simpleEntries.get(name)); - } - - @Nullable - @Override - public Boolean getBoolean(String name) { - return booleanOrNull(simpleEntries.get(name)); - } - - @Nullable - @Override - public Integer getInt(String name) { - Object value = simpleEntries.get(name); - if (value == null) { - return null; - } - if (value instanceof Integer) { - return (Integer) value; - } - if (value instanceof Long) { - return ((Long) value).intValue(); - } - return Integer.parseInt(value.toString()); - } - - @Nullable - @Override - public Long getLong(String name) { - return longOrNull(simpleEntries.get(name)); - } - - @Nullable - @Override - public Double getDouble(String name) { - return doubleOrNull(simpleEntries.get(name)); - } - - @Nullable - @Override - public List getScalarList(String name, Class scalarType) { - if (!SUPPORTED_SCALAR_TYPES.contains(scalarType)) { - throw new DeclarativeConfigException( - "Unsupported scalar type " - + scalarType.getName() - + ". Supported types include " - + SUPPORTED_SCALAR_TYPES.stream() - .map(Class::getName) - .collect(joining(",", "[", "]"))); - } - Object value = simpleEntries.get(name); - if (value instanceof List) { - List objectList = ((List) value); - if (objectList.isEmpty()) { - return Collections.emptyList(); - } - List result = - objectList.stream() - .map( - entry -> { - if (scalarType == String.class) { - return stringOrNull(entry); - } else if (scalarType == Boolean.class) { - return booleanOrNull(entry); - } else if (scalarType == Long.class) { - return longOrNull(entry); - } else if (scalarType == Double.class) { - return doubleOrNull(entry); - } - return null; - }) - .filter(Objects::nonNull) - .map(scalarType::cast) - .collect(toList()); - if (result.isEmpty()) { - return null; - } - return result; - } - return null; - } - - @Nullable - private static String stringOrNull(@Nullable Object value) { - if (value == null) { - return null; - } - return value.toString(); - } - - @Nullable - private static Boolean booleanOrNull(@Nullable Object value) { - if (value == null) { - return null; - } - if (value instanceof Boolean) { - return (Boolean) value; - } - return Boolean.parseBoolean(value.toString()); - } - - @Nullable - private static Long longOrNull(@Nullable Object value) { - if (value == null) { - return null; - } - if (value instanceof Integer) { - return ((Integer) value).longValue(); - } - if (value instanceof Long) { - return (Long) value; - } - return Long.parseLong(value.toString()); - } - - @Nullable - private static Double doubleOrNull(@Nullable Object value) { - if (value == null) { - return null; - } - if (value instanceof Float) { - return ((Float) value).doubleValue(); - } - if (value instanceof Double) { - return (Double) value; - } - return Double.parseDouble(value.toString()); - } - - @Nullable - @Override - public DeclarativeConfigProperties getStructured(String name) { - return mapEntries.get(name); - } - - @Nullable - @Override - public List getStructuredList(String name) { - List value = listEntries.get(name); - if (value != null) { - return Collections.unmodifiableList(value); - } - return null; - } - - @Override - public Set getPropertyKeys() { - Set keys = new LinkedHashSet<>(); - keys.addAll(simpleEntries.keySet()); - keys.addAll(listEntries.keySet()); - keys.addAll(mapEntries.keySet()); - return Collections.unmodifiableSet(keys); - } - - @Override - public String toString() { - StringJoiner joiner = new StringJoiner(", ", "SpringDeclarativeConfigProperties{", "}"); - simpleEntries.forEach((key, value) -> joiner.add(key + "=" + value)); - listEntries.forEach((key, value) -> joiner.add(key + "=" + value)); - mapEntries.forEach((key, value) -> joiner.add(key + "=" + value)); - return joiner.toString(); - } - - /** Return the {@link ComponentLoader}. */ - @Override - public ComponentLoader getComponentLoader() { - return componentLoader; - } -} diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java index 41e8b6809492..10dbe59c1567 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java @@ -7,11 +7,10 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.jdbc.datasource.JdbcTelemetry; import io.opentelemetry.instrumentation.jdbc.datasource.JdbcTelemetryBuilder; import io.opentelemetry.instrumentation.jdbc.datasource.internal.Experimental; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; @@ -31,13 +30,9 @@ final class DataSourcePostProcessor implements BeanPostProcessor, Ordered { @Nullable private static final Class ROUTING_DATA_SOURCE_CLASS = getRoutingDataSourceClass(); private final ObjectProvider openTelemetryProvider; - private final ObjectProvider configProvider; - DataSourcePostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { + DataSourcePostProcessor(ObjectProvider openTelemetryProvider) { this.openTelemetryProvider = openTelemetryProvider; - this.configProvider = configProvider; } @Nullable @@ -61,24 +56,33 @@ public Object postProcessAfterInitialization(Object bean, String beanName) { && !isRoutingDatasource(bean) && !ScopedProxyUtils.isScopedTarget(beanName)) { DataSource dataSource = (DataSource) bean; - InstrumentationConfig config = configProvider.getObject(); + OpenTelemetry openTelemetry = openTelemetryProvider.getObject(); JdbcTelemetryBuilder builder = - JdbcTelemetry.builder(openTelemetryProvider.getObject()) + JdbcTelemetry.builder(openTelemetry) .setStatementSanitizationEnabled( - InstrumentationConfigUtil.isStatementSanitizationEnabled( - config, "otel.instrumentation.jdbc.statement-sanitizer.enabled")) + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "jdbc", "statement_sanitizer", "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + openTelemetry, "common", "db_statement_sanitizer", "enabled") + .orElse(true))) .setCaptureQueryParameters( - config.getBoolean( - "otel.instrumentation.jdbc.experimental.capture-query-parameters", false)) + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "jdbc", "capture_query_parameters") + .orElse(false)) .setTransactionInstrumenterEnabled( - config.getBoolean( - "otel.instrumentation.jdbc.experimental.transaction.enabled", false)) + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "jdbc", "transaction", "enabled") + .orElse(false)) .setDataSourceInstrumenterEnabled( - config.getBoolean( - "otel.instrumentation.jdbc.experimental.datasource.enabled", false)); + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "jdbc", "datasource", "enabled") + .orElse(false)); Experimental.setEnableSqlCommenter( builder, - config.getBoolean("otel.instrumentation.jdbc.experimental.sqlcommenter.enabled", false)); + DeclarativeConfigUtil.getBoolean(openTelemetry, "java", "jdbc", "sqlcommenter", "enabled") + .orElse(false)); DataSource otelDataSource = builder.build().wrap(dataSource); // wrap instrumented data source into a proxy that unwraps to the original data source diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationAutoConfiguration.java index 70ecf92407e6..5df6ef082593 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationAutoConfiguration.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.jdbc; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; import javax.sql.DataSource; import org.springframework.beans.factory.ObjectProvider; @@ -34,8 +33,7 @@ public JdbcInstrumentationAutoConfiguration() {} @Bean // static to avoid "is not eligible for getting processed by all BeanPostProcessors" warning static DataSourcePostProcessor dataSourcePostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { - return new DataSourcePostProcessor(openTelemetryProvider, configProvider); + ObjectProvider openTelemetryProvider) { + return new DataSourcePostProcessor(openTelemetryProvider); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java index f1204f314cf4..abaa2b119786 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java @@ -8,7 +8,7 @@ import static java.util.Collections.emptyList; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; import io.opentelemetry.instrumentation.spring.kafka.v2_7.SpringKafkaTelemetry; import org.springframework.beans.factory.ObjectProvider; @@ -34,19 +34,21 @@ public class KafkaInstrumentationAutoConfiguration { public KafkaInstrumentationAutoConfiguration() {} @Bean - static SpringKafkaTelemetry getTelemetry( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { - InstrumentationConfig config = configProvider.getObject(); - return SpringKafkaTelemetry.builder(openTelemetryProvider.getObject()) + static SpringKafkaTelemetry getTelemetry(ObjectProvider openTelemetryProvider) { + OpenTelemetry openTelemetry = openTelemetryProvider.getObject(); + return SpringKafkaTelemetry.builder(openTelemetry) .setCaptureExperimentalSpanAttributes( - config.getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "kafka", "experimental_span_attributes") + .orElse(false)) .setMessagingReceiveInstrumentationEnabled( - config.getBoolean( - "otel.instrumentation.messaging.experimental.receive-telemetry.enabled", false)) + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "messaging", "receive_telemetry/development", "enabled") + .orElse(false)) .setCapturedHeaders( - config.getList( - "otel.instrumentation.messaging.experimental.capture-headers", emptyList())) + DeclarativeConfigUtil.getList( + openTelemetry, "java", "messaging", "capture_headers/development") + .orElse(emptyList())) .build(); } @@ -58,9 +60,8 @@ static SpringKafkaTelemetry getTelemetry( matchIfMissing = true) static ConcurrentKafkaListenerContainerFactoryPostProcessor otelKafkaListenerContainerFactoryBeanPostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { + ObjectProvider openTelemetryProvider) { return new ConcurrentKafkaListenerContainerFactoryPostProcessor( - () -> getTelemetry(openTelemetryProvider, configProvider)); + () -> getTelemetry(openTelemetryProvider)); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/mongo/MongoClientInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/mongo/MongoClientInstrumentationAutoConfiguration.java index af47b2371991..6ef0c7224543 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/mongo/MongoClientInstrumentationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/mongo/MongoClientInstrumentationAutoConfiguration.java @@ -7,10 +7,9 @@ import com.mongodb.MongoClientSettings; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.mongo.v3_1.MongoTelemetry; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.mongo.MongoClientSettingsBuilderCustomizer; import org.springframework.context.annotation.Bean; @@ -29,14 +28,21 @@ public class MongoClientInstrumentationAutoConfiguration { @Bean - MongoClientSettingsBuilderCustomizer customizer( - OpenTelemetry openTelemetry, InstrumentationConfig config) { + MongoClientSettingsBuilderCustomizer customizer(OpenTelemetry openTelemetry) { return builder -> builder.addCommandListener( MongoTelemetry.builder(openTelemetry) .setStatementSanitizationEnabled( - InstrumentationConfigUtil.isStatementSanitizationEnabled( - config, "otel.instrumentation.mongo.statement-sanitizer.enabled")) + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "mongo", "statement_sanitizer", "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + openTelemetry, + "common", + "db_statement_sanitizer", + "enabled") + .orElse(true))) .build() .newCommandListener()); } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentationAutoConfiguration.java index 4dcddb592aca..12232ef953ed 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentationAutoConfiguration.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.r2dbc; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; import io.r2dbc.spi.ConnectionFactory; import org.springframework.beans.factory.ObjectProvider; @@ -28,8 +27,7 @@ public R2dbcInstrumentationAutoConfiguration() {} @Bean // static to avoid "is not eligible for getting processed by all BeanPostProcessors" warning static R2dbcInstrumentingPostProcessor r2dbcInstrumentingPostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { - return new R2dbcInstrumentingPostProcessor(openTelemetryProvider, configProvider); + ObjectProvider openTelemetryProvider) { + return new R2dbcInstrumentingPostProcessor(openTelemetryProvider); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentingPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentingPostProcessor.java index 09849deef13b..ee9266662632 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentingPostProcessor.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentingPostProcessor.java @@ -6,9 +6,8 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.r2dbc; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.r2dbc.v1_0.internal.shaded.R2dbcTelemetry; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil; import io.r2dbc.spi.ConnectionFactory; import io.r2dbc.spi.ConnectionFactoryOptions; import org.springframework.aop.scope.ScopedProxyUtils; @@ -19,24 +18,29 @@ class R2dbcInstrumentingPostProcessor implements BeanPostProcessor { private final ObjectProvider openTelemetryProvider; - private final ObjectProvider configProvider; - R2dbcInstrumentingPostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { + R2dbcInstrumentingPostProcessor(ObjectProvider openTelemetryProvider) { this.openTelemetryProvider = openTelemetryProvider; - this.configProvider = configProvider; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) { if (bean instanceof ConnectionFactory && !ScopedProxyUtils.isScopedTarget(beanName)) { ConnectionFactory connectionFactory = (ConnectionFactory) bean; - return R2dbcTelemetry.builder(openTelemetryProvider.getObject()) + OpenTelemetry openTelemetry = openTelemetryProvider.getObject(); + return R2dbcTelemetry.builder(openTelemetry) .setStatementSanitizationEnabled( - InstrumentationConfigUtil.isStatementSanitizationEnabled( - configProvider.getObject(), - "otel.instrumentation.r2dbc.statement-sanitizer.enabled")) + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "r2dbc", "statement_sanitizer", "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + openTelemetry, + "java", + "common", + "db_statement_sanitizer", + "enabled") + .orElse(true))) .build() .wrapConnectionFactory(connectionFactory, getConnectionFactoryOptions(connectionFactory)); } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java index 6518099c4bcc..275dcc8c15b0 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java17.internal.RuntimeMetricsConfigUtil; import javax.annotation.Nullable; @@ -29,8 +28,8 @@ public int minJavaVersion() { @Nullable @Override - public AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationConfig config) { + public AutoCloseable start(OpenTelemetry openTelemetry) { logger.debug("Use runtime metrics instrumentation for Java 17+"); - return RuntimeMetricsConfigUtil.configure(RuntimeMetrics.builder(openTelemetry), config); + return RuntimeMetricsConfigUtil.configure(RuntimeMetrics.builder(openTelemetry), openTelemetry); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java index 3b7f334ca815..75050a424071 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.RuntimeMetricsConfigUtil; import javax.annotation.Nullable; @@ -29,8 +28,8 @@ public int minJavaVersion() { @Nullable @Override - public AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationConfig config) { + public AutoCloseable start(OpenTelemetry openTelemetry) { logger.debug("Use runtime metrics instrumentation for Java 8"); - return RuntimeMetricsConfigUtil.configure(RuntimeMetrics.builder(openTelemetry), config); + return RuntimeMetricsConfigUtil.configure(RuntimeMetrics.builder(openTelemetry), openTelemetry); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java index d32c13904fdd..268e9d230e9d 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; import java.util.Comparator; import java.util.Optional; @@ -45,7 +44,6 @@ public void stopMetrics() throws Exception { public void handleApplicationReadyEvent(ApplicationReadyEvent event) { ConfigurableApplicationContext applicationContext = event.getApplicationContext(); OpenTelemetry openTelemetry = applicationContext.getBean(OpenTelemetry.class); - InstrumentationConfig config = applicationContext.getBean(InstrumentationConfig.class); double version = Math.max(8, Double.parseDouble(System.getProperty("java.specification.version"))); @@ -56,7 +54,7 @@ public void handleApplicationReadyEvent(ApplicationReadyEvent event) { .findFirst(); if (metricsProvider.isPresent()) { - this.closeable = metricsProvider.get().start(openTelemetry, config); + this.closeable = metricsProvider.get().start(openTelemetry); } else { logger.debug("No runtime metrics instrumentation available for Java {}", version); } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsProvider.java index 8549f9394e61..80254addb1b1 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsProvider.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import javax.annotation.Nullable; /** @@ -19,5 +18,5 @@ public interface RuntimeMetricsProvider { int minJavaVersion(); @Nullable - AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationConfig config); + AutoCloseable start(OpenTelemetry openTelemetry); } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SpringSchedulingInstrumentationAspect.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SpringSchedulingInstrumentationAspect.java index 6d84cde77985..28e4654af586 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SpringSchedulingInstrumentationAspect.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SpringSchedulingInstrumentationAspect.java @@ -9,7 +9,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesGetter; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; @@ -42,8 +42,7 @@ final class SpringSchedulingInstrumentationAspect { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-boot-autoconfigure"; private final Instrumenter instrumenter; - public SpringSchedulingInstrumentationAspect( - OpenTelemetry openTelemetry, InstrumentationConfig config) { + public SpringSchedulingInstrumentationAspect(OpenTelemetry openTelemetry) { CodeAttributesGetter codedAttributesGetter = ClassAndMethod.codeAttributesGetter(); InstrumenterBuilder builder = @@ -52,8 +51,9 @@ public SpringSchedulingInstrumentationAspect( INSTRUMENTATION_NAME, CodeSpanNameExtractor.create(codedAttributesGetter)) .addAttributesExtractor(CodeAttributesExtractor.create(codedAttributesGetter)); - if (config.getBoolean( - "otel.instrumentation.spring-scheduling.experimental-span-attributes", false)) { + if (DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "spring_scheduling", "experimental_span_attributes") + .orElse(false)) { builder.addAttributesExtractor( AttributesExtractor.constant(AttributeKey.stringKey("job.system"), "spring_scheduling")); } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SpringSchedulingInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SpringSchedulingInstrumentationAutoConfiguration.java index 85a54625e455..cfeae0637929 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SpringSchedulingInstrumentationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SpringSchedulingInstrumentationAutoConfiguration.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.scheduling; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; import org.aspectj.lang.annotation.Aspect; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -26,7 +25,7 @@ class SpringSchedulingInstrumentationAutoConfiguration { @Bean SpringSchedulingInstrumentationAspect springSchedulingInstrumentationAspect( - OpenTelemetry openTelemetry, InstrumentationConfig config) { - return new SpringSchedulingInstrumentationAspect(openTelemetry, config); + OpenTelemetry openTelemetry) { + return new SpringSchedulingInstrumentationAspect(openTelemetry); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateBeanPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateBeanPostProcessor.java index 8ffe8f0c9b5a..d9b54aa22b40 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateBeanPostProcessor.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateBeanPostProcessor.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.web.client.RestTemplate; @@ -19,13 +18,8 @@ public final class RestTemplateBeanPostProcessor implements BeanPostProcessor { private final ObjectProvider openTelemetryProvider; - private final ObjectProvider configProvider; - - RestTemplateBeanPostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { + RestTemplateBeanPostProcessor(ObjectProvider openTelemetryProvider) { this.openTelemetryProvider = openTelemetryProvider; - this.configProvider = configProvider; } @Override @@ -35,6 +29,6 @@ public Object postProcessAfterInitialization(Object bean, String beanName) { } return RestTemplateInstrumentation.addIfNotPresent( - (RestTemplate) bean, openTelemetryProvider.getObject(), configProvider.getObject()); + (RestTemplate) bean, openTelemetryProvider.getObject()); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateInstrumentation.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateInstrumentation.java index ca4c0c97c466..eb3c8ee15623 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateInstrumentation.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateInstrumentation.java @@ -7,9 +7,8 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil; import io.opentelemetry.instrumentation.spring.web.v3_1.SpringWebTelemetry; +import io.opentelemetry.instrumentation.spring.web.v3_1.SpringWebTelemetryBuilder; import io.opentelemetry.instrumentation.spring.web.v3_1.internal.WebTelemetryUtil; import java.util.List; import org.springframework.http.client.ClientHttpRequestInterceptor; @@ -20,16 +19,10 @@ class RestTemplateInstrumentation { private RestTemplateInstrumentation() {} @CanIgnoreReturnValue - static RestTemplate addIfNotPresent( - RestTemplate restTemplate, OpenTelemetry openTelemetry, InstrumentationConfig config) { - - ClientHttpRequestInterceptor instrumentationInterceptor = - InstrumentationConfigUtil.configureClientBuilder( - config, - SpringWebTelemetry.builder(openTelemetry), - WebTelemetryUtil.getBuilderExtractor()) - .build() - .newInterceptor(); + static RestTemplate addIfNotPresent(RestTemplate restTemplate, OpenTelemetry openTelemetry) { + SpringWebTelemetryBuilder builder = SpringWebTelemetry.builder(openTelemetry); + WebTelemetryUtil.getBuilderExtractor().apply(builder).configure(openTelemetry); + ClientHttpRequestInterceptor instrumentationInterceptor = builder.build().newInterceptor(); List restTemplateInterceptors = restTemplate.getInterceptors(); if (restTemplateInterceptors.stream() diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationAutoConfiguration.java index 97d5bd9b52d5..10e9178c2e12 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationAutoConfiguration.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -33,17 +32,15 @@ public SpringWebInstrumentationAutoConfiguration() {} // static to avoid "is not eligible for getting processed by all BeanPostProcessors" warning @Bean static RestTemplateBeanPostProcessor otelRestTemplateBeanPostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { - return new RestTemplateBeanPostProcessor(openTelemetryProvider, configProvider); + ObjectProvider openTelemetryProvider) { + return new RestTemplateBeanPostProcessor(openTelemetryProvider); } @Bean RestTemplateCustomizer otelRestTemplateCustomizer( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { + ObjectProvider openTelemetryProvider) { return restTemplate -> RestTemplateInstrumentation.addIfNotPresent( - restTemplate, openTelemetryProvider.getObject(), configProvider.getObject()); + restTemplate, openTelemetryProvider.getObject()); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfiguration.java index 79bacde3ccc2..93e9a1fde417 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfiguration.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webflux; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -33,14 +32,13 @@ public SpringWebfluxInstrumentationAutoConfiguration() {} // static to avoid "is not eligible for getting processed by all BeanPostProcessors" warning @Bean static WebClientBeanPostProcessor otelWebClientBeanPostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { - return new WebClientBeanPostProcessor(openTelemetryProvider, configProvider); + ObjectProvider openTelemetryProvider) { + return new WebClientBeanPostProcessor(openTelemetryProvider); } @Bean - WebFilter telemetryFilter(OpenTelemetry openTelemetry, InstrumentationConfig config) { - return WebClientBeanPostProcessor.getWebfluxServerTelemetry(openTelemetry, config) + WebFilter telemetryFilter(OpenTelemetry openTelemetry) { + return WebClientBeanPostProcessor.getWebfluxServerTelemetry(openTelemetry) .createWebFilterAndRegisterReactorHook(); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessor.java index 9b501c410be3..ec2bafee919e 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessor.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessor.java @@ -6,10 +6,10 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webflux; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil; import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxClientTelemetry; +import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxClientTelemetryBuilder; import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxServerTelemetry; +import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxServerTelemetryBuilder; import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.SpringWebfluxBuilderUtil; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.BeanPostProcessor; @@ -23,31 +23,23 @@ final class WebClientBeanPostProcessor implements BeanPostProcessor { private final ObjectProvider openTelemetryProvider; - private final ObjectProvider configProvider; - WebClientBeanPostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { + WebClientBeanPostProcessor(ObjectProvider openTelemetryProvider) { this.openTelemetryProvider = openTelemetryProvider; - this.configProvider = configProvider; } - static SpringWebfluxClientTelemetry getWebfluxClientTelemetry( - OpenTelemetry openTelemetry, InstrumentationConfig config) { - return InstrumentationConfigUtil.configureClientBuilder( - config, - SpringWebfluxClientTelemetry.builder(openTelemetry), - SpringWebfluxBuilderUtil.getClientBuilderExtractor()) - .build(); + static SpringWebfluxClientTelemetry getWebfluxClientTelemetry(OpenTelemetry openTelemetry) { + SpringWebfluxClientTelemetryBuilder builder = + SpringWebfluxClientTelemetry.builder(openTelemetry); + SpringWebfluxBuilderUtil.getClientBuilderExtractor().apply(builder).configure(openTelemetry); + return builder.build(); } - static SpringWebfluxServerTelemetry getWebfluxServerTelemetry( - OpenTelemetry openTelemetry, InstrumentationConfig config) { - return InstrumentationConfigUtil.configureServerBuilder( - config, - SpringWebfluxServerTelemetry.builder(openTelemetry), - SpringWebfluxBuilderUtil.getServerBuilderExtractor()) - .build(); + static SpringWebfluxServerTelemetry getWebfluxServerTelemetry(OpenTelemetry openTelemetry) { + SpringWebfluxServerTelemetryBuilder builder = + SpringWebfluxServerTelemetry.builder(openTelemetry); + SpringWebfluxBuilderUtil.getServerBuilderExtractor().apply(builder).configure(openTelemetry); + return builder.build(); } @Override @@ -64,7 +56,7 @@ public Object postProcessAfterInitialization(Object bean, String beanName) { private WebClient.Builder wrapBuilder(WebClient.Builder webClientBuilder) { SpringWebfluxClientTelemetry instrumentation = - getWebfluxClientTelemetry(openTelemetryProvider.getObject(), configProvider.getObject()); + getWebfluxClientTelemetry(openTelemetryProvider.getObject()); return webClientBuilder.filters(instrumentation::addFilter); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc5InstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc5InstrumentationAutoConfiguration.java index 73d3f657504c..de866093b76a 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc5InstrumentationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc5InstrumentationAutoConfiguration.java @@ -6,10 +6,9 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webmvc; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil; import io.opentelemetry.instrumentation.spring.webmvc.v5_3.SpringWebMvcTelemetry; +import io.opentelemetry.instrumentation.spring.webmvc.v5_3.SpringWebMvcTelemetryBuilder; import io.opentelemetry.instrumentation.spring.webmvc.v5_3.internal.SpringMvcBuilderUtil; import javax.servlet.Filter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -28,12 +27,9 @@ public class SpringWebMvc5InstrumentationAutoConfiguration { @Bean - Filter otelWebMvcFilter(OpenTelemetry openTelemetry, InstrumentationConfig config) { - return InstrumentationConfigUtil.configureServerBuilder( - config, - SpringWebMvcTelemetry.builder(openTelemetry), - SpringMvcBuilderUtil.getBuilderExtractor()) - .build() - .createServletFilter(); + Filter otelWebMvcFilter(OpenTelemetry openTelemetry) { + SpringWebMvcTelemetryBuilder builder = SpringWebMvcTelemetry.builder(openTelemetry); + SpringMvcBuilderUtil.getBuilderExtractor().apply(builder).configure(openTelemetry); + return builder.build().createServletFilter(); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/ConfigPropertiesBridge.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/ConfigPropertiesBridge.java deleted file mode 100644 index dbabca731486..000000000000 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/ConfigPropertiesBridge.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties; - -import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; -import static java.util.Objects.requireNonNull; - -import io.opentelemetry.api.incubator.config.ConfigProvider; -import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; -import java.time.Duration; -import java.util.List; -import java.util.Map; -import javax.annotation.Nullable; - -/** - * Support for {@link ConfigProperties} in {@link InstrumentationConfig}. - * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -public final class ConfigPropertiesBridge implements InstrumentationConfig { - - private final ConfigProperties configProperties; - @Nullable private final ConfigProvider configProvider; - - public ConfigPropertiesBridge(ConfigProperties configProperties) { - this(configProperties, null); - } - - public ConfigPropertiesBridge( - ConfigProperties configProperties, @Nullable ConfigProvider configProvider) { - this.configProperties = configProperties; - this.configProvider = configProvider; - } - - @Nullable - @Override - public String getString(String name) { - try { - return configProperties.getString(name); - } catch (ConfigurationException ignored) { - return null; - } - } - - @Override - public String getString(String name, String defaultValue) { - try { - return configProperties.getString(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public boolean getBoolean(String name, boolean defaultValue) { - try { - return configProperties.getBoolean(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public int getInt(String name, int defaultValue) { - try { - return configProperties.getInt(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public long getLong(String name, long defaultValue) { - try { - return configProperties.getLong(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public double getDouble(String name, double defaultValue) { - try { - return configProperties.getDouble(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public Duration getDuration(String name, Duration defaultValue) { - try { - return configProperties.getDuration(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public List getList(String name, List defaultValue) { - try { - return configProperties.getList(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public Map getMap(String name, Map defaultValue) { - try { - return configProperties.getMap(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public boolean isDeclarative() { - return configProvider != null; - } - - @Override - public DeclarativeConfigProperties getDeclarativeConfig(String node) { - DeclarativeConfigProperties config = - InstrumentationConfigUtil.javaInstrumentationConfig(requireNonNull(configProvider), node); - if (config == null) { - // there is no declarative config for this node - return empty(); - } - return config; - } - - @Nullable - @Override - public ConfigProvider getConfigProvider() { - return configProvider; - } -} diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/InstrumentationConfigUtil.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/InstrumentationConfigUtil.java deleted file mode 100644 index 683529a18b29..000000000000 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/InstrumentationConfigUtil.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; -import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import java.util.function.Function; - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public final class InstrumentationConfigUtil { - private InstrumentationConfigUtil() {} - - @CanIgnoreReturnValue - public static T configureClientBuilder( - InstrumentationConfig config, - T builder, - Function> getBuilder) { - getBuilder.apply(builder).configure(getConfig(config)); - return builder; - } - - @CanIgnoreReturnValue - public static T configureServerBuilder( - InstrumentationConfig config, - T builder, - Function> getBuilder) { - getBuilder.apply(builder).configure(getConfig(config)); - return builder; - } - - private static CommonConfig getConfig(InstrumentationConfig config) { - return new CommonConfig(config); - } - - public static boolean isStatementSanitizationEnabled(InstrumentationConfig config, String key) { - return config.getBoolean( - key, config.getBoolean("otel.instrumentation.common.db-statement-sanitizer.enabled", true)); - } -} diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringOpenTelemetrySdk.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringOpenTelemetrySdk.java new file mode 100644 index 000000000000..f0110ccce230 --- /dev/null +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringOpenTelemetrySdk.java @@ -0,0 +1,72 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties; + +import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; +import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import java.io.Closeable; +import javax.annotation.concurrent.ThreadSafe; + +/** + * An {@link OpenTelemetrySdk} that also implements {@link ExtendedOpenTelemetry} and provides a + * {@link ConfigProvider}. + * + *

This allows instrumentations to use {@code ExtendedOpenTelemetry.getConfigProvider()} + * regardless of whether the SDK was configured with system properties or YAML. + * + *

This class is internal and is hence not for public use. Its APIs are unstable and can change + * at any time. + */ +@ThreadSafe +public final class SpringOpenTelemetrySdk extends OpenTelemetrySdk + implements ExtendedOpenTelemetry, Closeable { + + private final ConfigProvider configProvider; + + private SpringOpenTelemetrySdk(OpenTelemetrySdk delegate, ConfigProvider configProvider) { + super( + delegate.getSdkTracerProvider(), + delegate.getSdkMeterProvider(), + delegate.getSdkLoggerProvider(), + delegate.getPropagators()); + this.configProvider = configProvider; + } + + /** + * Creates a new {@link SpringOpenTelemetrySdk} that wraps the given SDK and provides the given + * ConfigProvider. + * + * @param openTelemetrySdk the SDK to wrap + * @param configProvider the ConfigProvider to return from getConfigProvider() + * @return a new SpringOpenTelemetrySdk + */ + public static SpringOpenTelemetrySdk create( + OpenTelemetrySdk openTelemetrySdk, ConfigProvider configProvider) { + return new SpringOpenTelemetrySdk(openTelemetrySdk, configProvider); + } + + @Override + public ConfigProvider getConfigProvider() { + return configProvider; + } + + @Override + public String toString() { + return "SpringOpenTelemetrySdk{" + + "tracerProvider=" + + getSdkTracerProvider() + + ", meterProvider=" + + getSdkMeterProvider() + + ", loggerProvider=" + + getSdkLoggerProvider() + + ", propagators=" + + getPropagators() + + ", configProvider=" + + configProvider + + '}'; + } +} diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientBeanPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientBeanPostProcessor.java index 9ef5b7f19194..6599d0ae92ad 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientBeanPostProcessor.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientBeanPostProcessor.java @@ -6,9 +6,8 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil; import io.opentelemetry.instrumentation.spring.web.v3_1.SpringWebTelemetry; +import io.opentelemetry.instrumentation.spring.web.v3_1.SpringWebTelemetryBuilder; import io.opentelemetry.instrumentation.spring.web.v3_1.internal.WebTelemetryUtil; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.BeanPostProcessor; @@ -18,27 +17,22 @@ final class RestClientBeanPostProcessor implements BeanPostProcessor { private final ObjectProvider openTelemetryProvider; - private final ObjectProvider configProvider; - public RestClientBeanPostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { + public RestClientBeanPostProcessor(ObjectProvider openTelemetryProvider) { this.openTelemetryProvider = openTelemetryProvider; - this.configProvider = configProvider; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) { if (bean instanceof RestClient restClient) { - return addRestClientInterceptorIfNotPresent( - restClient, openTelemetryProvider.getObject(), configProvider.getObject()); + return addRestClientInterceptorIfNotPresent(restClient, openTelemetryProvider.getObject()); } return bean; } private static RestClient addRestClientInterceptorIfNotPresent( - RestClient restClient, OpenTelemetry openTelemetry, InstrumentationConfig config) { - ClientHttpRequestInterceptor instrumentationInterceptor = getInterceptor(openTelemetry, config); + RestClient restClient, OpenTelemetry openTelemetry) { + ClientHttpRequestInterceptor instrumentationInterceptor = getInterceptor(openTelemetry); return restClient .mutate() @@ -54,13 +48,9 @@ private static RestClient addRestClientInterceptorIfNotPresent( .build(); } - static ClientHttpRequestInterceptor getInterceptor( - OpenTelemetry openTelemetry, InstrumentationConfig config) { - return InstrumentationConfigUtil.configureClientBuilder( - config, - SpringWebTelemetry.builder(openTelemetry), - WebTelemetryUtil.getBuilderExtractor()) - .build() - .newInterceptor(); + static ClientHttpRequestInterceptor getInterceptor(OpenTelemetry openTelemetry) { + SpringWebTelemetryBuilder builder = SpringWebTelemetry.builder(openTelemetry); + WebTelemetryUtil.getBuilderExtractor().apply(builder).configure(openTelemetry); + return builder.build().newInterceptor(); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfiguration.java index 72c83ef5d5ad..3501b65e1b67 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfiguration.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -33,18 +32,15 @@ public class RestClientInstrumentationAutoConfiguration { @Bean static RestClientBeanPostProcessor otelRestClientBeanPostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { - return new RestClientBeanPostProcessor(openTelemetryProvider, configProvider); + ObjectProvider openTelemetryProvider) { + return new RestClientBeanPostProcessor(openTelemetryProvider); } @Bean RestClientCustomizer otelRestClientCustomizer( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { + ObjectProvider openTelemetryProvider) { return builder -> builder.requestInterceptor( - RestClientBeanPostProcessor.getInterceptor( - openTelemetryProvider.getObject(), configProvider.getObject())); + RestClientBeanPostProcessor.getInterceptor(openTelemetryProvider.getObject())); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc6InstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc6InstrumentationAutoConfiguration.java index b8653d4d3936..71396ffdf34c 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc6InstrumentationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc6InstrumentationAutoConfiguration.java @@ -6,10 +6,9 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webmvc; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil; import io.opentelemetry.instrumentation.spring.webmvc.v6_0.SpringWebMvcTelemetry; +import io.opentelemetry.instrumentation.spring.webmvc.v6_0.SpringWebMvcTelemetryBuilder; import io.opentelemetry.instrumentation.spring.webmvc.v6_0.internal.SpringMvcBuilderUtil; import jakarta.servlet.Filter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -28,12 +27,9 @@ public class SpringWebMvc6InstrumentationAutoConfiguration { @Bean - Filter otelWebMvcFilter(OpenTelemetry openTelemetry, InstrumentationConfig config) { - return InstrumentationConfigUtil.configureServerBuilder( - config, - SpringWebMvcTelemetry.builder(openTelemetry), - SpringMvcBuilderUtil.getBuilderExtractor()) - .build() - .createServletFilter(); + Filter otelWebMvcFilter(OpenTelemetry openTelemetry) { + SpringWebMvcTelemetryBuilder builder = SpringWebMvcTelemetry.builder(openTelemetry); + SpringMvcBuilderUtil.getBuilderExtractor().apply(builder).configure(openTelemetry); + return builder.build().createServletFilter(); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationSpringBoot4AutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationSpringBoot4AutoConfiguration.java index ab8ad9cdf99f..78c732a8e190 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationSpringBoot4AutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationSpringBoot4AutoConfiguration.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.jdbc; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; import javax.sql.DataSource; import org.springframework.beans.factory.ObjectProvider; @@ -34,8 +33,7 @@ public JdbcInstrumentationSpringBoot4AutoConfiguration() {} @Bean // static to avoid "is not eligible for getting processed by all BeanPostProcessors" warning static DataSourcePostProcessor dataSourcePostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { - return new DataSourcePostProcessor(openTelemetryProvider, configProvider); + ObjectProvider openTelemetryProvider) { + return new DataSourcePostProcessor(openTelemetryProvider); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/mongo/MongoClientInstrumentationSpringBoot4AutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/mongo/MongoClientInstrumentationSpringBoot4AutoConfiguration.java index 09dcf88b3480..cfe9f1f0656e 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/mongo/MongoClientInstrumentationSpringBoot4AutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/mongo/MongoClientInstrumentationSpringBoot4AutoConfiguration.java @@ -7,10 +7,9 @@ import com.mongodb.MongoClientSettings; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.mongo.v3_1.MongoTelemetry; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.mongodb.autoconfigure.MongoClientSettingsBuilderCustomizer; import org.springframework.context.annotation.Bean; @@ -26,14 +25,22 @@ public class MongoClientInstrumentationSpringBoot4AutoConfiguration { @Bean - MongoClientSettingsBuilderCustomizer customizer( - OpenTelemetry openTelemetry, InstrumentationConfig config) { + MongoClientSettingsBuilderCustomizer customizer(OpenTelemetry openTelemetry) { return builder -> builder.addCommandListener( MongoTelemetry.builder(openTelemetry) .setStatementSanitizationEnabled( - InstrumentationConfigUtil.isStatementSanitizationEnabled( - config, "otel.instrumentation.mongo.statement-sanitizer.enabled")) + DeclarativeConfigUtil.getBoolean( + openTelemetry, "java", "mongo", "statement_sanitizer", "enabled") + .orElseGet( + () -> + DeclarativeConfigUtil.getBoolean( + openTelemetry, + "java", + "common", + "db_statement_sanitizer", + "enabled") + .orElse(true))) .build() .newCommandListener()); } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationSpringBoot4AutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationSpringBoot4AutoConfiguration.java index 04bd21413678..77b15036c6b1 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationSpringBoot4AutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationSpringBoot4AutoConfiguration.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -33,17 +32,15 @@ public SpringWebInstrumentationSpringBoot4AutoConfiguration() {} // static to avoid "is not eligible for getting processed by all BeanPostProcessors" warning @Bean static RestTemplateBeanPostProcessor otelRestTemplateBeanPostProcessor( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { - return new RestTemplateBeanPostProcessor(openTelemetryProvider, configProvider); + ObjectProvider openTelemetryProvider) { + return new RestTemplateBeanPostProcessor(openTelemetryProvider); } @Bean RestTemplateCustomizer otelRestTemplateCustomizer( - ObjectProvider openTelemetryProvider, - ObjectProvider configProvider) { + ObjectProvider openTelemetryProvider) { return restTemplate -> RestTemplateInstrumentation.addIfNotPresent( - restTemplate, openTelemetryProvider.getObject(), configProvider.getObject()); + restTemplate, openTelemetryProvider.getObject()); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFileTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFileTest.java index 2396a1147ad3..201fda267d22 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFileTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFileTest.java @@ -16,7 +16,7 @@ class EmbeddedConfigFileTest { @Test void convertFlatPropsToNested_simpleProperties() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("resource.service.name", "my-service"); flatProps.put("traces.exporter", "otlp"); @@ -55,7 +55,7 @@ void convertFlatPropsToNested_simpleProperties() { @Test void convertFlatPropsToNested_arrayProperties() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("instrumentation.java.list[0]", "one"); flatProps.put("instrumentation.java.list[1]", "two"); flatProps.put("instrumentation.java.list[2]", "three"); @@ -89,7 +89,7 @@ void convertFlatPropsToNested_arrayProperties() { @Test void convertFlatPropsToNested_mixedPropertiesAndArrays() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("resource.service.name", "test-service"); flatProps.put("resource.attributes[0]", "key1=value1"); flatProps.put("resource.attributes[1]", "key2=value2"); @@ -124,7 +124,7 @@ void convertFlatPropsToNested_mixedPropertiesAndArrays() { @Test void convertFlatPropsToNested_emptyMap() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); Map result = EmbeddedConfigFile.convertFlatPropsToNested(flatProps); @@ -133,7 +133,7 @@ void convertFlatPropsToNested_emptyMap() { @Test void convertFlatPropsToNested_singleLevelProperty() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("enabled", "true"); Map result = EmbeddedConfigFile.convertFlatPropsToNested(flatProps); @@ -143,7 +143,7 @@ void convertFlatPropsToNested_singleLevelProperty() { @Test void convertFlatPropsToNested_arrayWithGaps() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("list[0]", "first"); flatProps.put("list[2]", "third"); @@ -161,7 +161,7 @@ void convertFlatPropsToNested_arrayWithGaps() { @Test void convertFlatPropsToNested_deeplyNestedProperties() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("a.b.c.d.e", "deep-value"); Map result = EmbeddedConfigFile.convertFlatPropsToNested(flatProps); @@ -183,7 +183,7 @@ void convertFlatPropsToNested_deeplyNestedProperties() { @Test void convertFlatPropsToNested_nestedArrays() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("outer[0].inner[0]", "value1"); flatProps.put("outer[0].inner[1]", "value2"); flatProps.put("outer[1].inner[0]", "value3"); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SchedulingInstrumentationAspectTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SchedulingInstrumentationAspectTest.java index 3306b280869c..6e66cfa96d7c 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SchedulingInstrumentationAspectTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SchedulingInstrumentationAspectTest.java @@ -13,14 +13,10 @@ import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.code.SemconvCodeStabilityUtil; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.StatusData; -import java.util.Collections; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -39,9 +35,8 @@ class SchedulingInstrumentationAspectTest { private String unproxiedTesterSimpleClassName; private String unproxiedTesterClassName; - SpringSchedulingInstrumentationAspect newAspect( - OpenTelemetry openTelemetry, InstrumentationConfig config) { - return new SpringSchedulingInstrumentationAspect(openTelemetry, config); + SpringSchedulingInstrumentationAspect newAspect(OpenTelemetry openTelemetry) { + return new SpringSchedulingInstrumentationAspect(openTelemetry); } @BeforeEach @@ -54,11 +49,7 @@ void setup() { AspectJProxyFactory factory = new AspectJProxyFactory(); factory.setTarget(unproxiedTester); - SpringSchedulingInstrumentationAspect aspect = - newAspect( - testing.getOpenTelemetry(), - new ConfigPropertiesBridge( - DefaultConfigProperties.createFromMap(Collections.emptyMap()))); + SpringSchedulingInstrumentationAspect aspect = newAspect(testing.getOpenTelemetry()); factory.addAspect(aspect); schedulingTester = factory.getProxy(); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SchedulingInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SchedulingInstrumentationAutoConfigurationTest.java index 5b631daf1434..2115ea9b8642 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SchedulingInstrumentationAutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/scheduling/SchedulingInstrumentationAutoConfigurationTest.java @@ -8,10 +8,6 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; -import java.util.Collections; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -20,11 +16,6 @@ class SchedulingInstrumentationAutoConfigurationTest { private final ApplicationContextRunner runner = new ApplicationContextRunner() .withBean(OpenTelemetry.class, OpenTelemetry::noop) - .withBean( - InstrumentationConfig.class, - () -> - new ConfigPropertiesBridge( - DefaultConfigProperties.createFromMap(Collections.emptyMap()))) .withConfiguration( AutoConfigurations.of(SpringSchedulingInstrumentationAutoConfiguration.class)); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfigurationTest.java index df6273d4686c..6eb3dbd29fe7 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfigurationTest.java @@ -8,10 +8,6 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; -import java.util.Collections; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -21,11 +17,6 @@ class SpringWebfluxInstrumentationAutoConfigurationTest { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withBean(OpenTelemetry.class, OpenTelemetry::noop) - .withBean( - InstrumentationConfig.class, - () -> - new ConfigPropertiesBridge( - DefaultConfigProperties.createFromMap(Collections.emptyMap()))) .withConfiguration( AutoConfigurations.of(SpringWebfluxInstrumentationAutoConfiguration.class)); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessorTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessorTest.java index 4c25da12a112..3152bb8e1717 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessorTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessorTest.java @@ -8,10 +8,6 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; -import java.util.Collections; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.config.BeanPostProcessor; @@ -24,9 +20,6 @@ class WebClientBeanPostProcessorTest { static { beanFactory.registerSingleton("openTelemetry", OpenTelemetry.noop()); - beanFactory.registerSingleton( - "configProperties", - new ConfigPropertiesBridge(DefaultConfigProperties.createFromMap(Collections.emptyMap()))); } @Test @@ -34,9 +27,7 @@ class WebClientBeanPostProcessorTest { "when processed bean is NOT of type WebClient or WebClientBuilder should return Object") void returnsObject() { BeanPostProcessor underTest = - new WebClientBeanPostProcessor( - beanFactory.getBeanProvider(OpenTelemetry.class), - beanFactory.getBeanProvider(InstrumentationConfig.class)); + new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class)); assertThat(underTest.postProcessAfterInitialization(new Object(), "testObject")) .isExactlyInstanceOf(Object.class); @@ -46,9 +37,7 @@ void returnsObject() { @DisplayName("when processed bean is of type WebClient should return WebClient") void returnsWebClient() { BeanPostProcessor underTest = - new WebClientBeanPostProcessor( - beanFactory.getBeanProvider(OpenTelemetry.class), - beanFactory.getBeanProvider(InstrumentationConfig.class)); + new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class)); assertThat(underTest.postProcessAfterInitialization(WebClient.create(), "testWebClient")) .isInstanceOf(WebClient.class); @@ -58,9 +47,7 @@ void returnsWebClient() { @DisplayName("when processed bean is of type WebClientBuilder should return WebClientBuilder") void returnsWebClientBuilder() { BeanPostProcessor underTest = - new WebClientBeanPostProcessor( - beanFactory.getBeanProvider(OpenTelemetry.class), - beanFactory.getBeanProvider(InstrumentationConfig.class)); + new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class)); assertThat( underTest.postProcessAfterInitialization(WebClient.builder(), "testWebClientBuilder")) @@ -71,9 +58,7 @@ void returnsWebClientBuilder() { @DisplayName("when processed bean is of type WebClient should add exchange filter to WebClient") void addsExchangeFilterWebClient() { BeanPostProcessor underTest = - new WebClientBeanPostProcessor( - beanFactory.getBeanProvider(OpenTelemetry.class), - beanFactory.getBeanProvider(InstrumentationConfig.class)); + new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class)); WebClient webClient = WebClient.create(); Object processedWebClient = @@ -96,9 +81,7 @@ void addsExchangeFilterWebClient() { "when processed bean is of type WebClientBuilder should add ONE exchange filter to WebClientBuilder") void addsExchangeFilterWebClientBuilder() { BeanPostProcessor underTest = - new WebClientBeanPostProcessor( - beanFactory.getBeanProvider(OpenTelemetry.class), - beanFactory.getBeanProvider(InstrumentationConfig.class)); + new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class)); WebClient.Builder webClientBuilder = WebClient.builder(); underTest.postProcessAfterInitialization(webClientBuilder, "testWebClientBuilder"); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation5AutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation5AutoConfigurationTest.java index 3c90a46fdfdc..a1d6583808d6 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation5AutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation5AutoConfigurationTest.java @@ -9,10 +9,6 @@ import static org.junit.jupiter.api.Assumptions.assumeFalse; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; -import java.util.Collections; import javax.servlet.Filter; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -24,11 +20,6 @@ class SpringWebMvcInstrumentation5AutoConfigurationTest { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withBean(OpenTelemetry.class, OpenTelemetry::noop) - .withBean( - InstrumentationConfig.class, - () -> - new ConfigPropertiesBridge( - DefaultConfigProperties.createFromMap(Collections.emptyMap()))) .withConfiguration( AutoConfigurations.of(SpringWebMvc5InstrumentationAutoConfiguration.class)); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/java/io/opentelemetry/instrumentation/spring/autoconfigure/DeclarativeConfigTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/java/io/opentelemetry/instrumentation/spring/autoconfigure/DeclarativeConfigTest.java index 7bb5b53f5832..4846a8b87141 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/java/io/opentelemetry/instrumentation/spring/autoconfigure/DeclarativeConfigTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/java/io/opentelemetry/instrumentation/spring/autoconfigure/DeclarativeConfigTest.java @@ -8,7 +8,7 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web.SpringWebInstrumentationAutoConfiguration; import io.opentelemetry.sdk.OpenTelemetrySdk; import org.junit.jupiter.api.DisplayName; @@ -46,8 +46,7 @@ void customOpenTelemetry() { context -> assertThat(context) .hasBean("customOpenTelemetry") - .doesNotHaveBean("openTelemetry") - .hasBean("otelProperties")); + .doesNotHaveBean("openTelemetry")); } @Test @@ -55,20 +54,12 @@ void customOpenTelemetry() { "when Application Context DOES NOT contain OpenTelemetry bean should initialize openTelemetry") void initializeProvidersAndOpenTelemetry() { this.contextRunner.run( - context -> - assertThat(context) - .hasBean("openTelemetry") - .hasBean("otelProperties") - .getBean(InstrumentationConfig.class) - .isNotNull() - .satisfies( - c -> - assertThat(c.getDeclarativeConfig("foo")) - .isNotNull() - .satisfies( - instrumentationConfig -> - assertThat(instrumentationConfig.getString("bar")) - .isEqualTo("baz")))); + context -> { + assertThat(context).hasBean("openTelemetry"); + OpenTelemetry openTelemetry = context.getBean(OpenTelemetry.class); + assertThat(DeclarativeConfigUtil.getString(openTelemetry, "java", "foo", "bar")) + .hasValue("baz"); + }); } @Test diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfigurationTest.java index 3e16f15b23ef..25a13c2e956c 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfigurationTest.java @@ -8,10 +8,6 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; -import java.util.Collections; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -22,11 +18,6 @@ class RestClientInstrumentationAutoConfigurationTest { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withBean(OpenTelemetry.class, OpenTelemetry::noop) - .withBean( - InstrumentationConfig.class, - () -> - new ConfigPropertiesBridge( - DefaultConfigProperties.createFromMap(Collections.emptyMap()))) .withBean(RestClient.class, RestClient::create) .withConfiguration( AutoConfigurations.of(RestClientInstrumentationAutoConfiguration.class)); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation6AutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation6AutoConfigurationTest.java index a96d6abc2f4e..9b358e513e30 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation6AutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation6AutoConfigurationTest.java @@ -9,11 +9,7 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; import jakarta.servlet.Filter; -import java.util.Collections; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -24,11 +20,6 @@ class SpringWebMvcInstrumentation6AutoConfigurationTest { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withBean(OpenTelemetry.class, OpenTelemetry::noop) - .withBean( - InstrumentationConfig.class, - () -> - new ConfigPropertiesBridge( - DefaultConfigProperties.createFromMap(Collections.emptyMap()))) .withConfiguration( AutoConfigurations.of(SpringWebMvc6InstrumentationAutoConfiguration.class)); diff --git a/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractJdbcInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractJdbcInstrumentationAutoConfigurationTest.java index 8c7b05f14e96..82d6b124891b 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractJdbcInstrumentationAutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractJdbcInstrumentationAutoConfigurationTest.java @@ -7,14 +7,10 @@ import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; -import static java.util.Collections.emptyMap; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; import java.sql.Connection; import java.sql.Statement; import javax.sql.DataSource; @@ -32,9 +28,6 @@ public abstract class AbstractJdbcInstrumentationAutoConfigurationTest { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withBean( - InstrumentationConfig.class, - () -> new ConfigPropertiesBridge(DefaultConfigProperties.createFromMap(emptyMap()))) .withConfiguration(autoConfigurations()) .withBean("openTelemetry", OpenTelemetry.class, testing()::getOpenTelemetry); diff --git a/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractKafkaInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractKafkaInstrumentationAutoConfigurationTest.java index c4e0b40a127c..92995512a544 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractKafkaInstrumentationAutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractKafkaInstrumentationAutoConfigurationTest.java @@ -5,13 +5,9 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal; -import static java.util.Collections.emptyMap; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; @@ -25,9 +21,6 @@ public abstract class AbstractKafkaInstrumentationAutoConfigurationTest { protected final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withBean( - InstrumentationConfig.class, - () -> new ConfigPropertiesBridge(DefaultConfigProperties.createFromMap(emptyMap()))) .withConfiguration(autoConfigurations()) .withBean("openTelemetry", OpenTelemetry.class, OpenTelemetry::noop); diff --git a/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractR2DbcInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractR2DbcInstrumentationAutoConfigurationTest.java index a556d7e1f68c..dff18c213b44 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractR2DbcInstrumentationAutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractR2DbcInstrumentationAutoConfigurationTest.java @@ -9,11 +9,7 @@ import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; -import java.util.Collections; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -27,11 +23,6 @@ public abstract class AbstractR2DbcInstrumentationAutoConfigurationTest { protected final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withBean( - InstrumentationConfig.class, - () -> - new ConfigPropertiesBridge( - DefaultConfigProperties.createFromMap(Collections.emptyMap()))) .withConfiguration(autoConfigurations()) .withBean("openTelemetry", OpenTelemetry.class, testing()::getOpenTelemetry); diff --git a/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractSpringWebInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractSpringWebInstrumentationAutoConfigurationTest.java index 4b9a339d38b7..6b96ce5ec1d0 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractSpringWebInstrumentationAutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/testing/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/AbstractSpringWebInstrumentationAutoConfigurationTest.java @@ -8,11 +8,7 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web.RestTemplateBeanPostProcessor; -import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; -import java.util.Collections; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -25,11 +21,6 @@ public abstract class AbstractSpringWebInstrumentationAutoConfigurationTest { protected final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withBean(OpenTelemetry.class, OpenTelemetry::noop) - .withBean( - InstrumentationConfig.class, - () -> - new ConfigPropertiesBridge( - DefaultConfigProperties.createFromMap(Collections.emptyMap()))) .withBean(RestTemplate.class, RestTemplate::new) .withConfiguration(autoConfigurations()); diff --git a/instrumentation/spring/spring-cloud-gateway/spring-cloud-gateway-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/gateway/common/GatewayRouteHelper.java b/instrumentation/spring/spring-cloud-gateway/spring-cloud-gateway-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/gateway/common/GatewayRouteHelper.java index 89d8b72e917e..a66b1abca882 100644 --- a/instrumentation/spring/spring-cloud-gateway/spring-cloud-gateway-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/gateway/common/GatewayRouteHelper.java +++ b/instrumentation/spring/spring-cloud-gateway/spring-cloud-gateway-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/gateway/common/GatewayRouteHelper.java @@ -5,8 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.spring.gateway.common; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributeKey; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import java.util.regex.Pattern; import javax.annotation.Nullable; @@ -36,9 +37,9 @@ public final class GatewayRouteHelper { static { CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.spring-cloud-gateway.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "spring_cloud_gateway", "experimental_span_attributes") + .orElse(false); } /* Regex for UUID */ diff --git a/instrumentation/spring/spring-core-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/core/v2_0/SpringCoreIgnoredTypesConfigurer.java b/instrumentation/spring/spring-core-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/core/v2_0/SpringCoreIgnoredTypesConfigurer.java index 9ec673d1fb71..172a9f1a77c8 100644 --- a/instrumentation/spring/spring-core-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/core/v2_0/SpringCoreIgnoredTypesConfigurer.java +++ b/instrumentation/spring/spring-core-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/core/v2_0/SpringCoreIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class SpringCoreIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // a Runnable task class that we don't need to touch builder .ignoreClass("org.springframework.util.ConcurrentLruCache$AddTask") diff --git a/instrumentation/spring/spring-integration-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationIgnoredTypesConfigurer.java b/instrumentation/spring/spring-integration-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationIgnoredTypesConfigurer.java index a54b279e9da7..be1b753245d1 100644 --- a/instrumentation/spring/spring-integration-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationIgnoredTypesConfigurer.java +++ b/instrumentation/spring/spring-integration-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationIgnoredTypesConfigurer.java @@ -8,12 +8,11 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class SpringIntegrationIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // we don't instrument any messaging classes builder.ignoreClass("org.springframework.messaging"); } diff --git a/instrumentation/spring/spring-integration-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationSingletons.java b/instrumentation/spring/spring-integration-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationSingletons.java index 19cbd73fcb2e..6dd18e37f670 100644 --- a/instrumentation/spring/spring-integration-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationSingletons.java +++ b/instrumentation/spring/spring-integration-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationSingletons.java @@ -8,26 +8,36 @@ import static java.util.Collections.singletonList; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.spring.integration.v4_1.SpringIntegrationTelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.Collections; import java.util.List; import org.springframework.messaging.support.ChannelInterceptor; public final class SpringIntegrationSingletons { private static final List PATTERNS = - AgentInstrumentationConfig.get() - .getList( - "otel.instrumentation.spring-integration.global-channel-interceptor-patterns", - singletonList("*")); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "spring_integration", + "global_channel_interceptor_patterns") + .orElse(singletonList("*")); private static final ChannelInterceptor INTERCEPTOR = SpringIntegrationTelemetry.builder(GlobalOpenTelemetry.get()) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "messaging", "capture_headers/development") + .orElse(Collections.emptyList())) .setProducerSpanEnabled( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.spring-integration.producer.enabled", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "spring_integration", + "producer", + "enabled") + .orElse(false)) .build() .newChannelInterceptor(); diff --git a/instrumentation/spring/spring-jms/spring-jms-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v2_0/SpringJmsSingletons.java b/instrumentation/spring/spring-jms/spring-jms-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v2_0/SpringJmsSingletons.java index 034e3cdedac7..e35fb6783b92 100644 --- a/instrumentation/spring/spring-jms/spring-jms-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v2_0/SpringJmsSingletons.java +++ b/instrumentation/spring/spring-jms/spring-jms-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v2_0/SpringJmsSingletons.java @@ -6,23 +6,36 @@ package io.opentelemetry.javaagent.instrumentation.spring.jms.v2_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; 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 SpringJmsSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-jms-2.0"; private static final boolean RECEIVE_TELEMETRY_ENABLED = - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled(); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false); private static final Instrumenter LISTENER_INSTRUMENTER; private static final Instrumenter RECEIVE_INSTRUMENTER; static { JmsInstrumenterFactory factory = new JmsInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "capture_headers/development") + .orElse(Collections.emptyList())) .setMessagingReceiveInstrumentationEnabled(RECEIVE_TELEMETRY_ENABLED); LISTENER_INSTRUMENTER = factory.createConsumerProcessInstrumenter(true); diff --git a/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsSingletons.java b/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsSingletons.java index 38360f67e3a6..f91b9887d743 100644 --- a/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsSingletons.java +++ b/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsSingletons.java @@ -6,23 +6,36 @@ package io.opentelemetry.javaagent.instrumentation.spring.jms.v6_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; 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 SpringJmsSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-jms-6.0"; private static final boolean RECEIVE_TELEMETRY_ENABLED = - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled(); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false); private static final Instrumenter LISTENER_INSTRUMENTER; private static final Instrumenter RECEIVE_INSTRUMENTER; static { JmsInstrumenterFactory factory = new JmsInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "capture_headers/development") + .orElse(Collections.emptyList())) .setMessagingReceiveInstrumentationEnabled(RECEIVE_TELEMETRY_ENABLED); LISTENER_INSTRUMENTER = factory.createConsumerProcessInstrumenter(true); diff --git a/instrumentation/spring/spring-kafka-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaSingletons.java b/instrumentation/spring/spring-kafka-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaSingletons.java index 1fd566dd5659..9df23bd6856f 100644 --- a/instrumentation/spring/spring-kafka-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaSingletons.java +++ b/instrumentation/spring/spring-kafka-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaSingletons.java @@ -6,37 +6,51 @@ package io.opentelemetry.javaagent.instrumentation.spring.kafka.v2_7; 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.kafkaclients.common.v0_11.internal.KafkaInstrumenterFactory; import io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal.KafkaReceiveRequest; import io.opentelemetry.instrumentation.spring.kafka.v2_7.SpringKafkaTelemetry; import io.opentelemetry.instrumentation.spring.kafka.v2_7.internal.SpringKafkaErrorCauseExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.Collections; +import java.util.List; public final class SpringKafkaSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-kafka-2.7"; + private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "kafka", "experimental_span_attributes") + .orElse(false); + + private static final List CAPTURED_HEADERS = + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "messaging", "capture_headers/development") + .orElse(Collections.emptyList()); + + private static final boolean RECEIVE_TELEMETRY_ENABLED = + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false); + private static final SpringKafkaTelemetry TELEMETRY = SpringKafkaTelemetry.builder(GlobalOpenTelemetry.get()) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) - .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false)) - .setMessagingReceiveInstrumentationEnabled( - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled()) + .setCapturedHeaders(CAPTURED_HEADERS) + .setCaptureExperimentalSpanAttributes(CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES) + .setMessagingReceiveInstrumentationEnabled(RECEIVE_TELEMETRY_ENABLED) .build(); private static final Instrumenter BATCH_PROCESS_INSTRUMENTER; static { KafkaInstrumenterFactory factory = 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()) + .setCapturedHeaders(CAPTURED_HEADERS) + .setCaptureExperimentalSpanAttributes(CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES) + .setMessagingReceiveInstrumentationEnabled(RECEIVE_TELEMETRY_ENABLED) .setErrorCauseExtractor(SpringKafkaErrorCauseExtractor.INSTANCE); BATCH_PROCESS_INSTRUMENTER = factory.createBatchProcessInstrumenter(); } diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java index fc9c454dcda2..ebd12ae4be8d 100644 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java @@ -7,6 +7,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessageOperation; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingSpanNameExtractor; @@ -14,7 +15,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.internal.PropagatorBasedSpanLinksExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.Collections; import org.apache.pulsar.client.api.Message; public final class SpringPulsarSingletons { @@ -26,7 +27,13 @@ public final class SpringPulsarSingletons { SpringPulsarMessageAttributesGetter getter = SpringPulsarMessageAttributesGetter.INSTANCE; MessageOperation operation = MessageOperation.PROCESS; boolean messagingReceiveInstrumentationEnabled = - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled(); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false); InstrumenterBuilder, Void> builder = Instrumenter., Void>builder( @@ -35,7 +42,13 @@ public final class SpringPulsarSingletons { MessagingSpanNameExtractor.create(getter, operation)) .addAttributesExtractor( MessagingAttributesExtractor.builder(getter, operation) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "capture_headers/development") + .orElse(Collections.emptyList())) .build()); if (messagingReceiveInstrumentationEnabled) { builder.addSpanLinksExtractor( diff --git a/instrumentation/spring/spring-rabbit-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitIgnoredTypesConfigurer.java b/instrumentation/spring/spring-rabbit-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitIgnoredTypesConfigurer.java index c4890b1340fc..6fa7129a684a 100644 --- a/instrumentation/spring/spring-rabbit-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitIgnoredTypesConfigurer.java +++ b/instrumentation/spring/spring-rabbit-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitIgnoredTypesConfigurer.java @@ -8,12 +8,11 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class SpringRabbitIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // contains a Runnable that servers as a worker that continuously reads messages from queue builder .ignoreClass("org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$") diff --git a/instrumentation/spring/spring-rabbit-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitSingletons.java b/instrumentation/spring/spring-rabbit-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitSingletons.java index eae11c3df682..df6ec117bc03 100644 --- a/instrumentation/spring/spring-rabbit-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitSingletons.java +++ b/instrumentation/spring/spring-rabbit-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitSingletons.java @@ -6,11 +6,12 @@ package io.opentelemetry.javaagent.instrumentation.spring.rabbit.v1_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessageOperation; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.Collections; import org.springframework.amqp.core.Message; public final class SpringRabbitSingletons { @@ -30,7 +31,13 @@ public final class SpringRabbitSingletons { MessagingSpanNameExtractor.create(getter, operation)) .addAttributesExtractor( MessagingAttributesExtractor.builder(getter, operation) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "capture_headers/development") + .orElse(Collections.emptyList())) .build()) .buildConsumerInstrumenter(MessageHeaderGetter.INSTANCE); } diff --git a/instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rmi/v4_0/SpringRmiIgnoredTypesConfigurer.java b/instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rmi/v4_0/SpringRmiIgnoredTypesConfigurer.java index c12ab641a0a4..e8cf8fb24235 100644 --- a/instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rmi/v4_0/SpringRmiIgnoredTypesConfigurer.java +++ b/instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/rmi/v4_0/SpringRmiIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class SpringRmiIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // The Spring EJB classes are ignored in the AdditionalLibraryIgnoredTypesConfigurer, but // are required when utilizing Spring's local-slsb and remote-slsb to access EJBs through RMI. builder.allowClass("org.springframework.ejb.access."); diff --git a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingSingletons.java b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingSingletons.java index d7d6ad54f818..cb818e47f4f1 100644 --- a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingSingletons.java +++ b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingSingletons.java @@ -7,18 +7,22 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class SpringSchedulingSingletons { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.spring-scheduling.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "spring_scheduling", + "experimental_span_attributes") + .orElse(false); private static final Instrumenter INSTRUMENTER; diff --git a/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/EnduserAttributesCapturerSingletons.java b/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/EnduserAttributesCapturerSingletons.java index 3ebaf45feb24..5bcd567420d5 100644 --- a/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/EnduserAttributesCapturerSingletons.java +++ b/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/EnduserAttributesCapturerSingletons.java @@ -5,9 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.spring.security.config.v6_0; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.spring.security.config.v6_0.EnduserAttributesCapturer; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public class EnduserAttributesCapturerSingletons { @@ -22,22 +22,41 @@ public static EnduserAttributesCapturer enduserAttributesCapturer() { private static EnduserAttributesCapturer createEndUserAttributesCapturerFromConfig() { EnduserAttributesCapturer capturer = new EnduserAttributesCapturer(); - capturer.setEnduserIdEnabled(AgentCommonConfig.get().getEnduserConfig().isIdEnabled()); - capturer.setEnduserRoleEnabled(AgentCommonConfig.get().getEnduserConfig().isRoleEnabled()); - capturer.setEnduserScopeEnabled(AgentCommonConfig.get().getEnduserConfig().isScopeEnabled()); + capturer.setEnduserIdEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "enduser", "id", "enabled") + .orElse(false)); + capturer.setEnduserRoleEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "enduser", "role", "enabled") + .orElse(false)); + capturer.setEnduserScopeEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "enduser", "scope", "enabled") + .orElse(false)); String rolePrefix = - AgentInstrumentationConfig.get() - .getString( - "otel.instrumentation.spring-security.enduser.role.granted-authority-prefix"); + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), + "java", + "spring_security", + "enduser", + "role", + "granted_authority_prefix") + .orElse(null); if (rolePrefix != null) { capturer.setRoleGrantedAuthorityPrefix(rolePrefix); } String scopePrefix = - AgentInstrumentationConfig.get() - .getString( - "otel.instrumentation.spring-security.enduser.scope.granted-authority-prefix"); + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), + "java", + "spring_security", + "enduser", + "scope", + "granted_authority_prefix") + .orElse(null); if (scopePrefix != null) { capturer.setScopeGrantedAuthorityPrefix(scopePrefix); } diff --git a/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/servlet/SpringSecurityConfigServletInstrumentationModule.java b/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/servlet/SpringSecurityConfigServletInstrumentationModule.java index dee55a33f4ca..5fd7b743eea0 100644 --- a/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/servlet/SpringSecurityConfigServletInstrumentationModule.java +++ b/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/servlet/SpringSecurityConfigServletInstrumentationModule.java @@ -9,11 +9,11 @@ import static java.util.Collections.singletonList; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @@ -30,8 +30,8 @@ public SpringSecurityConfigServletInstrumentationModule() { } @Override - public boolean defaultEnabled(ConfigProperties config) { - return super.defaultEnabled(config) + public boolean defaultEnabled() { + return superDefaultEnabled() /* * Since the only thing this module currently does is capture enduser attributes, * the module can be completely disabled if enduser attributes are disabled. @@ -39,7 +39,26 @@ public boolean defaultEnabled(ConfigProperties config) { * If any functionality not related to enduser attributes is added to this module, * then this check will need to move elsewhere to only guard the enduser attributes logic. */ - && AgentCommonConfig.get().getEnduserConfig().isAnyEnabled(); + && isAnyEnduserAttributeEnabled(); + } + + // This method can be removed and super.defaultEnabled() can be used instead once the deprecated + // InstrumentationModule.defaultEnabled(ConfigProperties) is removed, at which point + // InstrumentationModule.defaultEnabled() will no longer need to throw an exception. + private static boolean superDefaultEnabled() { + return DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "default_enabled") + .orElse(true); + } + + private static boolean isAnyEnduserAttributeEnabled() { + var otel = GlobalOpenTelemetry.get(); + return DeclarativeConfigUtil.getBoolean(otel, "java", "common", "enduser", "id", "enabled") + .orElse(false) + || DeclarativeConfigUtil.getBoolean(otel, "java", "common", "enduser", "role", "enabled") + .orElse(false) + || DeclarativeConfigUtil.getBoolean(otel, "java", "common", "enduser", "scope", "enabled") + .orElse(false); } @Override diff --git a/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/webflux/SpringSecurityConfigWebFluxInstrumentationModule.java b/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/webflux/SpringSecurityConfigWebFluxInstrumentationModule.java index 43572827b483..22ece73d7241 100644 --- a/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/webflux/SpringSecurityConfigWebFluxInstrumentationModule.java +++ b/instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/webflux/SpringSecurityConfigWebFluxInstrumentationModule.java @@ -8,10 +8,10 @@ import static java.util.Collections.singletonList; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; /** Instrumentation module for webflux-based applications that use spring-security-config. */ @@ -27,8 +27,8 @@ public SpringSecurityConfigWebFluxInstrumentationModule() { } @Override - public boolean defaultEnabled(ConfigProperties config) { - return super.defaultEnabled(config) + public boolean defaultEnabled() { + return superDefaultEnabled() /* * Since the only thing this module currently does is capture enduser attributes, * the module can be completely disabled if enduser attributes are disabled. @@ -36,7 +36,26 @@ public boolean defaultEnabled(ConfigProperties config) { * If any functionality not related to enduser attributes is added to this module, * then this check will need to move elsewhere to only guard the enduser attributes logic. */ - && AgentCommonConfig.get().getEnduserConfig().isAnyEnabled(); + && isAnyEnduserAttributeEnabled(); + } + + // This method can be removed and super.defaultEnabled() can be used instead once the deprecated + // InstrumentationModule.defaultEnabled(ConfigProperties) is removed, at which point + // InstrumentationModule.defaultEnabled() will no longer need to throw an exception. + private static boolean superDefaultEnabled() { + return DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "default_enabled") + .orElse(true); + } + + private static boolean isAnyEnduserAttributeEnabled() { + var otel = GlobalOpenTelemetry.get(); + return DeclarativeConfigUtil.getBoolean(otel, "java", "common", "enduser", "id", "enabled") + .orElse(false) + || DeclarativeConfigUtil.getBoolean(otel, "java", "common", "enduser", "role", "enabled") + .orElse(false) + || DeclarativeConfigUtil.getBoolean(otel, "java", "common", "enduser", "scope", "enabled") + .orElse(false); } @Override diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java index bc57cf8f7f34..2912f68997c6 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java @@ -6,11 +6,11 @@ package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteGetter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import org.springframework.web.reactive.HandlerMapping; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.util.pattern.PathPattern; @@ -27,7 +27,14 @@ public final class WebfluxSingletons { INSTRUMENTER = builder - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .addAttributesExtractor( CodeAttributesExtractor.create(new HandlerCodeAttributesGetter())) .buildInstrumenter(); diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/ModelAndViewAttributesExtractor.java b/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/ModelAndViewAttributesExtractor.java index 1dcece6a87d9..aab6ed9ea7e4 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/ModelAndViewAttributesExtractor.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/ModelAndViewAttributesExtractor.java @@ -5,10 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.spring.webmvc; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import javax.annotation.Nullable; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.View; @@ -16,8 +17,9 @@ public class ModelAndViewAttributesExtractor implements AttributesExtractor { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.spring-webmvc.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "spring_webmvc", "experimental_span_attributes") + .orElse(false); @Override public void onStart( diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/SpringWebMvcInstrumenterFactory.java b/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/SpringWebMvcInstrumenterFactory.java index a072c14a56ed..71ab85f66467 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/SpringWebMvcInstrumenterFactory.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/SpringWebMvcInstrumenterFactory.java @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.spring.webmvc; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import org.springframework.web.servlet.ModelAndView; public final class SpringWebMvcInstrumenterFactory { @@ -27,7 +27,14 @@ public Instrumenter createHandlerInstrumenter() { instrumentationName, CodeSpanNameExtractor.create(codeAttributesGetter)) .addAttributesExtractor(CodeAttributesExtractor.create(codeAttributesGetter)) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } @@ -35,7 +42,14 @@ public Instrumenter createModelAndViewInstrumenter() { return Instrumenter.builder( GlobalOpenTelemetry.get(), instrumentationName, new ModelAndViewSpanNameExtractor()) .addAttributesExtractor(new ModelAndViewAttributesExtractor()) - .setEnabled(ExperimentalConfig.get().viewTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "view_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } } diff --git a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/SpringWsInstrumentationModule.java b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/SpringWsInstrumentationModule.java index 442e21f119e9..75270afce189 100644 --- a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/SpringWsInstrumentationModule.java +++ b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/SpringWsInstrumentationModule.java @@ -6,11 +6,11 @@ package io.opentelemetry.javaagent.instrumentation.spring.ws.v2_0; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.Collections; import java.util.List; @@ -27,9 +27,25 @@ public List typeInstrumentations() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // this instrumentation only produces controller telemetry - return super.defaultEnabled(config) && ExperimentalConfig.get().controllerTelemetryEnabled(); + return superDefaultEnabled() + && DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false); + } + + // This method can be removed and super.defaultEnabled() can be used instead once the deprecated + // InstrumentationModule.defaultEnabled(ConfigProperties) is removed, at which point + // InstrumentationModule.defaultEnabled() will no longer need to throw an exception. + private static boolean superDefaultEnabled() { + return DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "common", "default_enabled") + .orElse(true); } @Override diff --git a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/SpringWsSingletons.java b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/SpringWsSingletons.java index b21b1184675b..32781e2a157c 100644 --- a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/SpringWsSingletons.java +++ b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/SpringWsSingletons.java @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.spring.ws.v2_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; public class SpringWsSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-ws-2.0"; @@ -25,7 +25,14 @@ public class SpringWsSingletons { INSTRUMENTATION_NAME, CodeSpanNameExtractor.create(codeAttributesGetter)) .addAttributesExtractor(CodeAttributesExtractor.create(codeAttributesGetter)) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/CompletionListener.java b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/CompletionListener.java index b045a961be82..88d1acb79944 100644 --- a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/CompletionListener.java +++ b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/CompletionListener.java @@ -7,17 +7,19 @@ import static io.opentelemetry.javaagent.instrumentation.spymemcached.SpymemcachedSingletons.instrumenter; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; public abstract class CompletionListener { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.spymemcached.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "spymemcached", "experimental_span_attributes") + .orElse(false); private static final String DB_COMMAND_CANCELLED = "spymemcached.command.cancelled"; private static final String MEMCACHED_RESULT = "spymemcached.result"; diff --git a/instrumentation/struts/struts-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/struts/v2_3/StrutsSingletons.java b/instrumentation/struts/struts-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/struts/v2_3/StrutsSingletons.java index 913db3c99bc1..03813628d489 100644 --- a/instrumentation/struts/struts-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/struts/v2_3/StrutsSingletons.java +++ b/instrumentation/struts/struts-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/struts/v2_3/StrutsSingletons.java @@ -7,10 +7,10 @@ import com.opensymphony.xwork2.ActionInvocation; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; public class StrutsSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.struts-2.3"; @@ -26,7 +26,14 @@ public class StrutsSingletons { INSTRUMENTATION_NAME, CodeSpanNameExtractor.create(codeAttributesGetter)) .addAttributesExtractor(CodeAttributesExtractor.create(codeAttributesGetter)) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/struts/struts-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/struts/v7_0/StrutsSingletons.java b/instrumentation/struts/struts-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/struts/v7_0/StrutsSingletons.java index b638dd646223..584b648a03be 100644 --- a/instrumentation/struts/struts-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/struts/v7_0/StrutsSingletons.java +++ b/instrumentation/struts/struts-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/struts/v7_0/StrutsSingletons.java @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.struts.v7_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import org.apache.struts2.ActionInvocation; public class StrutsSingletons { @@ -26,7 +26,14 @@ public class StrutsSingletons { INSTRUMENTATION_NAME, CodeSpanNameExtractor.create(codeAttributesGetter)) .addAttributesExtractor(CodeAttributesExtractor.create(codeAttributesGetter)) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/tapestry-5.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tapestry/TapestrySingletons.java b/instrumentation/tapestry-5.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tapestry/TapestrySingletons.java index e3e2e279885e..b3041b06fea1 100644 --- a/instrumentation/tapestry-5.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tapestry/TapestrySingletons.java +++ b/instrumentation/tapestry-5.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tapestry/TapestrySingletons.java @@ -6,9 +6,9 @@ package io.opentelemetry.javaagent.instrumentation.tapestry; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; 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 { @@ -27,7 +27,14 @@ public class TapestrySingletons { } return ErrorCauseExtractor.getDefault().extract(error); }) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false)) .buildInstrumenter(); } diff --git a/instrumentation/twilio-6.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/twilio/TwilioSingletons.java b/instrumentation/twilio-6.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/twilio/TwilioSingletons.java index 106ad4873ce3..57d807d46c1b 100644 --- a/instrumentation/twilio-6.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/twilio/TwilioSingletons.java +++ b/instrumentation/twilio-6.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/twilio/TwilioSingletons.java @@ -8,16 +8,17 @@ import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient; 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.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.semconv.util.SpanNames; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class TwilioSingletons { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.twilio.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "twilio", "experimental_span_attributes") + .orElse(false); private static final Instrumenter INSTRUMENTER; diff --git a/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowIgnoredTypesConfigurer.java b/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowIgnoredTypesConfigurer.java index 49bc8883ce8a..3287251ffb85 100644 --- a/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowIgnoredTypesConfigurer.java +++ b/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class UndertowIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // When http pipelining is used HttpReadListener is passed to another worker thread to start // processing next request when the context from the old request is still active. Prevent // propagating context from the old request to the new one. diff --git a/instrumentation/vaadin-14.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vaadin/VaadinSingletons.java b/instrumentation/vaadin-14.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vaadin/VaadinSingletons.java index d7e41033dd72..ddc6904c5941 100644 --- a/instrumentation/vaadin-14.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vaadin/VaadinSingletons.java +++ b/instrumentation/vaadin-14.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vaadin/VaadinSingletons.java @@ -8,11 +8,11 @@ import com.vaadin.flow.server.communication.rpc.RpcInvocationHandler; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.ContextKey; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.semconv.util.SpanNames; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; public class VaadinSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.vaadin-14.2"; @@ -29,6 +29,15 @@ public class VaadinSingletons { private static final VaadinHelper HELPER; static { + boolean controllerTelemetryEnabled = + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "controller_telemetry/development", + "enabled") + .orElse(false); + ClientCallableCodeAttributesGetter clientCallableAttributesGetter = new ClientCallableCodeAttributesGetter(); CLIENT_CALLABLE_INSTRUMENTER = @@ -36,14 +45,14 @@ public class VaadinSingletons { GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, CodeSpanNameExtractor.create(clientCallableAttributesGetter)) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled(controllerTelemetryEnabled) .addAttributesExtractor(CodeAttributesExtractor.create(clientCallableAttributesGetter)) .buildInstrumenter(); REQUEST_HANDLER_INSTRUMENTER = Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, VaadinHandlerRequest::getSpanName) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled(controllerTelemetryEnabled) // add context for tracking nested request handler calls .addContextCustomizer( (context, vaadinHandlerRequest, startAttributes) -> @@ -54,14 +63,14 @@ public class VaadinSingletons { RPC_INSTRUMENTER = Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, VaadinSingletons::rpcSpanName) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled(controllerTelemetryEnabled) .addAttributesExtractor(CodeAttributesExtractor.create(rpcCodeAttributesGetter)) .buildInstrumenter(); SERVICE_INSTRUMENTER = Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, VaadinServiceRequest::getSpanName) - .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .setEnabled(controllerTelemetryEnabled) // add context for tracking whether any request handler handled the request .addContextCustomizer( (context, vaadinServiceRequest, startAttributes) -> diff --git a/instrumentation/vertx/vertx-kafka-client-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/VertxKafkaSingletons.java b/instrumentation/vertx/vertx-kafka-client-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/VertxKafkaSingletons.java index 44947e2723d7..8f85aa8a2307 100644 --- a/instrumentation/vertx/vertx-kafka-client-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/VertxKafkaSingletons.java +++ b/instrumentation/vertx/vertx-kafka-client-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/VertxKafkaSingletons.java @@ -6,12 +6,12 @@ package io.opentelemetry.javaagent.instrumentation.vertx.kafka.v3_6; 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.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.KafkaReceiveRequest; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import java.util.Collections; public final class VertxKafkaSingletons { @@ -23,12 +23,25 @@ public final class VertxKafkaSingletons { static { KafkaInstrumenterFactory factory = new KafkaInstrumenterFactory(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME) - .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .setCapturedHeaders( + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "capture_headers/development") + .orElse(Collections.emptyList())) .setCaptureExperimentalSpanAttributes( - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false)) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "kafka", "experimental_span_attributes") + .orElse(false)) .setMessagingReceiveInstrumentationEnabled( - ExperimentalConfig.get().messagingReceiveInstrumentationEnabled()); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "messaging", + "receive_telemetry/development", + "enabled") + .orElse(false)); BATCH_PROCESS_INSTRUMENTER = factory.createBatchProcessInstrumenter(); PROCESS_INSTRUMENTER = factory.createConsumerProcessInstrumenter(); } diff --git a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesGetter.java b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesGetter.java index a6330addd21b..9c9487e7436d 100644 --- a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesGetter.java +++ b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesGetter.java @@ -5,10 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.vertx.v4_0.redis; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesGetter; import io.opentelemetry.instrumentation.api.incubator.semconv.db.RedisCommandSanitizer; import io.opentelemetry.instrumentation.api.internal.SemconvStability; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import javax.annotation.Nullable; @@ -17,7 +18,15 @@ public enum VertxRedisClientAttributesGetter INSTANCE; private static final RedisCommandSanitizer sanitizer = - RedisCommandSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); + RedisCommandSanitizer.create( + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "common", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)); @SuppressWarnings("deprecation") // using deprecated DbSystemIncubatingValues @Override diff --git a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientSingletons.java b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientSingletons.java index 7bc57fbbb10e..df60457e0332 100644 --- a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientSingletons.java +++ b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientSingletons.java @@ -11,6 +11,7 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; @@ -18,7 +19,6 @@ import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor; import io.opentelemetry.instrumentation.api.util.VirtualField; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.vertx.core.Future; import io.vertx.redis.client.Command; import io.vertx.redis.client.impl.RedisStandaloneConnection; @@ -54,7 +54,7 @@ public final class VertxRedisClientSingletons { .addAttributesExtractor( PeerServiceAttributesExtractor.create( VertxRedisClientNetAttributesGetter.INSTANCE, - AgentCommonConfig.get().getPeerServiceResolver())) + PeerServiceResolver.create(GlobalOpenTelemetry.get()))) .addOperationMetrics(DbClientMetrics.get()); INSTRUMENTER = builder.buildInstrumenter(SpanKindExtractor.alwaysClient()); diff --git a/instrumentation/vertx/vertx-sql-client/vertx-sql-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sql/VertxSqlInstrumenterFactory.java b/instrumentation/vertx/vertx-sql-client/vertx-sql-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sql/VertxSqlInstrumenterFactory.java index d21b69444cd3..b59c445ab3b5 100644 --- a/instrumentation/vertx/vertx-sql-client/vertx-sql-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sql/VertxSqlInstrumenterFactory.java +++ b/instrumentation/vertx/vertx-sql-client/vertx-sql-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sql/VertxSqlInstrumenterFactory.java @@ -6,16 +6,17 @@ package io.opentelemetry.javaagent.instrumentation.vertx.sql; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; 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.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; public final class VertxSqlInstrumenterFactory { @@ -30,14 +31,20 @@ public static Instrumenter createInstrumenter( .addAttributesExtractor( SqlClientAttributesExtractor.builder(VertxSqlClientAttributesGetter.INSTANCE) .setStatementSanitizationEnabled( - AgentCommonConfig.get().isStatementSanitizationEnabled()) + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "general", + "db", + "statement_sanitizer", + "enabled") + .orElse(true)) .build()) .addAttributesExtractor( ServerAttributesExtractor.create(VertxSqlClientNetAttributesGetter.INSTANCE)) .addAttributesExtractor( PeerServiceAttributesExtractor.create( VertxSqlClientNetAttributesGetter.INSTANCE, - AgentCommonConfig.get().getPeerServiceResolver())) + PeerServiceResolver.create(GlobalOpenTelemetry.get()))) .addOperationMetrics(DbClientMetrics.get()); return builder.buildInstrumenter(SpanKindExtractor.alwaysClient()); diff --git a/instrumentation/xxl-job/xxl-job-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/xxljob/common/XxlJobInstrumenterFactory.java b/instrumentation/xxl-job/xxl-job-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/xxljob/common/XxlJobInstrumenterFactory.java index 1544504bdac6..202c2eae2172 100644 --- a/instrumentation/xxl-job/xxl-job-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/xxljob/common/XxlJobInstrumenterFactory.java +++ b/instrumentation/xxl-job/xxl-job-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/xxljob/common/XxlJobInstrumenterFactory.java @@ -8,17 +8,18 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class XxlJobInstrumenterFactory { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.xxl-job.experimental-span-attributes", false); + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "xxl_job", "experimental_span_attributes") + .orElse(false); public static Instrumenter create(String instrumentationName) { XxlJobCodeAttributesGetter codeAttributesGetter = new XxlJobCodeAttributesGetter(); diff --git a/instrumentation/zio/zio-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/zio/v2_0/ZioIgnoredTypesConfigurer.java b/instrumentation/zio/zio-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/zio/v2_0/ZioIgnoredTypesConfigurer.java index 6aade7c175c4..bcc5c254a91f 100644 --- a/instrumentation/zio/zio-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/zio/v2_0/ZioIgnoredTypesConfigurer.java +++ b/instrumentation/zio/zio-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/zio/v2_0/ZioIgnoredTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class ZioIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // context is propagated using FiberContext builder.ignoreTaskClass("zio.internal.FiberRuntime"); } diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/AgentCommonConfig.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/AgentCommonConfig.java deleted file mode 100644 index e5ee4b396871..000000000000 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/AgentCommonConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.bootstrap.internal; - -import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public class AgentCommonConfig { - private AgentCommonConfig() {} - - private static final CommonConfig instance = new CommonConfig(AgentInstrumentationConfig.get()); - - public static CommonConfig get() { - return instance; - } -} diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/AgentInstrumentationConfig.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/AgentInstrumentationConfig.java deleted file mode 100644 index 081050ef76ac..000000000000 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/AgentInstrumentationConfig.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.bootstrap.internal; - -import static java.util.Objects.requireNonNull; - -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -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. - */ -public class AgentInstrumentationConfig { - private AgentInstrumentationConfig() {} - - private static final Logger logger = Logger.getLogger(AgentInstrumentationConfig.class.getName()); - - private static final InstrumentationConfig DEFAULT = new EmptyInstrumentationConfig(); - - // lazy initialized, so that javaagent can set it - private static volatile InstrumentationConfig instance = DEFAULT; - - /** - * Sets the instrumentation configuration singleton. This method is only supposed to be called - * once, during the agent initialization, just before {@link AgentInstrumentationConfig#get()} is - * used for the first time. - * - *

This method is internal and is hence not for public use. Its API is unstable and can change - * at any time. - */ - public static void internalInitializeConfig(InstrumentationConfig config) { - if (instance != DEFAULT) { - logger.warning("InstrumentationConfig#instance was already set earlier"); - return; - } - instance = requireNonNull(config); - } - - /** Returns the global instrumentation configuration. */ - public static InstrumentationConfig get() { - return instance; - } -} diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder.java index ea7c51ff436f..e2509fc469cd 100644 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder.java +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder.java @@ -7,7 +7,9 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -28,9 +30,9 @@ public static Map getResourceAttributes() { public static void initialize(Attributes resourceAttribute) { List mdcResourceAttributes = - AgentInstrumentationConfig.get() - .getList( - "otel.instrumentation.common.mdc.resource-attributes", Collections.emptyList()); + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "common", "mdc", "resource_attributes") + .orElse(Collections.emptyList()); for (String key : mdcResourceAttributes) { String value = resourceAttribute.get(stringKey(key)); if (value != null) { diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/DeprecatedConfigProperties.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/DeprecatedConfigProperties.java deleted file mode 100644 index d81ccbb96116..000000000000 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/DeprecatedConfigProperties.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.bootstrap.internal; - -import static java.util.Collections.emptyList; -import static java.util.logging.Level.WARNING; - -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import java.util.List; -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. - */ -@SuppressWarnings("unused") // keep around for next time even if not currently used -public final class DeprecatedConfigProperties { - - private static final Logger logger = Logger.getLogger(DeprecatedConfigProperties.class.getName()); - - public static boolean getBoolean( - InstrumentationConfig config, - String deprecatedPropertyName, - String newPropertyName, - boolean defaultValue) { - warnIfUsed(config, deprecatedPropertyName, newPropertyName); - boolean value = config.getBoolean(deprecatedPropertyName, defaultValue); - return config.getBoolean(newPropertyName, value); - } - - public static List getList( - InstrumentationConfig config, String deprecatedPropertyName, String newPropertyName) { - warnIfUsed(config, deprecatedPropertyName, newPropertyName); - List value = config.getList(deprecatedPropertyName, emptyList()); - return config.getList(newPropertyName, value); - } - - private static void warnIfUsed( - InstrumentationConfig config, String deprecatedPropertyName, String newPropertyName) { - if (config.getString(deprecatedPropertyName) != null) { - logger.log( - WARNING, - "Deprecated property \"{0}\" was used; use the \"{1}\" property instead", - new Object[] {deprecatedPropertyName, newPropertyName}); - } - } - - private DeprecatedConfigProperties() {} -} diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/EmptyInstrumentationConfig.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/EmptyInstrumentationConfig.java deleted file mode 100644 index 56cd43580c17..000000000000 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/EmptyInstrumentationConfig.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.bootstrap.internal; - -import io.opentelemetry.api.incubator.config.ConfigProvider; -import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import java.time.Duration; -import java.util.List; -import java.util.Map; -import javax.annotation.Nullable; - -final class EmptyInstrumentationConfig implements InstrumentationConfig { - - @Nullable - @Override - public String getString(String name) { - return null; - } - - @Override - public String getString(String name, String defaultValue) { - return defaultValue; - } - - @Override - public boolean getBoolean(String name, boolean defaultValue) { - return defaultValue; - } - - @Override - public int getInt(String name, int defaultValue) { - return defaultValue; - } - - @Override - public long getLong(String name, long defaultValue) { - return defaultValue; - } - - @Override - public double getDouble(String name, double defaultValue) { - return defaultValue; - } - - @Override - public Duration getDuration(String name, Duration defaultValue) { - return defaultValue; - } - - @Override - public List getList(String name, List defaultValue) { - return defaultValue; - } - - @Override - public Map getMap(String name, Map defaultValue) { - return defaultValue; - } - - @Override - public boolean isDeclarative() { - return false; - } - - @Override - public DeclarativeConfigProperties getDeclarativeConfig(String node) { - throw new IllegalStateException( - "Declarative configuration is not supported in the empty instrumentation config"); - } - - @Nullable - @Override - public ConfigProvider getConfigProvider() { - return null; - } -} diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ExperimentalConfig.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ExperimentalConfig.java deleted file mode 100644 index 736229de4ecb..000000000000 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ExperimentalConfig.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.bootstrap.internal; - -import static java.util.Collections.emptyList; - -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import java.util.List; - -/** - * 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(AgentInstrumentationConfig.get()); - - private final InstrumentationConfig config; - private final List messagingHeaders; - - /** Returns the global agent configuration. */ - public static ExperimentalConfig get() { - return instance; - } - - public ExperimentalConfig(InstrumentationConfig config) { - this.config = config; - messagingHeaders = - config.getList("otel.instrumentation.messaging.experimental.capture-headers", emptyList()); - } - - public boolean controllerTelemetryEnabled() { - return config.getBoolean( - "otel.instrumentation.common.experimental.controller-telemetry.enabled", false); - } - - public boolean viewTelemetryEnabled() { - return config.getBoolean( - "otel.instrumentation.common.experimental.view-telemetry.enabled", false); - } - - public boolean messagingReceiveInstrumentationEnabled() { - return config.getBoolean( - "otel.instrumentation.messaging.experimental.receive-telemetry.enabled", false); - } - - public boolean indyEnabled() { - return config.getBoolean("otel.javaagent.experimental.indy", false); - } - - public List getMessagingHeaders() { - return messagingHeaders; - } -} diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpClientInstrumenters.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpClientInstrumenters.java index 915ab0fa1a26..f5aefae659b2 100644 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpClientInstrumenters.java +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpClientInstrumenters.java @@ -57,7 +57,7 @@ private static Instrumenter create( DefaultHttpClientInstrumenterBuilder builder, Consumer> builderCustomizer) { return builder - .configure(AgentCommonConfig.get()) + .configure(GlobalOpenTelemetry.get()) .setBuilderCustomizer(builderCustomizer) .build(); } diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpServerInstrumenters.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpServerInstrumenters.java index b27cefbfa3a0..5219e82a00bf 100644 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpServerInstrumenters.java +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpServerInstrumenters.java @@ -48,7 +48,7 @@ public static Instrumenter create( DefaultHttpServerInstrumenterBuilder builder, Consumer> builderCustomizer) { return builder - .configure(AgentCommonConfig.get()) + .configure(GlobalOpenTelemetry.get()) .setBuilderCustomizer(builderCustomizer) .build(); } diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/ignore/IgnoredTypesConfigurer.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/ignore/IgnoredTypesConfigurer.java index 1f2b20327335..b68a005f0633 100644 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/ignore/IgnoredTypesConfigurer.java +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/ignore/IgnoredTypesConfigurer.java @@ -22,5 +22,16 @@ public interface IgnoredTypesConfigurer extends Ordered { * Configure the passed {@code builder} and define which classes should be ignored when * instrumenting. */ - void configure(IgnoredTypesBuilder builder, ConfigProperties config); + default void configure(IgnoredTypesBuilder builder) { + throw new UnsupportedOperationException(); + } + + /** + * Configure the passed {@code builder} and define which classes should be ignored when + * instrumenting. + * + * @deprecated Use {@link #configure(IgnoredTypesBuilder)} instead. + */ + @Deprecated + default void configure(IgnoredTypesBuilder builder, ConfigProperties config) {} } diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/InstrumentationModule.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/InstrumentationModule.java index e6ee634fe5d9..a0282bd4a454 100644 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/InstrumentationModule.java +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/InstrumentationModule.java @@ -9,7 +9,8 @@ import static java.util.Collections.unmodifiableSet; import static net.bytebuddy.matcher.ElementMatchers.any; -import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.Ordered; import java.util.Collections; @@ -88,6 +89,17 @@ public final String instrumentationName() { * Allows instrumentation modules to disable themselves by default, or to additionally disable * themselves on some other condition. */ + public boolean defaultEnabled() { + throw new UnsupportedOperationException(); + } + + /** + * Allows instrumentation modules to disable themselves by default, or to additionally disable + * themselves on some other condition. + * + * @deprecated Use {@link #defaultEnabled()} instead. + */ + @Deprecated public boolean defaultEnabled(ConfigProperties config) { return config.getBoolean("otel.instrumentation.common.default-enabled", true); } @@ -156,12 +168,14 @@ public List getAdditionalHelperClassNames() { return Collections.emptyList(); } - // InstrumentationModule is loaded before ExperimentalConfig is initialized private static class IndyConfigurationHolder { private static final boolean indyEnabled; static { - indyEnabled = ExperimentalConfig.get().indyEnabled(); + indyEnabled = + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "agent", "indy/development") + .orElse(false); if (indyEnabled) { logger.info("Enabled indy for instrumentation modules"); } diff --git a/javaagent-tooling/src/jmh/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesMatcherBenchmark.java b/javaagent-tooling/src/jmh/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesMatcherBenchmark.java index 73e7d7ea5e0f..03ed1bbcd35f 100644 --- a/javaagent-tooling/src/jmh/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesMatcherBenchmark.java +++ b/javaagent-tooling/src/jmh/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesMatcherBenchmark.java @@ -5,7 +5,6 @@ package io.opentelemetry.javaagent.tooling.ignore; -import io.opentelemetry.javaagent.tooling.EmptyConfigProperties; import java.util.concurrent.TimeUnit; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -33,8 +32,7 @@ public class IgnoredTypesMatcherBenchmark { static { IgnoredTypesBuilderImpl builder = new IgnoredTypesBuilderImpl(); - new AdditionalLibraryIgnoredTypesConfigurer() - .configure(builder, EmptyConfigProperties.INSTANCE); + new AdditionalLibraryIgnoredTypesConfigurer().configure(builder); ignoredTypesMatcher = new IgnoredTypesMatcher(builder.buildIgnoredTypesTrie()); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentExtension.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentExtension.java index 556c1bbfdf2d..bc01858612b9 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentExtension.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentExtension.java @@ -26,7 +26,22 @@ public interface AgentExtension extends Ordered { * @return The customized agent. Note that this method MUST return a non-null {@link AgentBuilder} * instance that contains all customizations defined in this extension. */ - AgentBuilder extend(AgentBuilder agentBuilder, ConfigProperties config); + default AgentBuilder extend(AgentBuilder agentBuilder) { + throw new UnsupportedOperationException( + "This method is not implemented. Please override this method."); + } + + /** + * Extend the passed {@code agentBuilder} with custom logic (e.g. instrumentation). + * + * @return The customized agent. Note that this method MUST return a non-null {@link AgentBuilder} + * instance that contains all customizations defined in this extension. + * @deprecated Use {@link #extend(AgentBuilder)} instead. + */ + @Deprecated + default AgentBuilder extend(AgentBuilder agentBuilder, ConfigProperties config) { + return extend(agentBuilder); + } /** * Returns the name of the extension. It does not have to be unique, but it should be diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java index 769908d7f2a8..bb8cddaa7ebc 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java @@ -9,15 +9,16 @@ import static io.opentelemetry.javaagent.tooling.SafeServiceLoader.load; import static io.opentelemetry.javaagent.tooling.SafeServiceLoader.loadOrdered; import static io.opentelemetry.javaagent.tooling.Utils.getResourceName; -import static java.util.Arrays.asList; import static java.util.logging.Level.FINE; import static java.util.logging.Level.SEVERE; import static net.bytebuddy.matcher.ElementMatchers.any; import static net.bytebuddy.matcher.ElementMatchers.none; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; import io.opentelemetry.context.ContextStorage; import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties; import io.opentelemetry.javaagent.bootstrap.AgentClassLoader; import io.opentelemetry.javaagent.bootstrap.BootstrapPackagePrefixesHolder; @@ -28,7 +29,6 @@ import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizer; import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder; import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseMutator; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.bootstrap.internal.sqlcommenter.SqlCommenterCustomizer; import io.opentelemetry.javaagent.bootstrap.internal.sqlcommenter.SqlCommenterCustomizerHolder; @@ -38,8 +38,8 @@ import io.opentelemetry.javaagent.tooling.asyncannotationsupport.WeakRefAsyncOperationEndStrategies; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesBuilderImpl; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesConfigurer; -import io.opentelemetry.javaagent.tooling.config.ConfigPropertiesBridge; import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; +import io.opentelemetry.javaagent.tooling.config.RuntimeConfigProperties; import io.opentelemetry.javaagent.tooling.field.FieldBackedImplementationConfiguration; import io.opentelemetry.javaagent.tooling.field.VirtualFieldImplementationInstaller; import io.opentelemetry.javaagent.tooling.field.VirtualFieldImplementationInstallerFactory; @@ -50,8 +50,6 @@ import io.opentelemetry.javaagent.tooling.util.Trie; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.SdkAutoconfigureAccess; -import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.util.ArrayList; @@ -83,13 +81,6 @@ public class AgentInstaller { static final String JAVAAGENT_ENABLED_CONFIG = "otel.javaagent.enabled"; - // This property may be set to force synchronous AgentListener#afterAgent() execution: the - // condition for delaying the AgentListener initialization is pretty broad and in case it covers - // too much javaagent users can file a bug, force sync execution by setting this property to true - // and continue using the javaagent - private static final String FORCE_SYNCHRONOUS_AGENT_LISTENERS_CONFIG = - "otel.javaagent.experimental.force-synchronous-agent-listeners"; - private static final String STRICT_CONTEXT_STRESSOR_MILLIS = "otel.javaagent.testing.strict-context-stressor-millis"; @@ -166,13 +157,10 @@ private static void installBytebuddyAgent( AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = installOpenTelemetrySdk(extensionClassLoader, earlyConfig); - ConfigProperties sdkConfig = AutoConfigureUtil.getConfig(autoConfiguredSdk); - AgentInstrumentationConfig.internalInitializeConfig( - new ConfigPropertiesBridge( - sdkConfig, AutoConfigureUtil.getConfigProvider(autoConfiguredSdk))); - copyNecessaryConfigToSystemProperties(sdkConfig); + // TODO remove this method when library instrumentation reads it from declarative configuration + copyNecessaryConfigToSystemProperties(); - setBootstrapPackages(sdkConfig, extensionClassLoader); + setBootstrapPackages(extensionClassLoader); ConfiguredResourceAttributesHolder.initialize( SdkAutoconfigureAccess.getResource(autoConfiguredSdk).getAttributes()); @@ -182,7 +170,7 @@ private static void installBytebuddyAgent( } agentBuilder = agentBuilder.with(new ClassLoadListener()); - agentBuilder = configureIgnoredTypes(sdkConfig, extensionClassLoader, agentBuilder); + agentBuilder = configureIgnoredTypes(extensionClassLoader, agentBuilder); int numberOfLoadedExtensions = 0; for (AgentExtension agentExtension : loadOrdered(AgentExtension.class, extensionClassLoader)) { @@ -193,7 +181,15 @@ private static void installBytebuddyAgent( new Object[] {agentExtension.extensionName(), agentExtension.getClass().getName()}); } try { - agentBuilder = agentExtension.extend(agentBuilder, sdkConfig); + try { + agentBuilder = agentExtension.extend(agentBuilder); + } catch (UnsupportedOperationException e) { + // fall back to the deprecated method + @SuppressWarnings("deprecation") + AgentBuilder extended = + agentExtension.extend(agentBuilder, RuntimeConfigProperties.get()); + agentBuilder = extended; + } numberOfLoadedExtensions++; } catch (Exception | LinkageError e) { logger.log( @@ -225,7 +221,7 @@ private static void installBytebuddyAgent( addHttpServerResponseCustomizers(extensionClassLoader); addSqlCommenterCustomizers(extensionClassLoader); - runAfterAgentListeners(agentListeners, autoConfiguredSdk, sdkConfig); + runAfterAgentListeners(agentListeners, autoConfiguredSdk); } private static AgentBuilder newAgentBuilder(ByteBuddy byteBuddy) { @@ -283,21 +279,31 @@ private static void installEarlyInstrumentation( agentBuilder.installOn(instrumentation); } - private static void copyNecessaryConfigToSystemProperties(ConfigProperties config) { - for (String property : asList("otel.instrumentation.experimental.span-suppression-strategy")) { - String value = config.getString(property); - if (value != null) { - System.setProperty(property, value); - } - } + // TODO remove this method when library instrumentation reads it from declarative configuration + private static void copyNecessaryConfigToSystemProperties() { + DeclarativeConfigUtil.getString( + GlobalOpenTelemetry.get(), + "java", + // TODO add "common" here + "span_suppression_strategy/experimental") + .ifPresent( + value -> + System.setProperty( + "otel.instrumentation.experimental.span-suppression-strategy", value)); } - private static void setBootstrapPackages( - ConfigProperties config, ClassLoader extensionClassLoader) { + // Need to call deprecated API for backward compatibility with extensions that haven't migrated + @SuppressWarnings("deprecation") + private static void setBootstrapPackages(ClassLoader extensionClassLoader) { BootstrapPackagesBuilderImpl builder = new BootstrapPackagesBuilderImpl(); for (BootstrapPackagesConfigurer configurer : load(BootstrapPackagesConfigurer.class, extensionClassLoader)) { - configurer.configure(builder, config); + try { + configurer.configure(builder); + } catch (UnsupportedOperationException e) { + // fall back to the deprecated method + configurer.configure(builder, RuntimeConfigProperties.get()); + } } BootstrapPackagePrefixesHolder.setBoostrapPackagePrefixes(builder.build()); } @@ -306,12 +312,19 @@ private static void setDefineClassHandler() { DefineClassHelper.internalSetHandler(DefineClassHandler.INSTANCE); } + // Need to call deprecated API for backward compatibility with extensions that haven't migrated + @SuppressWarnings("deprecation") private static AgentBuilder configureIgnoredTypes( - ConfigProperties config, ClassLoader extensionClassLoader, AgentBuilder agentBuilder) { + ClassLoader extensionClassLoader, AgentBuilder agentBuilder) { IgnoredTypesBuilderImpl builder = new IgnoredTypesBuilderImpl(); for (IgnoredTypesConfigurer configurer : loadOrdered(IgnoredTypesConfigurer.class, extensionClassLoader)) { - configurer.configure(builder, config); + try { + configurer.configure(builder); + } catch (UnsupportedOperationException e) { + // fall back to the deprecated method + configurer.configure(builder, RuntimeConfigProperties.get()); + } } Trie ignoredTasksTrie = builder.buildIgnoredTasksTrie(); @@ -356,9 +369,7 @@ private static void addSqlCommenterCustomizers(ClassLoader extensionClassLoader) } private static void runAfterAgentListeners( - Iterable agentListeners, - AutoConfiguredOpenTelemetrySdk autoConfiguredSdk, - ConfigProperties sdkConfigProperties) { + Iterable agentListeners, AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) { // java.util.logging.LogManager maintains a final static LogManager, which is created during // class initialization. Some AgentListener implementations may use JRE bootstrap classes // which touch this class (e.g. JFR classes or some MBeans). @@ -376,7 +387,12 @@ private static void runAfterAgentListeners( // the application is already setting the global LogManager and AgentListener won't be able // to touch it due to class loader locking. boolean shouldForceSynchronousAgentListenersCalls = - sdkConfigProperties.getBoolean(FORCE_SYNCHRONOUS_AGENT_LISTENERS_CONFIG, false); + DeclarativeConfigUtil.getBoolean( + autoConfiguredSdk.getOpenTelemetrySdk(), + "java", + "agent", + "force_synchronous_agent_listeners/experimental") + .orElse(false); boolean javaBefore9 = isJavaBefore9(); if (!shouldForceSynchronousAgentListenersCalls && javaBefore9 && isAppUsingCustomLogManager()) { logger.fine("Custom JUL LogManager detected: delaying AgentListener#afterAgent() calls"); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java index 4f4009038a6b..63d7574b7667 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java @@ -12,7 +12,6 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.instrumentation.thread.internal.AddThreadDetailsSpanProcessor; -import io.opentelemetry.javaagent.tooling.config.AgentConfig; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @@ -48,7 +47,8 @@ private static SdkTracerProviderBuilder configure( private static void maybeEnableLoggingExporter( SdkTracerProviderBuilder builder, ConfigProperties config) { - if (AgentConfig.isDebugModeEnabled(config)) { + boolean debugModeEnabled = config.getBoolean("otel.javaagent.debug", false); + if (debugModeEnabled) { // don't install another instance if the user has already explicitly requested it. if (loggingExporterIsNotAlreadyConfigured(config)) { builder.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())); diff --git a/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridge.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/DeclarativeConfigPropertiesBridge.java similarity index 99% rename from declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridge.java rename to javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/DeclarativeConfigPropertiesBridge.java index 0421148323e6..b0779c04ab7b 100644 --- a/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridge.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/DeclarativeConfigPropertiesBridge.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.config.bridge; +package io.opentelemetry.javaagent.tooling; import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; diff --git a/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridgeBuilder.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/DeclarativeConfigPropertiesBridgeBuilder.java similarity index 55% rename from declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridgeBuilder.java rename to javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/DeclarativeConfigPropertiesBridgeBuilder.java index 3c70dc8b6100..b320fc595ee9 100644 --- a/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridgeBuilder.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/DeclarativeConfigPropertiesBridgeBuilder.java @@ -3,15 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.config.bridge; +package io.opentelemetry.javaagent.tooling; import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.api.incubator.config.ConfigProvider; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.HashMap; import java.util.LinkedHashMap; @@ -22,7 +19,7 @@ * A builder for {@link DeclarativeConfigPropertiesBridge} that allows adding translations and fixed * values for properties. */ -public class DeclarativeConfigPropertiesBridgeBuilder { +class DeclarativeConfigPropertiesBridgeBuilder { /** * order is important here, so we use LinkedHashMap - see {@link #addMapping(String, String)} for * more details @@ -31,7 +28,7 @@ public class DeclarativeConfigPropertiesBridgeBuilder { private final Map overrideValues = new HashMap<>(); - public DeclarativeConfigPropertiesBridgeBuilder() {} + DeclarativeConfigPropertiesBridgeBuilder() {} /** * Adds a mapping from a property prefix to a YAML path. @@ -44,8 +41,7 @@ public DeclarativeConfigPropertiesBridgeBuilder() {} * @param yamlPath the YAML path to resolve the property against */ @CanIgnoreReturnValue - public DeclarativeConfigPropertiesBridgeBuilder addMapping( - String propertyPrefix, String yamlPath) { + DeclarativeConfigPropertiesBridgeBuilder addMapping(String propertyPrefix, String yamlPath) { mappings.put(propertyPrefix, yamlPath); return this; } @@ -57,39 +53,11 @@ public DeclarativeConfigPropertiesBridgeBuilder addMapping( * @param value the value to return when the property is requested */ @CanIgnoreReturnValue - public DeclarativeConfigPropertiesBridgeBuilder addOverride(String propertyName, Object value) { + DeclarativeConfigPropertiesBridgeBuilder addOverride(String propertyName, Object value) { overrideValues.put(propertyName, value); return this; } - /** Build {@link ConfigProperties} from the {@code autoConfiguredOpenTelemetrySdk}. */ - public ConfigProperties build(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { - ConfigProperties sdkConfigProperties = - AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk); - if (sdkConfigProperties != null) { - return sdkConfigProperties; - } - ConfigProvider configProvider = - AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk); - if (configProvider != null) { - return buildFromInstrumentationConfig(configProvider.getInstrumentationConfig()); - } - // Should never happen - throw new IllegalStateException( - "AutoConfiguredOpenTelemetrySdk does not have ConfigProperties or DeclarativeConfigProperties. This is likely a programming error in opentelemetry-java"); - } - - /** - * Build {@link ConfigProperties} from the provided {@link DeclarativeConfigProperties} node. - * - * @param node the declarative config properties to build from - * @return a new instance of {@link ConfigProperties} - */ - public ConfigProperties build(@Nullable DeclarativeConfigProperties node) { - return new DeclarativeConfigPropertiesBridge( - node == null ? empty() : node, mappings, overrideValues); - } - /** * Build {@link ConfigProperties} from the {@link DeclarativeConfigProperties} provided by the * instrumentation configuration. @@ -100,9 +68,11 @@ public ConfigProperties build(@Nullable DeclarativeConfigProperties node) { * @param instrumentationConfig the instrumentation configuration to build from * @return a new instance of {@link ConfigProperties} */ - public ConfigProperties buildFromInstrumentationConfig( + ConfigProperties buildFromInstrumentationConfig( @Nullable DeclarativeConfigProperties instrumentationConfig) { - return build( - instrumentationConfig == null ? null : instrumentationConfig.getStructured("java")); + DeclarativeConfigProperties javaConfig = + instrumentationConfig == null ? null : instrumentationConfig.getStructured("java"); + return new DeclarativeConfigPropertiesBridge( + javaConfig == null ? empty() : javaConfig, mappings, overrideValues); } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtendedOpenTelemetrySdkWrapper.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtendedOpenTelemetrySdkWrapper.java new file mode 100644 index 000000000000..602fc0e01ae5 --- /dev/null +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtendedOpenTelemetrySdkWrapper.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.tooling; + +import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; +import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.sdk.OpenTelemetrySdk; + +/** + * Wrapper around {@link OpenTelemetrySdk} that implements {@link ExtendedOpenTelemetry} and + * provides a {@link ConfigProvider} even when the underlying SDK doesn't have one. + * + *

This is used when the user configured with system properties (not YAML), so we create a + * ConfigProvider backed by the final ConfigProperties. This allows instrumentations to always use + * {@code ExtendedOpenTelemetry.getConfigProvider()} regardless of how the SDK was configured. + */ +public final class ExtendedOpenTelemetrySdkWrapper extends OpenTelemetrySdk + implements ExtendedOpenTelemetry { + + private final ConfigProvider configProvider; + + public ExtendedOpenTelemetrySdkWrapper(OpenTelemetrySdk delegate, ConfigProvider configProvider) { + super( + delegate.getSdkTracerProvider(), + delegate.getSdkMeterProvider(), + delegate.getSdkLoggerProvider(), + delegate.getPropagators()); + this.configProvider = configProvider; + } + + @Override + public ConfigProvider getConfigProvider() { + return configProvider; + } +} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java index ff7147ef44bb..711ef97bfb12 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java @@ -7,11 +7,13 @@ import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.incubator.config.ConfigProvider; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.instrumentation.config.bridge.DeclarativeConfigPropertiesBridgeBuilder; +import io.opentelemetry.instrumentation.config.bridge.ConfigPropertiesBackedConfigProvider; import io.opentelemetry.javaagent.bootstrap.OpenTelemetrySdkAccess; import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; +import io.opentelemetry.javaagent.tooling.config.RuntimeConfigProperties; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.SdkAutoconfigureAccess; @@ -34,26 +36,36 @@ public static AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk( AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = AutoConfiguredOpenTelemetrySdk.builder() - .setResultAsGlobal() + // Don't use setResultAsGlobal() - we need to wrap the SDK before setting as global .setServiceClassLoader(extensionClassLoader) .build(); ConfigProvider configProvider = AutoConfigureUtil.getConfigProvider(autoConfiguredSdk); OpenTelemetrySdk sdk = autoConfiguredSdk.getOpenTelemetrySdk(); + ConfigProperties configProperties = AutoConfigureUtil.getConfig(autoConfiguredSdk); + if (configProvider == null && configProperties != null) { + // Provide a fake declarative configuration based on config properties + // so that declarative configuration APIs can be used everywhere + configProvider = ConfigPropertiesBackedConfigProvider.create(configProperties); + sdk = new ExtendedOpenTelemetrySdkWrapper(sdk, configProvider); + } else if (configProperties == null && configProvider != null) { + // Declarative configuration was used, but we still need a ConfigProperties + // instance for some deprecated agent extension APIs + configProperties = getDeclarativeConfigBridgedProperties(earlyConfig, configProvider); + } else { + throw new IllegalStateException( + "Exactly one of configProvider or configProperties must be non-null"); + } setForceFlush(sdk); + GlobalOpenTelemetry.set(sdk); + // we still need a ConfigProperties instance for some deprecated agent extension APIs + RuntimeConfigProperties.set(configProperties); - if (configProvider != null) { - // We create a new instance of AutoConfiguredOpenTelemetrySdk, which has a ConfigProperties - // instance that can be used to read properties from the configuration file. - // This allows most instrumentations to be unaware of which configuration style is used. - return SdkAutoconfigureAccess.create( - sdk, - SdkAutoconfigureAccess.getResource(autoConfiguredSdk), - getDeclarativeConfigBridgedProperties(earlyConfig, configProvider), - configProvider); - } - - return autoConfiguredSdk; + return SdkAutoconfigureAccess.create( + sdk, + SdkAutoconfigureAccess.getResource(autoConfiguredSdk), + configProperties, + configProvider); } // Visible for testing @@ -61,6 +73,7 @@ static ConfigProperties getDeclarativeConfigBridgedProperties( EarlyInitAgentConfig earlyConfig, ConfigProvider configProvider) { return new DeclarativeConfigPropertiesBridgeBuilder() .addMapping("otel.javaagent", "agent") + .addMapping("otel.jmx", "otel.instrumentation.jmx") .addOverride("otel.instrumentation.common.default-enabled", defaultEnabled(configProvider)) // these properties are used to initialize the SDK before the configuration file // is loaded for consistency, we pass them to the bridge, so that they can be read diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bootstrap/BootstrapPackagesConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bootstrap/BootstrapPackagesConfigurer.java index 30d0e56a9a8c..0f1cf9cad19b 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bootstrap/BootstrapPackagesConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bootstrap/BootstrapPackagesConfigurer.java @@ -24,5 +24,19 @@ public interface BootstrapPackagesConfigurer { * Configure the passed {@code builder} and define which classes should always be loaded by the * bootstrap class loader. */ - void configure(BootstrapPackagesBuilder builder, ConfigProperties config); + default void configure(BootstrapPackagesBuilder builder) { + throw new UnsupportedOperationException( + "This method is not implemented. Please override this method."); + } + + /** + * Configure the passed {@code builder} and define which classes should always be loaded by the + * bootstrap class loader. + * + * @deprecated Use {@link #configure(BootstrapPackagesBuilder)} instead. + */ + @Deprecated + default void configure(BootstrapPackagesBuilder builder, ConfigProperties config) { + configure(builder); + } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/AgentConfig.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/AgentConfig.java deleted file mode 100644 index 66ac96401612..000000000000 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/AgentConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.tooling.config; - -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; - -public final class AgentConfig { - - public static boolean isInstrumentationEnabled( - ConfigProperties config, Iterable instrumentationNames, boolean defaultEnabled) { - for (String name : instrumentationNames) { - String propertyName = "otel.instrumentation." + name + ".enabled"; - Boolean enabled = config.getBoolean(propertyName); - if (enabled != null) { - return enabled; - } - } - return defaultEnabled; - } - - public static boolean isDebugModeEnabled(ConfigProperties config) { - return config.getBoolean("otel.javaagent.debug", false); - } - - private AgentConfig() {} -} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigPropertiesBridge.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigPropertiesBridge.java deleted file mode 100644 index 5c7fe70d9f1d..000000000000 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigPropertiesBridge.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.tooling.config; - -import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; -import static java.util.Objects.requireNonNull; - -import io.opentelemetry.api.incubator.config.ConfigProvider; -import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; -import java.time.Duration; -import java.util.List; -import java.util.Map; -import javax.annotation.Nullable; - -public final class ConfigPropertiesBridge implements InstrumentationConfig { - - private final ConfigProperties configProperties; - @Nullable private final ConfigProvider configProvider; - - public ConfigPropertiesBridge( - ConfigProperties configProperties, @Nullable ConfigProvider configProvider) { - this.configProperties = configProperties; - this.configProvider = configProvider; - } - - @Nullable - @Override - public String getString(String name) { - try { - return configProperties.getString(name); - } catch (ConfigurationException ignored) { - return null; - } - } - - @Override - public String getString(String name, String defaultValue) { - try { - return configProperties.getString(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public boolean getBoolean(String name, boolean defaultValue) { - try { - return configProperties.getBoolean(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public int getInt(String name, int defaultValue) { - try { - return configProperties.getInt(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public long getLong(String name, long defaultValue) { - try { - return configProperties.getLong(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public double getDouble(String name, double defaultValue) { - try { - return configProperties.getDouble(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public Duration getDuration(String name, Duration defaultValue) { - try { - return configProperties.getDuration(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public List getList(String name, List defaultValue) { - try { - return configProperties.getList(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public Map getMap(String name, Map defaultValue) { - try { - return configProperties.getMap(name, defaultValue); - } catch (ConfigurationException ignored) { - return defaultValue; - } - } - - @Override - public boolean isDeclarative() { - return configProvider != null; - } - - @Override - public DeclarativeConfigProperties getDeclarativeConfig(String node) { - DeclarativeConfigProperties config = - InstrumentationConfigUtil.javaInstrumentationConfig(requireNonNull(configProvider), node); - if (config == null) { - // there is no declarative config for this node - return empty(); - } - return config; - } - - @Nullable - @Override - public ConfigProvider getConfigProvider() { - return configProvider; - } -} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/RuntimeConfigProperties.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/RuntimeConfigProperties.java new file mode 100644 index 000000000000..47ab86297933 --- /dev/null +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/RuntimeConfigProperties.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.tooling.config; + +import io.opentelemetry.javaagent.tooling.EmptyConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import javax.annotation.Nullable; + +public final class RuntimeConfigProperties { + + @Nullable private static volatile ConfigProperties instance = EmptyConfigProperties.INSTANCE; + + public static void set(ConfigProperties configProperties) { + instance = configProperties; + } + + @Nullable + public static ConfigProperties get() { + return instance; + } + + private RuntimeConfigProperties() {} +} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/AdditionalLibraryIgnoredTypesConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/AdditionalLibraryIgnoredTypesConfigurer.java index 1244902a486e..33fa3a6fde9d 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/AdditionalLibraryIgnoredTypesConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/AdditionalLibraryIgnoredTypesConfigurer.java @@ -6,9 +6,10 @@ package io.opentelemetry.javaagent.tooling.ignore; import com.google.auto.service.AutoService; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; /** * Additional global ignore settings that are used to reduce number of classes we try to apply @@ -21,21 +22,27 @@ @AutoService(IgnoredTypesConfigurer.class) public class AdditionalLibraryIgnoredTypesConfigurer implements IgnoredTypesConfigurer { - // We set this system property when running the agent with unit tests to allow verifying that we - // don't ignore libraries that we actually attempt to instrument. It means either the list is - // wrong or a type matcher is. - private static final String ADDITIONAL_LIBRARY_IGNORES_ENABLED = - "otel.javaagent.testing.additional-library-ignores.enabled"; - @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { - if (config.getBoolean(ADDITIONAL_LIBRARY_IGNORES_ENABLED, true)) { - configure(builder); + public void configure(IgnoredTypesBuilder builder) { + // We set this system property when running the agent with unit tests to allow verifying that we + // don't ignore libraries that we actually attempt to instrument. It means either the list is + // wrong or a type matcher is. + boolean enabled = + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), + "java", + "agent", + "testing", + "additional_library_ignores", + "enabled") + .orElse(true); + if (enabled) { + configureIgnores(builder); } } // only used by tests (to bypass the ignores check) - public void configure(IgnoredTypesBuilder builder) { + public void configureIgnores(IgnoredTypesBuilder builder) { builder .ignoreClass("com.beust.jcommander.") .ignoreClass("com.fasterxml.classmate.") diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/CommonLibraryIgnoredTypesConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/CommonLibraryIgnoredTypesConfigurer.java index 1bcacdf2b816..29c8424b1d14 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/CommonLibraryIgnoredTypesConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/CommonLibraryIgnoredTypesConfigurer.java @@ -8,7 +8,6 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; /** * Unlike the {@link AdditionalLibraryIgnoredTypesConfigurer}, this one is applied to all tests. It @@ -19,7 +18,7 @@ public class CommonLibraryIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { builder.ignoreClass("org.springframework.boot.autoconfigure.ssl.FileWatcher$WatcherThread"); } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java index e67909490ee2..f7dfa1e4d65d 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java @@ -11,13 +11,12 @@ import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; import io.opentelemetry.javaagent.tooling.ExtensionClassLoader; import io.opentelemetry.javaagent.tooling.instrumentation.indy.InstrumentationModuleClassLoader; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class GlobalIgnoredTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { configureIgnoredTypes(builder); configureIgnoredClassLoaders(builder); configureIgnoredTasks(builder); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassLoadersConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassLoadersConfigurer.java index d2d386ca4f7e..60be6ea03f68 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassLoadersConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassLoadersConfigurer.java @@ -8,20 +8,26 @@ import static java.util.Collections.emptyList; import com.google.auto.service.AutoService; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @AutoService(IgnoredTypesConfigurer.class) public class UserExcludedClassLoadersConfigurer implements IgnoredTypesConfigurer { - // visible for tests - static final String EXCLUDED_CLASS_LOADERS_CONFIG = "otel.javaagent.exclude-class-loaders"; - @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { - List excludedClassLoaders = config.getList(EXCLUDED_CLASS_LOADERS_CONFIG, emptyList()); + public void configure(IgnoredTypesBuilder builder) { + List excludedClassLoaders = + DeclarativeConfigUtil.getList( + GlobalOpenTelemetry.get(), "java", "agent", "exclude_class_loaders") + .orElse(emptyList()); + configureInternal(builder, excludedClassLoaders); + } + + // Visible for testing + void configureInternal(IgnoredTypesBuilder builder, List excludedClassLoaders) { for (String excludedClassLoader : excludedClassLoaders) { excludedClassLoader = excludedClassLoader.trim(); // remove the trailing * diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassesConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassesConfigurer.java index 44a240545b16..85401795349a 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassesConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassesConfigurer.java @@ -8,20 +8,25 @@ import static java.util.Collections.emptyList; import com.google.auto.service.AutoService; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @AutoService(IgnoredTypesConfigurer.class) public class UserExcludedClassesConfigurer implements IgnoredTypesConfigurer { - // visible for tests - static final String EXCLUDED_CLASSES_CONFIG = "otel.javaagent.exclude-classes"; - @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { - List excludedClasses = config.getList(EXCLUDED_CLASSES_CONFIG, emptyList()); + public void configure(IgnoredTypesBuilder builder) { + List excludedClasses = + DeclarativeConfigUtil.getList(GlobalOpenTelemetry.get(), "java", "agent", "exclude_classes") + .orElse(emptyList()); + configureInternal(builder, excludedClasses); + } + + // Visible for testing + void configureInternal(IgnoredTypesBuilder builder, List excludedClasses) { for (String excludedClass : excludedClasses) { excludedClass = excludedClass.trim(); // remove the trailing * diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationLoader.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationLoader.java index 71d6faf68679..0558669a23bb 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationLoader.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationLoader.java @@ -14,7 +14,6 @@ import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.tooling.AgentExtension; import io.opentelemetry.javaagent.tooling.Utils; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.logging.Logger; import net.bytebuddy.agent.builder.AgentBuilder; @@ -26,7 +25,7 @@ public class InstrumentationLoader implements AgentExtension { new InstrumentationModuleInstaller(InstrumentationHolder.getInstrumentation()); @Override - public AgentBuilder extend(AgentBuilder agentBuilder, ConfigProperties config) { + public AgentBuilder extend(AgentBuilder agentBuilder) { int numberOfLoadedModules = 0; for (InstrumentationModule instrumentationModule : loadOrdered(InstrumentationModule.class, Utils.getExtensionsClassLoader())) { @@ -40,8 +39,7 @@ public AgentBuilder extend(AgentBuilder agentBuilder, ConfigProperties config) { }); } try { - agentBuilder = - instrumentationModuleInstaller.install(instrumentationModule, agentBuilder, config); + agentBuilder = instrumentationModuleInstaller.install(instrumentationModule, agentBuilder); numberOfLoadedModules++; } catch (Exception | LinkageError e) { logger.log( diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java index fbc7b8aad68a..4228233d2ad7 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java @@ -11,6 +11,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.not; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; @@ -21,7 +23,7 @@ import io.opentelemetry.javaagent.tooling.TransformSafeLogger; import io.opentelemetry.javaagent.tooling.Utils; import io.opentelemetry.javaagent.tooling.bytebuddy.LoggingFailSafeMatcher; -import io.opentelemetry.javaagent.tooling.config.AgentConfig; +import io.opentelemetry.javaagent.tooling.config.RuntimeConfigProperties; import io.opentelemetry.javaagent.tooling.field.VirtualFieldImplementationInstaller; import io.opentelemetry.javaagent.tooling.field.VirtualFieldImplementationInstallerFactory; import io.opentelemetry.javaagent.tooling.instrumentation.indy.ClassInjectorImpl; @@ -32,11 +34,11 @@ import io.opentelemetry.javaagent.tooling.muzzle.InstrumentationModuleMuzzle; import io.opentelemetry.javaagent.tooling.util.IgnoreFailedTypeMatcher; import io.opentelemetry.javaagent.tooling.util.NamedMatcher; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.lang.instrument.Instrumentation; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; import net.bytebuddy.agent.builder.AgentBuilder; @@ -63,30 +65,32 @@ public InstrumentationModuleInstaller(Instrumentation instrumentation) { this.instrumentation = instrumentation; } + // Need to call deprecated API for backward compatibility with modules that haven't migrated + @SuppressWarnings("deprecation") AgentBuilder install( - InstrumentationModule instrumentationModule, - AgentBuilder parentAgentBuilder, - ConfigProperties config) { - if (!AgentConfig.isInstrumentationEnabled( - config, - instrumentationModule.instrumentationNames(), - instrumentationModule.defaultEnabled(config))) { + InstrumentationModule instrumentationModule, AgentBuilder parentAgentBuilder) { + boolean defaultEnabled; + try { + defaultEnabled = instrumentationModule.defaultEnabled(); + } catch (UnsupportedOperationException e) { + // fall back to the deprecated method + defaultEnabled = instrumentationModule.defaultEnabled(RuntimeConfigProperties.get()); + } + if (!isInstrumentationEnabled(instrumentationModule.instrumentationNames(), defaultEnabled)) { logger.log( FINE, "Instrumentation {0} is disabled", instrumentationModule.instrumentationName()); return parentAgentBuilder; } if (instrumentationModule.isIndyModule()) { - return installIndyModule(instrumentationModule, parentAgentBuilder, config); + return installIndyModule(instrumentationModule, parentAgentBuilder); } else { - return installInjectingModule(instrumentationModule, parentAgentBuilder, config); + return installInjectingModule(instrumentationModule, parentAgentBuilder); } } private AgentBuilder installIndyModule( - InstrumentationModule instrumentationModule, - AgentBuilder parentAgentBuilder, - ConfigProperties config) { + InstrumentationModule instrumentationModule, AgentBuilder parentAgentBuilder) { List helperClassNames = InstrumentationModuleMuzzle.getHelperClassNames(instrumentationModule); HelperResourceBuilderImpl helperResourceBuilder = new HelperResourceBuilderImpl(); @@ -118,7 +122,7 @@ private AgentBuilder installIndyModule( .injectClasses(injectedClassesCollector); } - MuzzleMatcher muzzleMatcher = new MuzzleMatcher(logger, instrumentationModule, config); + MuzzleMatcher muzzleMatcher = new MuzzleMatcher(logger, instrumentationModule); Function> helperGenerator = cl -> { @@ -170,9 +174,7 @@ private AgentBuilder installIndyModule( } private AgentBuilder installInjectingModule( - InstrumentationModule instrumentationModule, - AgentBuilder parentAgentBuilder, - ConfigProperties config) { + InstrumentationModule instrumentationModule, AgentBuilder parentAgentBuilder) { List helperClassNames = InstrumentationModuleMuzzle.getHelperClassNames(instrumentationModule); HelperResourceBuilderImpl helperResourceBuilder = new HelperResourceBuilderImpl(); @@ -189,7 +191,7 @@ private AgentBuilder installInjectingModule( return parentAgentBuilder; } - MuzzleMatcher muzzleMatcher = new MuzzleMatcher(logger, instrumentationModule, config); + MuzzleMatcher muzzleMatcher = new MuzzleMatcher(logger, instrumentationModule); AgentBuilder.Transformer helperInjector = new HelperInjector( instrumentationModule.instrumentationName(), @@ -272,4 +274,16 @@ private static AgentBuilder.Identified.Narrowable setTypeMatcher( (typeDescription, classLoader, module, classBeingRedefined, protectionDomain) -> classLoader == null || NOT_DECORATOR_MATCHER.matches(typeDescription)); } + + private static boolean isInstrumentationEnabled( + Iterable instrumentationNames, boolean defaultEnabled) { + for (String name : instrumentationNames) { + Optional enabled = + DeclarativeConfigUtil.getBoolean(GlobalOpenTelemetry.get(), "java", name, "enabled"); + if (enabled.isPresent()) { + return enabled.get(); + } + } + return defaultEnabled; + } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java index fd9f84924e5f..8b299abab7c7 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java @@ -9,16 +9,16 @@ import static java.util.logging.Level.WARNING; import static net.bytebuddy.dynamic.loading.ClassLoadingStrategy.BOOTSTRAP_LOADER; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.internal.cache.Cache; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TransformSafeLogger; import io.opentelemetry.javaagent.tooling.Utils; -import io.opentelemetry.javaagent.tooling.config.AgentConfig; import io.opentelemetry.javaagent.tooling.instrumentation.indy.IndyModuleRegistry; import io.opentelemetry.javaagent.tooling.instrumentation.indy.InstrumentationModuleClassLoader; import io.opentelemetry.javaagent.tooling.muzzle.Mismatch; import io.opentelemetry.javaagent.tooling.muzzle.ReferenceMatcher; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.security.ProtectionDomain; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -45,12 +45,13 @@ class MuzzleMatcher implements AgentBuilder.RawMatcher { private volatile ReferenceMatcher referenceMatcher; MuzzleMatcher( - TransformSafeLogger instrumentationLogger, - InstrumentationModule instrumentationModule, - ConfigProperties config) { + TransformSafeLogger instrumentationLogger, InstrumentationModule instrumentationModule) { this.instrumentationLogger = instrumentationLogger; this.instrumentationModule = instrumentationModule; - this.muzzleLogLevel = AgentConfig.isDebugModeEnabled(config) ? WARNING : FINE; + boolean debugMode = + DeclarativeConfigUtil.getBoolean(GlobalOpenTelemetry.get(), "java", "agent", "debug") + .orElse(false); + this.muzzleLogLevel = debugMode ? WARNING : FINE; } @Override diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/http/RegexUrlTemplateCustomizerInitializer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/http/RegexUrlTemplateCustomizerInitializer.java index 7b592c9d0b84..4bd1f5208e9a 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/http/RegexUrlTemplateCustomizerInitializer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/http/RegexUrlTemplateCustomizerInitializer.java @@ -5,14 +5,13 @@ package io.opentelemetry.javaagent.tooling.instrumentation.http; -import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; import static java.util.Collections.emptyList; import static java.util.logging.Level.WARNING; import com.google.auto.service.AutoService; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.javaagent.tooling.BeforeAgentListener; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import java.util.logging.Logger; @@ -26,15 +25,18 @@ public final class RegexUrlTemplateCustomizerInitializer implements BeforeAgentL @Override public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { - InstrumentationConfig config = AgentInstrumentationConfig.get(); // url template is emitted only when http client experimental telemetry is enabled boolean urlTemplateEnabled = - config.getBoolean("otel.instrumentation.http.client.emit-experimental-telemetry", false); - if (!urlTemplateEnabled || !config.isDeclarative()) { + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "http", "client", "emit_experimental_telemetry") + .orElse(false); + if (!urlTemplateEnabled) { return; } DeclarativeConfigProperties configuration = - config.getDeclarativeConfig("http").getStructured("client", empty()); + DeclarativeConfigUtil.getStructuredConfig( + GlobalOpenTelemetry.get(), "java", "http", "client") + .orElse(DeclarativeConfigProperties.empty()); configuration .getStructuredList("url_template_rules", emptyList()) .forEach( diff --git a/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridgeTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/DeclarativeConfigPropertiesBridgeTest.java similarity index 99% rename from declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridgeTest.java rename to javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/DeclarativeConfigPropertiesBridgeTest.java index 29f9d424cd9d..d75b6b512d84 100644 --- a/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/DeclarativeConfigPropertiesBridgeTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/DeclarativeConfigPropertiesBridgeTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.config.bridge; +package io.opentelemetry.javaagent.tooling; import static org.assertj.core.api.Assertions.assertThat; diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/AgentConfigTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/AgentConfigTest.java deleted file mode 100644 index 449fb5911926..000000000000 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/AgentConfigTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.tooling.config; - -import static java.util.Arrays.asList; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import java.util.TreeSet; -import java.util.stream.Stream; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -class AgentConfigTest { - - @ParameterizedTest(name = "isInstrumentationEnabled({0}) = {4}") - @MethodSource("instrumentationEnabledParams") - void testIsInstrumentationEnabled( - @SuppressWarnings("unused") String description, - Boolean firstEnabled, - Boolean secondEnabled, - boolean defaultEnabled, - boolean expected) { - - ConfigProperties config = mock(ConfigProperties.class); - when(config.getBoolean("otel.instrumentation.first.enabled")).thenReturn(firstEnabled); - when(config.getBoolean("otel.instrumentation.second.enabled")).thenReturn(secondEnabled); - - assertEquals( - expected, - AgentConfig.isInstrumentationEnabled( - config, new TreeSet<>(asList("first", "second")), defaultEnabled)); - } - - private static Stream instrumentationEnabledParams() { - return Stream.of( - Arguments.of( - "enabled by default, both instrumentations are off", false, false, true, false), - Arguments.of("enabled by default, first instrumentation is on", true, null, true, true), - Arguments.of("enabled by default, second instrumentation is on", null, true, true, true), - Arguments.of("enabled by default, both instrumentations are on", true, true, true, true), - Arguments.of( - "enabled by default, first instrumentation is off, second is on", - false, - true, - true, - false), - Arguments.of( - "enabled by default, first instrumentation is on, second is off", - true, - false, - true, - true), - Arguments.of("enabled by default", null, null, true, true), - Arguments.of( - "disabled by default, both instrumentations are off", false, false, false, false), - Arguments.of("disabled by default, first instrumentation is on", true, null, false, true), - Arguments.of("disabled by default, second instrumentation is on", null, true, false, true), - Arguments.of("disabled by default, both instrumentation are on", true, true, false, true), - Arguments.of( - "disabled by default, first instrumentation is off, second is on", - false, - true, - false, - false), - Arguments.of( - "disabled by default, first instrumentation is on, second is off", - true, - false, - false, - true), - Arguments.of("disabled by default", null, null, false, false)); - } -} diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigPropertiesBridgeTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigPropertiesBridgeTest.java deleted file mode 100644 index 6adba8deacfd..000000000000 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigPropertiesBridgeTest.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.tooling.config; - -import static java.util.Arrays.asList; -import static java.util.Collections.emptyMap; -import static org.assertj.core.api.Assertions.assertThat; - -import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; -import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ClientModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalGeneralInstrumentationModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalHttpInstrumentationModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalPeerInstrumentationModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.InstrumentationModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ServerModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ServiceMappingModel; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Stream; -import org.assertj.core.api.InstanceOfAssertFactories; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -/** - * common config that is read from declarative config or config properties in a different way - * - *

cannot test CommonConfig in its own module, because there is no implementation of - * InstrumentationConfig in that module - */ -class ConfigPropertiesBridgeTest { - - public static Stream emptyGeneralConfig() { - OpenTelemetryConfigurationModel emptyModel = - new OpenTelemetryConfigurationModel() - .withAdditionalProperty("instrumentation/development", new InstrumentationModel()); - - DefaultConfigProperties configProperties = DefaultConfigProperties.createFromMap(emptyMap()); - - return Stream.of( - Arguments.of("config properties", new ConfigPropertiesBridge(configProperties, null)), - Arguments.of( - "declarative config", - new ConfigPropertiesBridge(configProperties, SdkConfigProvider.create(emptyModel)))); - } - - @ParameterizedTest(name = "{0}") - @MethodSource("emptyGeneralConfig") - void testEmptyGeneralConfig(String name, InstrumentationConfig config) { - CommonConfig commonConfig = new CommonConfig(config); - assertThat(commonConfig.getPeerServiceResolver()).extracting("mapping").isEqualTo(emptyMap()); - assertThat(commonConfig.getClientRequestHeaders()).isEmpty(); - assertThat(commonConfig.getServerRequestHeaders()).isEmpty(); - assertThat(commonConfig.getClientResponseHeaders()).isEmpty(); - assertThat(commonConfig.getServerResponseHeaders()).isEmpty(); - } - - public static Stream fullGeneralConfig() { - InstrumentationModel model = - new InstrumentationModel() - .withGeneral( - new ExperimentalGeneralInstrumentationModel() - .withPeer( - new ExperimentalPeerInstrumentationModel() - .withServiceMapping( - asList( - new ServiceMappingModel() - .withService("cats-service") - .withPeer("1.2.3.4"), - new ServiceMappingModel() - .withService("dogs-api") - .withPeer("dogs-abcdef123.serverlessapis.com")))) - .withHttp( - new ExperimentalHttpInstrumentationModel() - .withClient( - new ClientModel() - .withRequestCapturedHeaders(asList("header1", "header2")) - .withResponseCapturedHeaders(asList("header3", "header4"))) - .withServer( - new ServerModel() - .withRequestCapturedHeaders(asList("header5", "header6")) - .withResponseCapturedHeaders(asList("header7", "header8"))))); - OpenTelemetryConfigurationModel emptyModel = - new OpenTelemetryConfigurationModel() - .withAdditionalProperty("instrumentation/development", model); - - DefaultConfigProperties configProperties = - DefaultConfigProperties.createFromMap(getProperties()); - - return Stream.of( - Arguments.of("config properties", new ConfigPropertiesBridge(configProperties, null)), - Arguments.of( - "declarative config", - new ConfigPropertiesBridge(configProperties, SdkConfigProvider.create(emptyModel)))); - } - - private static Map getProperties() { - Map properties = new HashMap<>(); - properties.put( - "otel.instrumentation.common.peer-service-mapping", - "1.2.3.4=cats-service,dogs-abcdef123.serverlessapis.com=dogs-api"); - properties.put("otel.instrumentation.http.client.capture-request-headers", "header1,header2"); - properties.put("otel.instrumentation.http.client.capture-response-headers", "header3,header4"); - properties.put("otel.instrumentation.http.server.capture-request-headers", "header5,header6"); - properties.put("otel.instrumentation.http.server.capture-response-headers", "header7,header8"); - return properties; - } - - @ParameterizedTest(name = "{0}") - @MethodSource("fullGeneralConfig") - void testFullGeneralConfig(String name, InstrumentationConfig config) { - CommonConfig commonConfig = new CommonConfig(config); - assertThat(commonConfig.getPeerServiceResolver()) - .extracting("mapping", InstanceOfAssertFactories.MAP) - .containsOnlyKeys("1.2.3.4", "dogs-abcdef123.serverlessapis.com"); - assertThat(commonConfig.getClientRequestHeaders()).containsExactly("header1", "header2"); - assertThat(commonConfig.getClientResponseHeaders()).containsExactly("header3", "header4"); - assertThat(commonConfig.getServerRequestHeaders()).containsExactly("header5", "header6"); - assertThat(commonConfig.getServerResponseHeaders()).containsExactly("header7", "header8"); - } -} diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java index 93c4b7574999..cb214d49e977 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java @@ -10,9 +10,10 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; import java.io.IOException; @@ -41,7 +42,7 @@ void setUp() { void fileConfigOverwritesUserPropertiesSupplier(@TempDir Path tempDir) throws IOException { // given Path configFile = tempDir.resolve("test-config.properties"); - Files.write(configFile, singleton("custom.key = 42")); + Files.write(configFile, singleton("otel.instrumentation.custom.key = 42")); System.setProperty(ConfigurationFile.CONFIGURATION_FILE_PROPERTY, configFile.toString()); // when @@ -50,16 +51,42 @@ void fileConfigOverwritesUserPropertiesSupplier(@TempDir Path tempDir) throws IO this.getClass().getClassLoader(), EarlyInitAgentConfig.create()); // then - assertThat(AutoConfigureUtil.getConfig(autoConfiguredSdk).getString("custom.key")) + assertThat( + ((ExtendedOpenTelemetry) autoConfiguredSdk.getOpenTelemetrySdk()) + .getConfigProvider() + .getInstrumentationConfig() + .getStructured("custom", DeclarativeConfigProperties.empty()) + .getString("key")) .isEqualTo("42"); } + // baseline for the test above to make sure UserCustomPropertiesSupplier + // is actually working + @SetSystemProperty(key = "otel.sdk.disabled", value = "true") // don't setup the SDK + @Test + void userPropertiesSupplier(@TempDir Path tempDir) throws IOException { + // when + AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = + OpenTelemetryInstaller.installOpenTelemetrySdk( + this.getClass().getClassLoader(), EarlyInitAgentConfig.create()); + + // then + assertThat( + ((ExtendedOpenTelemetry) autoConfiguredSdk.getOpenTelemetrySdk()) + .getConfigProvider() + .getInstrumentationConfig() + .getStructured("custom", DeclarativeConfigProperties.empty()) + .getString("key")) + .isEqualTo("123"); + } + // SPI used in test public static class UserCustomPropertiesSupplier implements AutoConfigurationCustomizerProvider { @Override public void customize(AutoConfigurationCustomizer autoConfiguration) { - autoConfiguration.addPropertiesSupplier(() -> singletonMap("custom.key", "123")); + autoConfiguration.addPropertiesSupplier( + () -> singletonMap("otel.instrumentation.custom.key", "123")); } } } diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java index cbca89d51548..b037894a9a37 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java @@ -10,7 +10,6 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -35,9 +34,9 @@ void keepUserOtlpProtocolConfiguration() { this.getClass().getClassLoader(), EarlyInitAgentConfig.create()); // then - assertThat( - AutoConfigureUtil.getConfig(autoConfiguredSdk).getString("otel.exporter.otlp.protocol")) - .isEqualTo("grpc"); + assertThat(autoConfiguredSdk.getOpenTelemetrySdk().toString()) + .contains("OtlpGrpc") + .doesNotContain("OtlpHttp"); } @Test @@ -48,8 +47,8 @@ void defaultHttpProtobufOtlpProtocolConfiguration() { this.getClass().getClassLoader(), EarlyInitAgentConfig.create()); // then - assertThat( - AutoConfigureUtil.getConfig(autoConfiguredSdk).getString("otel.exporter.otlp.protocol")) - .isEqualTo("http/protobuf"); + assertThat(autoConfiguredSdk.getOpenTelemetrySdk().toString()) + .contains("OtlpHttp") + .doesNotContain("OtlpGrpc"); } } diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassLoadersConfigurerTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassLoadersConfigurerTest.java index 166b702b98d3..38a9bcca606c 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassLoadersConfigurerTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassLoadersConfigurerTest.java @@ -5,16 +5,12 @@ package io.opentelemetry.javaagent.tooling.ignore; -import static io.opentelemetry.javaagent.tooling.ignore.UserExcludedClassLoadersConfigurer.EXCLUDED_CLASS_LOADERS_CONFIG; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; -import static org.mockito.Mockito.when; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; -import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -23,15 +19,14 @@ @ExtendWith(MockitoExtension.class) class UserExcludedClassLoadersConfigurerTest { - @Mock ConfigProperties config; @Mock IgnoredTypesBuilder builder; - IgnoredTypesConfigurer underTest = new UserExcludedClassLoadersConfigurer(); + UserExcludedClassLoadersConfigurer underTest = new UserExcludedClassLoadersConfigurer(); @Test void shouldAddNothingToBuilderWhenPropertyIsEmpty() { // when - underTest.configure(builder, config); + underTest.configureInternal(builder, emptyList()); // then verifyNoInteractions(builder); @@ -39,13 +34,9 @@ void shouldAddNothingToBuilderWhenPropertyIsEmpty() { @Test void shouldIgnoreClassesAndPackages() { - // given - when(config.getList(EXCLUDED_CLASS_LOADERS_CONFIG, emptyList())) - .thenReturn( - asList("com.example.IgnoredClass", "com.example.ignored.*", "com.another_ignore")); - // when - underTest.configure(builder, config); + underTest.configureInternal( + builder, asList("com.example.IgnoredClass", "com.example.ignored.*", "com.another_ignore")); // then verify(builder).ignoreClassLoader("com.example.IgnoredClass"); diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassesConfigurerTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassesConfigurerTest.java index f67d015cbf4b..095135f97912 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassesConfigurerTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/ignore/UserExcludedClassesConfigurerTest.java @@ -5,16 +5,12 @@ package io.opentelemetry.javaagent.tooling.ignore; -import static io.opentelemetry.javaagent.tooling.ignore.UserExcludedClassesConfigurer.EXCLUDED_CLASSES_CONFIG; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; -import static org.mockito.Mockito.when; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; -import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -23,15 +19,14 @@ @ExtendWith(MockitoExtension.class) class UserExcludedClassesConfigurerTest { - @Mock ConfigProperties config; @Mock IgnoredTypesBuilder builder; - IgnoredTypesConfigurer underTest = new UserExcludedClassesConfigurer(); + UserExcludedClassesConfigurer underTest = new UserExcludedClassesConfigurer(); @Test void shouldAddNothingToBuilderWhenPropertyIsEmpty() { // when - underTest.configure(builder, config); + underTest.configureInternal(builder, emptyList()); // then verifyNoInteractions(builder); @@ -39,13 +34,9 @@ void shouldAddNothingToBuilderWhenPropertyIsEmpty() { @Test void shouldIgnoreClassesAndPackages() { - // given - when(config.getList(EXCLUDED_CLASSES_CONFIG, emptyList())) - .thenReturn( - asList("com.example.IgnoredClass", "com.example.ignored.*", "com.another_ignore")); - // when - underTest.configure(builder, config); + underTest.configureInternal( + builder, asList("com.example.IgnoredClass", "com.example.ignored.*", "com.another_ignore")); // then verify(builder).ignoreClass("com.example.IgnoredClass"); diff --git a/declarative-config-bridge/src/test/resources/config.yaml b/javaagent-tooling/src/test/resources/config.yaml similarity index 100% rename from declarative-config-bridge/src/test/resources/config.yaml rename to javaagent-tooling/src/test/resources/config.yaml diff --git a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentCachingPoolStrategy.java b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentCachingPoolStrategy.java index 560919a31b6b..056df1c194d1 100644 --- a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentCachingPoolStrategy.java +++ b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentCachingPoolStrategy.java @@ -6,10 +6,11 @@ package io.opentelemetry.javaagent.tooling.muzzle; import com.google.errorprone.annotations.CanIgnoreReturnValue; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.internal.cache.Cache; import io.opentelemetry.javaagent.bootstrap.InstrumentationHolder; import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldAccessorMarker; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import java.lang.instrument.Instrumentation; import java.lang.ref.WeakReference; import java.lang.reflect.Method; @@ -52,9 +53,14 @@ public class AgentCachingPoolStrategy implements AgentBuilder.PoolStrategy { // Many things are package visible for testing purposes -- // others to avoid creation of synthetic accessors - private static final boolean REFLECTION_ENABLED = - AgentInstrumentationConfig.get() - .getBoolean("otel.instrumentation.internal-reflection.enabled", true); + // Lazy initialization holder - REFLECTION_ENABLED is read after GlobalOpenTelemetry is set + private static class ReflectionEnabledHolder { + static final boolean REFLECTION_ENABLED = + DeclarativeConfigUtil.getBoolean( + GlobalOpenTelemetry.get(), "java", "internal_reflection", "enabled") + .orElse(true); + } + private static final Method findLoadedClassMethod = getFindLoadedClassMethod(); static final int TYPE_CAPACITY = 64; @@ -626,7 +632,7 @@ public TypeList.Generic getInterfaces() { for (Class interfaceClass : clazz.getInterfaces()) { // virtual field accessors are removed by internal-reflection instrumentation // we do this extra check for tests run with internal-reflection disabled - if (!REFLECTION_ENABLED + if (!ReflectionEnabledHolder.REFLECTION_ENABLED && VirtualFieldAccessorMarker.class.isAssignableFrom(interfaceClass)) { continue; } diff --git a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/IgnoredTestTypesConfigurer.java b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/IgnoredTestTypesConfigurer.java index 7947ea0112e4..452e788900ef 100644 --- a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/IgnoredTestTypesConfigurer.java +++ b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/IgnoredTestTypesConfigurer.java @@ -8,13 +8,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class IgnoredTestTypesConfigurer implements IgnoredTypesConfigurer { @Override - public void configure(IgnoredTypesBuilder builder, ConfigProperties config) { + public void configure(IgnoredTypesBuilder builder) { // we don't want to instrument auto-generated mocks builder .ignoreClass("org.mockito") diff --git a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentExtension.java b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentExtension.java index 39955c92d012..f2a7463df333 100644 --- a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentExtension.java +++ b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentExtension.java @@ -7,14 +7,13 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.tooling.AgentExtension; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(AgentExtension.class) public class TestAgentExtension implements AgentExtension { @Override - public AgentBuilder extend(AgentBuilder agentBuilder, ConfigProperties config) { + public AgentBuilder extend(AgentBuilder agentBuilder) { return agentBuilder.with(TestAgentListener.INSTANCE); } diff --git a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentListener.java b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentListener.java index 12a799a1d000..c99e53a5a52c 100644 --- a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentListener.java +++ b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentListener.java @@ -59,7 +59,15 @@ private static Trie buildOtherConfiguredIgnores() { || configurer instanceof GlobalIgnoredTypesConfigurer) { continue; } - configurer.configure(builder, EmptyConfigProperties.INSTANCE); + try { + configurer.configure(builder); + } catch (UnsupportedOperationException e) { + // fall back to the deprecated method for backwards compatibility with old extensions + @SuppressWarnings("deprecation") + Runnable callDeprecated = + () -> configurer.configure(builder, EmptyConfigProperties.INSTANCE); + callDeprecated.run(); + } } return builder.buildIgnoredTypesTrie(); } diff --git a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/instrumentation/DenyUnsafeInstrumentationModule.java b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/instrumentation/DenyUnsafeInstrumentationModule.java index aedaf9f164f5..cf32a67e0c68 100644 --- a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/instrumentation/DenyUnsafeInstrumentationModule.java +++ b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/instrumentation/DenyUnsafeInstrumentationModule.java @@ -10,7 +10,6 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; /** @@ -34,7 +33,7 @@ public List typeInstrumentations() { } @Override - public boolean defaultEnabled(ConfigProperties config) { + public boolean defaultEnabled() { // using a system property here will enable the instrumentation when declarative config is used return Boolean.getBoolean("otel.instrumentation.deny-unsafe.enabled"); }