Skip to content

Commit

Permalink
Simplify logic, configure otel on all build agents
Browse files Browse the repository at this point in the history
Signed-off-by: Cyrille Le Clerc <cyrille.leclerc@grafana.com>
  • Loading branch information
cyrille-leclerc committed Aug 1, 2024
1 parent 7560c32 commit e9e09d5
Showing 1 changed file with 53 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -41,7 +40,6 @@
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import java.util.logging.Level;
import java.util.logging.Logger;
Expand All @@ -54,79 +52,65 @@ public class OpenTelemetryConfigurerComputerListener extends ComputerListener im

private static final Logger logger = Logger.getLogger(OpenTelemetryConfigurerComputerListener.class.getName());

final AtomicBoolean buildAgentsInstrumentationEnabled = new AtomicBoolean(false);

JenkinsOpenTelemetryPluginConfiguration jenkinsOpenTelemetryPluginConfiguration;

@Override
public void preOnline(Computer computer, Channel channel, FilePath root, TaskListener listener) {
if (buildAgentsInstrumentationEnabled.get()) {
OpenTelemetryConfiguration openTelemetryConfiguration = jenkinsOpenTelemetryPluginConfiguration.toOpenTelemetryConfiguration();
Map<String, String> otelSdkProperties = openTelemetryConfiguration.toOpenTelemetryProperties();
Map<String, String> otelSdkResourceProperties = openTelemetryConfiguration.toOpenTelemetryResourceAsMap();

try {
Object result = configureOpenTelemetrySdkOnComputer(computer, channel, otelSdkProperties, otelSdkResourceProperties).get();
logger.log(Level.FINE, () -> "Updated OpenTelemetry configuration for computer/build-agent '" + computer.getName() + "' with result: " + result);
} catch (InterruptedException e) {
logger.log(Level.INFO, e, () -> "Failure to update OpenTelemetry configuration for computer/build-agent '" + computer.getName() + "'");
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
logger.log(Level.INFO, e, () -> "Failure to update OpenTelemetry configuration for computer/build-agent '" + computer.getName() + "'");
}
OpenTelemetryConfiguration openTelemetryConfiguration = jenkinsOpenTelemetryPluginConfiguration.toOpenTelemetryConfiguration();
Map<String, String> otelSdkProperties = openTelemetryConfiguration.toOpenTelemetryProperties();
Map<String, String> otelSdkResourceProperties = openTelemetryConfiguration.toOpenTelemetryResourceAsMap();

try {
Object result = configureOpenTelemetrySdkOnComputer(computer, channel, otelSdkProperties, otelSdkResourceProperties).get();
logger.log(Level.FINE, () -> "Updated OpenTelemetry configuration for computer/build-agent '" + computer.getName() + "' with result: " + result);
} catch (InterruptedException e) {
logger.log(Level.INFO, e, () -> "Failure to update OpenTelemetry configuration for computer/build-agent '" + computer.getName() + "'");
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
logger.log(Level.INFO, e, () -> "Failure to update OpenTelemetry configuration for computer/build-agent '" + computer.getName() + "'");

Check warning on line 70 in src/main/java/io/jenkins/plugins/opentelemetry/jenkins/OpenTelemetryConfigurerComputerListener.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 66-70 are not covered by tests
}
}

@Inject
public void setJenkinsOpenTelemetryPluginConfiguration(JenkinsOpenTelemetryPluginConfiguration jenkinsOpenTelemetryPluginConfiguration) {
this.jenkinsOpenTelemetryPluginConfiguration = jenkinsOpenTelemetryPluginConfiguration;
ConfigProperties configProperties = this.jenkinsOpenTelemetryPluginConfiguration.getConfigProperties();
this.buildAgentsInstrumentationEnabled.set(configProperties.getBoolean(JenkinsOtelSemanticAttributes.OTEL_INSTRUMENTATION_JENKINS_AGENTS_ENABLED, false));
}

@Override
public void afterConfiguration(ConfigProperties configProperties) {
boolean buildAgentsInstrumentationEnabledPreviousVersion = buildAgentsInstrumentationEnabled.get();
this.buildAgentsInstrumentationEnabled.set(configProperties.getBoolean(JenkinsOtelSemanticAttributes.OTEL_INSTRUMENTATION_JENKINS_AGENTS_ENABLED, false));

// Update the configuration of the Jenkins build agents
OpenTelemetryConfiguration openTelemetryConfiguration = jenkinsOpenTelemetryPluginConfiguration.toOpenTelemetryConfiguration();

Map<String, String> otelSdkProperties = openTelemetryConfiguration.toOpenTelemetryProperties();
Map<String, String> otelSdkResourceProperties = openTelemetryConfiguration.toOpenTelemetryResourceAsMap();

if (!buildAgentsInstrumentationEnabledPreviousVersion && !this.buildAgentsInstrumentationEnabled.get()) {
// build agent instrumentation remains disabled, don't do anything
logger.log(Level.FINE, () -> "Build agent instrumentation remains disabled, no need to update OpenTelemetry configuration on jenkins build agents");
} else {
Computer[] computers = Jenkins.get().getComputers();
List<Future<Object>> configureAgentResults = new ArrayList<>(computers.length);
Arrays.stream(computers).forEach(computer -> {
Node node = computer.getNode();
VirtualChannel channel = computer.getChannel();

logger.log(Level.FINE, () ->
"Evaluate computer.name: '" + computer.getName() +
"', node: " + Optional.ofNullable(node).map(n -> n.getNodeName() + " / " + n.getClass().getName()));

if (node instanceof Jenkins) {
// skip Jenkins controller
} else if (channel == null) {
logger.log(Level.FINE, () -> "Failure to update OpenTelemetry configuration for computer/build-agent '" + computer.getName() + "' as its channel is null, probably offline");
} else {
configureAgentResults.add(configureOpenTelemetrySdkOnComputer(computer, channel, otelSdkProperties, otelSdkResourceProperties));
}
});
configureAgentResults.forEach(result -> {
try {
result.get(10, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
logger.log(Level.WARNING, e, () -> "Failure to update OpenTelemetry configuration for computer/build-agent");
}
Computer[] computers = Jenkins.get().getComputers();
List<Future<Object>> configureAgentResults = new ArrayList<>(computers.length);
Arrays.stream(computers).forEach(computer -> {
Node node = computer.getNode();
VirtualChannel channel = computer.getChannel();

logger.log(Level.FINE, () ->
"Evaluate computer.name: '" + computer.getName() +
"', node: " + Optional.ofNullable(node).map(n -> n.getNodeName() + " / " + n.getClass().getName()));

Check warning on line 96 in src/main/java/io/jenkins/plugins/opentelemetry/jenkins/OpenTelemetryConfigurerComputerListener.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 95-96 are not covered by tests

if (node instanceof Jenkins) {

Check warning on line 98 in src/main/java/io/jenkins/plugins/opentelemetry/jenkins/OpenTelemetryConfigurerComputerListener.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 98 is only partially covered, one branch is missing
// skip Jenkins controller
} else if (channel == null) {
logger.log(Level.FINE, () -> "Failure to update OpenTelemetry configuration for computer/build-agent '" + computer.getName() + "' as its channel is null, probably offline");
} else {
configureAgentResults.add(configureOpenTelemetrySdkOnComputer(computer, channel, otelSdkProperties, otelSdkResourceProperties));

Check warning on line 103 in src/main/java/io/jenkins/plugins/opentelemetry/jenkins/OpenTelemetryConfigurerComputerListener.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 100-103 are not covered by tests
}
});
configureAgentResults.forEach(result -> {
try {
result.get(10, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
logger.log(Level.WARNING, e, () -> "Failure to update OpenTelemetry configuration for computer/build-agent");
}
);
}

}

Check warning on line 112 in src/main/java/io/jenkins/plugins/opentelemetry/jenkins/OpenTelemetryConfigurerComputerListener.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 108-112 are not covered by tests
);
}

/**
Expand All @@ -135,26 +119,22 @@ public void afterConfiguration(ConfigProperties configProperties) {
private Future<Object> configureOpenTelemetrySdkOnComputer(@Nonnull Computer computer, @Nonnull VirtualChannel channel, Map<String, String> otelSdkProperties, Map<String, String> otelSdkResourceProperties) {
Map<String, String> buildAgentOtelSdkProperties;
Map<String, String> buildAgentOtelSdkResourceProperties;
if (this.buildAgentsInstrumentationEnabled.get()) {
final Set<String> filteredResourceKeys = Set.of(
ServiceAttributes.SERVICE_NAME.getKey(),
ServiceIncubatingAttributes.SERVICE_INSTANCE_ID.getKey()
);
buildAgentOtelSdkProperties = new HashMap<>(otelSdkProperties);
buildAgentOtelSdkResourceProperties = new HashMap<>();
otelSdkResourceProperties
.entrySet()
.stream()
.filter(Predicate.not(entry -> filteredResourceKeys.contains(entry.getKey())))
.forEach(entry -> buildAgentOtelSdkResourceProperties.put(entry.getKey(), entry.getValue()));
String serviceName = Optional.ofNullable(otelSdkResourceProperties.get(ServiceAttributes.SERVICE_NAME.getKey())).orElse(JenkinsAttributes.JENKINS) + "-agent";
buildAgentOtelSdkResourceProperties.put(ServiceAttributes.SERVICE_NAME.getKey(), serviceName);
buildAgentOtelSdkResourceProperties.put(JenkinsOtelSemanticAttributes.JENKINS_COMPUTER_NAME.getKey(), computer.getName());
buildAgentOtelSdkResourceProperties.put(JenkinsOtelSemanticAttributes.JENKINS_COMPUTER_NAME.getKey(), computer.getName());
} else {
buildAgentOtelSdkProperties = Collections.emptyMap();
buildAgentOtelSdkResourceProperties = Collections.emptyMap();
}
final Set<String> filteredResourceKeys = Set.of(
ServiceAttributes.SERVICE_NAME.getKey(),
ServiceIncubatingAttributes.SERVICE_INSTANCE_ID.getKey()
);
buildAgentOtelSdkProperties = new HashMap<>(otelSdkProperties);
buildAgentOtelSdkResourceProperties = new HashMap<>();
otelSdkResourceProperties
.entrySet()
.stream()
.filter(Predicate.not(entry -> filteredResourceKeys.contains(entry.getKey())))
.forEach(entry -> buildAgentOtelSdkResourceProperties.put(entry.getKey(), entry.getValue()));
String serviceName = Optional.ofNullable(otelSdkResourceProperties.get(ServiceAttributes.SERVICE_NAME.getKey())).orElse(JenkinsAttributes.JENKINS) + "-agent";
buildAgentOtelSdkResourceProperties.put(ServiceAttributes.SERVICE_NAME.getKey(), serviceName);
buildAgentOtelSdkResourceProperties.put(JenkinsOtelSemanticAttributes.JENKINS_COMPUTER_NAME.getKey(), computer.getName());
buildAgentOtelSdkResourceProperties.put(JenkinsOtelSemanticAttributes.JENKINS_COMPUTER_NAME.getKey(), computer.getName());

OpenTelemetryConfigurerMasterToSlaveCallable callable;
callable = new OpenTelemetryConfigurerMasterToSlaveCallable(buildAgentOtelSdkProperties, buildAgentOtelSdkResourceProperties);

Expand Down

0 comments on commit e9e09d5

Please sign in to comment.