Skip to content

Commit 1050615

Browse files
committed
create sdk from previously read config model
1 parent 40fb7a6 commit 1050615

File tree

9 files changed

+108
-89
lines changed

9 files changed

+108
-89
lines changed

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package io.opentelemetry.javaagent.tooling;
77

8-
import static io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller.installOpenTelemetrySdk;
98
import static io.opentelemetry.javaagent.tooling.SafeServiceLoader.load;
109
import static io.opentelemetry.javaagent.tooling.SafeServiceLoader.loadOrdered;
1110
import static io.opentelemetry.javaagent.tooling.Utils.getResourceName;
@@ -159,10 +158,8 @@ private static void installBytebuddyAgent(
159158

160159
installEarlyInstrumentation(agentBuilder, inst);
161160

162-
// If noop OpenTelemetry is enabled, autoConfiguredSdk will be null and AgentListeners are not
163-
// called
164161
AutoConfiguredOpenTelemetrySdk autoConfiguredSdk =
165-
installOpenTelemetrySdk(extensionClassLoader);
162+
earlyConfig.installOpenTelemetrySdk(extensionClassLoader);
166163

167164
ConfigProperties sdkConfig = AgentListener.resolveConfigProperties(autoConfiguredSdk);
168165
AgentInstrumentationConfig.internalInitializeConfig(

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java

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

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/DeclarativeConfigEarlyInitAgentConfig.java

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,24 @@
55

66
package io.opentelemetry.javaagent.tooling.config;
77

8+
import io.opentelemetry.api.GlobalOpenTelemetry;
89
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
10+
import io.opentelemetry.javaagent.bootstrap.OpenTelemetrySdkAccess;
911
import io.opentelemetry.javaagent.extension.DeclarativeConfigPropertiesBridge;
12+
import io.opentelemetry.sdk.OpenTelemetrySdk;
13+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
14+
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1015
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
16+
import io.opentelemetry.sdk.common.CompletableResultCode;
1117
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
1218
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
1319
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
20+
import io.opentelemetry.sdk.resources.Resource;
1421
import java.io.FileInputStream;
1522
import java.io.IOException;
23+
import java.lang.reflect.InvocationTargetException;
24+
import java.lang.reflect.Method;
25+
import java.util.Arrays;
1626
import java.util.Objects;
1727
import javax.annotation.Nullable;
1828

@@ -23,11 +33,12 @@
2333
public final class DeclarativeConfigEarlyInitAgentConfig implements EarlyInitAgentConfig {
2434
private final OpenTelemetryConfigurationModel configurationModel;
2535
private final ConfigProperties declarativeConfigProperties;
36+
private final SdkConfigProvider configProvider;
2637

2738
DeclarativeConfigEarlyInitAgentConfig(String configurationFile) {
2839
this.configurationModel = loadConfigurationModel(configurationFile);
29-
this.declarativeConfigProperties =
30-
new DeclarativeConfigPropertiesBridge(SdkConfigProvider.create(configurationModel));
40+
configProvider = SdkConfigProvider.create(configurationModel);
41+
this.declarativeConfigProperties = new DeclarativeConfigPropertiesBridge(configProvider);
3142
}
3243

3344
@Override
@@ -63,4 +74,43 @@ private static OpenTelemetryConfigurationModel loadConfigurationModel(String con
6374
throw new DeclarativeConfigException("unable to read " + configurationFile, e);
6475
}
6576
}
77+
78+
@Override
79+
public AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk(ClassLoader extensionClassLoader) {
80+
OpenTelemetrySdk sdk =
81+
DeclarativeConfiguration.create(
82+
this.configurationModel,
83+
SpiHelper.serviceComponentLoader(
84+
AutoConfiguredOpenTelemetrySdk.class.getClassLoader()));
85+
Runtime.getRuntime().addShutdownHook(new Thread(sdk::close));
86+
GlobalOpenTelemetry.set(sdk);
87+
88+
setForceFlush(sdk);
89+
90+
try {
91+
Method method =
92+
AutoConfiguredOpenTelemetrySdk.class.getDeclaredMethod(
93+
"create",
94+
OpenTelemetrySdk.class,
95+
Resource.class,
96+
ConfigProperties.class,
97+
Object.class);
98+
method.setAccessible(true);
99+
return (AutoConfiguredOpenTelemetrySdk)
100+
method.invoke(null, sdk, Resource.getDefault(), null, this.configProvider);
101+
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
102+
throw new IllegalStateException("Error calling create on AutoConfiguredOpenTelemetrySdk", e);
103+
}
104+
}
105+
106+
static void setForceFlush(OpenTelemetrySdk sdk) {
107+
OpenTelemetrySdkAccess.internalSetForceFlush(
108+
(timeout, unit) -> {
109+
CompletableResultCode traceResult = sdk.getSdkTracerProvider().forceFlush();
110+
CompletableResultCode metricsResult = sdk.getSdkMeterProvider().forceFlush();
111+
CompletableResultCode logsResult = sdk.getSdkLoggerProvider().forceFlush();
112+
CompletableResultCode.ofAll(Arrays.asList(traceResult, metricsResult, logsResult))
113+
.join(timeout, unit);
114+
});
115+
}
66116
}

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.javaagent.tooling.config;
77

8+
import io.opentelemetry.sdk.OpenTelemetrySdk;
9+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
810
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
911
import java.util.Collections;
1012
import javax.annotation.Nullable;
@@ -21,6 +23,14 @@ public interface EarlyInitAgentConfig {
2123

2224
void logEarlyConfigErrorsIfAny();
2325

26+
/**
27+
* Install the {@link OpenTelemetrySdk} using autoconfigure, and return the {@link
28+
* AutoConfiguredOpenTelemetrySdk}.
29+
*
30+
* @return the {@link AutoConfiguredOpenTelemetrySdk}
31+
*/
32+
AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk(ClassLoader extensionClassLoader);
33+
2434
static EarlyInitAgentConfig create() {
2535
String configurationFile =
2636
DefaultConfigProperties.create(Collections.emptyMap())

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/LegacyConfigFileEarlyInitAgentConfig.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
package io.opentelemetry.javaagent.tooling.config;
77

88
import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil;
9+
import io.opentelemetry.sdk.OpenTelemetrySdk;
10+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
911
import java.util.Map;
1012
import javax.annotation.Nullable;
1113

@@ -62,4 +64,16 @@ public int getInt(String propertyName, int defaultValue) {
6264
public void logEarlyConfigErrorsIfAny() {
6365
ConfigurationFile.logErrorIfAny();
6466
}
67+
68+
@Override
69+
public AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk(ClassLoader extensionClassLoader) {
70+
AutoConfiguredOpenTelemetrySdk autoConfiguredSdk =
71+
AutoConfiguredOpenTelemetrySdk.builder()
72+
.setResultAsGlobal()
73+
.setServiceClassLoader(extensionClassLoader)
74+
.build();
75+
OpenTelemetrySdk sdk = autoConfiguredSdk.getOpenTelemetrySdk();
76+
DeclarativeConfigEarlyInitAgentConfig.setForceFlush(sdk);
77+
return autoConfiguredSdk;
78+
}
6579
}

javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.groovy

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

javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import static org.assertj.core.api.Assertions.assertThat;
1111

1212
import io.opentelemetry.api.GlobalOpenTelemetry;
13-
import io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller;
1413
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
1514
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
1615
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
@@ -46,7 +45,7 @@ void fileConfigOverwritesUserPropertiesSupplier(@TempDir Path tempDir) throws IO
4645

4746
// when
4847
AutoConfiguredOpenTelemetrySdk autoConfiguredSdk =
49-
OpenTelemetryInstaller.installOpenTelemetrySdk(this.getClass().getClassLoader());
48+
EarlyInitAgentConfig.create().installOpenTelemetrySdk(this.getClass().getClassLoader());
5049

5150
// then
5251
assertThat(AutoConfigureUtil.getConfig(autoConfiguredSdk).getString("custom.key"))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.opentelemetry.javaagent.tooling.config;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.junit.jupiter.api.Assertions.*;
5+
6+
import io.opentelemetry.api.GlobalOpenTelemetry;
7+
import io.opentelemetry.api.OpenTelemetry;
8+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
11+
12+
class DeclarativeConfigEarlyInitAgentConfigTest {
13+
14+
@BeforeEach
15+
void setUp() {
16+
GlobalOpenTelemetry.resetForTest();
17+
}
18+
19+
@Test
20+
void globalOpenTelemetry() {
21+
EarlyInitAgentConfig config = EarlyInitAgentConfig.create(); // no declarative config file
22+
assertTrue(config.isAgentEnabled(), "Agent should be enabled by default");
23+
AutoConfiguredOpenTelemetrySdk sdk =
24+
config.installOpenTelemetrySdk(
25+
DeclarativeConfigEarlyInitAgentConfig.class.getClassLoader());
26+
assertThat(sdk).isNotNull().isNotEqualTo(OpenTelemetry.noop());
27+
}
28+
}

javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import static org.assertj.core.api.Assertions.assertThat;
99

1010
import io.opentelemetry.api.GlobalOpenTelemetry;
11-
import io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller;
1211
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
1312
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
1413
import org.junit.jupiter.api.AfterEach;
@@ -29,7 +28,7 @@ void cleanUp() {
2928
void keepUserOtlpProtocolConfiguration() {
3029
// when
3130
AutoConfiguredOpenTelemetrySdk autoConfiguredSdk =
32-
OpenTelemetryInstaller.installOpenTelemetrySdk(this.getClass().getClassLoader());
31+
EarlyInitAgentConfig.create().installOpenTelemetrySdk(this.getClass().getClassLoader());
3332

3433
// then
3534
assertThat(
@@ -41,7 +40,7 @@ void keepUserOtlpProtocolConfiguration() {
4140
void defaultHttpProtobufOtlpProtocolConfiguration() {
4241
// when
4342
AutoConfiguredOpenTelemetrySdk autoConfiguredSdk =
44-
OpenTelemetryInstaller.installOpenTelemetrySdk(this.getClass().getClassLoader());
43+
EarlyInitAgentConfig.create().installOpenTelemetrySdk(this.getClass().getClassLoader());
4544

4645
// then
4746
assertThat(

0 commit comments

Comments
 (0)