summaryrefslogtreecommitdiff
path: root/opendc-compute/opendc-compute-telemetry/src
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-compute/opendc-compute-telemetry/src')
-rw-r--r--opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/ComputeMetricReader.kt21
-rw-r--r--opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/export/parquet/ParquetHostDataWriter.kt27
-rw-r--r--opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/table/HostTableReader.kt10
3 files changed, 50 insertions, 8 deletions
diff --git a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/ComputeMetricReader.kt b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/ComputeMetricReader.kt
index 91f7cecf..46759ed1 100644
--- a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/ComputeMetricReader.kt
+++ b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/ComputeMetricReader.kt
@@ -30,6 +30,7 @@ import mu.KotlinLogging
import org.opendc.common.Dispatcher
import org.opendc.common.asCoroutineDispatcher
import org.opendc.compute.api.Server
+import org.opendc.compute.carbon.CarbonTrace
import org.opendc.compute.service.ComputeService
import org.opendc.compute.service.driver.Host
import org.opendc.compute.telemetry.table.HostInfo
@@ -55,6 +56,7 @@ public class ComputeMetricReader(
private val monitor: ComputeMonitor,
private val exportInterval: Duration = Duration.ofMinutes(5),
private val startTime: Duration = Duration.ofMillis(0),
+ private val carbonTrace: CarbonTrace = CarbonTrace(null),
) : AutoCloseable {
private val logger = KotlinLogging.logger {}
private val scope = CoroutineScope(dispatcher.asCoroutineDispatcher())
@@ -101,7 +103,7 @@ public class ComputeMetricReader(
val now = this.clock.instant()
for (host in this.service.hosts) {
- val reader = this.hostTableReaders.computeIfAbsent(host) { HostTableReaderImpl(it, startTime) }
+ val reader = this.hostTableReaders.computeIfAbsent(host) { HostTableReaderImpl(it, startTime, carbonTrace) }
reader.record(now)
this.monitor.record(reader.copy())
reader.reset()
@@ -218,6 +220,7 @@ public class ComputeMetricReader(
private class HostTableReaderImpl(
host: Host,
private val startTime: Duration = Duration.ofMillis(0),
+ private val carbonTrace: CarbonTrace = CarbonTrace(null),
) : HostTableReader {
override fun copy(): HostTableReader {
val newHostTable = HostTableReaderImpl(_host)
@@ -244,6 +247,8 @@ public class ComputeMetricReader(
_cpuLostTime = table.cpuLostTime
_powerDraw = table.powerDraw
_energyUsage = table.energyUsage
+ _carbonIntensity = table.carbonIntensity
+ _carbonEmission = table.carbonEmission
_uptime = table.uptime
_downtime = table.downtime
_bootTime = table.bootTime
@@ -322,6 +327,14 @@ public class ComputeMetricReader(
private var _energyUsage = 0.0
private var previousPowerTotal = 0.0
+ override val carbonIntensity: Double
+ get() = _carbonIntensity
+ private var _carbonIntensity = 0.0
+
+ override val carbonEmission: Double
+ get() = _carbonEmission
+ private var _carbonEmission = 0.0
+
override val uptime: Long
get() = _uptime - previousUptime
private var _uptime = 0L
@@ -360,6 +373,9 @@ public class ComputeMetricReader(
_cpuLostTime = hostCpuStats.lostTime
_powerDraw = hostSysStats.powerDraw
_energyUsage = hostSysStats.energyUsage
+ _carbonIntensity = carbonTrace.getCarbonIntensity(absoluteTimestamp)
+
+ _carbonEmission = carbonIntensity * (energyUsage / 3600000.0) // convert energy usage from J to kWh
_uptime = hostSysStats.uptime.toMillis()
_downtime = hostSysStats.downtime.toMillis()
_bootTime = hostSysStats.bootTime
@@ -389,6 +405,9 @@ public class ComputeMetricReader(
_cpuUtilization = 0.0
_powerDraw = 0.0
+ _energyUsage = 0.0
+ _carbonIntensity = 0.0
+ _carbonEmission = 0.0
}
}
diff --git a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/export/parquet/ParquetHostDataWriter.kt b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/export/parquet/ParquetHostDataWriter.kt
index 4fc5a078..dc2d39c2 100644
--- a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/export/parquet/ParquetHostDataWriter.kt
+++ b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/export/parquet/ParquetHostDataWriter.kt
@@ -148,19 +148,27 @@ public class ParquetHostDataWriter(path: File, bufferSize: Int) :
consumer.addDouble(data.energyUsage)
consumer.endField("energy_usage", 18)
- consumer.startField("uptime", 19)
+ consumer.startField("carbon_intensity", 19)
+ consumer.addDouble(data.carbonIntensity)
+ consumer.endField("carbon_intensity", 19)
+
+ consumer.startField("carbon_emission", 20)
+ consumer.addDouble(data.carbonEmission)
+ consumer.endField("carbon_emission", 20)
+
+ consumer.startField("uptime", 21)
consumer.addLong(data.uptime)
- consumer.endField("uptime", 19)
+ consumer.endField("uptime", 21)
- consumer.startField("downtime", 20)
+ consumer.startField("downtime", 22)
consumer.addLong(data.downtime)
- consumer.endField("downtime", 20)
+ consumer.endField("downtime", 22)
val bootTime = data.bootTime
if (bootTime != null) {
- consumer.startField("boot_time", 21)
+ consumer.startField("boot_time", 23)
consumer.addLong(bootTime.toEpochMilli())
- consumer.endField("boot_time", 21)
+ consumer.endField("boot_time", 23)
}
consumer.endMessage()
@@ -234,6 +242,12 @@ public class ParquetHostDataWriter(path: File, bufferSize: Int) :
.required(PrimitiveType.PrimitiveTypeName.DOUBLE)
.named("energy_usage"),
Types
+ .required(PrimitiveType.PrimitiveTypeName.DOUBLE)
+ .named("carbon_intensity"),
+ Types
+ .required(PrimitiveType.PrimitiveTypeName.DOUBLE)
+ .named("carbon_emission"),
+ Types
.required(PrimitiveType.PrimitiveTypeName.INT64)
.named("uptime"),
Types
@@ -241,7 +255,6 @@ public class ParquetHostDataWriter(path: File, bufferSize: Int) :
.named("downtime"),
Types
.optional(PrimitiveType.PrimitiveTypeName.INT64)
-// .`as`(LogicalTypeAnnotation.timestampType(true, LogicalTypeAnnotation.TimeUnit.MILLIS))
.named("boot_time"),
)
.named("host")
diff --git a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/table/HostTableReader.kt b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/table/HostTableReader.kt
index 7246ef55..e6b19c11 100644
--- a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/table/HostTableReader.kt
+++ b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/table/HostTableReader.kt
@@ -118,6 +118,16 @@ public interface HostTableReader {
public val energyUsage: Double
/**
+ * The current carbon intensity of the host in gCO2 / kW.
+ */
+ public val carbonIntensity: Double
+
+ /**
+ * The current carbon emission since the last deadline in g.
+ */
+ public val carbonEmission: Double
+
+ /**
* The uptime of the host since last time in ms.
*/
public val uptime: Long