Skip to content

Commit 49437a2

Browse files
committed
fix autoconfigured components
1 parent 83ac4c5 commit 49437a2

File tree

5 files changed

+127
-42
lines changed

5 files changed

+127
-42
lines changed

custom/src/main/java/com/splunk/opentelemetry/appd/AppdBonusConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
public final class AppdBonusConstants {
2424
public static final String CONFIG_CISCO_CTX_ENABLED = "cisco.ctx.enabled";
25+
public static final String PROPAGATOR_NAME = "appd-bonus";
2526
public static final String CTX_KEY = "cisco-bonus-ctx";
2627
public static final String CTX_HEADER_ACCT = "cisco-ctx-acct-id";
2728
public static final String CTX_HEADER_APP = "cisco-ctx-app-id";

custom/src/main/java/com/splunk/opentelemetry/appd/AppdBonusCustomizer.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,38 @@
1717
package com.splunk.opentelemetry.appd;
1818

1919
import static com.splunk.opentelemetry.appd.AppdBonusConstants.CONFIG_CISCO_CTX_ENABLED;
20+
import static com.splunk.opentelemetry.appd.AppdBonusConstants.PROPAGATOR_NAME;
2021
import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_NAME;
2122
import static io.opentelemetry.semconv.incubating.DeploymentIncubatingAttributes.DEPLOYMENT_ENVIRONMENT_NAME;
2223

2324
import com.google.auto.service.AutoService;
2425
import com.google.common.annotations.VisibleForTesting;
25-
import io.opentelemetry.context.propagation.TextMapPropagator;
2626
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
2727
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
2828
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
2929
import io.opentelemetry.sdk.extension.incubator.trace.OnStartSpanProcessor;
3030
import io.opentelemetry.sdk.trace.SpanProcessor;
31+
import java.util.ArrayList;
32+
import java.util.Arrays;
33+
import java.util.Collections;
34+
import java.util.HashMap;
35+
import java.util.List;
36+
import java.util.Map;
3137

3238
@AutoService(AutoConfigurationCustomizerProvider.class)
3339
public final class AppdBonusCustomizer implements AutoConfigurationCustomizerProvider {
3440

41+
static final List<String> DEFAULT_PROPAGATORS = Arrays.asList("tracecontext", "baggage");
42+
3543
@Override
3644
public void customize(AutoConfigurationCustomizer customizer) {
37-
customize(customizer, new AppdBonusPropagator());
45+
customize(customizer, AppdBonusPropagator.getInstance());
3846
}
3947

4048
@VisibleForTesting
4149
void customize(AutoConfigurationCustomizer customizer, AppdBonusPropagator propagator) {
50+
customizer.addPropertiesCustomizer(this::customizeProperties);
51+
4252
customizer.addTracerProviderCustomizer(
4353
(builder, config) -> {
4454
if (featureEnabled(config)) {
@@ -53,16 +63,25 @@ void customize(AutoConfigurationCustomizer customizer, AppdBonusPropagator propa
5363
propagator.setServiceName(resource.getAttribute(SERVICE_NAME));
5464
return resource;
5565
});
56-
customizer.addPropagatorCustomizer(
57-
(existing, config) -> {
58-
if (featureEnabled(config)) {
59-
return TextMapPropagator.composite(existing, propagator);
60-
}
61-
return existing;
62-
});
6366
}
6467

6568
private static boolean featureEnabled(ConfigProperties config) {
6669
return config.getBoolean(CONFIG_CISCO_CTX_ENABLED, false);
6770
}
71+
72+
/** Used to add the AppD propagator name to the otel.propagators list if configured. */
73+
private Map<String, String> customizeProperties(ConfigProperties config) {
74+
if (!config.getBoolean(CONFIG_CISCO_CTX_ENABLED, false)) {
75+
return Collections.emptyMap();
76+
}
77+
List<String> existing = config.getList("otel.propagators", DEFAULT_PROPAGATORS);
78+
if (existing.contains(PROPAGATOR_NAME)) {
79+
return Collections.emptyMap();
80+
}
81+
List<String> propagators = new ArrayList<>(existing);
82+
propagators.add(PROPAGATOR_NAME);
83+
Map<String, String> customized = new HashMap<>();
84+
customized.put("otel.propagators", String.join(",", propagators));
85+
return customized;
86+
}
6887
}

custom/src/main/java/com/splunk/opentelemetry/appd/AppdBonusPropagator.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import static com.splunk.opentelemetry.appd.AppdBonusConstants.CTX_HEADER_TIER;
2525
import static com.splunk.opentelemetry.appd.AppdBonusConstants.CTX_KEY;
2626

27+
import com.google.common.annotations.VisibleForTesting;
2728
import io.opentelemetry.context.Context;
2829
import io.opentelemetry.context.ContextKey;
2930
import io.opentelemetry.context.propagation.TextMapGetter;
@@ -36,9 +37,18 @@
3637
final class AppdBonusPropagator implements TextMapPropagator {
3738

3839
public static final ContextKey<AppdBonusContext> CONTEXT_KEY = ContextKey.named(CTX_KEY);
40+
private static final AppdBonusPropagator INSTANCE = new AppdBonusPropagator();
41+
3942
@Nullable private String serviceName;
4043
@Nullable private String environmentName;
4144

45+
@VisibleForTesting
46+
AppdBonusPropagator() {}
47+
48+
static AppdBonusPropagator getInstance() {
49+
return INSTANCE;
50+
}
51+
4252
@Override
4353
public Collection<String> fields() {
4454
return Arrays.asList(
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright Splunk Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.splunk.opentelemetry.appd;
18+
19+
import static com.splunk.opentelemetry.appd.AppdBonusConstants.PROPAGATOR_NAME;
20+
21+
import com.google.auto.service.AutoService;
22+
import io.opentelemetry.context.propagation.TextMapPropagator;
23+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
24+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider;
25+
26+
@AutoService(ConfigurablePropagatorProvider.class)
27+
public class AppdBonusPropagatorProvider implements ConfigurablePropagatorProvider {
28+
29+
@Override
30+
public TextMapPropagator getPropagator(ConfigProperties config) {
31+
return AppdBonusPropagator.getInstance();
32+
}
33+
34+
@Override
35+
public String getName() {
36+
return PROPAGATOR_NAME;
37+
}
38+
}

custom/src/test/java/com/splunk/opentelemetry/appd/AppdBonusCustomizerTest.java

Lines changed: 50 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,32 @@
1616

1717
package com.splunk.opentelemetry.appd;
1818

19+
import static com.splunk.opentelemetry.appd.AppdBonusConstants.APPD_ATTR_ACCT;
20+
import static com.splunk.opentelemetry.appd.AppdBonusConstants.APPD_ATTR_APP;
21+
import static com.splunk.opentelemetry.appd.AppdBonusConstants.APPD_ATTR_BT;
22+
import static com.splunk.opentelemetry.appd.AppdBonusConstants.APPD_ATTR_TIER;
1923
import static com.splunk.opentelemetry.appd.AppdBonusConstants.CONFIG_CISCO_CTX_ENABLED;
24+
import static com.splunk.opentelemetry.appd.AppdBonusCustomizer.DEFAULT_PROPAGATORS;
25+
import static com.splunk.opentelemetry.appd.AppdBonusPropagator.CONTEXT_KEY;
2026
import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_NAME;
2127
import static io.opentelemetry.semconv.incubating.DeploymentIncubatingAttributes.DEPLOYMENT_ENVIRONMENT_NAME;
2228
import static org.assertj.core.api.Assertions.assertThat;
2329
import static org.mockito.ArgumentMatchers.any;
24-
import static org.mockito.ArgumentMatchers.anyString;
2530
import static org.mockito.Mockito.mock;
2631
import static org.mockito.Mockito.never;
2732
import static org.mockito.Mockito.verify;
2833
import static org.mockito.Mockito.when;
2934

3035
import io.opentelemetry.context.Context;
31-
import io.opentelemetry.context.propagation.TextMapPropagator;
3236
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
3337
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
3438
import io.opentelemetry.sdk.resources.Resource;
39+
import io.opentelemetry.sdk.trace.ReadWriteSpan;
40+
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
3541
import io.opentelemetry.sdk.trace.SpanProcessor;
42+
import java.util.Map;
3643
import java.util.function.BiFunction;
44+
import java.util.function.Function;
3745
import org.junit.jupiter.api.Test;
3846
import org.junit.jupiter.api.extension.ExtendWith;
3947
import org.mockito.ArgumentCaptor;
@@ -54,27 +62,30 @@ class AppdBonusCustomizerTest {
5462
void customizeEnabled() {
5563
AppdBonusContext appdContext = new AppdBonusContext("acct123", "app456", "bt123", "tier456");
5664

65+
when(context.get(CONTEXT_KEY)).thenReturn(appdContext);
5766
when(config.getBoolean(CONFIG_CISCO_CTX_ENABLED, false)).thenReturn(true);
67+
when(config.getList("otel.propagators", DEFAULT_PROPAGATORS)).thenReturn(DEFAULT_PROPAGATORS);
5868
when(resource.getAttribute(SERVICE_NAME)).thenReturn("amazingService");
5969
when(resource.getAttribute(DEPLOYMENT_ENVIRONMENT_NAME)).thenReturn("amazingEnv");
6070

6171
AppdBonusCustomizer testClass = new AppdBonusCustomizer();
6272
testClass.customize(customizer, propagator);
6373

64-
ArgumentCaptor<BiFunction<SpanProcessor, ConfigProperties, SpanProcessor>> spcCaptor =
65-
ArgumentCaptor.forClass(BiFunction.class);
66-
verify(customizer).addSpanProcessorCustomizer(spcCaptor.capture());
74+
ArgumentCaptor<Function<ConfigProperties, Map<String, String>>> pcCaptor =
75+
ArgumentCaptor.forClass(Function.class);
76+
verify(customizer).addPropertiesCustomizer(pcCaptor.capture());
6777

6878
ArgumentCaptor<BiFunction<Resource, ConfigProperties, Resource>> rcCaptor =
6979
ArgumentCaptor.forClass(BiFunction.class);
7080
verify(customizer).addResourceCustomizer(rcCaptor.capture());
7181

72-
ArgumentCaptor<BiFunction<TextMapPropagator, ConfigProperties, TextMapPropagator>> pcCaptor =
73-
ArgumentCaptor.forClass(BiFunction.class);
74-
verify(customizer).addPropagatorCustomizer(pcCaptor.capture());
82+
ArgumentCaptor<BiFunction<SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>>
83+
tpcCaptor = ArgumentCaptor.forClass(BiFunction.class);
84+
verify(customizer).addTracerProviderCustomizer(tpcCaptor.capture());
85+
86+
Map<String, String> updatedConfig = pcCaptor.getValue().apply(config);
87+
assertThat(updatedConfig).containsEntry("otel.propagators", "tracecontext,baggage,appd-bonus");
7588

76-
SpanProcessor spanProcessor = spcCaptor.getValue().apply(defaultSpanProcessor, config);
77-
assertThat(spanProcessor).isNotSameAs(defaultSpanProcessor);
7889
defaultSpanProcessor.onStart(mock(), mock());
7990
verify(defaultSpanProcessor).onStart(any(), any());
8091

@@ -83,46 +94,52 @@ void customizeEnabled() {
8394
verify(propagator).setServiceName("amazingService");
8495
verify(propagator).setEnvironmentName("amazingEnv");
8596

86-
TextMapPropagator defaultPropagator = mock();
87-
TextMapPropagator prop = pcCaptor.getValue().apply(defaultPropagator, config);
88-
assertThat(prop).isNotSameAs(defaultPropagator);
89-
prop.extract(context, mock(), mock());
90-
verify(defaultPropagator).extract(any(), any(), any());
91-
verify(propagator).extract(any(), any(), any());
97+
SdkTracerProviderBuilder builder = mock();
98+
tpcCaptor.getValue().apply(builder, config);
99+
ArgumentCaptor<SpanProcessor> spCapture = ArgumentCaptor.forClass(SpanProcessor.class);
100+
verify(builder).addSpanProcessor(spCapture.capture());
101+
ReadWriteSpan span = mock();
102+
spCapture.getValue().onStart(context, span);
103+
verify(span).setAttribute(APPD_ATTR_APP, appdContext.getAppId());
104+
verify(span).setAttribute(APPD_ATTR_ACCT, appdContext.getAccountId());
105+
verify(span).setAttribute(APPD_ATTR_TIER, appdContext.getTierId());
106+
verify(span).setAttribute(APPD_ATTR_BT, appdContext.getBusinessTransactionId());
92107
}
93108

94109
@Test
95110
void customizeNotEnabled() {
96111
when(config.getBoolean(CONFIG_CISCO_CTX_ENABLED, false)).thenReturn(false);
112+
when(resource.getAttribute(SERVICE_NAME)).thenReturn("amazingService");
113+
when(resource.getAttribute(DEPLOYMENT_ENVIRONMENT_NAME)).thenReturn("amazingEnv");
97114

98115
AppdBonusCustomizer testClass = new AppdBonusCustomizer();
99116
testClass.customize(customizer, propagator);
100117

101-
ArgumentCaptor<BiFunction<SpanProcessor, ConfigProperties, SpanProcessor>> spcCaptor =
102-
ArgumentCaptor.forClass(BiFunction.class);
103-
verify(customizer).addSpanProcessorCustomizer(spcCaptor.capture());
118+
ArgumentCaptor<Function<ConfigProperties, Map<String, String>>> pcCaptor =
119+
ArgumentCaptor.forClass(Function.class);
120+
verify(customizer).addPropertiesCustomizer(pcCaptor.capture());
104121

105122
ArgumentCaptor<BiFunction<Resource, ConfigProperties, Resource>> rcCaptor =
106123
ArgumentCaptor.forClass(BiFunction.class);
107124
verify(customizer).addResourceCustomizer(rcCaptor.capture());
108125

109-
ArgumentCaptor<BiFunction<TextMapPropagator, ConfigProperties, TextMapPropagator>> pcCaptor =
110-
ArgumentCaptor.forClass(BiFunction.class);
111-
verify(customizer).addPropagatorCustomizer(pcCaptor.capture());
126+
ArgumentCaptor<BiFunction<SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>>
127+
tpcCaptor = ArgumentCaptor.forClass(BiFunction.class);
128+
verify(customizer).addTracerProviderCustomizer(tpcCaptor.capture());
112129

113-
SpanProcessor spanProcessor = spcCaptor.getValue().apply(defaultSpanProcessor, config);
114-
assertThat(spanProcessor).isSameAs(defaultSpanProcessor);
130+
Map<String, String> updatedConfig = pcCaptor.getValue().apply(config);
131+
assertThat(updatedConfig).isEmpty();
132+
133+
defaultSpanProcessor.onStart(mock(), mock());
134+
verify(defaultSpanProcessor).onStart(any(), any());
115135

116136
Resource res = rcCaptor.getValue().apply(resource, config);
117137
assertThat(res).isSameAs(resource);
118-
verify(propagator, never()).setServiceName(anyString());
119-
verify(propagator, never()).setEnvironmentName(anyString());
120-
121-
TextMapPropagator defaultPropagator = mock();
122-
TextMapPropagator prop = pcCaptor.getValue().apply(defaultPropagator, config);
123-
assertThat(prop).isSameAs(defaultPropagator);
124-
prop.extract(context, mock(), mock());
125-
verify(defaultPropagator).extract(any(), any(), any());
126-
verify(propagator, never()).extract(any(), any(), any());
138+
verify(propagator).setServiceName("amazingService");
139+
verify(propagator).setEnvironmentName("amazingEnv");
140+
141+
SdkTracerProviderBuilder builder = mock();
142+
tpcCaptor.getValue().apply(builder, config);
143+
verify(builder, never()).addSpanProcessor(any());
127144
}
128145
}

0 commit comments

Comments
 (0)