Skip to content

Commit 2cb46bd

Browse files
committed
use builder pattern
1 parent d7f21e5 commit 2cb46bd

File tree

9 files changed

+224
-239
lines changed

9 files changed

+224
-239
lines changed

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/internal/ConfigPropertiesUtil.java

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,61 +5,14 @@
55

66
package io.opentelemetry.javaagent.extension.internal;
77

8-
import io.opentelemetry.api.incubator.config.ConfigProvider;
9-
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
10-
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
11-
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
12-
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
13-
import javax.annotation.Nullable;
14-
158
/**
169
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
1710
* any time.
1811
*/
1912
public final class ConfigPropertiesUtil {
2013
private ConfigPropertiesUtil() {}
2114

22-
/** Resolve {@link ConfigProperties} from the {@code autoConfiguredOpenTelemetrySdk}. */
23-
public static ConfigProperties resolveConfigProperties(
24-
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
25-
ConfigProperties sdkConfigProperties =
26-
AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk);
27-
if (sdkConfigProperties != null) {
28-
return sdkConfigProperties;
29-
}
30-
ConfigProvider configProvider =
31-
AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk);
32-
if (configProvider != null) {
33-
return resolveInstrumentationConfig(
34-
configProvider.getInstrumentationConfig(), propertyTranslatorBuilder());
35-
}
36-
// Should never happen
37-
throw new IllegalStateException(
38-
"AutoConfiguredOpenTelemetrySdk does not have ConfigProperties or DeclarativeConfigProperties. This is likely a programming error in opentelemetry-java");
39-
}
40-
41-
public static ConfigProperties resolveInstrumentationConfig(
42-
@Nullable DeclarativeConfigProperties instrumentationConfig) {
43-
return resolveInstrumentationConfig(instrumentationConfig, propertyTranslatorBuilder());
44-
}
45-
46-
public static ConfigProperties resolveInstrumentationConfig(
47-
@Nullable DeclarativeConfigProperties instrumentationConfig,
48-
PropertyTranslatorBuilder builder) {
49-
return DeclarativeConfigPropertiesBridge.fromInstrumentationConfig(
50-
instrumentationConfig, builder.build());
51-
}
52-
53-
public static ConfigProperties resolveConfig(
54-
@Nullable DeclarativeConfigProperties config, PropertyTranslatorBuilder builder) {
55-
return DeclarativeConfigPropertiesBridge.create(config, builder.build());
56-
}
57-
5815
public static String propertyYamlPath(String propertyName) {
5916
return DeclarativeConfigPropertiesBridge.yamlPath(propertyName);
6017
}
61-
62-
public static PropertyTranslatorBuilder propertyTranslatorBuilder() {
63-
return new PropertyTranslatorBuilder();
64-
}
6518
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.extension.internal;
7+
8+
import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty;
9+
10+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
11+
import io.opentelemetry.api.incubator.config.ConfigProvider;
12+
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
13+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
14+
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
15+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
16+
import java.util.LinkedHashMap;
17+
import java.util.Map;
18+
import javax.annotation.Nullable;
19+
20+
/**
21+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
22+
* any time.
23+
*/
24+
@SuppressWarnings("NonApiType")
25+
public class ConfigPropertyTranslator {
26+
// lookup order matters - we choose the first match
27+
private final LinkedHashMap<String, String> translationMap;
28+
private final Map<String, Object> fixedValues;
29+
30+
public static Builder builder() {
31+
return new Builder();
32+
}
33+
34+
ConfigPropertyTranslator(
35+
LinkedHashMap<String, String> translationMap, Map<String, Object> fixedValues) {
36+
this.translationMap = translationMap;
37+
this.fixedValues = fixedValues;
38+
}
39+
40+
String translateProperty(String property) {
41+
for (Map.Entry<String, String> entry : translationMap.entrySet()) {
42+
if (property.startsWith(entry.getKey())) {
43+
return entry.getValue() + property.substring(entry.getKey().length());
44+
}
45+
}
46+
return property;
47+
}
48+
49+
public Object get(String propertyName) {
50+
return fixedValues.get(propertyName);
51+
}
52+
53+
/**
54+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
55+
* any time.
56+
*/
57+
public static class Builder {
58+
private final LinkedHashMap<String, String> translationMap = new LinkedHashMap<>();
59+
private final Map<String, Object> fixedValues = new LinkedHashMap<>();
60+
61+
private Builder() {}
62+
63+
@CanIgnoreReturnValue
64+
public Builder addTranslation(String propertyName, String yamlPath) {
65+
translationMap.put(propertyName, yamlPath);
66+
return this;
67+
}
68+
69+
@CanIgnoreReturnValue
70+
public Builder addFixedValue(String propertyName, Object value) {
71+
fixedValues.put(propertyName, value);
72+
return this;
73+
}
74+
75+
/** Resolve {@link ConfigProperties} from the {@code autoConfiguredOpenTelemetrySdk}. */
76+
public ConfigProperties resolveConfigProperties(
77+
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
78+
ConfigProperties sdkConfigProperties =
79+
AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk);
80+
if (sdkConfigProperties != null) {
81+
return sdkConfigProperties;
82+
}
83+
ConfigProvider configProvider =
84+
AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk);
85+
if (configProvider != null) {
86+
return resolveInstrumentationConfig(configProvider.getInstrumentationConfig());
87+
}
88+
// Should never happen
89+
throw new IllegalStateException(
90+
"AutoConfiguredOpenTelemetrySdk does not have ConfigProperties or DeclarativeConfigProperties. This is likely a programming error in opentelemetry-java");
91+
}
92+
93+
public ConfigProperties resolveInstrumentationConfig(
94+
@Nullable DeclarativeConfigProperties instrumentationConfig) {
95+
if (instrumentationConfig == null) {
96+
instrumentationConfig = DeclarativeConfigProperties.empty();
97+
}
98+
return resolveConfig(instrumentationConfig.getStructured("java", empty()));
99+
}
100+
101+
public ConfigProperties resolveConfig(@Nullable DeclarativeConfigProperties config) {
102+
return new DeclarativeConfigPropertiesBridge(
103+
config, new ConfigPropertyTranslator(translationMap, fixedValues));
104+
}
105+
}
106+
}

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/internal/DeclarativeConfigPropertiesBridge.java

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -53,25 +53,11 @@ final class DeclarativeConfigPropertiesBridge implements ConfigProperties {
5353

5454
private static final String OTEL_INSTRUMENTATION_PREFIX = "otel.instrumentation.";
5555

56-
private final PropertyTranslator translator;
56+
private final ConfigPropertyTranslator translator;
5757
@Nullable private final DeclarativeConfigProperties baseNode;
5858

59-
static DeclarativeConfigPropertiesBridge fromInstrumentationConfig(
60-
@Nullable DeclarativeConfigProperties instrumentationConfig, PropertyTranslator translator) {
61-
if (instrumentationConfig == null) {
62-
instrumentationConfig = DeclarativeConfigProperties.empty();
63-
}
64-
return new DeclarativeConfigPropertiesBridge(
65-
instrumentationConfig.getStructured("java", empty()), translator);
66-
}
67-
68-
static DeclarativeConfigPropertiesBridge create(
69-
@Nullable DeclarativeConfigProperties node, PropertyTranslator translator) {
70-
return new DeclarativeConfigPropertiesBridge(node, translator);
71-
}
72-
73-
private DeclarativeConfigPropertiesBridge(
74-
@Nullable DeclarativeConfigProperties baseNode, PropertyTranslator translator) {
59+
DeclarativeConfigPropertiesBridge(
60+
@Nullable DeclarativeConfigProperties baseNode, ConfigPropertyTranslator translator) {
7561
this.baseNode = baseNode;
7662
this.translator = translator;
7763
}

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/internal/PropertyTranslator.java

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

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/internal/PropertyTranslatorBuilder.java

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

javaagent-extension-api/src/test/java/io/opentelemetry/javaagent/extension/internal/ConfigPropertiesUtilTest.java

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -6,85 +6,10 @@
66
package io.opentelemetry.javaagent.extension.internal;
77

88
import static org.assertj.core.api.Assertions.assertThat;
9-
import static org.mockito.ArgumentMatchers.any;
10-
import static org.mockito.ArgumentMatchers.eq;
11-
import static org.mockito.Mockito.mock;
12-
import static org.mockito.Mockito.when;
139

14-
import io.opentelemetry.api.incubator.config.ConfigProvider;
15-
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
16-
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
17-
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
18-
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1910
import org.junit.jupiter.api.Test;
20-
import org.mockito.MockedStatic;
21-
import org.mockito.Mockito;
2211

23-
@SuppressWarnings("DoNotMockAutoValue")
2412
class ConfigPropertiesUtilTest {
25-
@Test
26-
void shouldUseConfigPropertiesForAutoConfiguration() {
27-
ConfigProperties configPropertiesMock = mock(ConfigProperties.class);
28-
AutoConfiguredOpenTelemetrySdk sdkMock = mock(AutoConfiguredOpenTelemetrySdk.class);
29-
try (MockedStatic<AutoConfigureUtil> autoConfigureUtilMock =
30-
Mockito.mockStatic(AutoConfigureUtil.class)) {
31-
autoConfigureUtilMock
32-
.when(() -> AutoConfigureUtil.getConfig(sdkMock))
33-
.thenReturn(configPropertiesMock);
34-
35-
ConfigProperties configProperties = ConfigPropertiesUtil.resolveConfigProperties(sdkMock);
36-
37-
assertThat(configProperties).isSameAs(configPropertiesMock);
38-
}
39-
}
40-
41-
@Test
42-
void shouldUseConfigProviderForDeclarativeConfiguration() {
43-
String propertyName = "testProperty";
44-
String expectedValue = "the value";
45-
DeclarativeConfigProperties javaNodeMock = mock(DeclarativeConfigProperties.class);
46-
when(javaNodeMock.getString(propertyName)).thenReturn(expectedValue);
47-
48-
DeclarativeConfigProperties instrumentationConfigMock = mock(DeclarativeConfigProperties.class);
49-
when(instrumentationConfigMock.getStructured(eq("java"), any())).thenReturn(javaNodeMock);
50-
51-
ConfigProvider configProviderMock = mock(ConfigProvider.class);
52-
when(configProviderMock.getInstrumentationConfig()).thenReturn(instrumentationConfigMock);
53-
54-
AutoConfiguredOpenTelemetrySdk sdkMock = mock(AutoConfiguredOpenTelemetrySdk.class);
55-
56-
try (MockedStatic<AutoConfigureUtil> autoConfigureUtilMock =
57-
Mockito.mockStatic(AutoConfigureUtil.class)) {
58-
autoConfigureUtilMock.when(() -> AutoConfigureUtil.getConfig(sdkMock)).thenReturn(null);
59-
autoConfigureUtilMock
60-
.when(() -> AutoConfigureUtil.getConfigProvider(sdkMock))
61-
.thenReturn(configProviderMock);
62-
63-
ConfigProperties configProperties = ConfigPropertiesUtil.resolveConfigProperties(sdkMock);
64-
65-
assertThat(configProperties.getString(propertyName)).isEqualTo(expectedValue);
66-
}
67-
}
68-
69-
@Test
70-
void shouldUseConfigProviderForDeclarativeConfiguration_noInstrumentationConfig() {
71-
AutoConfiguredOpenTelemetrySdk sdkMock = mock(AutoConfiguredOpenTelemetrySdk.class);
72-
ConfigProvider configProviderMock = mock(ConfigProvider.class);
73-
when(configProviderMock.getInstrumentationConfig()).thenReturn(null);
74-
75-
try (MockedStatic<AutoConfigureUtil> autoConfigureUtilMock =
76-
Mockito.mockStatic(AutoConfigureUtil.class)) {
77-
autoConfigureUtilMock.when(() -> AutoConfigureUtil.getConfig(sdkMock)).thenReturn(null);
78-
autoConfigureUtilMock
79-
.when(() -> AutoConfigureUtil.getConfigProvider(sdkMock))
80-
.thenReturn(configProviderMock);
81-
82-
ConfigProperties configProperties = ConfigPropertiesUtil.resolveConfigProperties(sdkMock);
83-
84-
assertThat(configProperties.getString("testProperty")).isEqualTo(null);
85-
}
86-
}
87-
8813
@Test
8914
void propertyYamlPath() {
9015
assertThat(ConfigPropertiesUtil.propertyYamlPath("google.otel.auth.target.signals"))

0 commit comments

Comments
 (0)