Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,24 +20,19 @@
import static com.solarwinds.opentelemetry.extensions.config.provider.AutoConfigurationCustomizerProviderImpl.setAgentEnabled;

import com.google.auto.service.AutoService;
import com.solarwinds.joboe.config.ConfigGroup;
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.ReporterFactory;
import com.solarwinds.joboe.core.profiler.Profiler;
import com.solarwinds.joboe.core.profiler.ProfilerSetting;
import com.solarwinds.joboe.core.rpc.ClientException;
import com.solarwinds.joboe.core.rpc.ClientManagerProvider;
import com.solarwinds.joboe.core.rpc.RpcClientManager;
import com.solarwinds.joboe.core.util.DaemonThreadFactory;
import com.solarwinds.joboe.core.util.HostInfoUtils;
import com.solarwinds.joboe.logging.Logger;
import com.solarwinds.joboe.logging.LoggerFactory;
import com.solarwinds.joboe.metrics.MetricsCollector;
import com.solarwinds.joboe.metrics.MetricsMonitor;
import com.solarwinds.joboe.metrics.SystemMonitorController;
import com.solarwinds.joboe.metrics.SystemMonitorFactoryImpl;
import com.solarwinds.joboe.sampling.SettingsManager;
import com.solarwinds.opentelemetry.core.AgentState;
import com.solarwinds.opentelemetry.extensions.config.HttpSettingsFetcher;
Expand Down Expand Up @@ -117,29 +112,11 @@ private void executeStartupTasks() {
SamplingConfigProvider.getSamplingConfiguration());
logger.debug("Initialized HostUtils");

logger.info("Starting System monitor");
SystemMonitorController.startWithBuilder(
() ->
new SystemMonitorFactoryImpl(
ConfigManager.getConfigs(ConfigGroup.MONITOR)) {
@Override
protected MetricsMonitor buildMetricsMonitor() {
try {
MetricsCollector metricsCollector =
new MetricsCollector(configs, null);

return MetricsMonitor.buildInstance(configs, metricsCollector);
} catch (InvalidConfigException | ClientException e) {
logger.debug(String.format("Error creating MetricsCollector: %s", e));
}
return null;
}
}.buildMonitors());
logger.debug("Started System monitor");

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Above is no longer needed AO-style metrics code, correct?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mainly tace.jvm.* metrics.

