Skip to content

Commit 862221c

Browse files
authored
Issue #2689: Unsatisfactory behavior of snapshot selector (#2717)
1 parent 3a2210a commit 862221c

32 files changed

Lines changed: 210 additions & 1340 deletions

profiler/src/main/java/com/splunk/opentelemetry/profiler/snapshot/ProbabilisticSnapshotSelector.java

Lines changed: 0 additions & 43 deletions
This file was deleted.

profiler/src/main/java/com/splunk/opentelemetry/profiler/snapshot/SnapshotProfilingConfigurationCustomizerProvider.java

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer;
2626
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
2727
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
28-
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PropagatorModel;
2928
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
3029
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
3130
import java.util.List;
@@ -52,33 +51,12 @@ OpenTelemetryConfigurationModel customizeModel(OpenTelemetryConfigurationModel m
5251
if (snapshotProfiling.isEnabled()) {
5352
initActiveSpansTracking();
5453
initStackTraceSampler(snapshotProfiling);
55-
addSnapshotVolumePropagator(model);
5654
addSpanProcessors(model);
5755
}
5856

5957
return model;
6058
}
6159

62-
private void addSnapshotVolumePropagator(OpenTelemetryConfigurationModel model) {
63-
PropagatorModel propagatorModel = model.getPropagator();
64-
if (propagatorModel == null) {
65-
propagatorModel = new PropagatorModel();
66-
model.withPropagator(propagatorModel);
67-
}
68-
69-
String volumePropagatorName = SnapshotVolumePropagatorComponentProvider.NAME;
70-
String propagators = propagatorModel.getCompositeList();
71-
// Possible propagator duplicates with propagatorModel.getComposite() are resolved by the
72-
// upstream
73-
if (propagators == null || propagators.trim().isEmpty()) {
74-
propagators = volumePropagatorName;
75-
} else {
76-
propagators = String.join(",", propagators, volumePropagatorName);
77-
}
78-
79-
propagatorModel.withCompositeList(propagators);
80-
}
81-
8260
private void initStackTraceSampler(
8361
SnapshotProfilingDeclarativeConfiguration snapshotProfilingConfig) {
8462
StackTraceSamplerInitializer.setupStackTraceSampler(snapshotProfilingConfig);

profiler/src/main/java/com/splunk/opentelemetry/profiler/snapshot/SnapshotProfilingSdkCustomizer.java

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
2525
import java.time.Duration;
2626
import java.util.Collections;
27-
import java.util.LinkedHashSet;
2827
import java.util.Map;
2928
import java.util.Set;
3029
import java.util.function.BiFunction;
@@ -81,7 +80,6 @@ private SnapshotProfilingSdkCustomizer(
8180
@Override
8281
public void customize(AutoConfigurationCustomizer autoConfigurationCustomizer) {
8382
autoConfigurationCustomizer
84-
.addPropertiesCustomizer(autoConfigureSnapshotVolumePropagator())
8583
.addTracerProviderCustomizer(snapshotProfilingSpanProcessor(registry))
8684
.addPropertiesCustomizer(setupStackTraceSampler())
8785
.addPropertiesCustomizer(startTrackingActiveSpans(registry))
@@ -102,39 +100,14 @@ public void customize(AutoConfigurationCustomizer autoConfigurationCustomizer) {
102100
snapshotProfilingSpanProcessor(TraceRegistry registry) {
103101
return (builder, properties) -> {
104102
if (snapshotProfilingEnabled(properties)) {
105-
return builder.addSpanProcessor(new SnapshotProfilingSpanProcessor(registry));
106-
}
107-
return builder;
108-
};
109-
}
103+
double selectionProbability =
104+
new SnapshotProfilingEnvVarsConfiguration(properties).getSnapshotSelectionProbability();
110105

111-
/**
112-
* Attempt to autoconfigure the OpenTelemetry propagators to include the Splunk snapshot volume
113-
* propagator and ensure it runs after the W3C Baggage propagator and ensure that a trace context
114-
* propagator is configured. In addition, take care to retain any propagators explicitly
115-
* configured prior.
116-
*
117-
* <p>The Java agent uses the "otel.propagators" property and the value is assumed to be a comma
118-
* seperated list of propagator names. See <a
119-
* href="https://opentelemetry.io/docs/languages/java/configuration/#properties-general">OpenTelemetry's
120-
* Java Agent Configuration</a> for more details.
121-
*/
122-
private Function<ConfigProperties, Map<String, String>> autoConfigureSnapshotVolumePropagator() {
123-
return properties -> {
124-
if (snapshotProfilingEnabled(properties)) {
125-
Set<String> propagators = new LinkedHashSet<>(properties.getList("otel.propagators"));
126-
if (propagators.contains("none")) {
127-
return Collections.emptyMap();
128-
}
129-
130-
if (includeTraceContextPropagator(propagators)) {
131-
propagators.add("tracecontext");
132-
}
133-
propagators.add("baggage");
134-
propagators.add(SnapshotVolumePropagatorProvider.NAME);
135-
return Collections.singletonMap("otel.propagators", String.join(",", propagators));
106+
return builder.addSpanProcessor(
107+
new SnapshotProfilingSpanProcessor(
108+
registry, new TraceIdBasedSnapshotSelector(selectionProbability)));
136109
}
137-
return Collections.emptyMap();
110+
return builder;
138111
};
139112
}
140113

profiler/src/main/java/com/splunk/opentelemetry/profiler/snapshot/SnapshotProfilingSpanProcessor.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static com.splunk.opentelemetry.profiler.ProfilingSemanticAttributes.SNAPSHOT_PROFILING;
2020

21+
import io.opentelemetry.api.trace.SpanContext;
2122
import io.opentelemetry.context.Context;
2223
import io.opentelemetry.sdk.common.CompletableResultCode;
2324
import io.opentelemetry.sdk.trace.ReadWriteSpan;
@@ -29,19 +30,22 @@
2930
*/
3031
public class SnapshotProfilingSpanProcessor implements SpanProcessor {
3132
private final TraceRegistry registry;
33+
private final SnapshotSelector selector;
3234
private final OrphanedTraceCleaner orphanedTraceCleaner;
3335

34-
SnapshotProfilingSpanProcessor(TraceRegistry registry) {
36+
SnapshotProfilingSpanProcessor(TraceRegistry registry, SnapshotSelector selector) {
3537
this.registry = registry;
38+
this.selector = selector;
3639
this.orphanedTraceCleaner = new OrphanedTraceCleaner(registry);
3740
}
3841

3942
@Override
4043
public void onStart(Context context, ReadWriteSpan span) {
4144
if (isEntry(span)) {
42-
Volume volume = Volume.from(context);
43-
if (volume == Volume.HIGHEST) {
44-
registry.register(span.getSpanContext());
45+
SpanContext spanContext = span.getSpanContext();
46+
boolean selected = selector.select(spanContext);
47+
if (selected) {
48+
registry.register(spanContext);
4549
orphanedTraceCleaner.register(span);
4650
}
4751
}

profiler/src/main/java/com/splunk/opentelemetry/profiler/snapshot/SnapshotProfilingSpanProcessorComponentProvider.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ public String getName() {
4747
@Override
4848
public SnapshotProfilingSpanProcessor create(
4949
DeclarativeConfigProperties declarativeConfigProperties) {
50-
return new SnapshotProfilingSpanProcessor(traceRegistry);
50+
double selectionProbability =
51+
new SnapshotProfilingDeclarativeConfiguration(declarativeConfigProperties)
52+
.getSnapshotSelectionProbability();
53+
return new SnapshotProfilingSpanProcessor(
54+
traceRegistry, new TraceIdBasedSnapshotSelector(selectionProbability));
5155
}
5256
}

profiler/src/main/java/com/splunk/opentelemetry/profiler/snapshot/SnapshotSelector.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,8 @@
1616

1717
package com.splunk.opentelemetry.profiler.snapshot;
1818

19-
import io.opentelemetry.context.Context;
19+
import io.opentelemetry.api.trace.SpanContext;
2020

2121
interface SnapshotSelector {
22-
default SnapshotSelector or(SnapshotSelector other) {
23-
return context -> select(context) || other.select(context);
24-
}
25-
26-
boolean select(Context context);
22+
boolean select(SpanContext context);
2723
}

profiler/src/main/java/com/splunk/opentelemetry/profiler/snapshot/SnapshotVolumePropagator.java

Lines changed: 0 additions & 62 deletions
This file was deleted.

profiler/src/main/java/com/splunk/opentelemetry/profiler/snapshot/SnapshotVolumePropagatorComponentProvider.java

Lines changed: 0 additions & 56 deletions
This file was deleted.

profiler/src/main/java/com/splunk/opentelemetry/profiler/snapshot/SnapshotVolumePropagatorProvider.java

Lines changed: 0 additions & 44 deletions
This file was deleted.

0 commit comments

Comments
 (0)