Skip to content

Commit 39a8949

Browse files
authored
New - Upgrade OpenTelemetry Dependencies and Fix Declarative Configuration (#413)
2 parents 83bdb2c + 5ab685e commit 39a8949

12 files changed

Lines changed: 250 additions & 135 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[![Status](https://img.shields.io/badge/status-stable-informational?style=for-the-badge)](https://github.com/solarwinds/apm-java)
2-
[![OTEL](https://img.shields.io/badge/otel-2.3.0-blueviolet?style=for-the-badge)](https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/tag/v2.3.0)
2+
[![OTEL](https://img.shields.io/badge/otel-2.24.0-blueviolet?style=for-the-badge)](https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/tag/v2.24.0)
33
[![SWO](https://img.shields.io/github/v/release/solarwinds/apm-java?include_prereleases&style=for-the-badge)](https://github.com/solarwinds/apm-java/releases)
44
[![SWO SDK](https://img.shields.io/maven-central/v/io.github.appoptics/solarwinds-otel-sdk?style=for-the-badge)](https://maven-badges.herokuapp.com/maven-central/io.github.appoptics/solarwinds-otel-sdk)
55
[![License](https://img.shields.io/badge/License-Apache_2.0-red.svg?style=for-the-badge)](https://github.com/solarwinds/apm-java/blob/main/LICENSE)

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ plugins{
1818
id("io.github.gradle-nexus.publish-plugin") version "2.0.0"
1919
}
2020

21-
val swoAgentVersion = "3.1.2"
21+
val swoAgentVersion = "3.1.3"
2222
extra["swoAgentVersion"] = swoAgentVersion
2323
group = "com.solarwinds"
2424
version = if (System.getenv("SNAPSHOT_BUILD").toBoolean()) "$swoAgentVersion-SNAPSHOT" else swoAgentVersion

custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/DeclarativeLoader.java

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,42 +25,45 @@
2525
import com.solarwinds.joboe.logging.LoggerFactory;
2626
import com.solarwinds.opentelemetry.extensions.LoggingConfigProvider;
2727
import com.solarwinds.opentelemetry.extensions.config.parser.yaml.DeclarativeConfigParser;
28-
import io.opentelemetry.api.incubator.config.ConfigProvider;
28+
import io.opentelemetry.api.incubator.ExtendedOpenTelemetry;
2929
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
3030
import io.opentelemetry.javaagent.tooling.BeforeAgentListener;
31+
import io.opentelemetry.sdk.OpenTelemetrySdk;
3132
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
32-
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
3333

3434
@AutoService(BeforeAgentListener.class)
3535
public class DeclarativeLoader implements BeforeAgentListener {
3636
private static final Logger logger = LoggerFactory.getLogger();
3737

3838
@Override
3939
public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
40-
ConfigProvider configProvider =
41-
AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk);
40+
OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
41+
if (!(openTelemetrySdk instanceof ExtendedOpenTelemetry)) {
42+
// Shouldn't happen in practice, but just in case
43+
logger.warn(
44+
"OpenTelemetrySdk is not an instance of ExtendedOpenTelemetry. Declarative configuration will not be applied.");
45+
return;
46+
}
4247

43-
if (configProvider != null) {
44-
DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig();
48+
ExtendedOpenTelemetry extendedOpenTelemetry = (ExtendedOpenTelemetry) openTelemetrySdk;
49+
DeclarativeConfigProperties solarwinds =
50+
extendedOpenTelemetry.getInstrumentationConfig("solarwinds");
4551

46-
if (instrumentationConfig != null) {
47-
DeclarativeConfigProperties solarwinds =
48-
instrumentationConfig
49-
.getStructured("java", DeclarativeConfigProperties.empty())
50-
.getStructured("solarwinds", DeclarativeConfigProperties.empty());
52+
if (solarwinds != null && !solarwinds.getPropertyKeys().isEmpty()) {
53+
try {
54+
ConfigContainer configContainer = new ConfigContainer();
55+
DeclarativeConfigParser declarativeConfigParser =
56+
new DeclarativeConfigParser(configContainer);
5157

52-
try {
53-
ConfigContainer configContainer = new ConfigContainer();
54-
new DeclarativeConfigParser(configContainer).parse(solarwinds);
55-
ConfigurationLoader.processConfigs(configContainer);
58+
declarativeConfigParser.parse(solarwinds);
59+
ConfigurationLoader.processConfigs(configContainer);
5660

57-
ConfigContainer agentConfig = configContainer.subset(ConfigGroup.AGENT);
58-
LoggerFactory.init(LoggingConfigProvider.getLoggerConfiguration(agentConfig));
59-
logger.info("Loaded via declarative config");
61+
ConfigContainer agentConfig = configContainer.subset(ConfigGroup.AGENT);
62+
LoggerFactory.init(LoggingConfigProvider.getLoggerConfiguration(agentConfig));
63+
logger.info("Loaded via declarative config");
6064

61-
} catch (InvalidConfigException e) {
62-
throw new RuntimeException(e);
63-
}
65+
} catch (InvalidConfigException e) {
66+
throw new RuntimeException(e);
6467
}
6568

6669
if (!JavaRuntimeVersionChecker.isJdkVersionSupported()) {

custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/CustomConfigCustomizerProvider.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
2323
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectionModel;
2424
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectorModel;
25+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectorPropertyModel;
2526
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ResourceModel;
2627
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
28+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorPropertyModel;
2729
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
2830
import java.util.ArrayList;
2931
import java.util.Collections;
@@ -71,12 +73,14 @@ private void addResourceDetector(ResourceModel resourceModel) {
7173
newDetectors.add(
7274
new ExperimentalResourceDetectorModel()
7375
.withAdditionalProperty(
74-
ResourceComponentProvider.COMPONENT_NAME, Collections.emptyMap()));
76+
ResourceComponentProvider.COMPONENT_NAME,
77+
new ExperimentalResourceDetectorPropertyModel()));
7578

7679
newDetectors.add(
7780
new ExperimentalResourceDetectorModel()
7881
.withAdditionalProperty(
79-
HostIdResourceComponentProvider.COMPONENT_NAME, Collections.emptyMap()));
82+
HostIdResourceComponentProvider.COMPONENT_NAME,
83+
new ExperimentalResourceDetectorPropertyModel()));
8084
detectionDevelopment.withDetectors(newDetectors);
8185
}
8286

@@ -87,7 +91,7 @@ private void addProcessors(TracerProviderModel model) {
8791
new SpanProcessorModel()
8892
.withAdditionalProperty(
8993
ProfilingSpanProcessorComponentProvider.COMPONENT_NAME,
90-
Collections.emptyMap()));
94+
new SpanProcessorPropertyModel()));
9195

9296
ArrayList<SpanProcessorModel> allProcessors = new ArrayList<>(model.getProcessors());
9397
allProcessors.addAll(processors);
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* © SolarWinds Worldwide, LLC. All rights reserved.
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.solarwinds.opentelemetry.extensions.config;
18+
19+
import static org.junit.jupiter.api.Assertions.assertNotNull;
20+
import static org.mockito.ArgumentMatchers.eq;
21+
import static org.mockito.Mockito.when;
22+
23+
import com.solarwinds.joboe.config.ConfigManager;
24+
import com.solarwinds.joboe.config.ConfigProperty;
25+
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
26+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
27+
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
28+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
29+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLanguageSpecificInstrumentationPropertyModel;
30+
import org.junit.jupiter.api.AfterAll;
31+
import org.junit.jupiter.api.Test;
32+
import org.junit.jupiter.api.extension.ExtendWith;
33+
import org.mockito.InjectMocks;
34+
import org.mockito.Mock;
35+
import org.mockito.junit.jupiter.MockitoExtension;
36+
37+
@ExtendWith(MockitoExtension.class)
38+
class DeclarativeLoaderTest {
39+
40+
@InjectMocks private DeclarativeLoader tested;
41+
42+
@Mock private AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdkMock;
43+
44+
@Mock private ExtendedOpenTelemetrySdk extendedOpenTelemetrySdkMock;
45+
46+
private final ExperimentalLanguageSpecificInstrumentationPropertyModel solarwinds =
47+
new ExperimentalLanguageSpecificInstrumentationPropertyModel()
48+
.withAdditionalProperty(
49+
ConfigProperty.AGENT_SERVICE_KEY.getConfigFileKey(), "token:service")
50+
.withAdditionalProperty(
51+
ConfigProperty.AGENT_COLLECTOR.getConfigFileKey(), "apm.collector.com");
52+
53+
@AfterAll
54+
public static void clearConfig() {
55+
ConfigManager.reset();
56+
}
57+
58+
@Test
59+
public void testBeforeAgent() {
60+
DeclarativeConfigProperties configProperties =
61+
DeclarativeConfiguration.toConfigProperties(solarwinds);
62+
when(autoConfiguredOpenTelemetrySdkMock.getOpenTelemetrySdk())
63+
.thenReturn(extendedOpenTelemetrySdkMock);
64+
when(extendedOpenTelemetrySdkMock.getInstrumentationConfig(eq("solarwinds")))
65+
.thenReturn(configProperties);
66+
tested.beforeAgent(autoConfiguredOpenTelemetrySdkMock);
67+
68+
assertNotNull(ConfigManager.getConfig(ConfigProperty.AGENT_COLLECTOR));
69+
assertNotNull(ConfigManager.getConfig(ConfigProperty.AGENT_SERVICE_KEY));
70+
}
71+
}

custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/LogRecordExporterCustomizerTest.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,16 @@
1818

1919
import static com.solarwinds.opentelemetry.extensions.SharedNames.SW_OTEL_PROXY_HOST_KEY;
2020
import static com.solarwinds.opentelemetry.extensions.SharedNames.SW_OTEL_PROXY_PORT_KEY;
21-
import static org.junit.jupiter.api.Assertions.assertNotSame;
2221
import static org.junit.jupiter.api.Assertions.assertSame;
22+
import static org.mockito.ArgumentMatchers.any;
23+
import static org.mockito.Mockito.mock;
24+
import static org.mockito.Mockito.verify;
2325
import static org.mockito.Mockito.when;
2426

2527
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter;
28+
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder;
2629
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
30+
import io.opentelemetry.sdk.common.export.ProxyOptions;
2731
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
2832
import org.junit.jupiter.api.Test;
2933
import org.junit.jupiter.api.extension.ExtendWith;
@@ -46,12 +50,19 @@ void shouldReturnSameExporterWhenProxyNotConfigured() {
4650
}
4751

4852
@Test
49-
void shouldReturnNewExporterWhenProxyConfigured() {
53+
void shouldCallSetProxyWhenProxyConfigured() {
5054
when(configProperties.getString(SW_OTEL_PROXY_HOST_KEY)).thenReturn("localhost");
5155
when(configProperties.getInt(SW_OTEL_PROXY_PORT_KEY)).thenReturn(8080);
5256

53-
OtlpHttpLogRecordExporter originalExporter = OtlpHttpLogRecordExporter.builder().build();
54-
LogRecordExporter result = tested.apply(originalExporter, configProperties);
55-
assertNotSame(originalExporter, result);
57+
OtlpHttpLogRecordExporter originalExporter = mock(OtlpHttpLogRecordExporter.class);
58+
OtlpHttpLogRecordExporterBuilder builder = mock(OtlpHttpLogRecordExporterBuilder.class);
59+
60+
when(originalExporter.toBuilder()).thenReturn(builder);
61+
when(builder.setProxyOptions(any(ProxyOptions.class))).thenReturn(builder);
62+
when(builder.build()).thenReturn(mock(OtlpHttpLogRecordExporter.class));
63+
64+
tested.apply(originalExporter, configProperties);
65+
66+
verify(builder).setProxyOptions(any(ProxyOptions.class));
5667
}
5768
}

custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/SpanExporterCustomizerTest.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,16 @@
1818

1919
import static com.solarwinds.opentelemetry.extensions.SharedNames.SW_OTEL_PROXY_HOST_KEY;
2020
import static com.solarwinds.opentelemetry.extensions.SharedNames.SW_OTEL_PROXY_PORT_KEY;
21-
import static org.junit.jupiter.api.Assertions.assertNotSame;
2221
import static org.junit.jupiter.api.Assertions.assertSame;
22+
import static org.mockito.ArgumentMatchers.any;
23+
import static org.mockito.Mockito.mock;
24+
import static org.mockito.Mockito.verify;
2325
import static org.mockito.Mockito.when;
2426

2527
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
28+
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder;
2629
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
30+
import io.opentelemetry.sdk.common.export.ProxyOptions;
2731
import io.opentelemetry.sdk.trace.export.SpanExporter;
2832
import org.junit.jupiter.api.Test;
2933
import org.junit.jupiter.api.extension.ExtendWith;
@@ -46,12 +50,18 @@ void shouldReturnSameExporterWhenProxyNotConfigured() {
4650
}
4751

4852
@Test
49-
void shouldReturnNewExporterWhenProxyConfigured() {
53+
void shouldCallSetProxyWhenProxyConfigured() {
5054
when(configProperties.getString(SW_OTEL_PROXY_HOST_KEY)).thenReturn("localhost");
5155
when(configProperties.getInt(SW_OTEL_PROXY_PORT_KEY)).thenReturn(8080);
5256

53-
OtlpHttpSpanExporter originalExporter = OtlpHttpSpanExporter.builder().build();
54-
SpanExporter result = tested.apply(originalExporter, configProperties);
55-
assertNotSame(originalExporter, result);
57+
OtlpHttpSpanExporter originalExporter = mock(OtlpHttpSpanExporter.class);
58+
OtlpHttpSpanExporterBuilder builder = mock(OtlpHttpSpanExporterBuilder.class);
59+
60+
when(originalExporter.toBuilder()).thenReturn(builder);
61+
when(builder.setProxy(any(ProxyOptions.class))).thenReturn(builder);
62+
when(builder.build()).thenReturn(mock(OtlpHttpSpanExporter.class));
63+
64+
tested.apply(originalExporter, configProperties);
65+
verify(builder).setProxy(any(ProxyOptions.class));
5666
}
5767
}

dependencyManagement/build.gradle.kts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ plugins {
22
`java-platform`
33
}
44

5-
val otelAgentVersion = "2.23.0"
6-
val otelSdkVersion = "1.57.0"
5+
val otelAgentVersion = "2.24.0"
6+
val otelSdkVersion = "1.58.0"
77

88
val mockitoVersion = "4.11.0"
9-
val byteBuddyVersion = "1.15.10"
9+
val byteBuddyVersion = "1.18.4"
1010
val joboeVersion = "10.0.27"
1111

1212
val opentelemetryJavaagentAlpha = "$otelAgentVersion-alpha"
@@ -15,7 +15,7 @@ val opentelemetrySemconv = "1.37.0"
1515
val opentelemetrySemconvAlpha = "$opentelemetrySemconv-alpha"
1616

1717
val autoservice = "1.1.1"
18-
val otelJavaContribVersion = "1.52.0-alpha"
18+
val otelJavaContribVersion = "1.53.0-alpha"
1919
val junit5 = "5.9.2"
2020

2121
rootProject.extra["otelAgentVersion"] = otelAgentVersion

libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/SolarwindsIgnoredTypesConfigurer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@
1919
import com.google.auto.service.AutoService;
2020
import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder;
2121
import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer;
22-
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
2322

2423
@AutoService(IgnoredTypesConfigurer.class)
2524
public class SolarwindsIgnoredTypesConfigurer implements IgnoredTypesConfigurer {
2625
@Override
27-
public void configure(IgnoredTypesBuilder builder, ConfigProperties config) {
26+
public void configure(IgnoredTypesBuilder builder) {
2827
builder.ignoreClass("com.solarwinds.ext.");
2928
builder.ignoreClass("com.solarwinds.joboe.");
3029
}

0 commit comments

Comments
 (0)