33 * SPDX-License-Identifier: Apache-2.0
44 */
55
6- package io .jenkins .plugins .opentelemetry .computer ;
6+ package io .jenkins .plugins .opentelemetry .init ;
77
88import com .cloudbees .simplediskusage .DiskItem ;
9+ import com .cloudbees .simplediskusage .QuickDiskUsageInitializer ;
910import com .cloudbees .simplediskusage .QuickDiskUsagePlugin ;
1011import hudson .Extension ;
11- import hudson .ExtensionPoint ;
1212import hudson .init .InitMilestone ;
1313import hudson .init .Initializer ;
14- import hudson .slaves .ComputerListener ;
1514import io .jenkins .plugins .opentelemetry .OpenTelemetrySdkProvider ;
16- import io .jenkins .plugins .opentelemetry .init .OpenTelemetryPluginAbstractInitializer ;
1715import io .jenkins .plugins .opentelemetry .semconv .JenkinsSemanticMetrics ;
1816import io .opentelemetry .api .metrics .Meter ;
1917import jenkins .YesNoMaybe ;
2018import jenkins .model .Jenkins ;
2119
2220import javax .annotation .Nonnull ;
23- import javax .annotation .PostConstruct ;
2421import javax .inject .Inject ;
2522import java .io .IOException ;
2623import java .util .logging .Level ;
2724import 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 )
3430public 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