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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
*/
package co.elastic.otel;

import co.elastic.otel.compositesampling.DynamicCompositeParentBasedTraceIdRatioBasedSampler;
import co.elastic.otel.config.ConfigLoggingAgentListener;
import co.elastic.otel.dynamicconfig.BlockableLogRecordExporter;
import co.elastic.otel.dynamicconfig.BlockableMetricExporter;
Expand Down Expand Up @@ -46,6 +45,7 @@ public class ElasticAutoConfigurationCustomizerProvider
"otel.instrumentation.runtime-telemetry.emit-experimental-telemetry";
private static final String METRIC_TEMPORALITY_PREFERENCE =
"otel.exporter.otlp.metrics.temporality.preference";
private static final String TRACES_SAMPLER = "otel.traces.sampler";

// must match value in io.opentelemetry.contrib.stacktrace.StackTraceAutoConfig
private static final String STACKTRACE_OTEL_FILTER =
Expand Down Expand Up @@ -93,7 +93,6 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) {
(providerBuilder, properties) -> {
CentralConfig.init(providerBuilder, properties);
AgentLog.addSpanLoggingIfRequired(providerBuilder, properties);
providerBuilder.setSampler(DynamicCompositeParentBasedTraceIdRatioBasedSampler.INSTANCE);
return providerBuilder;
});
}
Expand All @@ -105,6 +104,7 @@ static Map<String, String> propertiesCustomizer(ConfigProperties configPropertie
deltaMetricsTemporality(config, configProperties);
resourceProviders(config, configProperties);
spanStackTrace(config, configProperties);
defaultSampler(config, configProperties);
ConfigLoggingAgentListener.logTheConfig(
configProperties.getBoolean(ConfigLoggingAgentListener.LOG_THE_CONFIG, true));

Expand Down Expand Up @@ -151,6 +151,15 @@ private static void resourceProviders(
config.put(DISABLED_RESOURCE_PROVIDERS, String.join(",", disabledResourceProviders));
}

private static void defaultSampler(
Map<String, String> config, ConfigProperties configProperties) {
// enable EDOT default sampler by default if not explicitly disabled
String sampler =
configProperties.getString(
TRACES_SAMPLER, "experimental_composite_parentbased_traceidratio");
config.put(TRACES_SAMPLER, sampler);
}

private static void spanStackTrace(
Map<String, String> config, ConfigProperties configProperties) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package co.elastic.otel.config;

import co.elastic.otel.compositesampling.DynamicCompositeParentBasedTraceIdRatioBasedSampler;
import com.google.auto.service.AutoService;
import io.opentelemetry.javaagent.extension.AgentListener;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
Expand All @@ -27,6 +28,9 @@
public class ConfigLoggingAgentListener implements AgentListener {
public static final String LOG_THE_CONFIG =
"elastic.otel.java.experimental.configuration.logging.enabled";

private static volatile boolean enableDynamicSamplingRate = false;

private static final Logger logger = Logger.getLogger(ConfigLoggingAgentListener.class.getName());

private static boolean logTheConfig = true;
Expand All @@ -35,11 +39,19 @@ public static synchronized void logTheConfig(boolean logTheConfig) {
ConfigLoggingAgentListener.logTheConfig = logTheConfig;
}

public static boolean getEnableDynamicSamplingRate() {
return enableDynamicSamplingRate;
}

@Override
public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
if (logTheConfig) {
logger.info(autoConfiguredOpenTelemetrySdk.toString());
}
if (autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().getSdkTracerProvider().getSampler()
instanceof DynamicCompositeParentBasedTraceIdRatioBasedSampler) {
enableDynamicSamplingRate = true;
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package co.elastic.otel.dynamicconfig;

import co.elastic.otel.compositesampling.DynamicCompositeParentBasedTraceIdRatioBasedSampler;
import co.elastic.otel.config.ConfigLoggingAgentListener;
import co.elastic.otel.dynamicconfig.internal.OpampManager;
import co.elastic.otel.logging.AgentLog;
import io.opentelemetry.contrib.inferredspans.InferredSpans;
Expand Down Expand Up @@ -311,6 +312,10 @@ public static final class SamplingRate extends ConfigOption {
@Override
void update(String configurationValue, OpampManager opampManager)
throws IllegalArgumentException {
if (!ConfigLoggingAgentListener.getEnableDynamicSamplingRate()) {
logger.warning("ignoring \"sampling_rate\" because non-default sampler in use");
return;
}
DynamicCompositeParentBasedTraceIdRatioBasedSampler.setRatio(
Double.parseDouble(configurationValue));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ void defaultConfiguration() {
.describedAs("runtime experimental metrics must be enabled")
.containsEntry(
"otel.instrumentation.runtime-telemetry.emit-experimental-telemetry", "true");

assertThat(config)
.describedAs("edot default sampler when not set by user")
.containsEntry("otel.traces.sampler", "experimental_composite_parentbased_traceidratio");
}

@Test
Expand Down Expand Up @@ -98,6 +102,16 @@ void customizeMetricTemporalityPreference() {
assertThat(value).isEqualTo("LOWMEMORY");
}

@Test
void customizeSampler() {
Map<String, String> userConfig = new HashMap<>();
userConfig.put("otel.traces.sampler", "always_off");
Map<String, String> config =
propertiesCustomizer(DefaultConfigProperties.createFromMap(userConfig));
String value = config.get("otel.traces.sampler");
assertThat(value).isEqualTo("always_off");
}

@Test
void verifyDefaultTemporalityOverriddenToDelta() {
try (OpenTelemetrySdk sdk =
Expand Down
Loading