diff options
Diffstat (limited to 'opendc-compute/opendc-compute-telemetry/src')
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 |
