Skip to content

Commit 402d305

Browse files
committed
stack trace span processor
1 parent 63d7c8c commit 402d305

File tree

6 files changed

+67
-41
lines changed

6 files changed

+67
-41
lines changed

baggage-processor/src/main/java/io/opentelemetry/contrib/baggage/processor/BaggageLogRecordProcessor.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,17 @@ public class BaggageLogRecordProcessor implements LogRecordProcessor {
2323
* created log record.
2424
*/
2525
public static BaggageLogRecordProcessor allowAllBaggageKeys() {
26-
return new BaggageLogRecordProcessor(baggageKey -> true, false);
26+
return new BaggageLogRecordProcessor(baggageKey -> true);
2727
}
2828

2929
private final Predicate<String> baggageKeyPredicate;
30-
private boolean empty;
3130

3231
/**
3332
* Creates a new {@link BaggageLogRecordProcessor} that copies only baggage entries with keys that
3433
* pass the provided filter into the newly created log record.
3534
*/
3635
public BaggageLogRecordProcessor(Predicate<String> baggageKeyPredicate) {
37-
this(baggageKeyPredicate, false); // we don't know if the predicate matches any keys
38-
}
39-
40-
BaggageLogRecordProcessor(Predicate<String> baggageKeyPredicate, boolean empty) {
4136
this.baggageKeyPredicate = baggageKeyPredicate;
42-
this.empty = empty;
4337
}
4438

4539
@Override
@@ -52,8 +46,4 @@ public void onEmit(Context context, ReadWriteLogRecord logRecord) {
5246
}
5347
});
5448
}
55-
56-
boolean isEmpty() {
57-
return empty;
58-
}
5949
}

