summaryrefslogtreecommitdiff
path: root/opendc-compute/opendc-compute-simulator/src
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-compute/opendc-compute-simulator/src')
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt34
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt16
-rw-r--r--opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt82
3 files changed, 67 insertions, 65 deletions
diff --git a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
index 908a58e9..95921e8b 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
+++ b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
@@ -150,15 +150,15 @@ public class SimHost(
meter.gaugeBuilder("system.cpu.demand")
.setDescription("Amount of CPU resources the guests would use if there were no CPU contention or CPU limits")
.setUnit("MHz")
- .buildWithCallback { result -> result.observe(hypervisor.cpuDemand) }
+ .buildWithCallback { result -> result.record(hypervisor.cpuDemand) }
meter.gaugeBuilder("system.cpu.usage")
.setDescription("Amount of CPU resources used by the host")
.setUnit("MHz")
- .buildWithCallback { result -> result.observe(hypervisor.cpuUsage) }
+ .buildWithCallback { result -> result.record(hypervisor.cpuUsage) }
meter.gaugeBuilder("system.cpu.utilization")
.setDescription("Utilization of the CPU resources of the host")
.setUnit("%")
- .buildWithCallback { result -> result.observe(hypervisor.cpuUsage / _cpuLimit) }
+ .buildWithCallback { result -> result.record(hypervisor.cpuUsage / _cpuLimit) }
meter.counterBuilder("system.cpu.time")
.setDescription("Amount of CPU time spent by the host")
.setUnit("s")
@@ -166,12 +166,12 @@ public class SimHost(
meter.gaugeBuilder("system.power.usage")
.setDescription("Power usage of the host ")
.setUnit("W")
- .buildWithCallback { result -> result.observe(machine.powerUsage) }
+ .buildWithCallback { result -> result.record(machine.powerUsage) }
meter.counterBuilder("system.power.total")
.setDescription("Amount of energy used by the CPU")
.setUnit("J")
.ofDoubles()
- .buildWithCallback { result -> result.observe(machine.energyUsage) }
+ .buildWithCallback { result -> result.record(machine.energyUsage) }
meter.counterBuilder("system.time")
.setDescription("The uptime of the host")
.setUnit("s")
@@ -382,10 +382,10 @@ public class SimHost(
}
}
- result.observe(terminated, terminatedState)
- result.observe(running, runningState)
- result.observe(error, errorState)
- result.observe(invalid, invalidState)
+ result.record(terminated, terminatedState)
+ result.record(running, runningState)
+ result.record(error, errorState)
+ result.record(invalid, invalidState)
}
private val _cpuLimit = machine.model.cpus.sumOf { it.frequency }
@@ -394,7 +394,7 @@ public class SimHost(
* Helper function to collect the CPU limits of a machine.
*/
private fun collectCpuLimit(result: ObservableDoubleMeasurement) {
- result.observe(_cpuLimit)
+ result.record(_cpuLimit)
val guests = _guests
for (i in guests.indices) {
@@ -413,10 +413,10 @@ public class SimHost(
private fun collectCpuTime(result: ObservableLongMeasurement) {
val counters = hypervisor.counters
- result.observe(counters.cpuActiveTime / 1000L, _activeState)
- result.observe(counters.cpuIdleTime / 1000L, _idleState)
- result.observe(counters.cpuStealTime / 1000L, _stealState)
- result.observe(counters.cpuLostTime / 1000L, _lostState)
+ result.record(counters.cpuActiveTime / 1000L, _activeState)
+ result.record(counters.cpuIdleTime / 1000L, _idleState)
+ result.record(counters.cpuStealTime / 1000L, _stealState)
+ result.record(counters.cpuLostTime / 1000L, _lostState)
val guests = _guests
for (i in guests.indices) {
@@ -458,8 +458,8 @@ public class SimHost(
private fun collectUptime(result: ObservableLongMeasurement) {
updateUptime()
- result.observe(_uptime, _upState)
- result.observe(_downtime, _downState)
+ result.record(_uptime, _upState)
+ result.record(_downtime, _downState)
val guests = _guests
for (i in guests.indices) {
@@ -474,7 +474,7 @@ public class SimHost(
*/
private fun collectBootTime(result: ObservableLongMeasurement) {
if (_bootTime != Long.MIN_VALUE) {
- result.observe(_bootTime)
+ result.record(_bootTime)
}
val guests = _guests
diff --git a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt
index 9f3122db..f49c2824 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt
+++ b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt
@@ -239,8 +239,8 @@ internal class Guest(
* Helper function to track the uptime of the guest.
*/
fun collectUptime(result: ObservableLongMeasurement) {
- result.observe(_uptime, _upState)
- result.observe(_downtime, _downState)
+ result.record(_uptime, _upState)
+ result.record(_downtime, _downState)
}
private var _bootTime = Long.MIN_VALUE
@@ -250,7 +250,7 @@ internal class Guest(
*/
fun collectBootTime(result: ObservableLongMeasurement) {
if (_bootTime != Long.MIN_VALUE) {
- result.observe(_bootTime, attributes)
+ result.record(_bootTime, attributes)
}
}
@@ -273,10 +273,10 @@ internal class Guest(
fun collectCpuTime(result: ObservableLongMeasurement) {
val counters = machine.counters
- result.observe(counters.cpuActiveTime / 1000, _activeState)
- result.observe(counters.cpuIdleTime / 1000, _idleState)
- result.observe(counters.cpuStealTime / 1000, _stealState)
- result.observe(counters.cpuLostTime / 1000, _lostState)
+ result.record(counters.cpuActiveTime / 1000, _activeState)
+ result.record(counters.cpuIdleTime / 1000, _idleState)
+ result.record(counters.cpuStealTime / 1000, _stealState)
+ result.record(counters.cpuLostTime / 1000, _lostState)
}
private val _cpuLimit = machine.model.cpus.sumOf { it.frequency }
@@ -285,7 +285,7 @@ internal class Guest(
* Helper function to collect the CPU limits of a machine.
*/
fun collectCpuLimit(result: ObservableDoubleMeasurement) {
- result.observe(_cpuLimit, attributes)
+ result.record(_cpuLimit, attributes)
}
/**
diff --git a/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt b/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt
index 799a8cf0..dd13b60c 100644
--- a/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt
+++ b/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt
@@ -22,9 +22,7 @@
package org.opendc.compute.simulator
-import io.opentelemetry.api.metrics.MeterProvider
import io.opentelemetry.sdk.metrics.SdkMeterProvider
-import io.opentelemetry.sdk.metrics.export.MetricProducer
import io.opentelemetry.sdk.resources.Resource
import kotlinx.coroutines.*
import org.junit.jupiter.api.Assertions.assertEquals
@@ -83,10 +81,26 @@ internal class SimHostTest {
val hostResource = Resource.builder()
.put(HOST_ID, hostId.toString())
.build()
- val meterProvider: MeterProvider = SdkMeterProvider
+
+ // Setup metric reader
+ val duration = 5 * 60L
+ val reader = CoroutineMetricReader(
+ this,
+ object : ComputeMetricExporter() {
+ override fun record(reader: HostTableReader) {
+ activeTime += reader.cpuActiveTime
+ idleTime += reader.cpuIdleTime
+ stealTime += reader.cpuStealTime
+ }
+ },
+ exportInterval = Duration.ofSeconds(duration)
+ )
+
+ val meterProvider = SdkMeterProvider
.builder()
.setResource(hostResource)
.setClock(clock.toOtelClock())
+ .registerMetricReader(reader)
.build()
val engine = FlowEngine(coroutineContext, clock)
@@ -100,7 +114,6 @@ internal class SimHostTest {
meterProvider,
SimFairShareHypervisorProvider()
)
- val duration = 5 * 60L
val vmImageA = MockImage(
UUID.randomUUID(),
"<unnamed>",
@@ -136,19 +149,6 @@ internal class SimHostTest {
val flavor = MockFlavor(2, 0)
- // Setup metric reader
- val reader = CoroutineMetricReader(
- this, listOf(meterProvider as MetricProducer),
- object : ComputeMetricExporter() {
- override fun record(reader: HostTableReader) {
- activeTime += reader.cpuActiveTime
- idleTime += reader.cpuIdleTime
- stealTime += reader.cpuStealTime
- }
- },
- exportInterval = Duration.ofSeconds(duration)
- )
-
coroutineScope {
launch { virtDriver.spawn(MockServer(UUID.randomUUID(), "a", flavor, vmImageA)) }
launch { virtDriver.spawn(MockServer(UUID.randomUUID(), "b", flavor, vmImageB)) }
@@ -169,7 +169,7 @@ internal class SimHostTest {
// Ensure last cycle is collected
delay(1000L * duration)
virtDriver.close()
- reader.close()
+ meterProvider.close()
assertAll(
{ assertEquals(658, activeTime, "Active time does not match") },
@@ -195,10 +195,32 @@ internal class SimHostTest {
val hostResource = Resource.builder()
.put(HOST_ID, hostId.toString())
.build()
- val meterProvider: MeterProvider = SdkMeterProvider
+
+ // Setup metric reader
+ val duration = 5 * 60L
+ val reader = CoroutineMetricReader(
+ this,
+ object : ComputeMetricExporter() {
+ override fun record(reader: HostTableReader) {
+ activeTime += reader.cpuActiveTime
+ idleTime += reader.cpuIdleTime
+ uptime += reader.uptime
+ downtime += reader.downtime
+ }
+
+ override fun record(reader: ServerTableReader) {
+ guestUptime += reader.uptime
+ guestDowntime += reader.downtime
+ }
+ },
+ exportInterval = Duration.ofSeconds(duration)
+ )
+
+ val meterProvider = SdkMeterProvider
.builder()
.setResource(hostResource)
.setClock(clock.toOtelClock())
+ .registerMetricReader(reader)
.build()
val engine = FlowEngine(coroutineContext, clock)
@@ -212,7 +234,6 @@ internal class SimHostTest {
meterProvider,
SimFairShareHypervisorProvider()
)
- val duration = 5 * 60L
val image = MockImage(
UUID.randomUUID(),
"<unnamed>",
@@ -232,25 +253,6 @@ internal class SimHostTest {
val flavor = MockFlavor(2, 0)
val server = MockServer(UUID.randomUUID(), "a", flavor, image)
- // Setup metric reader
- val reader = CoroutineMetricReader(
- this, listOf(meterProvider as MetricProducer),
- object : ComputeMetricExporter() {
- override fun record(reader: HostTableReader) {
- activeTime += reader.cpuActiveTime
- idleTime += reader.cpuIdleTime
- uptime += reader.uptime
- downtime += reader.downtime
- }
-
- override fun record(reader: ServerTableReader) {
- guestUptime += reader.uptime
- guestDowntime += reader.downtime
- }
- },
- exportInterval = Duration.ofSeconds(duration)
- )
-
coroutineScope {
host.spawn(server)
delay(5000L)
@@ -273,7 +275,7 @@ internal class SimHostTest {
// Ensure last cycle is collected
delay(1000L * duration)
- reader.close()
+ meterProvider.close()
assertAll(
{ assertEquals(1175, idleTime, "Idle time does not match") },