ProfilerSetting profilerSetting =
(ProfilerSetting) ConfigManager.getConfig(ConfigProperty.PROFILER);
if (profilerSetting != null && profilerSetting.isEnabled()) {
if (JavaRuntimeVersionChecker.isJdkVersionSupported()
&& profilerSetting != null
&& profilerSetting.isEnabled()) {
logger.debug("Profiler is enabled, local settings : " + profilerSetting);
Profiler.initialize(
profilerSetting,
Expand All @@ -148,7 +125,7 @@ protected MetricsMonitor buildMetricsMonitor() {
RpcClientManager.getClient(
RpcClientManager.OperationType.PROFILING)));
} else {
logger.debug("Profiler is disabled, local settings : " + profilerSetting);
logger.info("Profiler is disabled, local settings : " + profilerSetting);
}

// now wait for all the latches (for now there's only one for settings)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import static com.solarwinds.opentelemetry.extensions.config.provider.AutoConfigurationCustomizerProviderImpl.isAgentEnabled;

import com.solarwinds.joboe.config.JavaRuntimeVersionChecker;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
import java.util.function.BiFunction;
Expand All @@ -29,9 +30,12 @@ public class SolarwindsTracerProviderCustomizer
public SdkTracerProviderBuilder apply(
SdkTracerProviderBuilder tracerProvider, ConfigProperties config) {
if (isAgentEnabled()) {
if (JavaRuntimeVersionChecker.isJdkVersionSupported()) {
tracerProvider.addSpanProcessor(new SolarwindsProfilingSpanProcessor());
}

tracerProvider
.setSampler(new SolarwindsSampler())
.addSpanProcessor(new SolarwindsProfilingSpanProcessor())
.addSpanProcessor(new InboundMeasurementMetricsGenerator());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,9 @@ public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemet
AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk);

if (configProvider != null) {
boolean jdkVersionSupported = JavaRuntimeVersionChecker.isJdkVersionSupported();
DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig();

if (instrumentationConfig != null && jdkVersionSupported) {
if (instrumentationConfig != null) {
DeclarativeConfigProperties solarwinds =
instrumentationConfig
.getStructured("java", DeclarativeConfigProperties.empty())
Expand All @@ -64,13 +63,11 @@ public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemet
}
}

if (!jdkVersionSupported) {
if (!JavaRuntimeVersionChecker.isJdkVersionSupported()) {
logger.warn(
String.format(
"Unsupported Java runtime version: %s. The lowest Java version supported is %s.",
"Profiling is not supported for Java runtime version: %s . The lowest Java version supported for profiling is %s.",
System.getProperty("java.version"), JavaRuntimeVersionChecker.minVersionSupported));

logger.warn("Solarwinds' extension is disabled");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,12 @@ public static void setAgentEnabled(boolean agentEnabled) {
@Override
public void customize(@Nonnull AutoConfigurationCustomizer autoConfiguration) {
try {
agentEnabled = JavaRuntimeVersionChecker.isJdkVersionSupported();
if (agentEnabled) {
ConfigurationLoader.load();
logger.debug("Loaded via normal config");
} else {
ConfigurationLoader.load();
logger.debug("Loaded via normal config");
if (!JavaRuntimeVersionChecker.isJdkVersionSupported()) {
logger.warn(
String.format(
"Unsupported Java runtime version: %s. The lowest Java version supported is %s.",
"Profiling is not supported for Java runtime version: %s . The lowest Java version supported for profiling is %s.",
System.getProperty("java.version"), JavaRuntimeVersionChecker.minVersionSupported));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.solarwinds.opentelemetry.extensions.config.provider;

import com.google.auto.service.AutoService;
import com.solarwinds.joboe.config.JavaRuntimeVersionChecker;
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer;
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectionModel;
Expand Down Expand Up @@ -80,15 +81,17 @@ private void addResourceDetector(ResourceModel resourceModel) {
}

private void addProcessors(TracerProviderModel model) {
List<SpanProcessorModel> processors =
Collections.singletonList(
new SpanProcessorModel()
.withAdditionalProperty(
ProfilingSpanProcessorComponentProvider.COMPONENT_NAME,
Collections.emptyMap()));
if (JavaRuntimeVersionChecker.isJdkVersionSupported()) {
List<SpanProcessorModel> processors =
Collections.singletonList(
new SpanProcessorModel()
.withAdditionalProperty(
ProfilingSpanProcessorComponentProvider.COMPONENT_NAME,
Collections.emptyMap()));

ArrayList<SpanProcessorModel> allProcessors = new ArrayList<>(model.getProcessors());
allProcessors.addAll(processors);
model.withProcessors(allProcessors);
ArrayList<SpanProcessorModel> allProcessors = new ArrayList<>(model.getProcessors());
allProcessors.addAll(processors);
model.withProcessors(allProcessors);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
/*
* © 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;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.solarwinds.joboe.config.JavaRuntimeVersionChecker;
import com.solarwinds.opentelemetry.extensions.config.provider.AutoConfigurationCustomizerProviderImpl;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
class SolarwindsTracerProviderCustomizerTest {

@InjectMocks private SolarwindsTracerProviderCustomizer tested;

@Mock private SdkTracerProviderBuilder tracerProviderBuilderMock;

@Mock private ConfigProperties configPropertiesMock;

private MockedStatic<AutoConfigurationCustomizerProviderImpl>
autoConfigurationCustomizerProviderImplMockedStatic;

@BeforeEach
void setUp() {
autoConfigurationCustomizerProviderImplMockedStatic =
mockStatic(AutoConfigurationCustomizerProviderImpl.class);
}

@AfterEach
void tearDown() {
autoConfigurationCustomizerProviderImplMockedStatic.close();
}

@Test
void verifyThatProfilingSpanProcessorIsAddedWhenAgentEnabledAndJdkVersionSupported() {
try (MockedStatic<JavaRuntimeVersionChecker> javaRuntimeVersionCheckerMockedStatic =
mockStatic(JavaRuntimeVersionChecker.class)) {

autoConfigurationCustomizerProviderImplMockedStatic
.when(AutoConfigurationCustomizerProviderImpl::isAgentEnabled)
.thenReturn(true);

javaRuntimeVersionCheckerMockedStatic
.when(JavaRuntimeVersionChecker::isJdkVersionSupported)
.thenReturn(true);

when(tracerProviderBuilderMock.addSpanProcessor(any(SpanProcessor.class)))
.thenReturn(tracerProviderBuilderMock);
when(tracerProviderBuilderMock.setSampler(any(Sampler.class)))
.thenReturn(tracerProviderBuilderMock);

tested.apply(tracerProviderBuilderMock, configPropertiesMock);

// Should add SolarwindsProfilingSpanProcessor and InboundMeasurementMetricsGenerator
verify(tracerProviderBuilderMock, times(2)).addSpanProcessor(any(SpanProcessor.class));
verify(tracerProviderBuilderMock).setSampler(any(Sampler.class));
}
}

@Test
void verifyThatProfilingSpanProcessorIsNotAddedWhenJdkVersionNotSupported() {
try (MockedStatic<JavaRuntimeVersionChecker> javaRuntimeVersionCheckerMockedStatic =
mockStatic(JavaRuntimeVersionChecker.class)) {

autoConfigurationCustomizerProviderImplMockedStatic
.when(AutoConfigurationCustomizerProviderImpl::isAgentEnabled)
.thenReturn(true);

javaRuntimeVersionCheckerMockedStatic
.when(JavaRuntimeVersionChecker::isJdkVersionSupported)
.thenReturn(false);

when(tracerProviderBuilderMock.addSpanProcessor(any(SpanProcessor.class)))
.thenReturn(tracerProviderBuilderMock);
when(tracerProviderBuilderMock.setSampler(any(Sampler.class)))
.thenReturn(tracerProviderBuilderMock);

tested.apply(tracerProviderBuilderMock, configPropertiesMock);

// Should only add InboundMeasurementMetricsGenerator, not SolarwindsProfilingSpanProcessor
verify(tracerProviderBuilderMock, times(1)).addSpanProcessor(any(SpanProcessor.class));
verify(tracerProviderBuilderMock).setSampler(any(Sampler.class));
}
}

@Test
void verifyThatNoProcessorsAddedWhenAgentDisabled() {
autoConfigurationCustomizerProviderImplMockedStatic
.when(AutoConfigurationCustomizerProviderImpl::isAgentEnabled)
.thenReturn(false);

tested.apply(tracerProviderBuilderMock, configPropertiesMock);

verify(tracerProviderBuilderMock, never()).addSpanProcessor(any(SpanProcessor.class));
verify(tracerProviderBuilderMock, never()).setSampler(any(Sampler.class));
}
}
Loading
Loading