From a9264ce692411f92934b2d4653765500175b3993 Mon Sep 17 00:00:00 2001 From: cleverchuk Date: Tue, 14 Apr 2026 11:54:29 -0400 Subject: [PATCH] declarative config parity --- .../script/solarwinds-apm-config.json | 1 - .../CustomConfigCustomizerProvider.java | 6 +- .../CustomConfigCustomizerProviderTest.java | 28 +++- .../solarwinds/joboe/config/ConfigGroup.java | 1 - .../joboe/config/ConfigProperty.java | 17 +-- .../parser/yaml/SqlQueryMaxLengthParser.java | 49 +++++++ .../parser/yaml/TriggerTraceParser.java | 37 +++++ .../yaml/UrlSampleRateConfigParser.java | 4 +- .../SharedConfigCustomizerProvider.java | 43 +++--- .../yaml/SqlQueryMaxLengthParserTest.java | 83 +++++++++++ .../parser/yaml/TriggerTraceParserTest.java | 64 +++++++++ .../SharedConfigCustomizerProviderTest.java | 136 ++++++++++++++++++ .../shared/src/test/resources/sdk-config.yaml | 29 +--- sdk-config.yaml | 2 +- smoke-tests/apm-config.json | 24 ---- 15 files changed, 431 insertions(+), 93 deletions(-) create mode 100644 libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/SqlQueryMaxLengthParser.java create mode 100644 libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/TriggerTraceParser.java create mode 100644 libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/SqlQueryMaxLengthParserTest.java create mode 100644 libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/TriggerTraceParserTest.java diff --git a/agent-lambda/script/solarwinds-apm-config.json b/agent-lambda/script/solarwinds-apm-config.json index 3074f78f..04d486dd 100644 --- a/agent-lambda/script/solarwinds-apm-config.json +++ b/agent-lambda/script/solarwinds-apm-config.json @@ -1,6 +1,5 @@ { "agent.logging": "info", - "monitor.jmx.enable": false, "profiler": { "enabled": false, "excludePackages": [ diff --git a/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/CustomConfigCustomizerProvider.java b/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/CustomConfigCustomizerProvider.java index f56a1054..f40b091a 100644 --- a/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/CustomConfigCustomizerProvider.java +++ b/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/CustomConfigCustomizerProvider.java @@ -39,9 +39,8 @@ public void customize(DeclarativeConfigurationCustomizer customizer) { customizer.addModelCustomizer( configurationModel -> { TracerProviderModel tracerProvider = configurationModel.getTracerProvider(); - if (tracerProvider == null) { - tracerProvider = new TracerProviderModel(); - configurationModel.withTracerProvider(tracerProvider); + if (tracerProvider != null) { + addProcessors(tracerProvider); } ResourceModel resourceModel = configurationModel.getResource(); @@ -51,7 +50,6 @@ public void customize(DeclarativeConfigurationCustomizer customizer) { } addResourceDetector(resourceModel); - addProcessors(tracerProvider); return configurationModel; }); } diff --git a/custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/CustomConfigCustomizerProviderTest.java b/custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/CustomConfigCustomizerProviderTest.java index af2b007c..450642c1 100644 --- a/custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/CustomConfigCustomizerProviderTest.java +++ b/custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/CustomConfigCustomizerProviderTest.java @@ -18,6 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mockStatic; @@ -58,7 +59,7 @@ void verifyThatProfilingProcessorIsAddedWhenJdkVersionIsSupported() { .thenReturn(true); OpenTelemetryConfigurationModel openTelemetryConfigurationModel = - new OpenTelemetryConfigurationModel(); + new OpenTelemetryConfigurationModel().withTracerProvider(new TracerProviderModel()); doNothing() .when(declarativeConfigurationCustomizerMock) @@ -88,7 +89,7 @@ void verifyThatProfilingProcessorIsNotAddedWhenJdkVersionIsNotSupported() { .thenReturn(false); OpenTelemetryConfigurationModel openTelemetryConfigurationModel = - new OpenTelemetryConfigurationModel(); + new OpenTelemetryConfigurationModel().withTracerProvider(new TracerProviderModel()); doNothing() .when(declarativeConfigurationCustomizerMock) @@ -133,4 +134,27 @@ void verifyThatResourceDetectorIsAlwaysAdded() { .isEmpty()); } } + + @Test + void processorsNotAddedWhenTracerProviderAbsent() { + try (MockedStatic javaRuntimeVersionCheckerMockedStatic = + mockStatic(JavaRuntimeVersionChecker.class)) { + javaRuntimeVersionCheckerMockedStatic + .when(JavaRuntimeVersionChecker::isJdkVersionSupported) + .thenReturn(true); + + OpenTelemetryConfigurationModel openTelemetryConfigurationModel = + new OpenTelemetryConfigurationModel(); + + doNothing() + .when(declarativeConfigurationCustomizerMock) + .addModelCustomizer(functionArgumentCaptor.capture()); + + tested.customize(declarativeConfigurationCustomizerMock); + functionArgumentCaptor.getValue().apply(openTelemetryConfigurationModel); + + assertNull(openTelemetryConfigurationModel.getTracerProvider()); + assertNotNull(openTelemetryConfigurationModel.getResource()); + } + } } diff --git a/libs/config/src/main/java/com/solarwinds/joboe/config/ConfigGroup.java b/libs/config/src/main/java/com/solarwinds/joboe/config/ConfigGroup.java index 3904bd6d..56f4bfb1 100644 --- a/libs/config/src/main/java/com/solarwinds/joboe/config/ConfigGroup.java +++ b/libs/config/src/main/java/com/solarwinds/joboe/config/ConfigGroup.java @@ -23,6 +23,5 @@ */ public enum ConfigGroup { AGENT, - MONITOR, PROFILER } diff --git a/libs/config/src/main/java/com/solarwinds/joboe/config/ConfigProperty.java b/libs/config/src/main/java/com/solarwinds/joboe/config/ConfigProperty.java index a687d304..d412a146 100644 --- a/libs/config/src/main/java/com/solarwinds/joboe/config/ConfigProperty.java +++ b/libs/config/src/main/java/com/solarwinds/joboe/config/ConfigProperty.java @@ -82,7 +82,9 @@ public enum ConfigProperty { ConfigGroup.AGENT, String.class), AGENT_LOG_FILE( - new ConfigKey(null, EnvPrefix.PRODUCT + "JAVA_LOG_FILE"), ConfigGroup.AGENT, String.class), + new ConfigKey("agent.javaLogFile", EnvPrefix.PRODUCT + "JAVA_LOG_FILE"), + ConfigGroup.AGENT, + String.class), AGENT_COLLECTOR( new ConfigKey("agent.collector", EnvPrefix.PRODUCT + "COLLECTOR"), ConfigGroup.AGENT, @@ -146,19 +148,6 @@ public enum ConfigProperty { new ConfigKey("agent.sqlTagDatabases", EnvPrefix.PRODUCT + "SQL_TAG_DATABASES"), ConfigGroup.AGENT, String.class), - MONITOR_JMX_SCOPES(new ConfigKey("monitor.jmx.scopes"), ConfigGroup.MONITOR, String.class), - MONITOR_JMX_ENABLE(new ConfigKey("monitor.jmx.enable"), ConfigGroup.MONITOR, Boolean.class), - MONITOR_JMX_MAX_ENTRY(new ConfigKey("monitor.jmx.maxEntry"), ConfigGroup.MONITOR, Integer.class), - MONITOR_METRICS_FLUSH_INTERVAL( - new ConfigKey(null, EnvPrefix.PRODUCT + "METRICS_FLUSH_INTERVAL"), - ConfigGroup.MONITOR, - Integer.class), - - MONITOR_SPAN_METRICS_ENABLE( - new ConfigKey("monitor.spanMetrics.enable", EnvPrefix.PRODUCT + "SPAN_METRICS_ENABLE"), - ConfigGroup.MONITOR, - Boolean.class), - PROFILER(new ConfigKey("profiler"), ConfigGroup.PROFILER, String.class), PROFILER_ENABLED_ENV_VAR( new ConfigKey(null, EnvPrefix.PRODUCT + "PROFILER_ENABLED"), diff --git a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/SqlQueryMaxLengthParser.java b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/SqlQueryMaxLengthParser.java new file mode 100644 index 00000000..ea9a4df3 --- /dev/null +++ b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/SqlQueryMaxLengthParser.java @@ -0,0 +1,49 @@ +/* + * © SolarWinds Worldwide, LLC. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.solarwinds.opentelemetry.extensions.config.parser.yaml; + +import com.google.auto.service.AutoService; +import com.solarwinds.joboe.config.ConfigParser; +import com.solarwinds.joboe.config.InvalidConfigException; +import com.solarwinds.opentelemetry.extensions.Constants; +import com.solarwinds.opentelemetry.extensions.config.parser.json.RangeValidationParser; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; + +@SuppressWarnings("rawtypes") +@AutoService(ConfigParser.class) +public class SqlQueryMaxLengthParser implements ConfigParser { + private static final String CONFIG_KEY = "agent.sqlQueryMaxLength"; + + private static final RangeValidationParser RANGE_VALIDATOR = + new RangeValidationParser<>( + Constants.MAX_SQL_QUERY_LENGTH_LOWER_LIMIT, Constants.MAX_SQL_QUERY_LENGTH_UPPER_LIMIT); + + @Override + public Integer convert(DeclarativeConfigProperties declarativeConfigProperties) + throws InvalidConfigException { + Integer value = declarativeConfigProperties.getInt(CONFIG_KEY); + if (value == null) { + return null; + } + return RANGE_VALIDATOR.convert(value); + } + + @Override + public String configKey() { + return CONFIG_KEY; + } +} diff --git a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/TriggerTraceParser.java b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/TriggerTraceParser.java new file mode 100644 index 00000000..4bd660c2 --- /dev/null +++ b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/TriggerTraceParser.java @@ -0,0 +1,37 @@ +/* + * © SolarWinds Worldwide, LLC. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.solarwinds.opentelemetry.extensions.config.parser.yaml; + +import com.google.auto.service.AutoService; +import com.solarwinds.joboe.config.ConfigParser; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; + +@SuppressWarnings("rawtypes") +@AutoService(ConfigParser.class) +public class TriggerTraceParser implements ConfigParser { + private static final String CONFIG_KEY = "agent.triggerTrace"; + + @Override + public Boolean convert(DeclarativeConfigProperties declarativeConfigProperties) { + return declarativeConfigProperties.getBoolean(CONFIG_KEY, true); + } + + @Override + public String configKey() { + return CONFIG_KEY; + } +} diff --git a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/UrlSampleRateConfigParser.java b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/UrlSampleRateConfigParser.java index 02e9db73..f86edd96 100644 --- a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/UrlSampleRateConfigParser.java +++ b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/UrlSampleRateConfigParser.java @@ -75,9 +75,7 @@ public TraceConfigs convert(DeclarativeConfigProperties declarativeConfigPropert urlSampleRate.getStructured(url, DeclarativeConfigProperties.empty()); TraceConfig traceConfig = extractConfig(urlConfig, declarativeConfigProperties); - if (traceConfig != null) { - result.put(new StringPatternMatcher(pattern), traceConfig); - } + result.put(new StringPatternMatcher(pattern), traceConfig); } return new TraceConfigs(result); diff --git a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProvider.java b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProvider.java index fd9be520..b159d870 100644 --- a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProvider.java +++ b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProvider.java @@ -81,28 +81,31 @@ public void customize(DeclarativeConfigurationCustomizer customizer) { if (meterProvider == null) { meterProvider = new MeterProviderModel(); configurationModel.withMeterProvider(meterProvider); + try { + ConfigManager.setConfig(ConfigProperty.AGENT_EXPORT_METRICS_ENABLED, false); + } catch (InvalidConfigException ignore) { + } } + addMetricExporter(configurationModel); - if (tracerProvider == null) { - tracerProvider = new TracerProviderModel(); - configurationModel.withTracerProvider(tracerProvider); - } + if (tracerProvider != null) { + addSampler(tracerProvider); + addProcessors(tracerProvider); - if (loggerProvider == null) { - loggerProvider = new LoggerProviderModel(); - configurationModel.withLoggerProvider(loggerProvider); + addSpanExporter(configurationModel); } - addSampler(tracerProvider); - addProcessors(tracerProvider); - addMetricExporter(configurationModel); + if (loggerProvider != null) { + addLogExporter(configurationModel); + } - addLogExporter(configurationModel); - addSpanExporter(configurationModel); - PropagatorModel propagatorModel = new PropagatorModel(); + PropagatorModel propagatorModel = configurationModel.getPropagator(); + if (propagatorModel == null) { + propagatorModel = new PropagatorModel(); + configurationModel.withPropagator(propagatorModel); + } addContextPropagators(propagatorModel); - configurationModel.withPropagator(propagatorModel); return configurationModel; }); } @@ -156,9 +159,15 @@ private void addSampler(TracerProviderModel model) { } private void addContextPropagators(PropagatorModel model) { - model.withCompositeList( - String.format( - "tracecontext,baggage,%s", ContextPropagatorComponentProvider.COMPONENT_NAME)); + String compositeList = model.getCompositeList(); + if (compositeList != null) { + model.withCompositeList( + String.format("%s,%s", compositeList, ContextPropagatorComponentProvider.COMPONENT_NAME)); + } else { + model.withCompositeList( + String.format( + "tracecontext,baggage,%s", ContextPropagatorComponentProvider.COMPONENT_NAME)); + } } private void addSpanExporter(OpenTelemetryConfigurationModel model) { diff --git a/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/SqlQueryMaxLengthParserTest.java b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/SqlQueryMaxLengthParserTest.java new file mode 100644 index 00000000..c5b1fbf5 --- /dev/null +++ b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/SqlQueryMaxLengthParserTest.java @@ -0,0 +1,83 @@ +/* + * © SolarWinds Worldwide, LLC. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.solarwinds.opentelemetry.extensions.config.parser.yaml; + +import static org.junit.jupiter.api.Assertions.*; + +import com.solarwinds.joboe.config.InvalidConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class SqlQueryMaxLengthParserTest { + private static DeclarativeConfigProperties declarativeConfigProperties; + private final SqlQueryMaxLengthParser tested = new SqlQueryMaxLengthParser(); + + @BeforeAll + static void setup() { + try (InputStream resourceAsStream = + SqlQueryMaxLengthParserTest.class.getResourceAsStream("/sdk-config.yaml")) { + DeclarativeConfigProperties configProperties = + DeclarativeConfiguration.toConfigProperties(resourceAsStream); + declarativeConfigProperties = + configProperties + .getStructured("instrumentation/development", DeclarativeConfigProperties.empty()) + .getStructured("java", DeclarativeConfigProperties.empty()) + .getStructured("solarwinds"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Test + void testConvertValidValue() throws InvalidConfigException { + Integer result = tested.convert(declarativeConfigProperties); + assertEquals(4096, result); + } + + @Test + void testConvertNull() throws InvalidConfigException { + Integer result = tested.convert(DeclarativeConfigProperties.empty()); + assertNull(result); + } + + @Test + void testConvertBelowRange() { + assertThrows(InvalidConfigException.class, () -> tested.convert(propsWithValue(100))); + } + + @Test + void testConvertAboveRange() { + assertThrows(InvalidConfigException.class, () -> tested.convert(propsWithValue(200000))); + } + + @Test + void configKey() { + assertEquals("agent.sqlQueryMaxLength", tested.configKey()); + } + + private DeclarativeConfigProperties propsWithValue(int value) { + String yaml = "agent.sqlQueryMaxLength: " + value + "\n"; + return DeclarativeConfiguration.toConfigProperties( + new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8))); + } +} diff --git a/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/TriggerTraceParserTest.java b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/TriggerTraceParserTest.java new file mode 100644 index 00000000..0134562a --- /dev/null +++ b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/TriggerTraceParserTest.java @@ -0,0 +1,64 @@ +/* + * © SolarWinds Worldwide, LLC. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.solarwinds.opentelemetry.extensions.config.parser.yaml; + +import static org.junit.jupiter.api.Assertions.*; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; +import java.io.IOException; +import java.io.InputStream; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class TriggerTraceParserTest { + private static DeclarativeConfigProperties declarativeConfigProperties; + private final TriggerTraceParser tested = new TriggerTraceParser(); + + @BeforeAll + static void setup() { + try (InputStream resourceAsStream = + TriggerTraceParserTest.class.getResourceAsStream("/sdk-config.yaml")) { + DeclarativeConfigProperties configProperties = + DeclarativeConfiguration.toConfigProperties(resourceAsStream); + declarativeConfigProperties = + configProperties + .getStructured("instrumentation/development", DeclarativeConfigProperties.empty()) + .getStructured("java", DeclarativeConfigProperties.empty()) + .getStructured("solarwinds"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Test + void testConvertTrue() { + Boolean result = tested.convert(declarativeConfigProperties); + assertTrue(result); + } + + @Test + void testConvertNull() { + Boolean result = tested.convert(DeclarativeConfigProperties.empty()); + assertTrue(result); + } + + @Test + void configKey() { + assertEquals("agent.triggerTrace", tested.configKey()); + } +} diff --git a/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProviderTest.java b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProviderTest.java index cabf3c53..5dc306ca 100644 --- a/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProviderTest.java +++ b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProviderTest.java @@ -17,10 +17,13 @@ package com.solarwinds.opentelemetry.extensions.config.provider; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.doNothing; +import com.solarwinds.joboe.config.ConfigManager; import com.solarwinds.joboe.config.ConfigProperty; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeLimitsModel; @@ -34,6 +37,7 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PeriodicMetricReaderModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PropagatorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorPropertyModel; @@ -50,6 +54,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +@SuppressWarnings("all") @ExtendWith(MockitoExtension.class) class SharedConfigCustomizerProviderTest { @@ -65,6 +70,8 @@ class SharedConfigCustomizerProviderTest { void testCustomize() { OpenTelemetryConfigurationModel openTelemetryConfigurationModel = new OpenTelemetryConfigurationModel() + .withTracerProvider(new TracerProviderModel()) + .withLoggerProvider(new LoggerProviderModel()) .withInstrumentationDevelopment( new ExperimentalInstrumentationModel() .withJava( @@ -131,6 +138,7 @@ void testCustomize() { void testCustomize1() { OpenTelemetryConfigurationModel openTelemetryConfigurationModel = new OpenTelemetryConfigurationModel() + .withTracerProvider(new TracerProviderModel()) .withInstrumentationDevelopment( new ExperimentalInstrumentationModel() .withJava( @@ -194,6 +202,7 @@ void testCustomize1() { void testCustomizeSetsExperimentalStacktraceWhenNotSet() { OpenTelemetryConfigurationModel openTelemetryConfigurationModel = new OpenTelemetryConfigurationModel() + .withTracerProvider(new TracerProviderModel()) .withInstrumentationDevelopment( new ExperimentalInstrumentationModel() .withJava( @@ -270,6 +279,7 @@ void testCustomizeSetExperimentalStacktraceFilterWhenNotSet() { void testCustomize2() { OpenTelemetryConfigurationModel openTelemetryConfigurationModel = new OpenTelemetryConfigurationModel() + .withLoggerProvider(new LoggerProviderModel()) .withInstrumentationDevelopment( new ExperimentalInstrumentationModel() .withJava( @@ -310,6 +320,7 @@ void testCustomize2() { void UrlShouldNotChangeWhenNotApm() { OpenTelemetryConfigurationModel openTelemetryConfigurationModel = new OpenTelemetryConfigurationModel() + .withLoggerProvider(new LoggerProviderModel()) .withInstrumentationDevelopment( new ExperimentalInstrumentationModel() .withJava( @@ -350,6 +361,7 @@ void UrlShouldNotChangeWhenNotApm() { void UrlShouldNotChangeWhenNotApm2() { OpenTelemetryConfigurationModel openTelemetryConfigurationModel = new OpenTelemetryConfigurationModel() + .withLoggerProvider(new LoggerProviderModel()) .withInstrumentationDevelopment( new ExperimentalInstrumentationModel() .withJava( @@ -385,4 +397,128 @@ void UrlShouldNotChangeWhenNotApm2() { assertEquals("http://localhost:4317/v1/logs", logConfigs.get("endpoint")); assertEquals("authorization=Bearer token", logConfigs.get("headers_list")); } + + @Test + void tracesNotConfiguredWhenTracerProviderAbsent() { + OpenTelemetryConfigurationModel openTelemetryConfigurationModel = + new OpenTelemetryConfigurationModel() + .withLoggerProvider(new LoggerProviderModel()) + .withInstrumentationDevelopment( + new ExperimentalInstrumentationModel() + .withJava( + new ExperimentalLanguageSpecificInstrumentationModel() + .withAdditionalProperty( + "solarwinds", + new ExperimentalLanguageSpecificInstrumentationPropertyModel() + .withAdditionalProperty( + ConfigProperty.AGENT_SERVICE_KEY.getConfigFileKey(), + "token:service") + .withAdditionalProperty( + ConfigProperty.AGENT_COLLECTOR.getConfigFileKey(), + "apm.collector.com")))); + + doNothing() + .when(declarativeConfigurationCustomizerMock) + .addModelCustomizer(functionArgumentCaptor.capture()); + + tested.customize(declarativeConfigurationCustomizerMock); + functionArgumentCaptor.getValue().apply(openTelemetryConfigurationModel); + + assertNull(openTelemetryConfigurationModel.getTracerProvider()); + assertNotNull(openTelemetryConfigurationModel.getLoggerProvider()); + assertNotNull(openTelemetryConfigurationModel.getMeterProvider()); + assertNotNull(openTelemetryConfigurationModel.getPropagator()); + } + + @Test + void logsNotConfiguredWhenLoggerProviderAbsent() { + OpenTelemetryConfigurationModel openTelemetryConfigurationModel = + new OpenTelemetryConfigurationModel() + .withTracerProvider(new TracerProviderModel()) + .withInstrumentationDevelopment( + new ExperimentalInstrumentationModel() + .withJava( + new ExperimentalLanguageSpecificInstrumentationModel() + .withAdditionalProperty( + "solarwinds", + new ExperimentalLanguageSpecificInstrumentationPropertyModel() + .withAdditionalProperty( + ConfigProperty.AGENT_SERVICE_KEY.getConfigFileKey(), + "token:service") + .withAdditionalProperty( + ConfigProperty.AGENT_COLLECTOR.getConfigFileKey(), + "apm.collector.com")))); + + doNothing() + .when(declarativeConfigurationCustomizerMock) + .addModelCustomizer(functionArgumentCaptor.capture()); + + tested.customize(declarativeConfigurationCustomizerMock); + functionArgumentCaptor.getValue().apply(openTelemetryConfigurationModel); + + assertNull(openTelemetryConfigurationModel.getLoggerProvider()); + assertNotNull(openTelemetryConfigurationModel.getTracerProvider()); + assertNotNull(openTelemetryConfigurationModel.getTracerProvider().getSampler()); + assertNotNull(openTelemetryConfigurationModel.getMeterProvider()); + } + + @Test + void propagatorsAppendedToExistingCompositeList() { + OpenTelemetryConfigurationModel openTelemetryConfigurationModel = + new OpenTelemetryConfigurationModel() + .withPropagator(new PropagatorModel().withCompositeList("tracecontext,baggage")) + .withInstrumentationDevelopment( + new ExperimentalInstrumentationModel() + .withJava( + new ExperimentalLanguageSpecificInstrumentationModel() + .withAdditionalProperty( + "solarwinds", + new ExperimentalLanguageSpecificInstrumentationPropertyModel() + .withAdditionalProperty( + ConfigProperty.AGENT_SERVICE_KEY.getConfigFileKey(), + "token:service") + .withAdditionalProperty( + ConfigProperty.AGENT_COLLECTOR.getConfigFileKey(), + "apm.collector.com")))); + + doNothing() + .when(declarativeConfigurationCustomizerMock) + .addModelCustomizer(functionArgumentCaptor.capture()); + + tested.customize(declarativeConfigurationCustomizerMock); + functionArgumentCaptor.getValue().apply(openTelemetryConfigurationModel); + + assertEquals( + "tracecontext,baggage," + ContextPropagatorComponentProvider.COMPONENT_NAME, + openTelemetryConfigurationModel.getPropagator().getCompositeList()); + } + + @Test + void metricsExportDisabledWhenMeterProviderAbsent() { + OpenTelemetryConfigurationModel openTelemetryConfigurationModel = + new OpenTelemetryConfigurationModel() + .withInstrumentationDevelopment( + new ExperimentalInstrumentationModel() + .withJava( + new ExperimentalLanguageSpecificInstrumentationModel() + .withAdditionalProperty( + "solarwinds", + new ExperimentalLanguageSpecificInstrumentationPropertyModel() + .withAdditionalProperty( + ConfigProperty.AGENT_SERVICE_KEY.getConfigFileKey(), + "token:service") + .withAdditionalProperty( + ConfigProperty.AGENT_COLLECTOR.getConfigFileKey(), + "apm.collector.com")))); + + doNothing() + .when(declarativeConfigurationCustomizerMock) + .addModelCustomizer(functionArgumentCaptor.capture()); + + tested.customize(declarativeConfigurationCustomizerMock); + functionArgumentCaptor.getValue().apply(openTelemetryConfigurationModel); + + assertNotNull(openTelemetryConfigurationModel.getMeterProvider()); + assertFalse((Boolean) ConfigManager.getConfig(ConfigProperty.AGENT_EXPORT_METRICS_ENABLED)); + } } diff --git a/libs/shared/src/test/resources/sdk-config.yaml b/libs/shared/src/test/resources/sdk-config.yaml index 9bc99170..55b4ee4e 100644 --- a/libs/shared/src/test/resources/sdk-config.yaml +++ b/libs/shared/src/test/resources/sdk-config.yaml @@ -150,30 +150,7 @@ instrumentation/development: delimiter: ":" attributes: - HandlerName + agent.triggerTrace: true + agent.sqlQueryMaxLength: 4096 agent.serviceKey: ${SW_APM_SERVICE_KEY} - agent.collector: apm.collector.na-01.st-ssp.solarwinds.com - monitor.jmx.enable: true - monitor.jmx.scopes: | - { - "java.lang:type=MemoryPool,*": [ - "Usage" - ], - "java.lang:type=Memory": [ - "HeapMemoryUsage", - "NonHeapMemoryUsage" - ], - "java.lang:type=GarbageCollector,*": [ - "CollectionTime" - ], - "java.lang:type=Threading": [ - "ThreadCount" - ], - "java.lang:type=OperatingSystem": [ - "ProcessCpuTime", - "AvailableProcessors", - "ProcessCpuLoad" - ], - "java.lang:type=Runtime,*": [ - "Uptime" - ] - } + agent.collector: apm.collector.na-01.st-ssp.solarwinds.com \ No newline at end of file diff --git a/sdk-config.yaml b/sdk-config.yaml index d10938c1..0c56ddcd 100644 --- a/sdk-config.yaml +++ b/sdk-config.yaml @@ -28,7 +28,7 @@ tracer_provider: # Configure meter provider. meter_provider: -# Configure logger provider. +# Configure logger provider. Remove to disable log export logger_provider: instrumentation/development: diff --git a/smoke-tests/apm-config.json b/smoke-tests/apm-config.json index 37a6546a..603780d0 100644 --- a/smoke-tests/apm-config.json +++ b/smoke-tests/apm-config.json @@ -19,30 +19,6 @@ "tracing": "disabled" } ], - "monitor.jmx.scopes": { - "java.lang:type=MemoryPool,*": [ - "Usage" - ], - "java.lang:type=Memory": [ - "HeapMemoryUsage", - "NonHeapMemoryUsage" - ], - "java.lang:type=GarbageCollector,*": [ - "CollectionTime" - ], - "java.lang:type=Threading": [ - "ThreadCount" - ], - "java.lang:type=OperatingSystem": [ - "ProcessCpuTime", - "AvailableProcessors", - "ProcessCpuLoad" - ], - "java.lang:type=Runtime,*": [ - "Uptime" - ] - }, - "monitor.jmx.enable": true, "profiler": { "enabled": true, "interval": 10