Skip to content

Commit 32f00b6

Browse files
committed
wip: initial work on persisting measures to SQLite
1 parent 235b3c4 commit 32f00b6

File tree

8 files changed

+123
-38
lines changed

8 files changed

+123
-38
lines changed

pom.xml

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<?xml version="1.0"?>
1+
<?xml version="1.0" encoding="UTF-8"?>
22
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>net.laprun.sustainability</groupId>
@@ -8,8 +8,7 @@
88

99
<name>power-server : parent</name>
1010
<description>An application allowing to retrieve power consumption and associated metadata on a per-process basis,
11-
via a RESTful endpoint
12-
</description>
11+
via a RESTful endpoint</description>
1312
<url>https://github.com/metacosm/power-server</url>
1413

1514
<licenses>
@@ -184,6 +183,14 @@
184183
<disable>true</disable>
185184
</consoleOutputReporter>
186185
<statelessTestsetInfoReporter implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter">
186+
<printStacktraceOnError>true</printStacktraceOnError>
187+
<printStacktraceOnFailure>true</printStacktraceOnFailure>
188+
<printStdoutOnError>true</printStdoutOnError>
189+
<printStdoutOnFailure>true</printStdoutOnFailure>
190+
<printStdoutOnSuccess>false</printStdoutOnSuccess>
191+
<printStderrOnError>true</printStderrOnError>
192+
<printStderrOnFailure>true</printStderrOnFailure>
193+
<printStderrOnSuccess>false</printStderrOnSuccess>
187194
<theme>UNICODE</theme>
188195
</statelessTestsetInfoReporter>
189196
<systemPropertyVariables>
@@ -204,10 +211,8 @@
204211
</goals>
205212
<configuration>
206213
<systemPropertyVariables>
207-
<native.image.path>${project.build.directory}/${project.build.finalName}-runner
208-
</native.image.path>
209-
<java.util.logging.manager>org.jboss.logmanager.LogManager
210-
</java.util.logging.manager>
214+
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
215+
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
211216
<maven.home>${maven.home}</maven.home>
212217
</systemPropertyVariables>
213218
</configuration>
@@ -318,12 +323,8 @@
318323
</sdkman>
319324
<artifacts>
320325
<artifact>
321-
<path>
322-
{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-linux-x86_64.tar.gz
323-
</path>
324-
<transform>
325-
artifacts/{{distributionName}}-{{projectEffectiveVersion}}-linux-x86_64.tar.gz
326-
</transform>
326+
<path>{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-linux-x86_64.tar.gz</path>
327+
<transform>artifacts/{{distributionName}}-{{projectEffectiveVersion}}-linux-x86_64.tar.gz</transform>
327328
<platform>linux-x86_64</platform>
328329
</artifact>
329330
<!--<artifact>
@@ -336,21 +337,13 @@
336337
<platform>windows-x86_64</platform>
337338
</artifact>-->
338339
<artifact>
339-
<path>
340-
{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-osx-x86_64.tar.gz
341-
</path>
342-
<transform>
343-
artifacts/{{distributionName}}-{{projectEffectiveVersion}}-osx-x86_64.tar.gz
344-
</transform>
340+
<path>{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-osx-x86_64.tar.gz</path>
341+
<transform>artifacts/{{distributionName}}-{{projectEffectiveVersion}}-osx-x86_64.tar.gz</transform>
345342
<platform>osx-x86_64</platform>
346343
</artifact>
347344
<artifact>
348-
<path>
349-
{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-osx-aarch_64.tar.gz
350-
</path>
351-
<transform>
352-
artifacts/{{distributionName}}-{{projectEffectiveVersion}}-osx-aarch_64.tar.gz
353-
</transform>
345+
<path>{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-osx-aarch_64.tar.gz</path>
346+
<transform>artifacts/{{distributionName}}-{{projectEffectiveVersion}}-osx-aarch_64.tar.gz</transform>
354347
<platform>osx-aarch_64</platform>
355348
</artifact>
356349
</artifacts>
@@ -388,12 +381,8 @@
388381
<archive>
389382
<index>true</index>
390383
<manifest>
391-
<addDefaultSpecificationEntries>
392-
true
393-
</addDefaultSpecificationEntries>
394-
<addDefaultImplementationEntries>
395-
true
396-
</addDefaultImplementationEntries>
384+
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
385+
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
397386
</manifest>
398387
<manifestEntries>
399388
<Implementation-URL>${project.url}</Implementation-URL>
@@ -430,12 +419,8 @@
430419
<archive>
431420
<index>true</index>
432421
<manifest>
433-
<addDefaultSpecificationEntries>
434-
true
435-
</addDefaultSpecificationEntries>
436-
<addDefaultImplementationEntries>
437-
true
438-
</addDefaultImplementationEntries>
422+
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
423+
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
439424
</manifest>
440425
<manifestEntries>
441426
<Implementation-URL>${project.url}</Implementation-URL>

server/pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@
2222
<artifactId>power-server-metadata</artifactId>
2323
<version>${project.version}</version>
2424
</dependency>
25+
<dependency>
26+
<groupId>io.quarkus</groupId>
27+
<artifactId>quarkus-hibernate-orm-panache</artifactId>
28+
</dependency>
29+
<dependency>
30+
<groupId>io.quarkiverse.jdbc</groupId>
31+
<artifactId>quarkus-jdbc-sqlite4j</artifactId>
32+
<version>0.0.5</version>
33+
</dependency>
2534
</dependencies>
2635
<build>
2736
<extensions>

server/src/main/java/net/laprun/sustainability/power/PowerMeasurer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import io.smallrye.mutiny.Multi;
1111
import io.smallrye.mutiny.infrastructure.Infrastructure;
12+
import net.laprun.sustainability.power.persistence.Persistence;
1213
import net.laprun.sustainability.power.sensors.Measures;
1314
import net.laprun.sustainability.power.sensors.PowerSensor;
1415

@@ -43,6 +44,7 @@ public Multi<SensorMeasure> startTracking(String pid) throws Exception {
4344
// currently return -1 instead of null but this needs to be properly addressed
4445
return periodicSensorCheck
4546
.map(measures -> measures.getOrDefault(registeredPID))
47+
.onItem().invoke(sm -> Persistence.save(sm, parsedPID))
4648
.onCancellation().invoke(() -> sensor.unregister(registeredPID));
4749
}
4850

server/src/main/java/net/laprun/sustainability/power/PowerResource.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.laprun.sustainability.power;
22

33
import java.time.Duration;
4+
import java.util.List;
45

56
import jakarta.enterprise.event.Observes;
67
import jakarta.inject.Inject;
@@ -12,6 +13,7 @@
1213
import io.quarkus.logging.Log;
1314
import io.quarkus.runtime.StartupEvent;
1415
import io.smallrye.mutiny.Multi;
16+
import net.laprun.sustainability.power.persistence.Measure;
1517

1618
@Path("/power")
1719
public class PowerResource {
@@ -45,4 +47,10 @@ public SensorMetadata metadata() {
4547
public Duration samplingPeriod() {
4648
return measurer.getSamplingPeriod();
4749
}
50+
51+
@GET
52+
@Path("data/{pid}")
53+
public List<Measure> measures(@PathParam("pid") String pid) throws Exception {
54+
return Measure.forPID(Long.parseLong(pid));
55+
}
4856
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package net.laprun.sustainability.power.persistence;
2+
3+
import java.util.List;
4+
5+
import jakarta.persistence.Entity;
6+
7+
import io.quarkus.hibernate.orm.panache.PanacheEntity;
8+
9+
@Entity
10+
public class Measure extends PanacheEntity {
11+
public long pid;
12+
public long startTime;
13+
public long endTime;
14+
public double[] components;
15+
16+
public static List<Measure> forPID(long pid) {
17+
return find("pid", pid).list();
18+
}
19+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package net.laprun.sustainability.power.persistence;
2+
3+
import jakarta.transaction.Transactional;
4+
5+
import net.laprun.sustainability.power.SensorMeasure;
6+
7+
public enum Persistence {
8+
;
9+
10+
@Transactional
11+
public static Measure save(SensorMeasure measure, long parsedPID) {
12+
final var persisted = new Measure();
13+
persisted.components = measure.components();
14+
persisted.pid = parsedPID;
15+
persisted.startTime = measure.timestamp();
16+
persisted.endTime = measure.timestamp() + measure.duration();
17+
persisted.persist();
18+
return persisted;
19+
}
20+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package net.laprun.sustainability.power.persistence;
2+
3+
import java.sql.Connection;
4+
import java.sql.DriverManager;
5+
import java.sql.SQLException;
6+
import java.sql.Statement;
7+
8+
import jakarta.enterprise.event.Observes;
9+
10+
import org.eclipse.microprofile.config.inject.ConfigProperty;
11+
12+
import io.quarkus.logging.Log;
13+
import io.quarkus.runtime.ShutdownEvent;
14+
import io.quarkus.runtime.StartupEvent;
15+
16+
public class SQLiteFilePersister {
17+
@ConfigProperty(name = "quarkus.datasource.jdbc.url")
18+
String jdbcUrl;
19+
20+
@ConfigProperty(name = "power-server.db.location")
21+
String fileName;
22+
23+
public void onStartup(@Observes StartupEvent event) {
24+
25+
}
26+
27+
public void onShutdown(@Observes ShutdownEvent event) {
28+
Log.info("Saving data to " + fileName);
29+
try (
30+
Connection connection = DriverManager.getConnection(jdbcUrl);
31+
Statement statement = connection.createStatement()) {
32+
statement.executeUpdate("backup to " + fileName);
33+
} catch (SQLException e) {
34+
e.printStackTrace(System.err);
35+
}
36+
}
37+
}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1-
quarkus.http.port=20432
1+
quarkus.http.port=20432
2+
quarkus.datasource.jdbc.url=jdbc:sqlite:power-server.db
3+
quarkus.datasource.db-kind=sqlite
4+
5+
quarkus.hibernate-orm.database.generation=create
6+
power-server.db.location=${PWD}/power-server.sqlite

0 commit comments

Comments
 (0)