Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
1c8e98b
Use declarative configuration API
trask Dec 11, 2025
63559f1
simple examples
trask Dec 11, 2025
211e0f5
method instrumentation (complex)
trask Dec 11, 2025
a390d81
statement-sanitizer
trask Dec 12, 2025
4a6eedd
sqlcommenter
trask Dec 12, 2025
05f6cda
shouldEmitExperimentalHttpClientTelemetry
trask Dec 12, 2025
0362b07
logging
trask Dec 12, 2025
3151a17
known_methods
trask Dec 12, 2025
e231539
enduser
trask Dec 12, 2025
4cf2421
peerservice
trask Dec 12, 2025
af67bb1
httpconfigure
trask Dec 12, 2025
aa1574e
delete
trask Dec 12, 2025
aa770b1
Fix compilation errors: wrap HttpConstants.KNOWN_METHODS in HashSet c…
trask Dec 12, 2025
2c16191
Fix compilation errors after API changes
trask Dec 12, 2025
420bbe3
fix java/general prefix
trask Dec 12, 2025
987e596
category1
trask Dec 12, 2025
b42e1ff
another batch
trask Dec 12, 2025
dea3a2b
another batch
trask Dec 12, 2025
83e4ae8
another batch
trask Dec 12, 2025
f32f0be
compile
trask Dec 12, 2025
4a12565
spotless
trask Dec 12, 2025
cb138f7
up
trask Dec 12, 2025
ebac89d
springbootstarter
trask Dec 12, 2025
4ddab60
runtimetelemetry
trask Dec 12, 2025
3ea3aed
experimental
trask Dec 12, 2025
6317f5b
more
trask Dec 12, 2025
0d8017c
delete
trask Dec 12, 2025
323d6e7
up
trask Dec 12, 2025
5dfd803
up
trask Dec 12, 2025
5596375
Phase 1: Migrate EnduserConfig to use OpenTelemetry instead of Instru…
trask Dec 12, 2025
b57d91b
Phase 2.1: Remove InstrumentationConfig beans from OpenTelemetryAutoC…
trask Dec 12, 2025
6b59db3
Remove unused EnduserConfig class
trask Dec 12, 2025
adae282
InstrumentationConfig
trask Dec 12, 2025
4101a3f
more
trask Dec 12, 2025
fbb8ea0
Remove InstrumentationConfig interface
trask Dec 13, 2025
40c90e2
move
trask Dec 13, 2025
c422561
more
trask Dec 13, 2025
bec56b2
check
trask Dec 13, 2025
5897db9
more
trask Dec 13, 2025
c36373f
fix
trask Dec 13, 2025
7c262ec
remove
trask Dec 13, 2025
5db42a0
rm
trask Dec 13, 2025
d4db4a0
fix
trask Dec 13, 2025
eb27065
more
trask Dec 13, 2025
35f9cdf
fix
trask Dec 13, 2025
d64f9c7
fix
trask Dec 13, 2025
9a7e390
Fix spotless formatting in RegexUrlTemplateCustomizerInitializer
trask Dec 13, 2025
a246de8
Fix markdown lint errors in README and MAPPING
trask Dec 13, 2025
504446f
Fix Netty server experimental telemetry configuration path
trask Dec 13, 2025
3386d57
Fix spotless formatting in spring-boot-autoconfigure
trask Dec 13, 2025
b571c92
simplify spring
trask Dec 13, 2025
0872351
less ConfigProperties
trask Dec 13, 2025
1e8557e
less ConfigProperties
trask Dec 13, 2025
63cd412
less ConfigProperties
trask Dec 13, 2025
a1f14e7
less ConfigProperties
trask Dec 13, 2025
a0c4020
less ConfigProperties
trask Dec 13, 2025
5892d5c
less ConfigProperties
trask Dec 13, 2025
a221e95
spotless
trask Dec 13, 2025
9c67113
Fix compilation errors and formatting issues
trask Dec 13, 2025
2c83ae8
spotless
trask Dec 13, 2025
147d2d9
fix
trask Dec 13, 2025
a647859
up
trask Dec 13, 2025
4595bc8
Fix spotless formatting in TestAgentListener
trask Dec 13, 2025
5668336
Fix GlobalOpenTelemetry.set already called error
trask Dec 13, 2025
658104e
Fix ApplicationLoggerBridge initialization error
trask Dec 13, 2025
793bd1a
fix
trask Dec 13, 2025
eecae1b
fix
trask Dec 13, 2025
5b584ec
fix
trask Dec 14, 2025
0a78f2a
fix
trask Dec 14, 2025
5775c2b
fix
trask Dec 14, 2025
7a4b4f9
fix
trask Dec 14, 2025
e466315
fix
trask Dec 14, 2025
051c6d5
comment
trask Dec 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
113 changes: 113 additions & 0 deletions MAPPING.md
Original file line number Diff line number Diff line change
@@ -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` |
85 changes: 5 additions & 80 deletions declarative-config-bridge/README.md
Original file line number Diff line number Diff line change
@@ -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<SpanProcessor> getType() {
return SpanProcessor.class;
}
}
```
- `ConfigPropertiesBackedConfigProvider`: Creates a `ConfigProvider` backed by `ConfigProperties`
- `ConfigPropertiesBackedDeclarativeConfigProperties`: Adapts `ConfigProperties` to `DeclarativeConfigProperties`
4 changes: 0 additions & 4 deletions declarative-config-bridge/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
Original file line number Diff line number Diff line change
@@ -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}.
*
* <p>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.
*
* <p>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;
}
}
Loading
Loading