Skip to content

Commit 415c7b8

Browse files
committed
feat: move pid management to sensors and out of measures
1 parent 695100e commit 415c7b8

File tree

9 files changed

+57
-102
lines changed

9 files changed

+57
-102
lines changed

backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,14 @@
88
import net.laprun.sustainability.power.SensorMetadata;
99

1010
public abstract class AbstractPowerSensor implements PowerSensor {
11-
protected final Measures measures;
11+
protected final Measures measures = new MapMeasures();
12+
private final PIDRegistry registry = new PIDRegistry();
1213
private long lastUpdateEpoch;
1314
private boolean started;
1415
@ConfigProperty(name = "power-server.enable-cpu-share-sampling", defaultValue = "false")
1516
protected boolean cpuSharesEnabled;
1617
private SensorMetadata metadata;
1718

18-
public AbstractPowerSensor(Measures measures) {
19-
this.measures = measures;
20-
}
21-
22-
public AbstractPowerSensor() {
23-
this(new MapMeasures());
24-
}
25-
2619
@Override
2720
public SensorMetadata metadata() {
2821
if (metadata == null) {
@@ -46,15 +39,31 @@ public void enableCPUShareSampling(boolean enable) {
4639
@Override
4740
public RegisteredPID register(long pid) {
4841
Log.debugf("Registered pid: %d", pid);
49-
return measures.register(pid);
42+
final var key = RegisteredPID.create(pid);
43+
registry.register(key);
44+
return key;
5045
}
5146

5247
@Override
5348
public void unregister(RegisteredPID registeredPID) {
54-
measures.unregister(registeredPID);
49+
registry.unregister(registeredPID);
5550
Log.debugf("Unregistered pid: %d", registeredPID.pid());
5651
}
5752

53+
protected int numberOfRegisteredPIDs() {
54+
return registry.size();
55+
}
56+
57+
@Override
58+
public Set<RegisteredPID> registeredPIDs() {
59+
return registry.pids();
60+
}
61+
62+
@Override
63+
public Set<String> registeredPIDsAsStrings() {
64+
return registry.pidsAsStrings();
65+
}
66+
5867
@Override
5968
public void start() throws Exception {
6069
if (!started) {
@@ -64,6 +73,8 @@ public void start() throws Exception {
6473
}
6574
}
6675

76+
protected abstract void doStart();
77+
6778
@Override
6879
public boolean isStarted() {
6980
return started;
@@ -75,14 +86,6 @@ public void stop() {
7586
started = false;
7687
}
7788

78-
@Override
79-
public Set<String> getRegisteredPIDs() {
80-
return measures.trackedPIDsAsString();
81-
}
82-
83-
protected abstract void doStart();
84-
85-
@Override
8689
public Measures update(long tick) {
8790
final long newUpdateStartEpoch = System.currentTimeMillis();
8891
Log.debugf("Sensor update last called: %dms ago", newUpdateStartEpoch - lastUpdateEpoch);
Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,17 @@
11
package net.laprun.sustainability.power.sensors;
22

3-
import java.util.Set;
43
import java.util.concurrent.ConcurrentHashMap;
54
import java.util.concurrent.ConcurrentMap;
65

76
import net.laprun.sustainability.power.SensorMeasure;
87

98
public class MapMeasures implements Measures {
109
private final ConcurrentMap<RegisteredPID, SensorMeasure> measures = new ConcurrentHashMap<>();
11-
private final PIDRegistry registry = new PIDRegistry();
1210

1311
@Override
14-
public RegisteredPID register(long pid) {
15-
final var key = RegisteredPID.create(pid);
16-
measures.put(key, SensorMeasure.missing);
17-
registry.register(key);
18-
return key;
19-
}
20-
21-
@Override
22-
public void unregister(RegisteredPID registeredPID) {
23-
measures.remove(registeredPID);
24-
registry.unregister(registeredPID);
25-
}
26-
27-
@Override
28-
public Set<RegisteredPID> trackedPIDs() {
29-
return measures.keySet();
30-
}
31-
32-
@Override
33-
public Set<String> trackedPIDsAsString() {
34-
return registry.pids();
35-
}
36-
37-
@Override
38-
public int numberOfTrackedPIDs() {
39-
return measures.size();
40-
}
41-
42-
@Override
43-
public void record(RegisteredPID pid, SensorMeasure sensorMeasure) {
12+
public Measures record(RegisteredPID pid, SensorMeasure sensorMeasure) {
4413
measures.put(pid, sensorMeasure);
14+
return this;
4515
}
4616

4717
@Override
@@ -53,4 +23,9 @@ public SensorMeasure getOrDefault(RegisteredPID pid) {
5323
public String toString() {
5424
return measures.toString();
5525
}
26+
27+
@Override
28+
public void clear() {
29+
measures.clear();
30+
}
5631
}
Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,20 @@
11
package net.laprun.sustainability.power.sensors;
22

3-
import java.util.Set;
4-
53
import net.laprun.sustainability.power.SensorMeasure;
64

75
/**
86
* A representation of ongoing {@link PowerSensor} measures.
97
*/
108
public interface Measures {
119

12-
/**
13-
* Tracks the provided process identifier (pid) in the measures. For sensors that only provide system-wide measures, this
14-
* probably won't be doing much more than track which processes are of interest to clients of the sensor.
15-
*
16-
* @param pid the process identifier which power consumption is supposed to be tracked
17-
* @return a {@link RegisteredPID} recording the tracking of the specified pid by the sensor
18-
*/
19-
RegisteredPID register(long pid);
20-
21-
/**
22-
* Unregisters the specified {@link RegisteredPID} thus signaling that clients are not interested in tracking the
23-
* consumption of the associated process anymore
24-
*
25-
* @param registeredPID the {@link RegisteredPID} that was returned when the process we want to stop tracking was first
26-
* registered
27-
*/
28-
void unregister(RegisteredPID registeredPID);
29-
30-
/**
31-
* Retrieves the set of tracked process identifiers
32-
*
33-
* @return the set of tracked process identifiers
34-
*/
35-
Set<RegisteredPID> trackedPIDs();
36-
37-
Set<String> trackedPIDsAsString();
38-
39-
/**
40-
* Retrieves the number of tracked processes
41-
*
42-
* @return the number of tracked processes
43-
*/
44-
int numberOfTrackedPIDs();
45-
4610
/**
4711
* Records the specified measure and associates it to the specified tracked process, normally called once per tick
4812
*
4913
* @param pid the {@link RegisteredPID} representing the tracked process with which the recorded measure needs to be
5014
* associated
5115
* @param sensorMeasure the {@link SensorMeasure} to be recorded
5216
*/
53-
void record(RegisteredPID pid, SensorMeasure sensorMeasure);
17+
Measures record(RegisteredPID pid, SensorMeasure sensorMeasure);
5418

5519
/**
5620
* Retrieves the last recorded {@link SensorMeasure} associated with the specified {@link RegisteredPID}
@@ -60,10 +24,14 @@ public interface Measures {
6024
* it cannot be
6125
* retrieved for any reason
6226
*/
63-
SensorMeasure getOrDefault(RegisteredPID pid);
27+
default SensorMeasure getOrDefault(RegisteredPID pid) {
28+
return SensorMeasure.missing;
29+
}
6430

6531
@SuppressWarnings("unused")
6632
default SensorMeasure getSystemTotal() {
6733
return getOrDefault(RegisteredPID.SYSTEM_TOTAL_REGISTERED_PID);
6834
}
35+
36+
void clear();
6937
}

backend/src/main/java/net/laprun/sustainability/power/sensors/PIDRegistry.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,32 @@
22

33
import java.util.HashSet;
44
import java.util.Set;
5+
import java.util.stream.Collectors;
56

67
public class PIDRegistry {
7-
private final Set<String> pids = new HashSet<>();
8+
private final Set<RegisteredPID> pids = new HashSet<>();
89

910
public void register(RegisteredPID registeredPID) {
1011
if (!RegisteredPID.SYSTEM_TOTAL_REGISTERED_PID.equals(registeredPID)) {
11-
pids.add(registeredPID.pidAsString());
12+
pids.add(registeredPID);
1213
}
1314
}
1415

1516
public void unregister(RegisteredPID registeredPID) {
1617
if (!RegisteredPID.SYSTEM_TOTAL_REGISTERED_PID.equals(registeredPID)) {
17-
pids.remove(registeredPID.pidAsString());
18+
pids.remove(registeredPID);
1819
}
1920
}
2021

21-
public Set<String> pids() {
22+
public Set<String> pidsAsStrings() {
23+
return pids.stream().map(RegisteredPID::pidAsString).collect(Collectors.toSet());
24+
}
25+
26+
public Set<RegisteredPID> pids() {
2227
return pids;
2328
}
29+
30+
public int size() {
31+
return pids.size();
32+
}
2433
}

backend/src/main/java/net/laprun/sustainability/power/sensors/PowerSensor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,7 @@ default void stop() {
8282
*/
8383
void unregister(RegisteredPID registeredPID);
8484

85-
Set<String> getRegisteredPIDs();
85+
Set<String> registeredPIDsAsStrings();
86+
87+
Set<RegisteredPID> registeredPIDs();
8688
}

backend/src/main/java/net/laprun/sustainability/power/sensors/SamplingMeasurer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ private void startSamplingIfNeeded() throws Exception {
108108
if (sensor.wantsCPUShareSamplingEnabled()) {
109109
// if enabled, record a cpu share for each tick, group by the over sampling factor and average over these aggregates to produce one value for the power measure interval
110110
cpuSharesMulti = cpuSharesTicks
111-
.map(tick -> CPUShare.cpuSharesFor(sensor.getRegisteredPIDs()))
111+
.map(tick -> CPUShare.cpuSharesFor(sensor.registeredPIDsAsStrings()))
112112
.group()
113113
.intoLists()
114114
.of(overSamplingFactor)

backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch) {
147147
newUpdateStartEpoch);
148148

149149
final var single = new NoDurationSensorMeasure(measure, lastUpdateEpoch, newUpdateStartEpoch);
150-
measures.trackedPIDs().forEach(pid -> measures.record(pid, single));
150+
registeredPIDs().forEach(pid -> measures.record(pid, single));
151151

152152
return measures;
153153
}

backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/MacOSPowermetricsSensor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ Measures extractPowerMeasure(InputStream powerMeasureInput, long lastUpdateEpoch
7272
Log.debugf("powermetrics measure extraction last called %dms ago", (start - lastCalled));
7373
lastCalled = start;
7474
}
75-
PowerMetricsParser.extractPowerMeasure(powerMeasureInput, measures, lastUpdateEpoch, newUpdateEpoch,
76-
measures.trackedPIDs(), metadata(), cpu);
75+
PowerMetricsParser.extractPowerMeasure(powerMeasureInput, measures, lastUpdateEpoch, newUpdateEpoch, registeredPIDs(),
76+
metadata(), cpu);
7777
return measures;
7878
}
7979

@@ -88,7 +88,7 @@ protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch) {
8888
public void unregister(RegisteredPID registeredPID) {
8989
super.unregister(registeredPID);
9090
// if we're not tracking any processes anymore, stop powermetrics as well
91-
if (measures.numberOfTrackedPIDs() == 0) {
91+
if (numberOfRegisteredPIDs() == 0) {
9292
stop();
9393
}
9494
}

backend/src/main/java/net/laprun/sustainability/power/sensors/test/TestPowerSensor.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import net.laprun.sustainability.power.SensorMetadata;
88
import net.laprun.sustainability.power.measures.NoDurationSensorMeasure;
99
import net.laprun.sustainability.power.sensors.AbstractPowerSensor;
10-
import net.laprun.sustainability.power.sensors.MapMeasures;
1110
import net.laprun.sustainability.power.sensors.Measures;
1211

1312
@SuppressWarnings("unused")
@@ -23,7 +22,6 @@ public TestPowerSensor() {
2322
}
2423

2524
public TestPowerSensor(SensorMetadata metadata) {
26-
super(new MapMeasures());
2725
this.metadata = metadata;
2826
}
2927

@@ -39,7 +37,7 @@ public void doStart() {
3937

4038
@Override
4139
protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch) {
42-
measures.trackedPIDs().forEach(pid -> measures.record(pid,
40+
registeredPIDs().forEach(pid -> measures.record(pid,
4341
new NoDurationSensorMeasure(new double[] { Math.random() }, lastUpdateEpoch, newUpdateStartEpoch)));
4442
return measures;
4543
}

0 commit comments

Comments
 (0)