Skip to content

Commit a0ec06b

Browse files
authored
make edot sampler default instead of forcing it on (#841)
* Make edot sampler default but not forced * Fix * Warn when dynamic sampler wasn't initialized * Check actual sampler in agent listener * Fix * Cleanup
1 parent 983537d commit a0ec06b

File tree

4 files changed

+42
-2
lines changed

4 files changed

+42
-2
lines changed

custom/src/main/java/co/elastic/otel/ElasticAutoConfigurationCustomizerProvider.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
*/
1919
package co.elastic.otel;
2020

21-
import co.elastic.otel.compositesampling.DynamicCompositeParentBasedTraceIdRatioBasedSampler;
2221
import co.elastic.otel.config.ConfigLoggingAgentListener;
2322
import co.elastic.otel.dynamicconfig.BlockableLogRecordExporter;
2423
import co.elastic.otel.dynamicconfig.BlockableMetricExporter;
@@ -46,6 +45,7 @@ public class ElasticAutoConfigurationCustomizerProvider
4645
"otel.instrumentation.runtime-telemetry.emit-experimental-telemetry";
4746
private static final String METRIC_TEMPORALITY_PREFERENCE =
4847
"otel.exporter.otlp.metrics.temporality.preference";
48+
private static final String TRACES_SAMPLER = "otel.traces.sampler";
4949

5050
// must match value in io.opentelemetry.contrib.stacktrace.StackTraceAutoConfig
5151
private static final String STACKTRACE_OTEL_FILTER =
@@ -93,7 +93,6 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) {
9393
(providerBuilder, properties) -> {
9494
CentralConfig.init(providerBuilder, properties);
9595
AgentLog.addSpanLoggingIfRequired(providerBuilder, properties);
96-
providerBuilder.setSampler(DynamicCompositeParentBasedTraceIdRatioBasedSampler.INSTANCE);
9796
return providerBuilder;
9897
});
9998
}
@@ -105,6 +104,7 @@ static Map<String, String> propertiesCustomizer(ConfigProperties configPropertie
105104
deltaMetricsTemporality(config, configProperties);
106105
resourceProviders(config, configProperties);
107106
spanStackTrace(config, configProperties);
107+
defaultSampler(config, configProperties);
108108
ConfigLoggingAgentListener.logTheConfig(
109109
configProperties.getBoolean(ConfigLoggingAgentListener.LOG_THE_CONFIG, true));
110110

@@ -151,6 +151,15 @@ private static void resourceProviders(
151151
config.put(DISABLED_RESOURCE_PROVIDERS, String.join(",", disabledResourceProviders));
152152
}
153153

154+
private static void defaultSampler(
155+
Map<String, String> config, ConfigProperties configProperties) {
156+
// enable EDOT default sampler by default if not explicitly disabled
157+
String sampler =
158+
configProperties.getString(
159+
TRACES_SAMPLER, "experimental_composite_parentbased_traceidratio");
160+
config.put(TRACES_SAMPLER, sampler);
161+
}
162+
154163
private static void spanStackTrace(
155164
Map<String, String> config, ConfigProperties configProperties) {
156165

custom/src/main/java/co/elastic/otel/config/ConfigLoggingAgentListener.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package co.elastic.otel.config;
2020

21+
import co.elastic.otel.compositesampling.DynamicCompositeParentBasedTraceIdRatioBasedSampler;
2122
import com.google.auto.service.AutoService;
2223
import io.opentelemetry.javaagent.extension.AgentListener;
2324
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
@@ -27,6 +28,9 @@
2728
public class ConfigLoggingAgentListener implements AgentListener {
2829
public static final String LOG_THE_CONFIG =
2930
"elastic.otel.java.experimental.configuration.logging.enabled";
31+
32+
private static volatile boolean enableDynamicSamplingRate = false;
33+
3034
private static final Logger logger = Logger.getLogger(ConfigLoggingAgentListener.class.getName());
3135

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

42+
public static boolean getEnableDynamicSamplingRate() {
43+
return enableDynamicSamplingRate;
44+
}
45+
3846
@Override
3947
public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
4048
if (logTheConfig) {
4149
logger.info(autoConfiguredOpenTelemetrySdk.toString());
4250
}
51+
if (autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().getSdkTracerProvider().getSampler()
52+
instanceof DynamicCompositeParentBasedTraceIdRatioBasedSampler) {
53+
enableDynamicSamplingRate = true;
54+
}
4355
}
4456

4557
@Override

custom/src/main/java/co/elastic/otel/dynamicconfig/CentralConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package co.elastic.otel.dynamicconfig;
2020

2121
import co.elastic.otel.compositesampling.DynamicCompositeParentBasedTraceIdRatioBasedSampler;
22+
import co.elastic.otel.config.ConfigLoggingAgentListener;
2223
import co.elastic.otel.dynamicconfig.internal.OpampManager;
2324
import co.elastic.otel.logging.AgentLog;
2425
import io.opentelemetry.contrib.inferredspans.InferredSpans;
@@ -329,6 +330,10 @@ public static final class SamplingRate extends ConfigOption {
329330
@Override
330331
void update(String configurationValue, OpampManager opampManager)
331332
throws IllegalArgumentException {
333+
if (!ConfigLoggingAgentListener.getEnableDynamicSamplingRate()) {
334+
logger.warning("ignoring \"sampling_rate\" because non-default sampler in use");
335+
return;
336+
}
332337
DynamicCompositeParentBasedTraceIdRatioBasedSampler.setRatio(
333338
Double.parseDouble(configurationValue));
334339
}

custom/src/test/java/co/elastic/otel/ElasticAutoConfigurationCustomizerProviderTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ void defaultConfiguration() {
5252
.describedAs("runtime experimental metrics must be enabled")
5353
.containsEntry(
5454
"otel.instrumentation.runtime-telemetry.emit-experimental-telemetry", "true");
55+
56+
assertThat(config)
57+
.describedAs("edot default sampler when not set by user")
58+
.containsEntry("otel.traces.sampler", "experimental_composite_parentbased_traceidratio");
5559
}
5660

5761
@Test
@@ -98,6 +102,16 @@ void customizeMetricTemporalityPreference() {
98102
assertThat(value).isEqualTo("LOWMEMORY");
99103
}
100104

105+
@Test
106+
void customizeSampler() {
107+
Map<String, String> userConfig = new HashMap<>();
108+
userConfig.put("otel.traces.sampler", "always_off");
109+
Map<String, String> config =
110+
propertiesCustomizer(DefaultConfigProperties.createFromMap(userConfig));
111+
String value = config.get("otel.traces.sampler");
112+
assertThat(value).isEqualTo("always_off");
113+
}
114+
101115
@Test
102116
void verifyDefaultTemporalityOverriddenToDelta() {
103117
try (OpenTelemetrySdk sdk =

0 commit comments

Comments
 (0)