Skip to content

Commit 1ba1a07

Browse files
Fix integration with the CloudBees Simple Disk Usage Plugin
1 parent a5c59a4 commit 1ba1a07

File tree

1 file changed

+23
-20
lines changed

1 file changed

+23
-20
lines changed

src/main/java/io/jenkins/plugins/opentelemetry/computer/DiskUsageMonitoringInitializer.java renamed to src/main/java/io/jenkins/plugins/opentelemetry/init/DiskUsageMonitoringInitializer.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,62 +3,70 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.jenkins.plugins.opentelemetry.computer;
6+
package io.jenkins.plugins.opentelemetry.init;
77

88
import com.cloudbees.simplediskusage.DiskItem;
9+
import com.cloudbees.simplediskusage.QuickDiskUsageInitializer;
910
import com.cloudbees.simplediskusage.QuickDiskUsagePlugin;
1011
import hudson.Extension;
11-
import hudson.ExtensionPoint;
1212
import hudson.init.InitMilestone;
1313
import hudson.init.Initializer;
14-
import hudson.slaves.ComputerListener;
1514
import io.jenkins.plugins.opentelemetry.OpenTelemetrySdkProvider;
16-
import io.jenkins.plugins.opentelemetry.init.OpenTelemetryPluginAbstractInitializer;
1715
import io.jenkins.plugins.opentelemetry.semconv.JenkinsSemanticMetrics;
1816
import io.opentelemetry.api.metrics.Meter;
1917
import jenkins.YesNoMaybe;
2018
import jenkins.model.Jenkins;
2119

2220
import javax.annotation.Nonnull;
23-
import javax.annotation.PostConstruct;
2421
import javax.inject.Inject;
2522
import java.io.IOException;
2623
import java.util.logging.Level;
2724
import java.util.logging.Logger;
2825

2926
/**
30-
* Note: we extend {@link ComputerListener} instead of a plain {@link ExtensionPoint} because simple ExtensionPoint don't get automatically loaded by Jenkins
31-
* There may be a better API to do this.
27+
* Capture disk usage metrics relying on the {@link QuickDiskUsagePlugin}
3228
*/
33-
@Extension(dynamicLoadable = YesNoMaybe.MAYBE, optional = true)
29+
@Extension(dynamicLoadable = YesNoMaybe.YES, optional = true)
3430
public class DiskUsageMonitoringInitializer {
3531

3632
private final static Logger LOGGER = Logger.getLogger(DiskUsageMonitoringInitializer.class.getName());
3733

3834
protected Meter meter;
3935

36+
/**
37+
* Don't inject the `quickDiskUsagePlugin` using @{@link Inject} because the injected instance is not the right once.
38+
* Lazy load it using {@link Jenkins#getPlugin(Class)}.
39+
*/
4040
protected QuickDiskUsagePlugin quickDiskUsagePlugin;
4141

42-
@Initializer(after = InitMilestone.JOB_LOADED)
42+
/**
43+
* TODO ensure initialized after {@link QuickDiskUsageInitializer#initialize()} has been invoked by Jenkins
44+
* lifecycle before {@link io.opentelemetry.api.metrics.ObservableLongMeasurement#observe(long)} is invoked
45+
*/
46+
@Initializer(after = InitMilestone.JOB_CONFIG_ADAPTED)
4347
public void initialize() {
44-
if (quickDiskUsagePlugin == null) {
45-
LOGGER.log(Level.WARNING, () -> "Plugin 'disk-usage' not loaded, don't start monitoring Jenkins controller disk usage");
46-
} else {
4748
meter.gaugeBuilder(JenkinsSemanticMetrics.JENKINS_DISK_USAGE_BYTES)
4849
.ofLongs()
4950
.setDescription("Disk usage of first level folder in JENKINS_HOME.")
5051
.setUnit("byte")
51-
.buildWithCallback(valueObserver -> valueObserver.observe(calculateDiskUsageInBytes(quickDiskUsagePlugin)));
52+
.buildWithCallback(valueObserver -> valueObserver.observe(calculateDiskUsageInBytes()));
5253
LOGGER.log(Level.FINE, () -> "Start monitoring Jenkins controller disk usage");
54+
}
55+
private long calculateDiskUsageInBytes() {
56+
if (this.quickDiskUsagePlugin == null) {
57+
Jenkins jenkins = Jenkins.get();
58+
QuickDiskUsagePlugin quickDiskUsagePlugin = jenkins.getPlugin(QuickDiskUsagePlugin.class);
59+
if (quickDiskUsagePlugin == null) return 0l;
60+
this.quickDiskUsagePlugin = quickDiskUsagePlugin;
5361
}
62+
return calculateDiskUsageInBytes(quickDiskUsagePlugin);
5463
}
55-
5664
private long calculateDiskUsageInBytes(@Nonnull QuickDiskUsagePlugin diskUsagePlugin) {
5765
LOGGER.log(Level.FINE, "calculateDiskUsageInBytes");
5866
try {
5967
DiskItem disk = diskUsagePlugin.getDirectoriesUsages()
6068
.stream()
61-
.filter(x -> x.getDisplayName().equals("JENKINS_HOME"))
69+
.filter(diskItem -> diskItem.getDisplayName().equals("JENKINS_HOME"))
6270
.findFirst()
6371
.orElse(null);
6472
if (disk == null) {
@@ -72,11 +80,6 @@ private long calculateDiskUsageInBytes(@Nonnull QuickDiskUsagePlugin diskUsagePl
7280
}
7381
}
7482

75-
@Inject
76-
public void setQuickDiskUsagePlugin(QuickDiskUsagePlugin quickDiskUsagePlugin) {
77-
this.quickDiskUsagePlugin = quickDiskUsagePlugin;
78-
}
79-
8083
/**
8184
* Jenkins doesn't support {@link com.google.inject.Provides} so we manually wire dependencies :-(
8285
*/

0 commit comments

Comments
 (0)