baggage-processor/src/main/java/io/opentelemetry/contrib/baggage/processor/BaggageProcessorCustomizer.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,43 +35,50 @@ public void customize(AutoConfigurationCustomizer autoConfigurationCustomizer) {
3535

3636
private static void addSpanProcessor(
3737
SdkTracerProviderBuilder sdkTracerProviderBuilder, ConfigProperties config) {
38-
BaggageSpanProcessor processor = createBaggageSpanProcessor(config);
39-
if (processor.isEmpty()) {
38+
if (spanKeys(config).isEmpty()) {
4039
return;
4140
}
42-
sdkTracerProviderBuilder.addSpanProcessor(processor);
41+
42+
sdkTracerProviderBuilder.addSpanProcessor(createBaggageSpanProcessor(config));
4343
}
4444

4545
static BaggageSpanProcessor createBaggageSpanProcessor(ConfigProperties config) {
46-
return createBaggageSpanProcessor(config.getList(SPAN_PREFIX + "copy-from-baggage.include"));
46+
return createBaggageSpanProcessor(spanKeys(config));
47+
}
48+
49+
static List<String> spanKeys(ConfigProperties config) {
50+
return config.getList(SPAN_PREFIX + "copy-from-baggage.include");
4751
}
4852

4953
static BaggageSpanProcessor createBaggageSpanProcessor(List<String> keys) {
5054
if (matchAll(keys)) {
5155
return BaggageSpanProcessor.allowAllBaggageKeys();
5256
}
53-
return new BaggageSpanProcessor(keys::contains, keys.isEmpty());
57+
return new BaggageSpanProcessor(keys::contains);
5458
}
5559

5660
private static void addLogRecordProcessor(
5761
SdkLoggerProviderBuilder sdkLoggerProviderBuilder, ConfigProperties config) {
58-
BaggageLogRecordProcessor processor = createBaggageLogRecordProcessor(config);
59-
if (processor.isEmpty()) {
62+
if (logKeys(config).isEmpty()) {
6063
return;
6164
}
62-
sdkLoggerProviderBuilder.addLogRecordProcessor(processor);
65+
66+
sdkLoggerProviderBuilder.addLogRecordProcessor(createBaggageLogRecordProcessor(config));
6367
}
6468

6569
static BaggageLogRecordProcessor createBaggageLogRecordProcessor(ConfigProperties config) {
66-
return createBaggageLogRecordProcessor(
67-
config.getList(LOG_PREFIX + "copy-from-baggage.include"));
70+
return createBaggageLogRecordProcessor(logKeys(config));
71+
}
72+
73+
static List<String> logKeys(ConfigProperties config) {
74+
return config.getList(LOG_PREFIX + "copy-from-baggage.include");
6875
}
6976

7077
static BaggageLogRecordProcessor createBaggageLogRecordProcessor(List<String> keys) {
7178
if (matchAll(keys)) {
7279
return BaggageLogRecordProcessor.allowAllBaggageKeys();
7380
}
74-
return new BaggageLogRecordProcessor(keys::contains, keys.isEmpty());
81+
return new BaggageLogRecordProcessor(keys::contains);
7582
}
7683

7784
private static boolean matchAll(List<String> keys) {

baggage-processor/src/main/java/io/opentelemetry/contrib/baggage/processor/BaggageSpanProcessor.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,21 @@
1818
*/
1919
public class BaggageSpanProcessor implements SpanProcessor {
2020
private final Predicate<String> baggageKeyPredicate;
21-
private boolean empty;
2221

2322
/**
2423
* Creates a new {@link BaggageSpanProcessor} that copies only baggage entries with keys that pass
2524
* the provided filter into the newly created {@link io.opentelemetry.api.trace.Span}.
2625
*/
2726
public BaggageSpanProcessor(Predicate<String> baggageKeyPredicate) {
28-
this(baggageKeyPredicate, false); // we don't know if the predicate matches any keys
29-
}
30-
31-
BaggageSpanProcessor(Predicate<String> baggageKeyPredicate, boolean empty) {
3227
this.baggageKeyPredicate = baggageKeyPredicate;
33-
this.empty = empty;
3428
}
3529

3630
/**
3731
* Creates a new {@link BaggageSpanProcessor} that copies all baggage entries into the newly
3832
* created {@link io.opentelemetry.api.trace.Span}.
3933
*/
4034
public static BaggageSpanProcessor allowAllBaggageKeys() {
41-
return new BaggageSpanProcessor(baggageKey -> true, false);
35+
return new BaggageSpanProcessor(baggageKey -> true);
4236
}
4337

4438
@Override
@@ -64,8 +58,4 @@ public void onEnd(ReadableSpan span) {}
6458
public boolean isEndRequired() {
6559
return false;
6660
}
67-
68-
boolean isEmpty() {
69-
return empty;
70-
}
7161
}

span-stacktrace/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ description = "OpenTelemetry Java span stacktrace capture module"
77
otelJava.moduleName.set("io.opentelemetry.contrib.stacktrace")
88

99
dependencies {
10+
implementation(project(":declarative-config-bridge"))
11+
1012
annotationProcessor("com.google.auto.service:auto-service")
1113
compileOnly("com.google.auto.service:auto-service-annotations")
1214

@@ -15,8 +17,10 @@ dependencies {
1517

1618
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
1719
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
20+
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-incubator")
1821
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
1922
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
23+
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator")
2024

2125
compileOnly("io.opentelemetry.semconv:opentelemetry-semconv")
2226
testImplementation("io.opentelemetry.semconv:opentelemetry-semconv")

span-stacktrace/src/main/java/io/opentelemetry/contrib/stacktrace/StackTraceAutoConfig.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,26 @@ public class StackTraceAutoConfig implements AutoConfigurationCustomizerProvider
2323

2424
private static final Logger log = Logger.getLogger(StackTraceAutoConfig.class.getName());
2525

26-
private static final String CONFIG_MIN_DURATION =
27-
"otel.java.experimental.span-stacktrace.min.duration";
26+
static final String PREFIX = "otel.java.experimental.span-stacktrace.";
27+
private static final String CONFIG_MIN_DURATION = PREFIX + "min.duration";
2828
private static final Duration CONFIG_MIN_DURATION_DEFAULT = Duration.ofMillis(5);
29-
30-
private static final String CONFIG_FILTER = "otel.java.experimental.span-stacktrace.filter";
29+
private static final String CONFIG_FILTER = PREFIX + "filter";
3130

3231
@Override
3332
public void customize(AutoConfigurationCustomizer config) {
3433
config.addTracerProviderCustomizer(
3534
(providerBuilder, properties) -> {
36-
long minDuration = getMinDuration(properties);
37-
if (minDuration >= 0) {
38-
Predicate<ReadableSpan> filter = getFilterPredicate(properties);
39-
providerBuilder.addSpanProcessor(new StackTraceSpanProcessor(minDuration, filter));
35+
if (getMinDuration(properties) >= 0) {
36+
providerBuilder.addSpanProcessor(create(properties));
4037
}
4138
return providerBuilder;
4239
});
4340
}
4441

42+
static StackTraceSpanProcessor create(ConfigProperties properties) {
43+
return new StackTraceSpanProcessor(getMinDuration(properties), getFilterPredicate(properties));
44+
}
45+
4546
// package-private for testing
4647
static long getMinDuration(ConfigProperties properties) {
4748
long minDuration =
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.contrib.stacktrace;
7+
8+
import com.google.auto.service.AutoService;
9+
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
10+
import io.opentelemetry.contrib.sdk.autoconfigure.ConfigPropertiesUtil;
11+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
12+
import io.opentelemetry.sdk.trace.SpanProcessor;
13+
import java.util.Collections;
14+
15+
@SuppressWarnings("rawtypes")
16+
@AutoService(ComponentProvider.class)
17+
public class StackTraceComponentProvider implements ComponentProvider<SpanProcessor> {
18+
@Override
19+
public String getName() {
20+
return "stacktrace";
21+
}
22+
23+
@Override
24+
public SpanProcessor create(DeclarativeConfigProperties config) {
25+
return StackTraceAutoConfig.create(
26+
ConfigPropertiesUtil.resolveConfig(
27+
config, Collections.singletonMap(StackTraceAutoConfig.PREFIX, "")));
28+
}
29+
30+
@Override
31+
public Class<SpanProcessor> getType() {
32+
return SpanProcessor.class;
33+
}
34+
}

0 commit comments

Comments
 (0)