Description
This issue pretends to be an umbrella to steer the implementation of the File Configuration under the Java SDK and related projects.
The file configuration of the SDK has been added to the project in this PR: #5831
This work must follow the guidelines established under the OpenTelemetry specification for the configuration of the SDK defined here: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/configuration/sdk-configuration.md
On the spec, it's mentioned that:
All other configuration mechanisms SHOULD be built on top of this interface.
The programatic interface
The programatic interface in the Java SDK is the properties supplier defined in the AutoConfigureOpenTelemetrySdkBuilder
as Map<String, String>> propertiesSupplier
The file configuration MUST provide a map of properties to this supplier and MUST NOT override the existing auto-configuration interfaces, namely, if a configuration file is provided, it MUST NOT take precedence over the provided programatic configurations, oTelConfigs, in this example:
AutoConfiguredOpenTelemetrySdk.builder()
.setResultAsGlobal()
.disableShutdownHook()
.addPropertiesSupplier(() -> oTelConfigs)
.build().getOpenTelemetrySdk()
Including existing signal builders, providers and customisers.
Config sources
Multiple configuration sources are defined in the spec without a sense of priorities, however, in Java it's common practice to have a hierarchy of configuration sources:
- Microprofile Config spec (used in many containers): https://download.eclipse.org/microprofile/microprofile-config-3.0/microprofile-config-spec-3.0.html#_configsource_ordering
- Spring boot: https://docs.spring.io/spring-boot/docs/3.3.x/reference/html/howto.html#howto.properties-and-configuration
We can see that it's common practice for configurations to be sourced in many different ways and usually the same property can be set in many different sources.
Major java frameworks and cloud based systems in java assume precedence of env. vars. and sys. vars. over other configuration methods. This is a common, accepted and even expected practice.
Configuration collisions and unavailability.
If a source is not able to provide an unambiguous value for a particular configuration value, that configuration will be unavailable in that source. This behaviour must be documented and a default value must be provided. Example:
OTEL_TRACES_EXPORTER=otlp OTEL_EXPORTER_OTLP_ENDPOINT=http://yet-another-endpoint:4318
And the user has this code in the application:
SdkTracerProvider.builder() .addSpanProcessor(BatchSpanProcessor.create(OtlpGrpcSpanExporter.create("http://some-endpoint:4318"))) .addSpanProcessor(BatchSpanProcessor.create(OtlpGrpcSpanExporter.create("http://some-other-endpoint:4318")))
In this case it is not possible to use the env vars to configure 2 different exporters and they will end up with the same address. This must be documented. In the future, if required, support for this could be added by implementing new env. vars.
It should be noted however that frameworks integrating OpenTelemetry could find a solution of their own for this problem.
Configuration source independence
According to the OTel spec, A configuration must not be exclusive of a particular configuration source, namely the file configuration.
Broad support
By principle, libraries are much better off not forcing a specific way of configuration on users, but let those decisions be driven by frameworks - this makes library usage a breeze in the frameworks that integrate with said libraries, but also allows power users to provide arbitrary configuration options if desired.
Providing a file configuration alternative to "Java main()" standalone applications or the Java agent shouldn't interfere with other types of systems.
Maybe some aspects of the file configuration should be part of the Java agent and not the SDK itself.
There are related discussions on this PR: #5912
And these issues:
Activity