Skip to content
Open
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
4 changes: 4 additions & 0 deletions agent-lambda/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,11 @@ tasks {
filesMatching("META-INF/services/**") {
duplicatesStrategy = DuplicatesStrategy.INCLUDE
}

exclude("**/module-info.class")
filesMatching(listOf("META-INF/LICENSE", "META-INF/LICENSE.txt", "META-INF/NOTICE", "META-INF/NOTICE.txt")) {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
Comment thread
cleverchuk marked this conversation as resolved.

// exclude known bootstrap dependencies - they can't appear in the inst/ directory
dependencies {
Expand Down
5 changes: 5 additions & 0 deletions agent/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,11 @@ tasks {
filesMatching("META-INF/services/**") {
duplicatesStrategy = DuplicatesStrategy.INCLUDE
}

filesMatching(listOf("META-INF/LICENSE", "META-INF/LICENSE.txt", "META-INF/NOTICE", "META-INF/NOTICE.txt")) {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
Comment thread
cleverchuk marked this conversation as resolved.

exclude("**/module-info.class")

// exclude known bootstrap dependencies - they can't appear in the inst/ directory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package com.solarwinds.opentelemetry.extensions;

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

import com.google.auto.service.AutoService;
import com.solarwinds.joboe.config.ConfigManager;
Expand All @@ -39,7 +38,6 @@
import com.solarwinds.opentelemetry.extensions.config.HttpSettingsReaderDelegate;
import io.opentelemetry.javaagent.extension.AgentListener;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
Expand All @@ -56,7 +54,7 @@ public class SolarwindsAgentListener implements AgentListener {

@Override
public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
if (isAgentEnabled() && isUsingSolarwindsSampler(autoConfiguredOpenTelemetrySdk)) {
if (isAgentEnabled()) {
executeStartupTasks();
registerShutdownTasks();
logger.info(
Expand All @@ -66,19 +64,6 @@ public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetr
}
}

boolean isUsingSolarwindsSampler(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
Sampler sampler =
autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().getSdkTracerProvider().getSampler();
boolean verdict = sampler instanceof SolarwindsSampler;
setAgentEnabled(verdict);

if (!verdict) {
logger.warn(
"Not using Solarwinds sampler. Configured sampler is: " + sampler.getDescription());
}
return verdict;
}

private void executeStartupTasks() {
ExecutorService service =
Executors.newSingleThreadExecutor(DaemonThreadFactory.newInstance("post-startup-tasks"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,6 @@ public static boolean isAgentEnabled() {
return agentEnabled;
}

public static void setAgentEnabled(boolean agentEnabled) {
AutoConfigurationCustomizerProviderImpl.agentEnabled =
AutoConfigurationCustomizerProviderImpl.agentEnabled && agentEnabled;
}

@Override
public void customize(@Nonnull AutoConfigurationCustomizer autoConfiguration) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,19 @@

package com.solarwinds.opentelemetry.extensions;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.solarwinds.opentelemetry.extensions.config.provider.AutoConfigurationCustomizerProviderImpl;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.samplers.Sampler;
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)
Expand All @@ -39,35 +39,36 @@ class SolarwindsAgentListenerTest {

@Mock private OpenTelemetrySdk openTelemetrySdkMock;

@Mock private SdkTracerProvider sdkTracerProviderMock;

@Mock private Sampler samplerMock;

@Test
void returnFalseWhenOurSamplerIsNotAttached() {
when(autoConfiguredOpenTelemetrySdkMock.getOpenTelemetrySdk())
.thenReturn(OpenTelemetrySdk.builder().build());

assertFalse(tested.isUsingSolarwindsSampler(autoConfiguredOpenTelemetrySdkMock));
}
void verifySDKIsShutdownWhenBranchIsNotTaken() {
try (MockedStatic<AutoConfigurationCustomizerProviderImpl>
autoConfigurationCustomizerProviderMockedStatic =
mockStatic(AutoConfigurationCustomizerProviderImpl.class)) {

@Test
void returnTrueWhenOurSamplerIsAttached() {
when(autoConfiguredOpenTelemetrySdkMock.getOpenTelemetrySdk()).thenReturn(openTelemetrySdkMock);
autoConfigurationCustomizerProviderMockedStatic
.when(AutoConfigurationCustomizerProviderImpl::isAgentEnabled)
.thenReturn(false);

when(openTelemetrySdkMock.getSdkTracerProvider()).thenReturn(sdkTracerProviderMock);
when(sdkTracerProviderMock.getSampler()).thenReturn(new SolarwindsSampler());
when(autoConfiguredOpenTelemetrySdkMock.getOpenTelemetrySdk())
.thenReturn(openTelemetrySdkMock);

assertTrue(tested.isUsingSolarwindsSampler(autoConfiguredOpenTelemetrySdkMock));
tested.afterAgent(autoConfiguredOpenTelemetrySdkMock);
verify(openTelemetrySdkMock).shutdown();
}
}

@Test
void verifySDKIsShutdownWhenBranchIsNotTaken() {
when(autoConfiguredOpenTelemetrySdkMock.getOpenTelemetrySdk()).thenReturn(openTelemetrySdkMock);
when(openTelemetrySdkMock.getSdkTracerProvider()).thenReturn(sdkTracerProviderMock);
when(sdkTracerProviderMock.getSampler()).thenReturn(samplerMock);
void verifySDKIsNotShutdownWhenBranchIsTaken() {
try (MockedStatic<AutoConfigurationCustomizerProviderImpl>
autoConfigurationCustomizerProviderMockedStatic =
mockStatic(AutoConfigurationCustomizerProviderImpl.class)) {

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

tested.afterAgent(autoConfiguredOpenTelemetrySdkMock);
verify(openTelemetrySdkMock).shutdown();
tested.afterAgent(autoConfiguredOpenTelemetrySdkMock);
verify(openTelemetrySdkMock, never()).shutdown();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package com.solarwinds.opentelemetry.extensions.provider;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.atMostOnce;
import static org.mockito.Mockito.verify;
Expand Down Expand Up @@ -60,13 +59,6 @@ void teardown() throws Throwable {
AGENT_ENABLED_SETTER.invokeExact(true);
}

@Test
void verifyThatWhenDisabledItIsNeverEnabled() {
AutoConfigurationCustomizerProviderImpl.setAgentEnabled(false);
AutoConfigurationCustomizerProviderImpl.setAgentEnabled(true);
assertFalse(AutoConfigurationCustomizerProviderImpl.isAgentEnabled());
}

@Test
void verifyThatOrderReturnsIntMax() {
assertEquals(Integer.MAX_VALUE, tested.order());
Expand Down
1 change: 1 addition & 0 deletions dependencyManagement/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ dependencies {
api("com.github.ben-manes.caffeine:caffeine:2.9.3")

api("io.opentelemetry.contrib:opentelemetry-span-stacktrace:$otelJavaContribVersion")
api("io.opentelemetry.contrib:opentelemetry-cel-sampler:$otelJavaContribVersion")
api("io.opentelemetry.semconv:opentelemetry-semconv-incubating:$opentelemetrySemconvAlpha")

api("io.opentelemetry:opentelemetry-api-incubator:$opentelemetryAlpha")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

import com.google.auto.service.AutoService;
import com.solarwinds.joboe.config.InvalidConfigException;
import com.solarwinds.joboe.config.JavaRuntimeVersionChecker;
import com.solarwinds.joboe.logging.Logger;
import com.solarwinds.joboe.logging.LoggerFactory;
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
Expand All @@ -29,19 +28,11 @@ public class DefaultAutoConfigurationCustomizerProvider
implements AutoConfigurationCustomizerProvider {
private static final Logger logger = LoggerFactory.getLogger();

private static boolean agentEnabled;
private static boolean agentEnabled = true;

static {
try {
agentEnabled = JavaRuntimeVersionChecker.isJdkVersionSupported();
if (agentEnabled) {
LambdaConfigurationLoader.load();
} else {
logger.warn(
String.format(
"Unsupported Java runtime version: %s. The lowest Java version supported is %s.",
System.getProperty("java.version"), JavaRuntimeVersionChecker.minVersionSupported));
}
LambdaConfigurationLoader.load();

} catch (InvalidConfigException invalidConfigException) {
logger.warn("Error loading agent config", invalidConfigException);
Expand All @@ -57,11 +48,6 @@ public static boolean isAgentEnabled() {
return agentEnabled;
}

public static void setAgentEnabled(boolean agentEnabled) {
DefaultAutoConfigurationCustomizerProvider.agentEnabled =
DefaultAutoConfigurationCustomizerProvider.agentEnabled && agentEnabled;
}

@Override
public void customize(AutoConfigurationCustomizer autoConfiguration) {
autoConfiguration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,13 @@
package com.solarwinds.opentelemetry.extensions;

import static com.solarwinds.opentelemetry.extensions.DefaultAutoConfigurationCustomizerProvider.isAgentEnabled;
import static com.solarwinds.opentelemetry.extensions.DefaultAutoConfigurationCustomizerProvider.setAgentEnabled;

import com.google.auto.service.AutoService;
import com.solarwinds.joboe.logging.Logger;
import com.solarwinds.joboe.logging.LoggerFactory;
import com.solarwinds.joboe.sampling.SettingsManager;
import io.opentelemetry.javaagent.extension.AgentListener;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.trace.samplers.Sampler;

/**
* Executes startup task after it's safe to do so. See <a
Expand All @@ -37,7 +35,7 @@ public class LambdaAgentListener implements AgentListener {

@Override
public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
if (isAgentEnabled() && isUsingSolarwindsSampler(autoConfiguredOpenTelemetrySdk)) {
if (isAgentEnabled()) {
SettingsManager.initialize(
new AwsLambdaSettingsFetcher(new FileSettingsReader("/tmp/solarwinds-apm-settings.json")),
SamplingConfigProvider.getSamplingConfiguration());
Expand All @@ -47,17 +45,4 @@ public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetr
logger.info("SolarwindsAPM OpenTelemetry extensions is disabled");
}
}

boolean isUsingSolarwindsSampler(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
Sampler sampler =
autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().getSdkTracerProvider().getSampler();
boolean verdict = sampler instanceof SolarwindsSampler;
setAgentEnabled(verdict);

if (!verdict) {
logger.warn(
"Not using Solarwinds sampler. Configured sampler is: " + sampler.getDescription());
}
return verdict;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@
import com.solarwinds.joboe.sampling.SettingsManager;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
Expand All @@ -42,10 +40,6 @@ class LambdaAgentListenerTest {

@Mock private OpenTelemetrySdk openTelemetrySdkMock;

@Mock private SdkTracerProvider sdkTracerProviderMock;

@Mock private Sampler samplerMock;

@Test
void verifySettingsManagerIsInitializedWhenConditionsAreMet() {
try (MockedStatic<SettingsManager> settingsManagerMock = mockStatic(SettingsManager.class);
Expand All @@ -56,11 +50,6 @@ void verifySettingsManagerIsInitializedWhenConditionsAreMet() {
defaultAutoConfigurationCustomizerProviderMock
.when(DefaultAutoConfigurationCustomizerProvider::isAgentEnabled)
.thenReturn(true);
when(autoConfiguredOpenTelemetrySdkMock.getOpenTelemetrySdk())
.thenReturn(openTelemetrySdkMock);
when(openTelemetrySdkMock.getSdkTracerProvider()).thenReturn(sdkTracerProviderMock);

when(sdkTracerProviderMock.getSampler()).thenReturn(new SolarwindsSampler());

tested.afterAgent(autoConfiguredOpenTelemetrySdkMock);
settingsManagerMock.verify(() -> SettingsManager.initialize(any(), any()));
Expand All @@ -76,12 +65,10 @@ void verifySettingsManagerIsNotInitialized() {

defaultAutoConfigurationCustomizerProviderMock
.when(DefaultAutoConfigurationCustomizerProvider::isAgentEnabled)
.thenReturn(true);
.thenReturn(false);

when(autoConfiguredOpenTelemetrySdkMock.getOpenTelemetrySdk())
.thenReturn(openTelemetrySdkMock);
when(openTelemetrySdkMock.getSdkTracerProvider()).thenReturn(sdkTracerProviderMock);

when(sdkTracerProviderMock.getSampler()).thenReturn(samplerMock);

tested.afterAgent(autoConfiguredOpenTelemetrySdkMock);
settingsManagerMock.verify(() -> SettingsManager.initialize(any(), any()), never());
Expand All @@ -90,11 +77,19 @@ void verifySettingsManagerIsNotInitialized() {

@Test
void verifySDKIsShutdownWhenBranchIsNotTaken() {
when(autoConfiguredOpenTelemetrySdkMock.getOpenTelemetrySdk()).thenReturn(openTelemetrySdkMock);
when(openTelemetrySdkMock.getSdkTracerProvider()).thenReturn(sdkTracerProviderMock);
when(sdkTracerProviderMock.getSampler()).thenReturn(samplerMock);
try (MockedStatic<DefaultAutoConfigurationCustomizerProvider>
defaultAutoConfigurationCustomizerProviderMock =
mockStatic(DefaultAutoConfigurationCustomizerProvider.class)) {

tested.afterAgent(autoConfiguredOpenTelemetrySdkMock);
verify(openTelemetrySdkMock).shutdown();
defaultAutoConfigurationCustomizerProviderMock
.when(DefaultAutoConfigurationCustomizerProvider::isAgentEnabled)
.thenReturn(false);

when(autoConfiguredOpenTelemetrySdkMock.getOpenTelemetrySdk())
.thenReturn(openTelemetrySdkMock);

tested.afterAgent(autoConfiguredOpenTelemetrySdkMock);
verify(openTelemetrySdkMock).shutdown();
}
Comment thread
cleverchuk marked this conversation as resolved.
}
}
5 changes: 5 additions & 0 deletions libs/shared/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ dependencies {
exclude(module = "opentelemetry-sdk", group = "io.opentelemetry") // the agent includes this
}

implementation("io.opentelemetry.contrib:opentelemetry-cel-sampler") {
exclude(module = "opentelemetry-sdk", group = "io.opentelemetry") // the agent includes this
exclude(group = "com.google.code.findbugs", module = "annotations")
}

implementation("org.json:json")
implementation("com.google.code.gson:gson")
implementation("com.github.ben-manes.caffeine:caffeine")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,10 +152,13 @@ private void addProcessors(TracerProviderModel model) {
}

private void addSampler(TracerProviderModel model) {
model.withSampler(
new SamplerModel()
.withAdditionalProperty(
SamplerComponentProvider.COMPONENT_NAME, new SamplerPropertyModel()));
SamplerModel sampler = model.getSampler();
if (sampler == null) {
model.withSampler(
new SamplerModel()
.withAdditionalProperty(
SamplerComponentProvider.COMPONENT_NAME, new SamplerPropertyModel()));
}
}

private void addContextPropagators(PropagatorModel model) {
Expand Down
Loading
Loading