diff --git a/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProfilingSettingsParser.java b/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProfilingSettingsParser.java deleted file mode 100644 index 017ab358..00000000 --- a/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProfilingSettingsParser.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * © 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.InvalidConfigException; -import com.solarwinds.joboe.core.profiler.ProfilerSetting; -import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; - -@AutoService(DeclarativeConfigPropertyParser.class) -public class ProfilingSettingsParser implements DeclarativeConfigPropertyParser { - private static final String CONFIG_KEY = "profiler"; - - @Override - public ProfilerSetting convert(DeclarativeConfigProperties declarativeConfigProperties) - throws InvalidConfigException { - DeclarativeConfigProperties profilerSettings = - declarativeConfigProperties.getStructured(CONFIG_KEY); - if (profilerSettings == null) { - return null; - } - - boolean enabled = profilerSettings.getBoolean("enabled", false); - int circuitBreakerDurationThreshold = - profilerSettings.getInt("circuitBreakerDurationThreshold", 100); - int circuitBreakerCountThreshold = profilerSettings.getInt("circuitBreakerCountThreshold", 2); - - int interval = profilerSettings.getInt("interval", 20); - if (interval != 0 - && interval - < ProfilerSetting - .MIN_INTERVAL) { // special case for interval 0, it means profiler on standby - throw new InvalidConfigException( - "Profiling interval should be >= " - + ProfilerSetting.MIN_INTERVAL - + " but found " - + interval); - } - - List excludePackages = - profilerSettings.getScalarList("excludePackages", String.class, Collections.emptyList()); - return new ProfilerSetting( - enabled, - new HashSet<>(excludePackages), - interval, - circuitBreakerDurationThreshold, - circuitBreakerCountThreshold); - } - - @Override - public String configKey() { - return CONFIG_KEY; - } -} 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 4497db40..91f3a480 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 @@ -17,19 +17,14 @@ package com.solarwinds.opentelemetry.extensions.config.provider; import com.google.auto.service.AutoService; -import com.solarwinds.joboe.config.JavaRuntimeVersionChecker; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.DeclarativeConfigurationCustomizer; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.DeclarativeConfigurationCustomizerProvider; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ResourceModel; -import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.SpanProcessorModel; -import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.TracerProviderModel; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalResourceDetectionModel; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalResourceDetectorModel; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalResourceDetectorPropertyModel; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ResourceModelAccessor; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; import java.util.List; @AutoService(DeclarativeConfigurationCustomizerProvider.class) @@ -39,11 +34,6 @@ public class CustomConfigCustomizerProvider implements DeclarativeConfigurationC public void customize(DeclarativeConfigurationCustomizer customizer) { customizer.addModelCustomizer( configurationModel -> { - TracerProviderModel tracerProvider = configurationModel.getTracerProvider(); - if (tracerProvider != null) { - addProcessors(tracerProvider); - } - ResourceModel resourceModel = configurationModel.getResource(); if (resourceModel == null) { resourceModel = new ResourceModel(); @@ -88,24 +78,4 @@ private void addResourceDetector(ResourceModel resourceModel) { detectionDevelopment.setDetectors(newDetectors); ResourceModelAccessor.setDetection(resourceModel, detectionDevelopment); } - - private void addProcessors(TracerProviderModel model) { - if (JavaRuntimeVersionChecker.isJdkVersionSupported()) { - List processors = - Collections.singletonList( - new SpanProcessorModel() - .setExtensionProperty( - ProfilingSpanProcessorComponentProvider.COMPONENT_NAME, - new HashMap())); - - List spanProcessorModels = model.getProcessors(); - if (spanProcessorModels == null) { - spanProcessorModels = new ArrayList<>(); - } - - ArrayList allProcessors = new ArrayList<>(spanProcessorModels); - allProcessors.addAll(processors); - model.setProcessors(allProcessors); - } - } } diff --git a/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/ProfilingSpanProcessorComponentProvider.java b/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/ProfilingSpanProcessorComponentProvider.java index 4e659f16..9f08fc5c 100644 --- a/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/ProfilingSpanProcessorComponentProvider.java +++ b/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/ProfilingSpanProcessorComponentProvider.java @@ -17,15 +17,26 @@ package com.solarwinds.opentelemetry.extensions.config.provider; import com.google.auto.service.AutoService; +import com.solarwinds.joboe.config.ConfigManager; +import com.solarwinds.joboe.config.ConfigProperty; +import com.solarwinds.joboe.config.InvalidConfigException; +import com.solarwinds.joboe.config.JavaRuntimeVersionChecker; +import com.solarwinds.joboe.core.profiler.ProfilerSetting; import com.solarwinds.opentelemetry.extensions.SolarwindsProfilingSpanProcessor; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.trace.SpanProcessor; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; @AutoService(ComponentProvider.class) public class ProfilingSpanProcessorComponentProvider implements ComponentProvider { - public static final String COMPONENT_NAME = "swo/profilingSpanProcessor"; + public static final String COMPONENT_NAME = "swo_profiler"; + + private static final List DEFAULT_EXCLUDE_PACKAGES = + Arrays.asList("java", "javax", "com.sun", "sun", "sunw"); @Override public Class getType() { @@ -39,6 +50,46 @@ public String getName() { @Override public SpanProcessor create(DeclarativeConfigProperties declarativeConfigProperties) { + try { + ProfilerSetting convert = convert(declarativeConfigProperties); + ConfigManager.setConfig(ConfigProperty.PROFILER, convert); + } catch (InvalidConfigException e) { + throw new RuntimeException(e); + } + return new SolarwindsProfilingSpanProcessor(); } + + ProfilerSetting convert(DeclarativeConfigProperties profilerSettings) + throws InvalidConfigException { + + boolean enabled = + JavaRuntimeVersionChecker.isJdkVersionSupported() + && profilerSettings.getBoolean("enabled", false); + int circuitBreakerDurationThreshold = + profilerSettings.getInt("circuit_breaker_duration_threshold", 100); + int circuitBreakerCountThreshold = + profilerSettings.getInt("circuit_breaker_count_threshold", 2); + + int interval = profilerSettings.getInt("interval", 20); + if (interval != 0 + && interval + < ProfilerSetting + .MIN_INTERVAL) { // special case for interval 0, it means profiler on standby + throw new InvalidConfigException( + "Profiling interval should be >= " + + ProfilerSetting.MIN_INTERVAL + + " but found " + + interval); + } + + List excludePackages = + profilerSettings.getScalarList("exclude_packages", String.class, DEFAULT_EXCLUDE_PACKAGES); + return new ProfilerSetting( + enabled, + new HashSet<>(excludePackages), + interval, + circuitBreakerDurationThreshold, + circuitBreakerCountThreshold); + } } diff --git a/custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProfilingSettingsParserTest.java b/custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProfilingSettingsParserTest.java deleted file mode 100644 index d5d56a22..00000000 --- a/custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProfilingSettingsParserTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * © 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.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import com.solarwinds.joboe.config.InvalidConfigException; -import com.solarwinds.joboe.core.profiler.ProfilerSetting; -import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.sdk.autoconfigure.declarativeconfig.DeclarativeConfiguration; -import java.io.IOException; -import java.io.InputStream; -import java.util.Collections; -import org.junit.jupiter.api.Test; - -class ProfilingSettingsParserTest { - private final ProfilingSettingsParser tested = new ProfilingSettingsParser(); - - @Test - void testConvert() throws InvalidConfigException { - try (InputStream resourceAsStream = - ProfilingSettingsParserTest.class.getResourceAsStream("/sdk-config.yaml")) { - DeclarativeConfigProperties configProperties = - DeclarativeConfiguration.toConfigProperties(resourceAsStream); - - DeclarativeConfigProperties declarativeConfigProperties = - configProperties - .getStructured("instrumentation/development", DeclarativeConfigProperties.empty()) - .getStructured("java", DeclarativeConfigProperties.empty()) - .getStructured("solarwinds", DeclarativeConfigProperties.empty()); - - ProfilerSetting profilerSetting = tested.convert(declarativeConfigProperties); - assertEquals(new ProfilerSetting(true, Collections.emptySet(), 20, 100, 2), profilerSetting); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Test - void testConvertWithException() { - try (InputStream resourceAsStream = - ProfilingSettingsParserTest.class.getResourceAsStream( - "/sdk-config-bad-transaction-settings-0.yaml")) { - DeclarativeConfigProperties configProperties = - DeclarativeConfiguration.toConfigProperties(resourceAsStream); - - DeclarativeConfigProperties declarativeConfigProperties = - configProperties - .getStructured("instrumentation/development", DeclarativeConfigProperties.empty()) - .getStructured("java", DeclarativeConfigProperties.empty()) - .getStructured("solarwinds", DeclarativeConfigProperties.empty()); - - assertThrows(InvalidConfigException.class, () -> tested.convert(declarativeConfigProperties)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Test - void configKey() { - assertEquals("profiler", tested.configKey()); - } -} 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 06ce707d..25a794cd 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 @@ -28,8 +28,6 @@ import io.opentelemetry.sdk.autoconfigure.declarativeconfig.DeclarativeConfigurationCustomizer; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.OpenTelemetryConfigurationModel; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.ResourceModel; -import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.SpanProcessorModel; -import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.TracerProviderModel; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalResourceDetectionModel; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalResourceDetectorModel; import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalResourceDetectorPropertyModel; @@ -57,64 +55,6 @@ class CustomConfigCustomizerProviderTest { private ArgumentCaptor> functionArgumentCaptor; - @Test - void verifyThatProfilingProcessorIsAddedWhenJdkVersionIsSupported() { - try (MockedStatic javaRuntimeVersionCheckerMockedStatic = - mockStatic(JavaRuntimeVersionChecker.class)) { - javaRuntimeVersionCheckerMockedStatic - .when(JavaRuntimeVersionChecker::isJdkVersionSupported) - .thenReturn(true); - - OpenTelemetryConfigurationModel openTelemetryConfigurationModel = - new OpenTelemetryConfigurationModel() - .setTracerProvider(new TracerProviderModel().setProcessors(Collections.emptyList())); - - doNothing() - .when(declarativeConfigurationCustomizerMock) - .addModelCustomizer(functionArgumentCaptor.capture()); - - tested.customize(declarativeConfigurationCustomizerMock); - functionArgumentCaptor.getValue().apply(openTelemetryConfigurationModel); - - TracerProviderModel tracerProvider = openTelemetryConfigurationModel.getTracerProvider(); - assertNotNull(tracerProvider); - - List processors = tracerProvider.getProcessors(); - assertNotNull( - processors - .get(0) - .getExtensionProperties() - .get(ProfilingSpanProcessorComponentProvider.COMPONENT_NAME)); - } - } - - @Test - void verifyThatProfilingProcessorIsNotAddedWhenJdkVersionIsNotSupported() { - try (MockedStatic javaRuntimeVersionCheckerMockedStatic = - mockStatic(JavaRuntimeVersionChecker.class)) { - javaRuntimeVersionCheckerMockedStatic - .when(JavaRuntimeVersionChecker::isJdkVersionSupported) - .thenReturn(false); - - OpenTelemetryConfigurationModel openTelemetryConfigurationModel = - new OpenTelemetryConfigurationModel() - .setTracerProvider(new TracerProviderModel().setProcessors(Collections.emptyList())); - - doNothing() - .when(declarativeConfigurationCustomizerMock) - .addModelCustomizer(functionArgumentCaptor.capture()); - - tested.customize(declarativeConfigurationCustomizerMock); - functionArgumentCaptor.getValue().apply(openTelemetryConfigurationModel); - - TracerProviderModel tracerProvider = openTelemetryConfigurationModel.getTracerProvider(); - assertNotNull(tracerProvider); - - List processors = tracerProvider.getProcessors(); - assertTrue(processors.isEmpty()); - } - } - @Test void verifyThatResourceDetectorIsAlwaysAdded() { try (MockedStatic javaRuntimeVersionCheckerMockedStatic = diff --git a/custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/ProfilingSpanProcessorComponentProviderTest.java b/custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/ProfilingSpanProcessorComponentProviderTest.java new file mode 100644 index 00000000..b528541d --- /dev/null +++ b/custom/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/ProfilingSpanProcessorComponentProviderTest.java @@ -0,0 +1,119 @@ +/* + * © 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.provider; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.solarwinds.joboe.config.ConfigManager; +import com.solarwinds.joboe.config.ConfigProperty; +import com.solarwinds.joboe.config.InvalidConfigException; +import com.solarwinds.joboe.config.JavaRuntimeVersionChecker; +import com.solarwinds.joboe.core.profiler.ProfilerSetting; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.autoconfigure.declarativeconfig.DeclarativeConfiguration; +import io.opentelemetry.sdk.trace.SpanProcessor; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +class ProfilingSpanProcessorComponentProviderTest { + + private static final Set DEFAULT_EXCLUDES = + new HashSet<>(Arrays.asList("java", "javax", "com.sun", "sun", "sunw")); + + private final ProfilingSpanProcessorComponentProvider tested = + new ProfilingSpanProcessorComponentProvider(); + + @AfterEach + void tearDown() { + ConfigManager.reset(); + } + + @Test + void testName() { + assertEquals("swo_profiler", tested.getName()); + } + + @Test + void testConvert() throws InvalidConfigException { + ProfilerSetting profilerSetting = tested.convert(loadProfilerConfig("/sdk-config.yaml")); + assertEquals(new ProfilerSetting(true, DEFAULT_EXCLUDES, 20, 100, 2), profilerSetting); + } + + @Test + void testConvertDisablesProfilerWhenJdkUnsupported() throws InvalidConfigException { + try (MockedStatic checker = + Mockito.mockStatic(JavaRuntimeVersionChecker.class)) { + checker.when(JavaRuntimeVersionChecker::isJdkVersionSupported).thenReturn(false); + + ProfilerSetting profilerSetting = tested.convert(loadProfilerConfig("/sdk-config.yaml")); + assertEquals(new ProfilerSetting(false, DEFAULT_EXCLUDES, 20, 100, 2), profilerSetting); + } + } + + @Test + void testConvertWithException() { + DeclarativeConfigProperties config = loadProfilerConfig("/sdk-config-bad.yaml"); + assertThrows(InvalidConfigException.class, () -> tested.convert(config)); + } + + @Test + void testCreateSetsProfilerConfig() { + SpanProcessor processor = tested.create(loadProfilerConfig("/sdk-config.yaml")); + + assertNotNull(processor); + assertEquals( + new ProfilerSetting(true, DEFAULT_EXCLUDES, 20, 100, 2), + ConfigManager.getConfig(ConfigProperty.PROFILER)); + } + + @Test + void testCreateWithInvalidConfigThrows() { + DeclarativeConfigProperties config = loadProfilerConfig("/sdk-config-bad.yaml"); + assertThrows(RuntimeException.class, () -> tested.create(config)); + } + + private DeclarativeConfigProperties loadProfilerConfig(String resource) { + try (InputStream resourceAsStream = + ProfilingSpanProcessorComponentProviderTest.class.getResourceAsStream(resource)) { + return findProfilerConfig(resourceAsStream, resource); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private DeclarativeConfigProperties findProfilerConfig(InputStream in, String name) { + return DeclarativeConfiguration.toConfigProperties(in) + .getStructured("tracer_provider", DeclarativeConfigProperties.empty()) + .getStructuredList("processors", Collections.emptyList()) + .stream() + .map(processor -> processor.getStructured("swo_profiler")) + .filter(Objects::nonNull) + .findFirst() + .orElseThrow(() -> new IllegalStateException("swo_profiler not found in " + name)); + } +} diff --git a/custom/src/test/java/com/solarwinds/opentelemetry/extensions/provider/ProfilingSpanProcessorComponentProviderTest.java b/custom/src/test/java/com/solarwinds/opentelemetry/extensions/provider/ProfilingSpanProcessorComponentProviderTest.java deleted file mode 100644 index 4283c1cd..00000000 --- a/custom/src/test/java/com/solarwinds/opentelemetry/extensions/provider/ProfilingSpanProcessorComponentProviderTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * © 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.provider; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import com.solarwinds.opentelemetry.extensions.config.provider.ProfilingSpanProcessorComponentProvider; -import org.junit.jupiter.api.Test; - -class ProfilingSpanProcessorComponentProviderTest { - - private final ProfilingSpanProcessorComponentProvider tested = - new ProfilingSpanProcessorComponentProvider(); - - @Test - void testName() { - assertEquals("swo/profilingSpanProcessor", tested.getName()); - } -} diff --git a/custom/src/test/resources/sdk-config-bad-transaction-settings-0.yaml b/custom/src/test/resources/sdk-config-bad.yaml similarity index 89% rename from custom/src/test/resources/sdk-config-bad-transaction-settings-0.yaml rename to custom/src/test/resources/sdk-config-bad.yaml index d888a734..a23f006a 100644 --- a/custom/src/test/resources/sdk-config-bad-transaction-settings-0.yaml +++ b/custom/src/test/resources/sdk-config-bad.yaml @@ -19,11 +19,8 @@ resource: - name: service.name value: java-apm-smoke-test -instrumentation/development: - java: - common: - default-enabled: true - solarwinds: - profiler: +tracer_provider: + processors: + - swo_profiler: enabled: true - interval: 1 \ No newline at end of file + interval: 1 diff --git a/custom/src/test/resources/sdk-config.yaml b/custom/src/test/resources/sdk-config.yaml index a0de667b..d69572d2 100644 --- a/custom/src/test/resources/sdk-config.yaml +++ b/custom/src/test/resources/sdk-config.yaml @@ -52,7 +52,8 @@ tracer_provider: # Configure headers. Entries have higher priority than entries from .headers_list. headers_list: ${OTEL_EXPORTER_OTLP_HEADERS} - swo/inboundMetricSpanProcessor: - - swo/profilingSpanProcessor: + - swo_profiler: + enabled: true - swo/inboundMeasurementMetrics: - swo/spanStacktrace: duration: 2 @@ -148,5 +149,3 @@ instrumentation/development: level: trace agent.sqlTag: true agent.tracingMode: enabled - profiler: - enabled: true diff --git a/sdk-config.yaml b/sdk-config.yaml index ffcf4f49..1a561bda 100644 --- a/sdk-config.yaml +++ b/sdk-config.yaml @@ -33,6 +33,15 @@ attribute_limits: # Configure tracer provider. tracer_provider: processors: + - swo_profiler: + enabled: false + interval: 20 + exclude_packages: + - java + - javax + - com.sun + - sun + - sunw # Configure meter provider. meter_provider: @@ -47,14 +56,4 @@ instrumentation/development: runtime_telemetry: emit_experimental_jfr_metrics/development: true common: - default-enabled: true - solarwinds: - profiler: - enabled: false - interval: 20 - excludePackages: - - java - - javax - - com.sun - - sun - - sunw \ No newline at end of file + default-enabled: true \ No newline at end of file diff --git a/smoke-tests/k6/basic.js b/smoke-tests/k6/basic.js index 9a157f39..1010abcf 100644 --- a/smoke-tests/k6/basic.js +++ b/smoke-tests/k6/basic.js @@ -19,7 +19,6 @@ import {check} from "k6"; import names from "./names.js"; const baseUri = `http://petclinic:9966/petclinic/api`; -const webMvcUri = `http://webmvc:8080`; export const options = { duration: "5m", minIterationDuration: "1m", @@ -27,56 +26,6 @@ export const options = { iterations: 25, }; -function verify_that_trace_is_persisted() { - let retryCount = Number.parseInt(`${__ENV.SWO_RETRY_COUNT}`) || 1000; - for (; retryCount > 0; retryCount--) { - const petTypesResponse = http.get(`${baseUri}/pettypes`); - check(petTypesResponse.headers, { - 'should have X-Trace header': (h) => h['X-Trace'] !== undefined - }) - - const traceContext = petTypesResponse.headers['X-Trace'] - const [_, traceId, spanId, flag] = traceContext.split("-") - console.log("Trace context -> ", traceContext) - if ((parseInt(flag, 16) & 1) === 0) continue; - - const traceDetailPayload = { - "operationName": "getTraceDetails", - "variables": { - "traceId": traceId.toUpperCase(), - "spanId": spanId.toUpperCase(), - "aggregateSpans": true - }, - "query": "query getTraceDetails($traceId: ID!, $spanId: ID, $aggregateSpans: Boolean) {\n traceDetails(\n traceId: $traceId\n spanId: $spanId\n aggregateSpans: $aggregateSpans\n ) {\n traceId\n action\n spanCount\n time\n controller\n duration\n originSpan {\n id\n service\n status\n transaction\n duration\n method\n errorCount\n host\n startTime\n action\n controller\n serviceEntity\n containerEntity\n hostEntity\n websiteEntity\n hostEntityName\n websiteEntityName\n serviceInstanceEntityName\n __typename\n }\n selectedSpan {\n id\n service\n status\n transaction\n duration\n method\n errorCount\n host\n startTime\n action\n controller\n serviceEntity\n containerEntity\n hostEntity\n websiteEntity\n hostEntityName\n websiteEntityName\n serviceInstanceEntityName\n __typename\n }\n allErrors {\n hostname\n message\n spanLayer\n time\n exceptionClassMessageHash\n spanId\n __typename\n }\n allQueries {\n ...QueryItem\n __typename\n }\n traceBreakdown {\n duration\n errorCount\n layer\n percentOfTraceDuration\n spanCount\n spanIds\n __typename\n }\n waterfall {\n ...WaterfallRow\n __typename\n }\n __typename\n }\n}\n\nfragment QueryItem on QueryItem {\n averageTime\n count\n query\n queryHash\n totalTime\n percentOfTraceDuration\n spanIds\n dboQueryId\n __typename\n}\n\nfragment WaterfallRow on WaterfallRow {\n parentId\n items {\n layer\n spanId\n endTime\n startTime\n service\n error {\n exceptionClassMessageHash\n message\n spanId\n timestamp\n __typename\n }\n async\n __typename\n }\n __typename\n}\n" - } - - for (; retryCount > 0; retryCount--) { - let traceDetailResponse = http.post(`${__ENV.SWO_HOST_URL}/common/graphql`, JSON.stringify(traceDetailPayload), - { - headers: { - 'Content-Type': 'application/json', - 'Cookie': `${__ENV.SWO_COOKIE}`, - 'X-Csrf-Token': `${__ENV.SWO_XSR_TOKEN}` - } - }); - - traceDetailResponse = JSON.parse(traceDetailResponse.body) - if (traceDetailResponse['errors']) { - console.log("Error -> Trace detail response:", JSON.stringify(traceDetailResponse)) - continue - } - - check(traceDetailResponse, { - "trace is returned": tdr => tdr.data.traceDetails.traceId.toLowerCase() === traceId.toLowerCase() - }); - - return - } - - } - -} - function verify_that_metrics_are_reported(metric, checkFn, service="lambda-e2e") { let retryCount = Number.parseInt(`${__ENV.SWO_RETRY_COUNT}`) || 1000; for (let i = 0; i < retryCount; i++) { @@ -293,5 +242,4 @@ export default function () { }) silence(verify_logs_export) - silence(verify_that_trace_is_persisted) }; diff --git a/smoke-tests/sdk-config.yaml b/smoke-tests/sdk-config.yaml index c0008ddb..583f372b 100644 --- a/smoke-tests/sdk-config.yaml +++ b/smoke-tests/sdk-config.yaml @@ -41,6 +41,15 @@ attribute_limits: tracer_provider: # Configure span processors. processors: + - swo_profiler: + enabled: true + interval: 20 + exclude_packages: + - java + - javax + - com.sun + - sun + - sunw - stacktrace/development: min_duration: 0 - # Configure a batch span processor. @@ -137,15 +146,6 @@ instrumentation/development: common: default-enabled: true solarwinds: - profiler: - enabled: true - interval: 20 - excludePackages: - - java - - javax - - com.sun - - sun - - sunw agent.sqlTag: true agent.sqlTagPrepared: true agent.sqlTagDatabases: diff --git a/smoke-tests/src/test/java/com/solarwinds/SmokeTest.java b/smoke-tests/src/test/java/com/solarwinds/SmokeTest.java index f5a0ebc7..8703dd0d 100644 --- a/smoke-tests/src/test/java/com/solarwinds/SmokeTest.java +++ b/smoke-tests/src/test/java/com/solarwinds/SmokeTest.java @@ -113,19 +113,6 @@ static void runAppOnce(Agent agent) throws Exception { } - @Test - void assertXTrace() throws IOException { - String resultJson = new String(Files.readAllBytes(namingConventions.local.k6Results(Configs.E2E.config.agents().get(0)))); - double fails = ResultsCollector.read(resultJson, "$.root_group.checks.['should have X-Trace header'].fails"); - assertEquals(0, fails, "Less than a 100 percent of the responses has X-Trace header"); - } - - @Test - void assertTraceIngestion() throws IOException { - String resultJson = new String(Files.readAllBytes(namingConventions.local.k6Results(Configs.E2E.config.agents().get(0)))); - double passes = ResultsCollector.read(resultJson, "$.root_group.checks.['trace is returned'].passes"); - assertTrue(passes > 0, "trace ingestion is not working. There maybe network issues"); - } @Test void assertTraceContextInLog() { diff --git a/smoke-tests/src/test/java/com/solarwinds/SmokeTestV2.java b/smoke-tests/src/test/java/com/solarwinds/SmokeTestV2.java index 3ef3fb16..81fba1f7 100644 --- a/smoke-tests/src/test/java/com/solarwinds/SmokeTestV2.java +++ b/smoke-tests/src/test/java/com/solarwinds/SmokeTestV2.java @@ -106,20 +106,6 @@ static void runAppOnce(Agent agent) throws Exception { } - @Test - void assertXTrace() throws IOException { - String resultJson = new String(Files.readAllBytes(namingConventions.local.k6Results(Configs.E2E.config.agents().get(0)))); - double fails = ResultsCollector.read(resultJson, "$.root_group.checks.['should have X-Trace header'].fails"); - assertEquals(0, fails, "Less than a 100 percent of the responses has X-Trace header"); - } - - @Test - void assertTraceIngestion() throws IOException { - String resultJson = new String(Files.readAllBytes(namingConventions.local.k6Results(Configs.E2E.config.agents().get(0)))); - double passes = ResultsCollector.read(resultJson, "$.root_group.checks.['trace is returned'].passes"); - assertTrue(passes > 0, "trace ingestion is not working. There maybe network issues"); - } - @Test void assertTraceContextInLog() { Boolean actual = logStreamAnalyzer.getAnswer().get("trace_id=[a-z0-9]+\\s+span_id=[a-z0-9]+\\s+trace_flags=[0-9a-f]{2}");