From 0b23097460e2f4c26331086ee6c8f6a07ee6b260 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 20 Nov 2025 17:11:59 +0100 Subject: [PATCH 1/7] fix: remove unreliable last measured end epoch --- .../sustainability/power/sensors/AbstractPowerSensor.java | 3 +-- .../laprun/sustainability/power/sensors/MapMeasures.java | 7 ------- .../net/laprun/sustainability/power/sensors/Measures.java | 7 ------- .../power/sensors/linux/rapl/SingleMeasureMeasures.java | 5 ----- .../macos/powermetrics/MacOSPowermetricsSensorTest.java | 3 --- 5 files changed, 1 insertion(+), 24 deletions(-) diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java index c83e4270..ecbf2739 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java @@ -101,8 +101,7 @@ public Set getRegisteredPIDs() { public Measures update(Long tick, Map cpuShares) { final long newUpdateStartEpoch = System.currentTimeMillis(); final var measures = doUpdate(lastUpdateEpoch, newUpdateStartEpoch, cpuShares); - lastUpdateEpoch = measures.lastMeasuredUpdateEndEpoch() > 0 ? measures.lastMeasuredUpdateEndEpoch() - : newUpdateStartEpoch; + lastUpdateEpoch = newUpdateStartEpoch; return measures; } diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/MapMeasures.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/MapMeasures.java index f110833b..472c6a86 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/MapMeasures.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/MapMeasures.java @@ -9,7 +9,6 @@ public class MapMeasures implements Measures { private final ConcurrentMap measures = new ConcurrentHashMap<>(); - private long lastMeasuredUpdateStartEpoch; private final PIDRegistry registry = new PIDRegistry(); @Override @@ -43,7 +42,6 @@ public int numberOfTrackedPIDs() { @Override public void record(RegisteredPID pid, SensorMeasure sensorMeasure) { - lastMeasuredUpdateStartEpoch = sensorMeasure.endMs(); measures.put(pid, sensorMeasure); } @@ -52,11 +50,6 @@ public SensorMeasure getOrDefault(RegisteredPID pid) { return measures.getOrDefault(pid, SensorMeasure.missing); } - @Override - public long lastMeasuredUpdateEndEpoch() { - return lastMeasuredUpdateStartEpoch; - } - @Override public void forEach(Consumer consumer) { measures.keySet().forEach(pid -> consumer.accept(getOrDefault(pid))); diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/Measures.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/Measures.java index 25896497..6dfceb48 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/Measures.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/Measures.java @@ -63,13 +63,6 @@ public interface Measures { */ SensorMeasure getOrDefault(RegisteredPID pid); - /** - * Returns the last measured end epoch of an update, if it exists. - * - * @return the last measured end epoch of an update, or {@code -1} if the measure didn't provide that information - */ - long lastMeasuredUpdateEndEpoch(); - default SensorMeasure getSystemTotal() { return getOrDefault(RegisteredPID.SYSTEM_TOTAL_REGISTERED_PID); } diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/SingleMeasureMeasures.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/SingleMeasureMeasures.java index ad81627a..dfff0500 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/SingleMeasureMeasures.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/SingleMeasureMeasures.java @@ -61,9 +61,4 @@ public SensorMeasure getOrDefault(RegisteredPID pid) { public void forEach(Consumer consumer) { throw new UnsupportedOperationException("todo: not implemented yet"); } - - @Override - public long lastMeasuredUpdateEndEpoch() { - return -1; - } } diff --git a/backend/src/test/java/net/laprun/sustainability/power/sensors/macos/powermetrics/MacOSPowermetricsSensorTest.java b/backend/src/test/java/net/laprun/sustainability/power/sensors/macos/powermetrics/MacOSPowermetricsSensorTest.java index 9affdda4..55f01e90 100644 --- a/backend/src/test/java/net/laprun/sustainability/power/sensors/macos/powermetrics/MacOSPowermetricsSensorTest.java +++ b/backend/src/test/java/net/laprun/sustainability/power/sensors/macos/powermetrics/MacOSPowermetricsSensorTest.java @@ -74,7 +74,6 @@ void extractPowerMeasureForM4() { // Process CPU power should be equal to sample ms/s divided for process (here: 116.64) by total samples (1222.65) times total CPU power final var pidCPUShare = 224.05 / totalCPUTime; assertEquals(pidCPUShare * totalCPUPower, getComponent(measure, pid0, cpu)); - assertEquals(startUpdateEpoch + 10458, measure.lastMeasuredUpdateEndEpoch()); } @Test @@ -94,7 +93,6 @@ void checkTotalPowerMeasureEvenWhenRegisteredProcessIsNotFound() { assertEquals(0, getTotalSystemComponent(measure, metadata, MacOSPowermetricsSensor.GPU)); assertEquals(25, getTotalSystemComponent(measure, metadata, MacOSPowermetricsSensor.PACKAGE)); assertEquals(1.0, getTotalSystemComponent(measure, metadata, MacOSPowermetricsSensor.CPU_SHARE)); - assertEquals(startUpdateEpoch + 1012, measure.lastMeasuredUpdateEndEpoch()); } @Test @@ -145,7 +143,6 @@ private static void checkPowerMeasure(String testFileName, float total, String t assertEquals(0.0, getComponent(measure, pid1, gpuMetadata)); assertEquals(0.0, getComponent(measure, pid2, gpuMetadata)); } - assertEquals(startUpdateEpoch + expectedMeasureDuration, measure.lastMeasuredUpdateEndEpoch()); } private static double getComponent(Measures measure, RegisteredPID pid1, SensorMetadata.ComponentMetadata metadata) { From 7f2e7d5baa522048659588cd8afa942eb58ddaeb Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 20 Nov 2025 17:27:55 +0100 Subject: [PATCH 2/7] feat: enable sensors to adjust sampling period if needed This is needed by powermetrics-based sensor as the process has an unavoidable built-in delay (source unknown at this point) that makes it go over the allocated sampling time, thus not able to be refresh on the proper schedule. We therefore need to re --- .../power/sensors/AbstractPowerSensor.java | 7 ++++--- .../power/sensors/PowerSensor.java | 7 +++++-- .../power/sensors/SamplingMeasurer.java | 7 +++++-- .../sensors/linux/rapl/IntelRAPLSensor.java | 2 +- .../powermetrics/MacOSPowermetricsSensor.java | 2 +- .../macos/powermetrics/NuProcessWrapper.java | 2 -- .../ProcessMacOSPowermetricsSensor.java | 19 +++++++++++++++++-- .../power/sensors/test/TestPowerSensor.java | 2 +- .../linux/rapl/IntelRAPLSensorTest.java | 4 ++-- 9 files changed, 36 insertions(+), 16 deletions(-) diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java index ecbf2739..56c98a65 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java @@ -71,11 +71,11 @@ public void unregister(RegisteredPID registeredPID) { } @Override - public void start(long samplingPeriodInMillis) throws Exception { + public void start() throws Exception { if (!started) { lastUpdateEpoch = System.currentTimeMillis(); started = true; - doStart(samplingPeriodInMillis); + doStart(); } } @@ -95,11 +95,12 @@ public Set getRegisteredPIDs() { return measures.trackedPIDsAsString(); } - protected abstract void doStart(long samplingFrequencyInMillis); + protected abstract void doStart(); @Override public Measures update(Long tick, Map cpuShares) { final long newUpdateStartEpoch = System.currentTimeMillis(); + Log.infof("Sensor update for tick: %d, last called: %dms ago", tick, newUpdateStartEpoch - lastUpdateEpoch); final var measures = doUpdate(lastUpdateEpoch, newUpdateStartEpoch, cpuShares); lastUpdateEpoch = newUpdateStartEpoch; return measures; diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/PowerSensor.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/PowerSensor.java index 22ccdab1..a8dd243e 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/PowerSensor.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/PowerSensor.java @@ -26,6 +26,10 @@ default boolean supportsProcessAttribution() { void enableCPUShareSampling(boolean enable); + default long adjustSamplingPeriodIfNeeded(long requestedSamplingPeriodInMillis) { + return requestedSamplingPeriodInMillis; + } + /** * Stops measuring power consumption */ @@ -50,10 +54,9 @@ default void stop() { /** * Starts emitting power consumption measures at the given frequency * - * @param samplingFrequencyInMillis the number of milliseconds between emitted measures * @throws Exception if the sensor couldn't be started for some reason */ - void start(long samplingFrequencyInMillis) throws Exception; + void start() throws Exception; /** * Registers the provided process identifier (pid) with the sensor in case it can provide per-process measures. For sensors diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java index fc2207f0..473ed783 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import io.quarkus.logging.Log; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -26,7 +27,7 @@ @ApplicationScoped public class SamplingMeasurer { - public static final String DEFAULT_SAMPLING_PERIOD = "PT0.5S"; + public static final String DEFAULT_SAMPLING_PERIOD = "PT1S"; @Inject PowerSensor sensor; @@ -67,7 +68,9 @@ RegisteredPID track(long pid) throws Exception { final var registeredPID = sensor.register(pid); if (!sensor.isStarted()) { - sensor.start(samplingPeriod.toMillis()); + final var adjusted = sensor.adjustSamplingPeriodIfNeeded(samplingPeriod.toMillis()); + Log.infof("%s sensor adjusted its sampling period to %dms", sensor.getClass().getSimpleName(), adjusted); + sensor.start(); final var samplingTicks = Multi.createFrom().ticks().every(samplingPeriod); diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensor.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensor.java index 51a0449f..0c287306 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensor.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensor.java @@ -101,7 +101,7 @@ private static boolean addFileIfReadable(String raplFileAsString, SortedMap 100 ? periodInMilliSeconds - 50 : periodInMilliSeconds; this.periodInMilliSecondsAsString = Long.toString(periodInMilliSeconds); } diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/ProcessMacOSPowermetricsSensor.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/ProcessMacOSPowermetricsSensor.java index 71c19058..f9c3ead0 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/ProcessMacOSPowermetricsSensor.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/ProcessMacOSPowermetricsSensor.java @@ -3,7 +3,9 @@ import java.io.InputStream; public class ProcessMacOSPowermetricsSensor extends MacOSPowermetricsSensor { + private static final int MINIMAL_PERIOD_MS = 700; private final ProcessWrapper processWrapper = new NuProcessWrapper(); + private long samplingPeriodInMillis; public ProcessMacOSPowermetricsSensor() { // extract metadata @@ -15,8 +17,21 @@ public ProcessMacOSPowermetricsSensor() { } @Override - public void doStart(long frequency) { - processWrapper.start(frequency); + public long adjustSamplingPeriodIfNeeded(long requestedSamplingPeriodInMillis) { + if (requestedSamplingPeriodInMillis < MINIMAL_PERIOD_MS) { + throw new IllegalArgumentException( + "powermetrics takes around 500ms of incompressible time for each sample, set the sampling period to at least " + + + MINIMAL_PERIOD_MS + " milliseconds to get useful results to also account for processing time."); + } + samplingPeriodInMillis = requestedSamplingPeriodInMillis - 600; + return samplingPeriodInMillis; + } + + @Override + public void doStart() { + super.doStart(); + processWrapper.start(samplingPeriodInMillis); } @Override diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/test/TestPowerSensor.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/test/TestPowerSensor.java index 2a09c460..5cd751d9 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/test/TestPowerSensor.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/test/TestPowerSensor.java @@ -34,7 +34,7 @@ protected SensorMetadata nativeMetadata() { } @Override - public void doStart(long samplingFrequencyInMillis) { + public void doStart() { // nothing to do } diff --git a/backend/src/test/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensorTest.java b/backend/src/test/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensorTest.java index 7eab2b97..56695eb9 100644 --- a/backend/src/test/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensorTest.java +++ b/backend/src/test/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensorTest.java @@ -100,7 +100,7 @@ protected void readAndRecordSensor(BiConsumer onReadingSensorValu void wattComputationShouldWork() throws Exception { final var raplFile = new TestRAPLFile(10000L, 20000L, 30000L); final var sensor = new TestIntelRAPLSensor(new TreeMap<>(Map.of("sensor", raplFile))); - sensor.start(500); + sensor.start(); Thread.sleep(10); // ensure we get enough time between the measure performed during start and the first update final var pid = sensor.register(1234L); final var measures = sensor.update(1L, Map.of()); @@ -118,7 +118,7 @@ void shouldIncludeCPUShareIfRequested() throws Exception { final var raplFile = new TestRAPLFile(10000L, 20000L, 30000L); final var sensor = new TestIntelRAPLSensor(new TreeMap<>(Map.of("sensor", raplFile))); sensor.enableCPUShareSampling(true); - sensor.start(500); + sensor.start(); final var pid = sensor.register(1234L); double cpuShare = 0.3; final var measures = sensor.update(1L, Map.of("1234", cpuShare)); From a63d93d3b2c03b06fb613124c00b3938ea22cc5d Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 20 Nov 2025 17:28:11 +0100 Subject: [PATCH 3/7] fix: do not stop if not started --- .../macos/powermetrics/ProcessMacOSPowermetricsSensor.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/ProcessMacOSPowermetricsSensor.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/ProcessMacOSPowermetricsSensor.java index f9c3ead0..dfea1f9b 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/ProcessMacOSPowermetricsSensor.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/ProcessMacOSPowermetricsSensor.java @@ -41,7 +41,9 @@ protected InputStream getInputStream() { @Override public void stop() { - processWrapper.stop(); - super.stop(); + if (isStarted()) { + processWrapper.stop(); + super.stop(); + } } } From 3d01a3a070695e655ea86c8987a813257758567e Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 20 Nov 2025 17:28:38 +0100 Subject: [PATCH 4/7] fix: run on worker pool --- .../laprun/sustainability/power/sensors/SamplingMeasurer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java index 473ed783..6c80c3ad 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java @@ -79,7 +79,7 @@ RegisteredPID track(long pid) throws Exception { final var cpuSharesMulti = Multi.createFrom().ticks() // over sample but over a shorter period to ensure we have an average that covers most of the sampling period .every(samplingPeriod.minus(50, ChronoUnit.MILLIS).dividedBy(overSamplingFactor)) - .runSubscriptionOn(Infrastructure.getDefaultExecutor()) + .runSubscriptionOn(Infrastructure.getDefaultWorkerPool()) .map(tick -> CPUShare.cpuSharesFor(sensor.getRegisteredPIDs())) .group() .intoLists() From 9aa7ebdb4c89f43ca9773aff3d6341c712035e77 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 20 Nov 2025 17:29:44 +0100 Subject: [PATCH 5/7] fix: remove logging --- .../laprun/sustainability/power/sensors/SamplingMeasurer.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java index 6c80c3ad..c98810b8 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java @@ -8,12 +8,12 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import io.quarkus.logging.Log; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; +import io.quarkus.logging.Log; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.infrastructure.Infrastructure; import io.smallrye.mutiny.subscription.Cancellable; @@ -103,7 +103,6 @@ RegisteredPID track(long pid) throws Exception { .combining() .streams(samplingTicks, cpuSharesMulti) .asTuple() - .log() .map(this::updateSensor); } else { periodicSensorCheck = samplingTicks From f25ee36b021b80b931e0540bfcfafd9991ed3e62 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 20 Nov 2025 17:32:04 +0100 Subject: [PATCH 6/7] refactor: clean-up --- .../power/sensors/SamplingMeasurer.java | 1 + .../linux/rapl/SingleMeasureMeasures.java | 64 ------------------- .../MacOSPowermetricsSensorTest.java | 9 ++- 3 files changed, 5 insertions(+), 69 deletions(-) delete mode 100644 backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/SingleMeasureMeasures.java diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java index c98810b8..b31dada4 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java @@ -154,6 +154,7 @@ public void stop() { manuallyTrackedProcesses.values().forEach(Cancellable::cancel); } + @SuppressWarnings("unused") public void stopTrackingProcess(long processId) { sensor.unregister(RegisteredPID.create(processId)); // cancel associated process tracking diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/SingleMeasureMeasures.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/SingleMeasureMeasures.java deleted file mode 100644 index dfff0500..00000000 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/SingleMeasureMeasures.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.laprun.sustainability.power.sensors.linux.rapl; - -import java.util.HashSet; -import java.util.Set; -import java.util.function.Consumer; - -import net.laprun.sustainability.power.SensorMeasure; -import net.laprun.sustainability.power.sensors.Measures; -import net.laprun.sustainability.power.sensors.PIDRegistry; -import net.laprun.sustainability.power.sensors.RegisteredPID; - -class SingleMeasureMeasures implements Measures { - private final Set trackedPIDs = new HashSet<>(); - private SensorMeasure measure; - private final PIDRegistry registry = new PIDRegistry(); - - void singleMeasure(SensorMeasure sensorMeasure) { - this.measure = sensorMeasure; - } - - @Override - public RegisteredPID register(long pid) { - final var registeredPID = RegisteredPID.create(pid); - trackedPIDs.add(registeredPID); - registry.register(registeredPID); - return registeredPID; - } - - @Override - public void unregister(RegisteredPID registeredPID) { - trackedPIDs.remove(registeredPID); - registry.unregister(registeredPID); - } - - @Override - public Set trackedPIDs() { - return trackedPIDs; - } - - @Override - public Set trackedPIDsAsString() { - return registry.pids(); - } - - @Override - public int numberOfTrackedPIDs() { - return trackedPIDs.size(); - } - - @Override - public void record(RegisteredPID pid, SensorMeasure sensorMeasure) { - throw new UnsupportedOperationException("Shouldn't be needed"); - } - - @Override - public SensorMeasure getOrDefault(RegisteredPID pid) { - return trackedPIDs.contains(pid) && measure != null ? measure : SensorMeasure.missing; - } - - @Override - public void forEach(Consumer consumer) { - throw new UnsupportedOperationException("todo: not implemented yet"); - } -} diff --git a/backend/src/test/java/net/laprun/sustainability/power/sensors/macos/powermetrics/MacOSPowermetricsSensorTest.java b/backend/src/test/java/net/laprun/sustainability/power/sensors/macos/powermetrics/MacOSPowermetricsSensorTest.java index 55f01e90..99ef92af 100644 --- a/backend/src/test/java/net/laprun/sustainability/power/sensors/macos/powermetrics/MacOSPowermetricsSensorTest.java +++ b/backend/src/test/java/net/laprun/sustainability/power/sensors/macos/powermetrics/MacOSPowermetricsSensorTest.java @@ -50,12 +50,12 @@ private static void checkComponent(SensorMetadata metadata, String name, int ind @Test void extractPowerMeasureForM1Max() { - checkPowerMeasure("sonoma-m1max.txt", 211, MacOSPowermetricsSensor.CPU, 1012); + checkPowerMeasure("sonoma-m1max.txt", 211, MacOSPowermetricsSensor.CPU); } @Test void extractPowerMeasureForM2() { - checkPowerMeasure("monterey-m2.txt", 10, MacOSPowermetricsSensor.CPU, 1012); + checkPowerMeasure("monterey-m2.txt", 10, MacOSPowermetricsSensor.CPU); } @Test @@ -97,7 +97,7 @@ void checkTotalPowerMeasureEvenWhenRegisteredProcessIsNotFound() { @Test void extractPowerMeasureForIntel() { - checkPowerMeasure("sonoma-intel.txt", 8.53f, MacOSPowermetricsSensor.PACKAGE, 1002); + checkPowerMeasure("sonoma-intel.txt", 8.53f, MacOSPowermetricsSensor.PACKAGE); } @Test @@ -118,8 +118,7 @@ void extractionShouldWorkForLowProcessIds() { assertEquals(pidCPUShare * 211, getComponent(measure, pid1, cpu)); } - private static void checkPowerMeasure(String testFileName, float total, String totalMeasureName, - long expectedMeasureDuration) { + private static void checkPowerMeasure(String testFileName, float total, String totalMeasureName) { final var startUpdateEpoch = System.currentTimeMillis(); final var sensor = new ResourceMacOSPowermetricsSensor(testFileName, startUpdateEpoch); final var metadata = sensor.metadata(); From 7746a05647956038592b3c37f47071dc592fe33d Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 20 Nov 2025 17:42:29 +0100 Subject: [PATCH 7/7] refactor: clean-up [skip ci] --- .../sustainability/power/sensors/AbstractPowerSensor.java | 2 +- .../laprun/sustainability/power/sensors/MapMeasures.java | 6 ------ .../net/laprun/sustainability/power/sensors/Measures.java | 4 +--- .../power/sensors/linux/rapl/IntelRAPLSensor.java | 1 + .../power/sensors/macos/powermetrics/NuProcessWrapper.java | 1 + .../power/sensors/linux/rapl/IntelRAPLSensorTest.java | 1 + 6 files changed, 5 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java index 56c98a65..c447b9b3 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java @@ -100,7 +100,7 @@ public Set getRegisteredPIDs() { @Override public Measures update(Long tick, Map cpuShares) { final long newUpdateStartEpoch = System.currentTimeMillis(); - Log.infof("Sensor update for tick: %d, last called: %dms ago", tick, newUpdateStartEpoch - lastUpdateEpoch); + Log.debugf("Sensor update last called: %dms ago", newUpdateStartEpoch - lastUpdateEpoch); final var measures = doUpdate(lastUpdateEpoch, newUpdateStartEpoch, cpuShares); lastUpdateEpoch = newUpdateStartEpoch; return measures; diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/MapMeasures.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/MapMeasures.java index 472c6a86..18cd5a64 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/MapMeasures.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/MapMeasures.java @@ -3,7 +3,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.util.function.Consumer; import net.laprun.sustainability.power.SensorMeasure; @@ -49,9 +48,4 @@ public void record(RegisteredPID pid, SensorMeasure sensorMeasure) { public SensorMeasure getOrDefault(RegisteredPID pid) { return measures.getOrDefault(pid, SensorMeasure.missing); } - - @Override - public void forEach(Consumer consumer) { - measures.keySet().forEach(pid -> consumer.accept(getOrDefault(pid))); - } } diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/Measures.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/Measures.java index 6dfceb48..25c62701 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/Measures.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/Measures.java @@ -1,7 +1,6 @@ package net.laprun.sustainability.power.sensors; import java.util.Set; -import java.util.function.Consumer; import net.laprun.sustainability.power.SensorMeasure; @@ -63,9 +62,8 @@ public interface Measures { */ SensorMeasure getOrDefault(RegisteredPID pid); + @SuppressWarnings("unused") default SensorMeasure getSystemTotal() { return getOrDefault(RegisteredPID.SYSTEM_TOTAL_REGISTERED_PID); } - - void forEach(Consumer consumer); } diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensor.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensor.java index 0c287306..8cb6078d 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensor.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensor.java @@ -58,6 +58,7 @@ private static SortedMap defaultRAPLFiles() { return files; } + @SuppressWarnings("NonAsciiCharacters") IntelRAPLSensor(SortedMap files) { if (files.isEmpty()) throw new RuntimeException("Failed to get RAPL energy readings, probably due to lack of read access "); diff --git a/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/NuProcessWrapper.java b/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/NuProcessWrapper.java index 8afc6b00..e33ce079 100644 --- a/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/NuProcessWrapper.java +++ b/backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/NuProcessWrapper.java @@ -10,6 +10,7 @@ public class NuProcessWrapper implements ProcessWrapper { private PowermetricsProcessHandler measureHandler; private String periodInMilliSecondsAsString; + @SuppressWarnings("UnusedReturnValue") private NuProcess exec(PowermetricsProcessHandler handler) { if (handler == null) throw new IllegalArgumentException("Handler cannot be null"); diff --git a/backend/src/test/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensorTest.java b/backend/src/test/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensorTest.java index 56695eb9..3b8f1634 100644 --- a/backend/src/test/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensorTest.java +++ b/backend/src/test/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensorTest.java @@ -132,6 +132,7 @@ void shouldIncludeCPUShareIfRequested() throws Exception { assertEquals(cpuShare, components[2]); } + @SuppressWarnings("SameParameterValue") private SensorMetadata loadMetadata(String... fileNames) { Class clazz = getClass(); final var files = Arrays.stream(fileNames)