Skip to content

Commit c2b7fc1

Browse files
committed
wip: initial work on persisting measures to SQLite
1 parent a905d27 commit c2b7fc1

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
<printStacktraceOnError>true</printStacktraceOnError>
189196
<printStacktraceOnFailure>true</printStacktraceOnFailure>
@@ -212,10 +219,8 @@
212219
</goals>
213220
<configuration>
214221
<systemPropertyVariables>
215-
<native.image.path>${project.build.directory}/${project.build.finalName}-runner
216-
</native.image.path>
217-
<java.util.logging.manager>org.jboss.logmanager.LogManager
218-
</java.util.logging.manager>
222+
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
223+
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
219224
<maven.home>${maven.home}</maven.home>
220225
</systemPropertyVariables>
221226
</configuration>
@@ -326,12 +331,8 @@
326331
</sdkman>
327332
<artifacts>
328333
<artifact>
329-
<path>
330-
{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-linux-x86_64.tar.gz
331-
</path>
332-
<transform>
333-
artifacts/{{distributionName}}-{{projectEffectiveVersion}}-linux-x86_64.tar.gz
334-
</transform>
334+
<path>{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-linux-x86_64.tar.gz</path>
335+
<transform>artifacts/{{distributionName}}-{{projectEffectiveVersion}}-linux-x86_64.tar.gz</transform>
335336
<platform>linux-x86_64</platform>
336337
</artifact>
337338
<!--<artifact>
@@ -344,21 +345,13 @@
344345
<platform>windows-x86_64</platform>
345346
</artifact>-->
346347
<artifact>
347-
<path>
348-
{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-osx-x86_64.tar.gz
349-
</path>
350-
<transform>
351-
artifacts/{{distributionName}}-{{projectEffectiveVersion}}-osx-x86_64.tar.gz
352-
</transform>
348+
<path>{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-osx-x86_64.tar.gz</path>
349+
<transform>artifacts/{{distributionName}}-{{projectEffectiveVersion}}-osx-x86_64.tar.gz</transform>
353350
<platform>osx-x86_64</platform>
354351
</artifact>
355352
<artifact>
356-
<path>
357-
{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-osx-aarch_64.tar.gz
358-
</path>
359-
<transform>
360-
artifacts/{{distributionName}}-{{projectEffectiveVersion}}-osx-aarch_64.tar.gz
361-
</transform>
353+
<path>{{artifactsDir}}/{{distributionName}}-{{projectVersion}}-osx-aarch_64.tar.gz</path>
354+
<transform>artifacts/{{distributionName}}-{{projectEffectiveVersion}}-osx-aarch_64.tar.gz</transform>
362355
<platform>osx-aarch_64</platform>
363356
</artifact>
364357
</artifacts>
@@ -396,12 +389,8 @@
396389
<archive>
397390
<index>true</index>
398391
<manifest>
399-
<addDefaultSpecificationEntries>
400-
true
401-
</addDefaultSpecificationEntries>
402-
<addDefaultImplementationEntries>
403-
true
404-
</addDefaultImplementationEntries>
392+
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
393+
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
405394
</manifest>
406395
<manifestEntries>
407396
<Implementation-URL>${project.url}</Implementation-URL>
@@ -438,12 +427,8 @@
438427
<archive>
439428
<index>true</index>
440429
<manifest>
441-
<addDefaultSpecificationEntries>
442-
true
443-
</addDefaultSpecificationEntries>
444-
<addDefaultImplementationEntries>
445-
true
446-
</addDefaultImplementationEntries>
430+
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
431+
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
447432
</manifest>
448433
<manifestEntries>
449434
<Implementation-URL>${project.url}</Implementation-URL>

server/pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@
3232
<artifactId>quarkus-rest-client</artifactId>
3333
<scope>test</scope>
3434
</dependency>
35+
<dependency>
36+
<groupId>io.quarkus</groupId>
37+
<artifactId>quarkus-hibernate-orm-panache</artifactId>
38+
</dependency>
39+
<dependency>
40+
<groupId>io.quarkiverse.jdbc</groupId>
41+
<artifactId>quarkus-jdbc-sqlite4j</artifactId>
42+
<version>0.0.5</version>
43+
</dependency>
3544
</dependencies>
3645
<build>
3746
<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)