summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--opendc-compute/opendc-compute-service/build.gradle.kts2
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/ComputeService.kt6
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/telemetry/GuestSystemStats.kt2
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/telemetry/HostSystemStats.kt2
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt88
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/InternalServer.kt18
-rw-r--r--opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/ComputeServiceTest.kt3
-rw-r--r--opendc-compute/opendc-compute-simulator/build.gradle.kts3
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt171
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt144
-rw-r--r--opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt3
-rw-r--r--opendc-compute/opendc-compute-workload/build.gradle.kts2
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeServiceHelper.kt8
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetComputeMonitor.kt8
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetHostDataWriter.kt2
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetServerDataWriter.kt2
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetServiceDataWriter.kt3
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/ComputeMetricReader.kt (renamed from opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMetricReader.kt)4
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/ComputeMonitor.kt (renamed from opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMonitor.kt)10
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/NoopTelemetryManager.kt36
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/SdkTelemetryManager.kt135
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/TelemetryManager.kt42
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/HostInfo.kt (renamed from opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/HostInfo.kt)2
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/HostTableReader.kt (renamed from opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/HostTableReader.kt)2
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServerInfo.kt (renamed from opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServerInfo.kt)2
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServerTableReader.kt (renamed from opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServerTableReader.kt)2
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServiceData.kt (renamed from opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServiceData.kt)2
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServiceTableReader.kt (renamed from opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServiceTableReader.kt)2
-rw-r--r--opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/HostDataWriterTest.kt4
-rw-r--r--opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/ServerDataWriterTest.kt6
-rw-r--r--opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/ServiceDataWriterTest.kt2
-rw-r--r--opendc-experiments/opendc-experiments-capelin/build.gradle.kts3
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/jmh/kotlin/org/opendc/experiments/capelin/CapelinBenchmarks.kt6
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/jmh/resources/topology.txt5
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/Portfolio.kt5
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt11
-rw-r--r--opendc-telemetry/opendc-telemetry-compute/build.gradle.kts36
-rw-r--r--opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMetricAggregator.kt517
-rw-r--r--opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMetricExporter.kt59
-rw-r--r--opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/Helpers.kt45
-rw-r--r--opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/HostAttributes.kt51
-rw-r--r--opendc-web/opendc-web-runner/build.gradle.kts2
-rw-r--r--opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt4
-rw-r--r--opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/WebComputeMonitor.kt6
-rw-r--r--opendc-workflow/opendc-workflow-service/src/test/kotlin/org/opendc/workflow/service/WorkflowServiceTest.kt8
-rw-r--r--settings.gradle.kts1
46 files changed, 63 insertions, 1414 deletions
diff --git a/opendc-compute/opendc-compute-service/build.gradle.kts b/opendc-compute/opendc-compute-service/build.gradle.kts
index b42c2919..fd15b6e7 100644
--- a/opendc-compute/opendc-compute-service/build.gradle.kts
+++ b/opendc-compute/opendc-compute-service/build.gradle.kts
@@ -29,10 +29,8 @@ plugins {
dependencies {
api(projects.opendcCompute.opendcComputeApi)
- api(projects.opendcTelemetry.opendcTelemetryApi)
implementation(projects.opendcCommon)
implementation(libs.kotlin.logging)
- implementation(libs.opentelemetry.semconv)
testImplementation(projects.opendcSimulator.opendcSimulatorCore)
testRuntimeOnly(libs.log4j.slf4j)
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/ComputeService.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/ComputeService.kt
index 3a6baaa1..c0b70268 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/ComputeService.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/ComputeService.kt
@@ -22,8 +22,6 @@
package org.opendc.compute.service
-import io.opentelemetry.api.metrics.Meter
-import io.opentelemetry.api.metrics.MeterProvider
import org.opendc.compute.api.ComputeClient
import org.opendc.compute.api.Server
import org.opendc.compute.service.driver.Host
@@ -79,18 +77,16 @@ public interface ComputeService : AutoCloseable {
*
* @param context The [CoroutineContext] to use in the service.
* @param clock The clock instance to use.
- * @param meterProvider The [MeterProvider] for creating a [Meter] for the service.
* @param scheduler The scheduler implementation to use.
* @param schedulingQuantum The interval between scheduling cycles.
*/
public operator fun invoke(
context: CoroutineContext,
clock: Clock,
- meterProvider: MeterProvider,
scheduler: ComputeScheduler,
schedulingQuantum: Duration = Duration.ofMinutes(5),
): ComputeService {
- return ComputeServiceImpl(context, clock, meterProvider, scheduler, schedulingQuantum)
+ return ComputeServiceImpl(context, clock, scheduler, schedulingQuantum)
}
}
}
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/telemetry/GuestSystemStats.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/telemetry/GuestSystemStats.kt
index b3958473..6fec5175 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/telemetry/GuestSystemStats.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/telemetry/GuestSystemStats.kt
@@ -35,5 +35,5 @@ import java.time.Instant
public data class GuestSystemStats(
val uptime: Duration,
val downtime: Duration,
- val bootTime: Instant
+ val bootTime: Instant?
)
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/telemetry/HostSystemStats.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/telemetry/HostSystemStats.kt
index 1c07023f..9d34a5ce 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/telemetry/HostSystemStats.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/telemetry/HostSystemStats.kt
@@ -41,7 +41,7 @@ import java.time.Instant
public data class HostSystemStats(
val uptime: Duration,
val downtime: Duration,
- val bootTime: Instant,
+ val bootTime: Instant?,
val powerUsage: Double,
val energyUsage: Double,
val guestsTerminated: Int,
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt
index e8664e5c..21aaa19e 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt
@@ -22,11 +22,6 @@
package org.opendc.compute.service.internal
-import io.opentelemetry.api.common.AttributeKey
-import io.opentelemetry.api.common.Attributes
-import io.opentelemetry.api.metrics.Meter
-import io.opentelemetry.api.metrics.MeterProvider
-import io.opentelemetry.api.metrics.ObservableLongMeasurement
import kotlinx.coroutines.*
import mu.KotlinLogging
import org.opendc.common.util.Pacer
@@ -49,14 +44,12 @@ import kotlin.math.max
*
* @param context The [CoroutineContext] to use in the service.
* @param clock The clock instance to use.
- * @param meterProvider The [MeterProvider] for creating a [Meter] for the service.
* @param scheduler The scheduler implementation to use.
* @param schedulingQuantum The interval between scheduling cycles.
*/
internal class ComputeServiceImpl(
private val context: CoroutineContext,
private val clock: Clock,
- meterProvider: MeterProvider,
private val scheduler: ComputeScheduler,
schedulingQuantum: Duration
) : ComputeService, HostListener {
@@ -71,11 +64,6 @@ internal class ComputeServiceImpl(
private val logger = KotlinLogging.logger {}
/**
- * The [Meter] to track metrics of the [ComputeService].
- */
- private val meter = meterProvider.get("org.opendc.compute.service")
-
- /**
* The [Random] instance used to generate unique identifiers for the objects.
*/
private val random = Random(0)
@@ -117,72 +105,20 @@ internal class ComputeServiceImpl(
private var maxCores = 0
private var maxMemory = 0L
-
- /**
- * The number of scheduling attempts.
- */
- private val _schedulingAttempts = meter.counterBuilder("scheduler.attempts")
- .setDescription("Number of scheduling attempts")
- .setUnit("1")
- .build()
- private val _schedulingAttemptsSuccessAttr = Attributes.of(AttributeKey.stringKey("result"), "success")
- private val _schedulingAttemptsFailureAttr = Attributes.of(AttributeKey.stringKey("result"), "failure")
- private val _schedulingAttemptsErrorAttr = Attributes.of(AttributeKey.stringKey("result"), "error")
private var _attemptsSuccess = 0L
private var _attemptsFailure = 0L
private var _attemptsError = 0L
-
- /**
- * The response time of the service.
- */
- private val _schedulingLatency = meter.histogramBuilder("scheduler.latency")
- .setDescription("End to end latency for a server to be scheduled (in multiple attempts)")
- .ofLongs()
- .setUnit("ms")
- .build()
-
- /**
- * The number of servers that are pending.
- */
- private val _servers = meter.upDownCounterBuilder("scheduler.servers")
- .setDescription("Number of servers managed by the scheduler")
- .setUnit("1")
- .build()
- private val _serversPendingAttr = Attributes.of(AttributeKey.stringKey("state"), "pending")
- private val _serversActiveAttr = Attributes.of(AttributeKey.stringKey("state"), "active")
private var _serversPending = 0
private var _serversActive = 0
/**
* The [Pacer] to use for scheduling the scheduler cycles.
*/
- private val pacer = Pacer(scope.coroutineContext, clock, schedulingQuantum.toMillis(), ::doSchedule)
+ private val pacer = Pacer(scope.coroutineContext, clock, schedulingQuantum.toMillis()) { doSchedule() }
override val hosts: Set<Host>
get() = hostToView.keys
- init {
- val upState = Attributes.of(AttributeKey.stringKey("state"), "up")
- val downState = Attributes.of(AttributeKey.stringKey("state"), "down")
-
- meter.upDownCounterBuilder("scheduler.hosts")
- .setDescription("Number of hosts registered with the scheduler")
- .setUnit("1")
- .buildWithCallback { result ->
- val total = hosts.size
- val available = availableHosts.size.toLong()
-
- result.record(available, upState)
- result.record(total - available, downState)
- }
-
- meter.gaugeBuilder("system.time.provision")
- .setDescription("The most recent timestamp where the server entered a provisioned state")
- .setUnit("1")
- .ofLongs()
- .buildWithCallback(::collectProvisionTime)
- }
-
override fun newClient(): ComputeClient {
check(scope.isActive) { "Service is already closed" }
return object : ComputeClient {
@@ -355,7 +291,6 @@ internal class ComputeServiceImpl(
server.launchedAt = Instant.ofEpochMilli(now)
queue.add(request)
_serversPending++
- _servers.add(1, _serversPendingAttr)
requestSchedulingCycle()
return request
}
@@ -387,14 +322,13 @@ internal class ComputeServiceImpl(
/**
* Run a single scheduling iteration.
*/
- private fun doSchedule(now: Long) {
+ private fun doSchedule() {
while (queue.isNotEmpty()) {
val request = queue.peek()
if (request.isCancelled) {
queue.poll()
_serversPending--
- _servers.add(-1, _serversPendingAttr)
continue
}
@@ -407,9 +341,7 @@ internal class ComputeServiceImpl(
// Remove the incoming image
queue.poll()
_serversPending--
- _servers.add(-1, _serversPendingAttr)
_attemptsFailure++
- _schedulingAttempts.add(1, _schedulingAttemptsFailureAttr)
logger.warn { "Failed to spawn $server: does not fit [${clock.instant()}]" }
@@ -425,8 +357,6 @@ internal class ComputeServiceImpl(
// Remove request from queue
queue.poll()
_serversPending--
- _servers.add(-1, _serversPendingAttr)
- _schedulingLatency.record(now - request.submitTime, server.attributes)
logger.info { "Assigned server $server to host $host." }
@@ -442,10 +372,8 @@ internal class ComputeServiceImpl(
host.spawn(server)
activeServers[server] = host
- _servers.add(1, _serversActiveAttr)
_serversActive++
_attemptsSuccess++
- _schedulingAttempts.add(1, _schedulingAttemptsSuccessAttr)
} catch (e: Throwable) {
logger.error(e) { "Failed to deploy VM" }
@@ -454,7 +382,6 @@ internal class ComputeServiceImpl(
hv.availableMemory += server.flavor.memorySize
_attemptsError++
- _schedulingAttempts.add(1, _schedulingAttemptsErrorAttr)
}
}
}
@@ -511,7 +438,6 @@ internal class ComputeServiceImpl(
if (activeServers.remove(server) != null) {
_serversActive--
- _servers.add(-1, _serversActiveAttr)
}
val hv = hostToView[host]
@@ -527,14 +453,4 @@ internal class ComputeServiceImpl(
requestSchedulingCycle()
}
}
-
- /**
- * Collect the timestamp when each server entered its provisioning state most recently.
- */
- private fun collectProvisionTime(result: ObservableLongMeasurement) {
- for ((_, server) in servers) {
- val launchedAt = server.launchedAt ?: continue
- result.record(launchedAt.toEpochMilli(), server.attributes)
- }
- }
}
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/InternalServer.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/InternalServer.kt
index d2a2d896..f9da24d8 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/InternalServer.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/InternalServer.kt
@@ -22,9 +22,6 @@
package org.opendc.compute.service.internal
-import io.opentelemetry.api.common.AttributeKey
-import io.opentelemetry.api.common.Attributes
-import io.opentelemetry.semconv.resource.attributes.ResourceAttributes
import mu.KotlinLogging
import org.opendc.compute.api.*
import org.opendc.compute.service.driver.Host
@@ -54,21 +51,6 @@ internal class InternalServer(
private val watchers = mutableListOf<ServerWatcher>()
/**
- * The attributes of a server.
- */
- @JvmField internal val attributes: Attributes = Attributes.builder()
- .put(ResourceAttributes.HOST_NAME, name)
- .put(ResourceAttributes.HOST_ID, uid.toString())
- .put(ResourceAttributes.HOST_TYPE, flavor.name)
- .put(AttributeKey.longKey("host.num_cpus"), flavor.cpuCount.toLong())
- .put(AttributeKey.longKey("host.mem_capacity"), flavor.memorySize)
- .put(AttributeKey.stringArrayKey("host.labels"), labels.map { (k, v) -> "$k:$v" })
- .put(ResourceAttributes.HOST_ARCH, ResourceAttributes.HostArchValues.AMD64)
- .put(ResourceAttributes.HOST_IMAGE_NAME, image.name)
- .put(ResourceAttributes.HOST_IMAGE_ID, image.uid.toString())
- .build()
-
- /**
* The [Host] that has been assigned to host the server.
*/
@JvmField internal var host: Host? = null
diff --git a/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/ComputeServiceTest.kt b/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/ComputeServiceTest.kt
index eb106817..cc7be4a8 100644
--- a/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/ComputeServiceTest.kt
+++ b/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/ComputeServiceTest.kt
@@ -23,7 +23,6 @@
package org.opendc.compute.service
import io.mockk.*
-import io.opentelemetry.api.metrics.MeterProvider
import kotlinx.coroutines.delay
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNull
@@ -59,7 +58,7 @@ internal class ComputeServiceTest {
filters = listOf(ComputeFilter(), VCpuFilter(allocationRatio = 1.0), RamFilter(allocationRatio = 1.0)),
weighers = listOf(RamWeigher())
)
- service = ComputeService(scope.coroutineContext, clock, MeterProvider.noop(), computeScheduler)
+ service = ComputeService(scope.coroutineContext, clock, computeScheduler)
}
@Test
diff --git a/opendc-compute/opendc-compute-simulator/build.gradle.kts b/opendc-compute/opendc-compute-simulator/build.gradle.kts
index e81d87ec..72962147 100644
--- a/opendc-compute/opendc-compute-simulator/build.gradle.kts
+++ b/opendc-compute/opendc-compute-simulator/build.gradle.kts
@@ -32,11 +32,8 @@ dependencies {
api(projects.opendcSimulator.opendcSimulatorCompute)
api(libs.commons.math3)
implementation(projects.opendcCommon)
- implementation(libs.opentelemetry.semconv)
implementation(libs.kotlin.logging)
testImplementation(projects.opendcSimulator.opendcSimulatorCore)
- testImplementation(projects.opendcTelemetry.opendcTelemetrySdk)
- testImplementation(projects.opendcTelemetry.opendcTelemetryCompute)
testRuntimeOnly(libs.slf4j.simple)
}
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 323ae4fe..c28239b4 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
@@ -22,12 +22,6 @@
package org.opendc.compute.simulator
-import io.opentelemetry.api.common.AttributeKey
-import io.opentelemetry.api.common.Attributes
-import io.opentelemetry.api.metrics.Meter
-import io.opentelemetry.api.metrics.MeterProvider
-import io.opentelemetry.api.metrics.ObservableDoubleMeasurement
-import io.opentelemetry.api.metrics.ObservableLongMeasurement
import kotlinx.coroutines.*
import org.opendc.compute.api.Flavor
import org.opendc.compute.api.Server
@@ -67,7 +61,6 @@ public class SimHost(
override val meta: Map<String, Any>,
context: CoroutineContext,
engine: FlowEngine,
- meterProvider: MeterProvider,
hypervisorProvider: SimHypervisorProvider,
scalingGovernor: ScalingGovernor = PerformanceScalingGovernor(),
powerDriver: PowerDriver = SimplePowerDriver(ConstantPowerModel(0.0)),
@@ -86,11 +79,6 @@ public class SimHost(
private val clock = engine.clock
/**
- * The [Meter] to track metrics of the simulated host.
- */
- private val meter = meterProvider.get("org.opendc.compute.simulator")
-
- /**
* The event listeners registered with this host.
*/
private val listeners = mutableListOf<HostListener>()
@@ -142,48 +130,6 @@ public class SimHost(
init {
launch()
-
- meter.upDownCounterBuilder("system.guests")
- .setDescription("Number of guests on this host")
- .setUnit("1")
- .buildWithCallback(::collectGuests)
- meter.gaugeBuilder("system.cpu.limit")
- .setDescription("Amount of CPU resources available to the host")
- .buildWithCallback(::collectCpuLimit)
- 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.record(hypervisor.cpuDemand) }
- meter.gaugeBuilder("system.cpu.usage")
- .setDescription("Amount of CPU resources used by the host")
- .setUnit("MHz")
- .buildWithCallback { result -> result.record(hypervisor.cpuUsage) }
- meter.gaugeBuilder("system.cpu.utilization")
- .setDescription("Utilization of the CPU resources of the host")
- .setUnit("%")
- .buildWithCallback { result -> result.record(hypervisor.cpuUsage / _cpuLimit) }
- meter.counterBuilder("system.cpu.time")
- .setDescription("Amount of CPU time spent by the host")
- .setUnit("s")
- .buildWithCallback(::collectCpuTime)
- meter.gaugeBuilder("system.power.usage")
- .setDescription("Power usage of the host ")
- .setUnit("W")
- .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.record(machine.energyUsage) }
- meter.counterBuilder("system.time")
- .setDescription("The uptime of the host")
- .setUnit("s")
- .buildWithCallback(::collectUptime)
- meter.gaugeBuilder("system.time.boot")
- .setDescription("The boot time of the host")
- .setUnit("1")
- .ofLongs()
- .buildWithCallback(::collectBootTime)
}
override fun canFit(server: Server): Boolean {
@@ -278,7 +224,7 @@ public class SimHost(
return HostSystemStats(
Duration.ofMillis(_uptime),
Duration.ofMillis(_downtime),
- Instant.ofEpochMilli(_bootTime),
+ _bootTime,
machine.powerUsage,
machine.energyUsage,
terminated,
@@ -358,7 +304,7 @@ public class SimHost(
_ctx = machine.startWorkload(object : SimWorkload {
override fun onStart(ctx: SimMachineContext) {
try {
- _bootTime = clock.millis()
+ _bootTime = clock.instant()
_state = HostState.UP
hypervisor.onStart(ctx)
} catch (cause: Throwable) {
@@ -422,80 +368,11 @@ public class SimHost(
return MachineModel(processingUnits, memoryUnits)
}
- private val STATE_KEY = AttributeKey.stringKey("state")
-
- private val terminatedState = Attributes.of(STATE_KEY, "terminated")
- private val runningState = Attributes.of(STATE_KEY, "running")
- private val errorState = Attributes.of(STATE_KEY, "error")
- private val invalidState = Attributes.of(STATE_KEY, "invalid")
-
- /**
- * Helper function to collect the guest counts on this host.
- */
- private fun collectGuests(result: ObservableLongMeasurement) {
- var terminated = 0L
- var running = 0L
- var error = 0L
- var invalid = 0L
-
- val guests = _guests.listIterator()
- for (guest in guests) {
- when (guest.state) {
- ServerState.TERMINATED -> terminated++
- ServerState.RUNNING -> running++
- ServerState.ERROR -> error++
- ServerState.DELETED -> {
- // Remove guests that have been deleted
- this.guests.remove(guest.server)
- guests.remove()
- }
- else -> invalid++
- }
- }
-
- 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 }
-
- /**
- * Helper function to collect the CPU limits of a machine.
- */
- private fun collectCpuLimit(result: ObservableDoubleMeasurement) {
- result.record(_cpuLimit)
-
- val guests = _guests
- for (i in guests.indices) {
- guests[i].collectCpuLimit(result)
- }
- }
-
- private val _activeState = Attributes.of(STATE_KEY, "active")
- private val _stealState = Attributes.of(STATE_KEY, "steal")
- private val _lostState = Attributes.of(STATE_KEY, "lost")
- private val _idleState = Attributes.of(STATE_KEY, "idle")
-
- /**
- * Helper function to track the CPU time of a machine.
- */
- private fun collectCpuTime(result: ObservableLongMeasurement) {
- val stats = getCpuStats()
-
- result.record(stats.activeTime, _activeState)
- result.record(stats.idleTime, _idleState)
- result.record(stats.stealTime, _stealState)
- result.record(stats.lostTime, _lostState)
-
- val guests = _guests
- for (i in guests.indices) {
- guests[i].collectCpuTime(result)
- }
- }
-
private var _lastReport = clock.millis()
+ private var _uptime = 0L
+ private var _downtime = 0L
+ private var _bootTime: Instant? = null
+ private val _cpuLimit = machine.model.cpus.sumOf { it.frequency }
/**
* Helper function to track the uptime of a machine.
@@ -517,40 +394,4 @@ public class SimHost(
guests[i].updateUptime()
}
}
-
- private var _uptime = 0L
- private var _downtime = 0L
- private val _upState = Attributes.of(STATE_KEY, "up")
- private val _downState = Attributes.of(STATE_KEY, "down")
-
- /**
- * Helper function to track the uptime of a machine.
- */
- private fun collectUptime(result: ObservableLongMeasurement) {
- updateUptime()
-
- result.record(_uptime, _upState)
- result.record(_downtime, _downState)
-
- val guests = _guests
- for (i in guests.indices) {
- guests[i].collectUptime(result)
- }
- }
-
- private var _bootTime = Long.MIN_VALUE
-
- /**
- * Helper function to track the boot time of a machine.
- */
- private fun collectBootTime(result: ObservableLongMeasurement) {
- if (_bootTime != Long.MIN_VALUE) {
- result.record(_bootTime)
- }
-
- val guests = _guests
- for (i in guests.indices) {
- guests[i].collectBootTime(result)
- }
- }
}
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 0d4c550d..ea3c6549 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
@@ -22,12 +22,6 @@
package org.opendc.compute.simulator.internal
-import io.opentelemetry.api.common.AttributeKey
-import io.opentelemetry.api.common.Attributes
-import io.opentelemetry.api.common.AttributesBuilder
-import io.opentelemetry.api.metrics.ObservableDoubleMeasurement
-import io.opentelemetry.api.metrics.ObservableLongMeasurement
-import io.opentelemetry.semconv.resource.attributes.ResourceAttributes
import kotlinx.coroutines.*
import mu.KotlinLogging
import org.opendc.compute.api.Server
@@ -77,11 +71,6 @@ internal class Guest(
var state: ServerState = ServerState.TERMINATED
/**
- * The attributes of the guest.
- */
- val attributes: Attributes = GuestAttributes(this)
-
- /**
* Start the guest.
*/
suspend fun start() {
@@ -158,7 +147,7 @@ internal class Guest(
return GuestSystemStats(
Duration.ofMillis(_uptime),
Duration.ofMillis(_downtime),
- Instant.ofEpochMilli(_bootTime)
+ _bootTime
)
}
@@ -235,7 +224,7 @@ internal class Guest(
* This method is invoked when the guest was started on the host and has booted into a running state.
*/
private fun onStart() {
- _bootTime = clock.millis()
+ _bootTime = clock.instant()
state = ServerState.RUNNING
listener.onStart(this)
}
@@ -250,18 +239,11 @@ internal class Guest(
listener.onStop(this)
}
- private val STATE_KEY = AttributeKey.stringKey("state")
-
private var _uptime = 0L
private var _downtime = 0L
- private val _upState = attributes.toBuilder()
- .put(STATE_KEY, "up")
- .build()
- private val _downState = attributes.toBuilder()
- .put(STATE_KEY, "down")
- .build()
-
private var _lastReport = clock.millis()
+ private var _bootTime: Instant? = null
+ private val _cpuLimit = machine.model.cpus.sumOf { it.frequency }
/**
* Helper function to track the uptime and downtime of the guest.
@@ -277,122 +259,4 @@ internal class Guest(
_downtime += duration
}
}
-
- /**
- * Helper function to track the uptime of the guest.
- */
- fun collectUptime(result: ObservableLongMeasurement) {
- updateUptime()
-
- result.record(_uptime, _upState)
- result.record(_downtime, _downState)
- }
-
- private var _bootTime = Long.MIN_VALUE
-
- /**
- * Helper function to track the boot time of the guest.
- */
- fun collectBootTime(result: ObservableLongMeasurement) {
- if (_bootTime != Long.MIN_VALUE) {
- result.record(_bootTime, attributes)
- }
- }
-
- private val _activeState = attributes.toBuilder()
- .put(STATE_KEY, "active")
- .build()
- private val _stealState = attributes.toBuilder()
- .put(STATE_KEY, "steal")
- .build()
- private val _lostState = attributes.toBuilder()
- .put(STATE_KEY, "lost")
- .build()
- private val _idleState = attributes.toBuilder()
- .put(STATE_KEY, "idle")
- .build()
-
- /**
- * Helper function to track the CPU time of a machine.
- */
- fun collectCpuTime(result: ObservableLongMeasurement) {
- val counters = machine.counters
- counters.flush()
-
- 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 }
-
- /**
- * Helper function to collect the CPU limits of a machine.
- */
- fun collectCpuLimit(result: ObservableDoubleMeasurement) {
- result.record(_cpuLimit, attributes)
- }
-
- /**
- * An optimized [Attributes] implementation.
- */
- private class GuestAttributes(private val uid: String, private val attributes: Attributes) : Attributes by attributes {
- /**
- * Construct a [GuestAttributes] instance from a [Guest].
- */
- constructor(guest: Guest) : this(
- guest.server.uid.toString(),
- Attributes.builder()
- .put(ResourceAttributes.HOST_NAME, guest.server.name)
- .put(ResourceAttributes.HOST_ID, guest.server.uid.toString())
- .put(ResourceAttributes.HOST_TYPE, guest.server.flavor.name)
- .put(AttributeKey.longKey("host.num_cpus"), guest.server.flavor.cpuCount.toLong())
- .put(AttributeKey.longKey("host.mem_capacity"), guest.server.flavor.memorySize)
- .put(AttributeKey.stringArrayKey("host.labels"), guest.server.labels.map { (k, v) -> "$k:$v" })
- .put(ResourceAttributes.HOST_ARCH, ResourceAttributes.HostArchValues.AMD64)
- .put(ResourceAttributes.HOST_IMAGE_NAME, guest.server.image.name)
- .put(ResourceAttributes.HOST_IMAGE_ID, guest.server.image.uid.toString())
- .build()
- )
-
- override fun <T : Any?> get(key: AttributeKey<T>): T? {
- // Optimize access to the HOST_ID key which is accessed quite often
- if (key == ResourceAttributes.HOST_ID) {
- @Suppress("UNCHECKED_CAST")
- return uid as T?
- }
- return attributes.get(key)
- }
-
- override fun toBuilder(): AttributesBuilder {
- val delegate = attributes.toBuilder()
- return object : AttributesBuilder {
-
- override fun putAll(attributes: Attributes): AttributesBuilder {
- delegate.putAll(attributes)
- return this
- }
-
- override fun <T : Any?> put(key: AttributeKey<Long>, value: Int): AttributesBuilder {
- delegate.put<T>(key, value)
- return this
- }
-
- override fun <T : Any?> put(key: AttributeKey<T>, value: T): AttributesBuilder {
- delegate.put(key, value)
- return this
- }
-
- override fun build(): Attributes = GuestAttributes(uid, delegate.build())
- }
- }
-
- override fun equals(other: Any?): Boolean = attributes == other
-
- // Cache hash code
- private val _hash = attributes.hashCode()
-
- override fun hashCode(): Int = _hash
- }
}
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 fd54ad1d..5ba4a667 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,7 +22,6 @@
package org.opendc.compute.simulator
-import io.opentelemetry.api.metrics.MeterProvider
import kotlinx.coroutines.*
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
@@ -75,7 +74,6 @@ internal class SimHostTest {
meta = emptyMap(),
coroutineContext,
engine,
- MeterProvider.noop(),
SimFairShareHypervisorProvider()
)
val vmImageA = MockImage(
@@ -158,7 +156,6 @@ internal class SimHostTest {
meta = emptyMap(),
coroutineContext,
engine,
- MeterProvider.noop(),
SimFairShareHypervisorProvider()
)
val image = MockImage(
diff --git a/opendc-compute/opendc-compute-workload/build.gradle.kts b/opendc-compute/opendc-compute-workload/build.gradle.kts
index 319b2ae3..e8a7c9fd 100644
--- a/opendc-compute/opendc-compute-workload/build.gradle.kts
+++ b/opendc-compute/opendc-compute-workload/build.gradle.kts
@@ -34,8 +34,6 @@ dependencies {
implementation(projects.opendcTrace.opendcTraceParquet)
implementation(projects.opendcSimulator.opendcSimulatorCore)
implementation(projects.opendcSimulator.opendcSimulatorCompute)
- implementation(projects.opendcTelemetry.opendcTelemetrySdk)
- implementation(projects.opendcTelemetry.opendcTelemetryCompute)
implementation(libs.opentelemetry.semconv)
implementation(libs.kotlin.logging)
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeServiceHelper.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeServiceHelper.kt
index 21cfdad2..fddb4890 100644
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeServiceHelper.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeServiceHelper.kt
@@ -30,7 +30,6 @@ import org.opendc.compute.api.Server
import org.opendc.compute.service.ComputeService
import org.opendc.compute.service.scheduler.ComputeScheduler
import org.opendc.compute.simulator.SimHost
-import org.opendc.compute.workload.telemetry.TelemetryManager
import org.opendc.compute.workload.topology.HostSpec
import org.opendc.simulator.compute.kernel.interference.VmInterferenceModel
import org.opendc.simulator.compute.workload.SimTraceWorkload
@@ -46,7 +45,6 @@ import kotlin.math.max
*
* @param context [CoroutineContext] to run the simulation in.
* @param clock [Clock] instance tracking simulation time.
- * @param telemetry Helper class for managing telemetry.
* @param scheduler [ComputeScheduler] implementation to use for the service.
* @param failureModel A failure model to use for injecting failures.
* @param interferenceModel The model to use for performance interference.
@@ -55,7 +53,6 @@ import kotlin.math.max
public class ComputeServiceHelper(
private val context: CoroutineContext,
private val clock: Clock,
- private val telemetry: TelemetryManager,
scheduler: ComputeScheduler,
private val failureModel: FailureModel? = null,
private val interferenceModel: VmInterferenceModel? = null,
@@ -167,7 +164,6 @@ public class ComputeServiceHelper(
* @return The [SimHost] that has been constructed by the runner.
*/
public fun registerHost(spec: HostSpec, optimize: Boolean = false): SimHost {
- val meterProvider = telemetry.createMeterProvider(spec)
val host = SimHost(
spec.uid,
spec.name,
@@ -175,7 +171,6 @@ public class ComputeServiceHelper(
spec.meta,
context,
_engine,
- meterProvider,
spec.hypervisor,
powerDriver = spec.powerDriver,
interferenceDomain = interferenceModel?.newDomain(),
@@ -202,7 +197,6 @@ public class ComputeServiceHelper(
* Construct a [ComputeService] instance.
*/
private fun createService(scheduler: ComputeScheduler, schedulingQuantum: Duration): ComputeService {
- val meterProvider = telemetry.createMeterProvider(scheduler)
- return ComputeService(context, clock, meterProvider, scheduler, schedulingQuantum)
+ return ComputeService(context, clock, scheduler, schedulingQuantum)
}
}
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetComputeMonitor.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetComputeMonitor.kt
index 6c515118..af4dad44 100644
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetComputeMonitor.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetComputeMonitor.kt
@@ -22,10 +22,10 @@
package org.opendc.compute.workload.export.parquet
-import org.opendc.telemetry.compute.ComputeMonitor
-import org.opendc.telemetry.compute.table.HostTableReader
-import org.opendc.telemetry.compute.table.ServerTableReader
-import org.opendc.telemetry.compute.table.ServiceTableReader
+import org.opendc.compute.workload.telemetry.ComputeMonitor
+import org.opendc.compute.workload.telemetry.table.HostTableReader
+import org.opendc.compute.workload.telemetry.table.ServerTableReader
+import org.opendc.compute.workload.telemetry.table.ServiceTableReader
import java.io.File
/**
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetHostDataWriter.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetHostDataWriter.kt
index 0d5b6b34..e6e7e42d 100644
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetHostDataWriter.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetHostDataWriter.kt
@@ -27,7 +27,7 @@ import org.apache.parquet.hadoop.ParquetWriter
import org.apache.parquet.hadoop.api.WriteSupport
import org.apache.parquet.io.api.RecordConsumer
import org.apache.parquet.schema.*
-import org.opendc.telemetry.compute.table.HostTableReader
+import org.opendc.compute.workload.telemetry.table.HostTableReader
import org.opendc.trace.util.parquet.LocalParquetWriter
import java.io.File
import java.util.*
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetServerDataWriter.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetServerDataWriter.kt
index 5d11629b..082c7c88 100644
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetServerDataWriter.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetServerDataWriter.kt
@@ -27,7 +27,7 @@ import org.apache.parquet.hadoop.ParquetWriter
import org.apache.parquet.hadoop.api.WriteSupport
import org.apache.parquet.io.api.RecordConsumer
import org.apache.parquet.schema.*
-import org.opendc.telemetry.compute.table.ServerTableReader
+import org.opendc.compute.workload.telemetry.table.ServerTableReader
import org.opendc.trace.util.parquet.LocalParquetWriter
import java.io.File
import java.util.*
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetServiceDataWriter.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetServiceDataWriter.kt
index 5ad3b95e..2a0fdca1 100644
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetServiceDataWriter.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/export/parquet/ParquetServiceDataWriter.kt
@@ -22,12 +22,11 @@
package org.opendc.compute.workload.export.parquet
-import io.opentelemetry.context.ContextKey.named
import org.apache.hadoop.conf.Configuration
import org.apache.parquet.hadoop.api.WriteSupport
import org.apache.parquet.io.api.RecordConsumer
import org.apache.parquet.schema.*
-import org.opendc.telemetry.compute.table.ServiceTableReader
+import org.opendc.compute.workload.telemetry.table.ServiceTableReader
import java.io.File
/**
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMetricReader.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/ComputeMetricReader.kt
index 593203fc..45bd9ab1 100644
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMetricReader.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/ComputeMetricReader.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.telemetry.compute
+package org.opendc.compute.workload.telemetry
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
@@ -30,7 +30,7 @@ import mu.KotlinLogging
import org.opendc.compute.api.Server
import org.opendc.compute.service.ComputeService
import org.opendc.compute.service.driver.Host
-import org.opendc.telemetry.compute.table.*
+import org.opendc.compute.workload.telemetry.table.*
import java.time.Clock
import java.time.Duration
import java.time.Instant
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMonitor.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/ComputeMonitor.kt
index 64b5f337..36a2079a 100644
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMonitor.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/ComputeMonitor.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021 AtLarge Research
+ * Copyright (c) 2022 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,11 +20,11 @@
* SOFTWARE.
*/
-package org.opendc.telemetry.compute
+package org.opendc.compute.workload.telemetry
-import org.opendc.telemetry.compute.table.HostTableReader
-import org.opendc.telemetry.compute.table.ServerTableReader
-import org.opendc.telemetry.compute.table.ServiceTableReader
+import org.opendc.compute.workload.telemetry.table.HostTableReader
+import org.opendc.compute.workload.telemetry.table.ServerTableReader
+import org.opendc.compute.workload.telemetry.table.ServiceTableReader
/**
* A monitor that tracks the metrics and events of the OpenDC Compute service.
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/NoopTelemetryManager.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/NoopTelemetryManager.kt
deleted file mode 100644
index 4e7d0b75..00000000
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/NoopTelemetryManager.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.compute.workload.telemetry
-
-import io.opentelemetry.api.metrics.MeterProvider
-import org.opendc.compute.service.scheduler.ComputeScheduler
-import org.opendc.compute.workload.topology.HostSpec
-
-/**
- * A [TelemetryManager] that does nothing.
- */
-public class NoopTelemetryManager : TelemetryManager {
- override fun createMeterProvider(host: HostSpec): MeterProvider = MeterProvider.noop()
-
- override fun createMeterProvider(scheduler: ComputeScheduler): MeterProvider = MeterProvider.noop()
-}
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/SdkTelemetryManager.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/SdkTelemetryManager.kt
deleted file mode 100644
index 478c0609..00000000
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/SdkTelemetryManager.kt
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.compute.workload.telemetry
-
-import io.opentelemetry.api.metrics.MeterProvider
-import io.opentelemetry.sdk.common.CompletableResultCode
-import io.opentelemetry.sdk.metrics.SdkMeterProvider
-import io.opentelemetry.sdk.metrics.data.AggregationTemporality
-import io.opentelemetry.sdk.metrics.data.MetricData
-import io.opentelemetry.sdk.metrics.export.MetricProducer
-import io.opentelemetry.sdk.metrics.export.MetricReader
-import io.opentelemetry.sdk.metrics.export.MetricReaderFactory
-import io.opentelemetry.sdk.resources.Resource
-import io.opentelemetry.semconv.resource.attributes.ResourceAttributes
-import org.opendc.compute.service.scheduler.ComputeScheduler
-import org.opendc.compute.workload.topology.HostSpec
-import org.opendc.telemetry.compute.*
-import org.opendc.telemetry.sdk.toOtelClock
-import java.time.Clock
-
-/**
- * A [TelemetryManager] using the OpenTelemetry Java SDK.
- */
-public class SdkTelemetryManager(private val clock: Clock) : TelemetryManager, AutoCloseable {
- /**
- * The [SdkMeterProvider]s that belong to the workload runner.
- */
- private val _meterProviders = mutableListOf<SdkMeterProvider>()
-
- /**
- * The internal [MetricProducer] registered with the runner.
- */
- private val _metricProducers = mutableListOf<MetricProducer>()
-
- /**
- * The list of [MetricReader]s that have been registered with the runner.
- */
- private val _metricReaders = mutableListOf<MetricReader>()
-
- /**
- * A [MetricProducer] that combines all the other metric producers.
- */
- public val metricProducer: MetricProducer = object : MetricProducer {
- private val producers = _metricProducers
-
- override fun collectAllMetrics(): Collection<MetricData> = producers.flatMap(MetricProducer::collectAllMetrics)
-
- override fun toString(): String = "SdkTelemetryManager.AggregateMetricProducer"
- }
-
- /**
- * Register a [MetricReader] for this manager.
- *
- * @param factory The factory for the reader to register.
- */
- public fun registerMetricReader(factory: MetricReaderFactory) {
- val reader = factory.apply(metricProducer)
- _metricReaders.add(reader)
- }
-
- override fun createMeterProvider(scheduler: ComputeScheduler): MeterProvider {
- val resource = Resource.builder()
- .put(ResourceAttributes.SERVICE_NAME, "opendc-compute")
- .build()
-
- return createMeterProvider(resource)
- }
-
- override fun createMeterProvider(host: HostSpec): MeterProvider {
- val resource = Resource.builder()
- .put(HOST_ID, host.uid.toString())
- .put(HOST_NAME, host.name)
- .put(HOST_ARCH, ResourceAttributes.HostArchValues.AMD64)
- .put(HOST_NCPUS, host.model.cpus.size)
- .put(HOST_MEM_CAPACITY, host.model.memory.sumOf { it.size })
- .build()
-
- return createMeterProvider(resource)
- }
-
- /**
- * Construct a [SdkMeterProvider] for the specified [resource].
- */
- private fun createMeterProvider(resource: Resource): SdkMeterProvider {
- val meterProvider = SdkMeterProvider.builder()
- .setClock(clock.toOtelClock())
- .setResource(resource)
- .registerMetricReader { producer ->
- _metricProducers.add(producer)
- object : MetricReader {
- override fun getPreferredTemporality(): AggregationTemporality = AggregationTemporality.CUMULATIVE
- override fun flush(): CompletableResultCode = CompletableResultCode.ofSuccess()
- override fun shutdown(): CompletableResultCode = CompletableResultCode.ofSuccess()
- }
- }
- .build()
- _meterProviders.add(meterProvider)
- return meterProvider
- }
-
- override fun close() {
- for (meterProvider in _meterProviders) {
- meterProvider.close()
- }
-
- _meterProviders.clear()
-
- for (metricReader in _metricReaders) {
- metricReader.shutdown()
- }
-
- _metricReaders.clear()
- _metricProducers.clear()
- }
-}
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/TelemetryManager.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/TelemetryManager.kt
deleted file mode 100644
index b67050ce..00000000
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/TelemetryManager.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.compute.workload.telemetry
-
-import io.opentelemetry.api.metrics.MeterProvider
-import org.opendc.compute.service.scheduler.ComputeScheduler
-import org.opendc.compute.workload.topology.HostSpec
-
-/**
- * Helper class to manage the telemetry for a [ComputeServiceHelper] instance.
- */
-public interface TelemetryManager {
- /**
- * Construct a [MeterProvider] for the specified [ComputeScheduler].
- */
- public fun createMeterProvider(scheduler: ComputeScheduler): MeterProvider
-
- /**
- * Construct a [MeterProvider] for the specified [HostSpec].
- */
- public fun createMeterProvider(host: HostSpec): MeterProvider
-}
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/HostInfo.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/HostInfo.kt
index d9a5906b..5d383e40 100644
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/HostInfo.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/HostInfo.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.telemetry.compute.table
+package org.opendc.compute.workload.telemetry.table
/**
* Information about a host exposed to the telemetry service.
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/HostTableReader.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/HostTableReader.kt
index 1e1ad94e..8f6f0d01 100644
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/HostTableReader.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/HostTableReader.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.telemetry.compute.table
+package org.opendc.compute.workload.telemetry.table
import java.time.Instant
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServerInfo.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServerInfo.kt
index b16e5f3d..111135b7 100644
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServerInfo.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServerInfo.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.telemetry.compute.table
+package org.opendc.compute.workload.telemetry.table
/**
* Static information about a server exposed to the telemetry service.
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServerTableReader.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServerTableReader.kt
index c23d1467..bccccd01 100644
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServerTableReader.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServerTableReader.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.telemetry.compute.table
+package org.opendc.compute.workload.telemetry.table
import java.time.Instant
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServiceData.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServiceData.kt
index 39bf96f4..a1df6ea7 100644
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServiceData.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServiceData.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.telemetry.compute.table
+package org.opendc.compute.workload.telemetry.table
import java.time.Instant
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServiceTableReader.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServiceTableReader.kt
index 908f6748..4211ab15 100644
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/table/ServiceTableReader.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/telemetry/table/ServiceTableReader.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.telemetry.compute.table
+package org.opendc.compute.workload.telemetry.table
import java.time.Instant
diff --git a/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/HostDataWriterTest.kt b/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/HostDataWriterTest.kt
index dae03513..4344bb08 100644
--- a/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/HostDataWriterTest.kt
+++ b/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/HostDataWriterTest.kt
@@ -25,8 +25,8 @@ package org.opendc.compute.workload.export.parquet
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertDoesNotThrow
-import org.opendc.telemetry.compute.table.HostInfo
-import org.opendc.telemetry.compute.table.HostTableReader
+import org.opendc.compute.workload.telemetry.table.HostInfo
+import org.opendc.compute.workload.telemetry.table.HostTableReader
import java.nio.file.Files
import java.time.Instant
diff --git a/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/ServerDataWriterTest.kt b/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/ServerDataWriterTest.kt
index 280f5ef8..8465871d 100644
--- a/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/ServerDataWriterTest.kt
+++ b/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/ServerDataWriterTest.kt
@@ -25,9 +25,9 @@ package org.opendc.compute.workload.export.parquet
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertDoesNotThrow
-import org.opendc.telemetry.compute.table.HostInfo
-import org.opendc.telemetry.compute.table.ServerInfo
-import org.opendc.telemetry.compute.table.ServerTableReader
+import org.opendc.compute.workload.telemetry.table.HostInfo
+import org.opendc.compute.workload.telemetry.table.ServerInfo
+import org.opendc.compute.workload.telemetry.table.ServerTableReader
import java.nio.file.Files
import java.time.Instant
diff --git a/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/ServiceDataWriterTest.kt b/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/ServiceDataWriterTest.kt
index 7ffa7186..d91982bc 100644
--- a/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/ServiceDataWriterTest.kt
+++ b/opendc-compute/opendc-compute-workload/src/test/kotlin/org/opendc/compute/workload/export/parquet/ServiceDataWriterTest.kt
@@ -25,7 +25,7 @@ package org.opendc.compute.workload.export.parquet
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertDoesNotThrow
-import org.opendc.telemetry.compute.table.ServiceTableReader
+import org.opendc.compute.workload.telemetry.table.ServiceTableReader
import java.nio.file.Files
import java.time.Instant
diff --git a/opendc-experiments/opendc-experiments-capelin/build.gradle.kts b/opendc-experiments/opendc-experiments-capelin/build.gradle.kts
index 9495f4ca..39cf101d 100644
--- a/opendc-experiments/opendc-experiments-capelin/build.gradle.kts
+++ b/opendc-experiments/opendc-experiments-capelin/build.gradle.kts
@@ -37,8 +37,6 @@ dependencies {
implementation(projects.opendcSimulator.opendcSimulatorCore)
implementation(projects.opendcSimulator.opendcSimulatorCompute)
implementation(projects.opendcCompute.opendcComputeSimulator)
- implementation(projects.opendcTelemetry.opendcTelemetrySdk)
- implementation(projects.opendcTelemetry.opendcTelemetryCompute)
implementation(libs.config)
implementation(libs.kotlin.logging)
@@ -46,7 +44,6 @@ dependencies {
implementation(libs.jackson.module.kotlin)
implementation(libs.jackson.dataformat.csv)
implementation(kotlin("reflect"))
- implementation(libs.opentelemetry.semconv)
runtimeOnly(projects.opendcTrace.opendcTraceOpendc)
diff --git a/opendc-experiments/opendc-experiments-capelin/src/jmh/kotlin/org/opendc/experiments/capelin/CapelinBenchmarks.kt b/opendc-experiments/opendc-experiments-capelin/src/jmh/kotlin/org/opendc/experiments/capelin/CapelinBenchmarks.kt
index 83b8c0c6..fd2c26f0 100644
--- a/opendc-experiments/opendc-experiments-capelin/src/jmh/kotlin/org/opendc/experiments/capelin/CapelinBenchmarks.kt
+++ b/opendc-experiments/opendc-experiments-capelin/src/jmh/kotlin/org/opendc/experiments/capelin/CapelinBenchmarks.kt
@@ -22,14 +22,12 @@
package org.opendc.experiments.capelin
-import kotlinx.coroutines.ExperimentalCoroutinesApi
import org.opendc.compute.service.scheduler.FilterScheduler
import org.opendc.compute.service.scheduler.filters.ComputeFilter
import org.opendc.compute.service.scheduler.filters.RamFilter
import org.opendc.compute.service.scheduler.filters.VCpuFilter
import org.opendc.compute.service.scheduler.weights.CoreRamWeigher
import org.opendc.compute.workload.*
-import org.opendc.compute.workload.telemetry.NoopTelemetryManager
import org.opendc.compute.workload.topology.Topology
import org.opendc.compute.workload.topology.apply
import org.opendc.experiments.capelin.topology.clusterTopology
@@ -46,7 +44,6 @@ import java.util.concurrent.TimeUnit
@Fork(1)
@Warmup(iterations = 2, time = 5, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS)
-@OptIn(ExperimentalCoroutinesApi::class)
class CapelinBenchmarks {
private lateinit var vms: List<VirtualMachine>
private lateinit var topology: Topology
@@ -59,7 +56,7 @@ class CapelinBenchmarks {
val loader = ComputeWorkloadLoader(File("src/test/resources/trace"))
val source = trace("bitbrains-small")
vms = source.resolve(loader, Random(1L)).vms
- topology = checkNotNull(object {}.javaClass.getResourceAsStream("/env/topology.txt")).use { clusterTopology(it) }
+ topology = checkNotNull(object {}.javaClass.getResourceAsStream("/topology.txt")).use { clusterTopology(it) }
}
@Benchmark
@@ -71,7 +68,6 @@ class CapelinBenchmarks {
val runner = ComputeServiceHelper(
coroutineContext,
clock,
- NoopTelemetryManager(),
computeScheduler
)
diff --git a/opendc-experiments/opendc-experiments-capelin/src/jmh/resources/topology.txt b/opendc-experiments/opendc-experiments-capelin/src/jmh/resources/topology.txt
new file mode 100644
index 00000000..6b347bff
--- /dev/null
+++ b/opendc-experiments/opendc-experiments-capelin/src/jmh/resources/topology.txt
@@ -0,0 +1,5 @@
+ClusterID;ClusterName;Cores;Speed;Memory;numberOfHosts;memoryCapacityPerHost;coreCountPerHost
+A01;A01;32;3.2;2048;1;256;32
+B01;B01;48;2.93;1256;6;64;8
+C01;C01;32;3.2;2048;2;128;16
+
diff --git a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/Portfolio.kt b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/Portfolio.kt
index 6fd85e8c..0de8aa7b 100644
--- a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/Portfolio.kt
+++ b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/Portfolio.kt
@@ -30,7 +30,7 @@ import org.opendc.compute.workload.ComputeWorkloadLoader
import org.opendc.compute.workload.createComputeScheduler
import org.opendc.compute.workload.export.parquet.ParquetComputeMonitor
import org.opendc.compute.workload.grid5000
-import org.opendc.compute.workload.telemetry.NoopTelemetryManager
+import org.opendc.compute.workload.telemetry.ComputeMetricReader
import org.opendc.compute.workload.topology.apply
import org.opendc.experiments.capelin.model.OperationalPhenomena
import org.opendc.experiments.capelin.model.Topology
@@ -39,7 +39,6 @@ import org.opendc.experiments.capelin.topology.clusterTopology
import org.opendc.harness.dsl.Experiment
import org.opendc.harness.dsl.anyOf
import org.opendc.simulator.core.runBlockingSimulation
-import org.opendc.telemetry.compute.ComputeMetricReader
import java.io.File
import java.time.Duration
import java.util.*
@@ -99,11 +98,9 @@ abstract class Portfolio(name: String) : Experiment(name) {
else
null
val (vms, interferenceModel) = workload.source.resolve(workloadLoader, seeder)
- val telemetry = NoopTelemetryManager()
val runner = ComputeServiceHelper(
coroutineContext,
clock,
- telemetry,
computeScheduler,
failureModel,
interferenceModel?.withSeed(repeat.toLong())
diff --git a/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt b/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt
index 62cdf123..fa2cd9c8 100644
--- a/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt
+++ b/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt
@@ -33,14 +33,13 @@ import org.opendc.compute.service.scheduler.filters.RamFilter
import org.opendc.compute.service.scheduler.filters.VCpuFilter
import org.opendc.compute.service.scheduler.weights.CoreRamWeigher
import org.opendc.compute.workload.*
-import org.opendc.compute.workload.telemetry.NoopTelemetryManager
+import org.opendc.compute.workload.telemetry.ComputeMetricReader
+import org.opendc.compute.workload.telemetry.ComputeMonitor
+import org.opendc.compute.workload.telemetry.table.HostTableReader
import org.opendc.compute.workload.topology.Topology
import org.opendc.compute.workload.topology.apply
import org.opendc.experiments.capelin.topology.clusterTopology
import org.opendc.simulator.core.runBlockingSimulation
-import org.opendc.telemetry.compute.ComputeMetricReader
-import org.opendc.telemetry.compute.ComputeMonitor
-import org.opendc.telemetry.compute.table.HostTableReader
import java.io.File
import java.time.Duration
import java.util.*
@@ -86,7 +85,6 @@ class CapelinIntegrationTest {
val runner = ComputeServiceHelper(
coroutineContext,
clock,
- NoopTelemetryManager(),
computeScheduler
)
val topology = createTopology()
@@ -136,7 +134,6 @@ class CapelinIntegrationTest {
val runner = ComputeServiceHelper(
coroutineContext,
clock,
- NoopTelemetryManager(),
computeScheduler
)
val topology = createTopology("single")
@@ -182,7 +179,6 @@ class CapelinIntegrationTest {
val simulator = ComputeServiceHelper(
coroutineContext,
clock,
- NoopTelemetryManager(),
computeScheduler,
interferenceModel = interferenceModel?.withSeed(seed.toLong())
)
@@ -226,7 +222,6 @@ class CapelinIntegrationTest {
val simulator = ComputeServiceHelper(
coroutineContext,
clock,
- NoopTelemetryManager(),
computeScheduler,
grid5000(Duration.ofDays(7))
)
diff --git a/opendc-telemetry/opendc-telemetry-compute/build.gradle.kts b/opendc-telemetry/opendc-telemetry-compute/build.gradle.kts
deleted file mode 100644
index b476a669..00000000
--- a/opendc-telemetry/opendc-telemetry-compute/build.gradle.kts
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-description = "Telemetry for OpenDC Compute"
-
-/* Build configuration */
-plugins {
- `kotlin-library-conventions`
-}
-
-dependencies {
- api(projects.opendcTelemetry.opendcTelemetrySdk)
-
- implementation(projects.opendcCompute.opendcComputeService)
- implementation(libs.opentelemetry.semconv)
- implementation(libs.kotlin.logging)
-}
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMetricAggregator.kt b/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMetricAggregator.kt
deleted file mode 100644
index 9557f680..00000000
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMetricAggregator.kt
+++ /dev/null
@@ -1,517 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-@file:Suppress("PropertyName")
-
-package org.opendc.telemetry.compute
-
-import io.opentelemetry.api.common.AttributeKey
-import io.opentelemetry.api.common.Attributes
-import io.opentelemetry.sdk.metrics.data.MetricData
-import io.opentelemetry.sdk.metrics.data.PointData
-import io.opentelemetry.sdk.resources.Resource
-import io.opentelemetry.semconv.resource.attributes.ResourceAttributes
-import org.opendc.telemetry.compute.table.*
-import java.time.Instant
-
-/**
- * Helper class responsible for aggregating [MetricData] into [ServiceTableReader], [HostTableReader] and [ServerTableReader].
- */
-public class ComputeMetricAggregator {
- private val _service = ServiceAggregator()
- private val _hosts = mutableMapOf<String, HostAggregator>()
- private val _servers = mutableMapOf<String, ServerAggregator>()
-
- /**
- * Process the specified [metrics] for this cycle.
- */
- public fun process(metrics: Collection<MetricData>) {
- val service = _service
- val hosts = _hosts
- val servers = _servers
-
- for (metric in metrics) {
- val resource = metric.resource
-
- when (metric.name) {
- // ComputeService
- "scheduler.hosts" -> {
- for (point in metric.longSumData.points) {
- // Record the timestamp for the service
- service.recordTimestamp(point)
-
- when (point.attributes[STATE_KEY]) {
- "up" -> service._hostsUp = point.value.toInt()
- "down" -> service._hostsDown = point.value.toInt()
- }
- }
- }
- "scheduler.servers" -> {
- for (point in metric.longSumData.points) {
- when (point.attributes[STATE_KEY]) {
- "pending" -> service._serversPending = point.value.toInt()
- "active" -> service._serversActive = point.value.toInt()
- }
- }
- }
- "scheduler.attempts" -> {
- for (point in metric.longSumData.points) {
- when (point.attributes[RESULT_KEY]) {
- "success" -> service._attemptsSuccess = point.value.toInt()
- "failure" -> service._attemptsFailure = point.value.toInt()
- "error" -> service._attemptsError = point.value.toInt()
- }
- }
- }
-
- // SimHost
- "system.guests" -> {
- val agg = getHost(hosts, resource) ?: continue
-
- for (point in metric.longSumData.points) {
- when (point.attributes[STATE_KEY]) {
- "terminated" -> agg._guestsTerminated = point.value.toInt()
- "running" -> agg._guestsRunning = point.value.toInt()
- "error" -> agg._guestsRunning = point.value.toInt()
- "invalid" -> agg._guestsInvalid = point.value.toInt()
- }
- }
- }
- "system.cpu.limit" -> {
- val agg = getHost(hosts, resource) ?: continue
-
- for (point in metric.doubleGaugeData.points) {
- val server = getServer(servers, point)
-
- if (server != null) {
- server._cpuLimit = point.value
- server._host = agg.host
- } else {
- agg._cpuLimit = point.value
- }
- }
- }
- "system.cpu.usage" -> {
- val agg = getHost(hosts, resource) ?: continue
- agg._cpuUsage = metric.doubleGaugeData.points.first().value
- }
- "system.cpu.demand" -> {
- val agg = getHost(hosts, resource) ?: continue
- agg._cpuDemand = metric.doubleGaugeData.points.first().value
- }
- "system.cpu.utilization" -> {
- val agg = getHost(hosts, resource) ?: continue
- agg._cpuUtilization = metric.doubleGaugeData.points.first().value
- }
- "system.cpu.time" -> {
- val agg = getHost(hosts, resource) ?: continue
-
- for (point in metric.longSumData.points) {
- val server = getServer(servers, point)
- val state = point.attributes[STATE_KEY]
- if (server != null) {
- when (state) {
- "active" -> server._cpuActiveTime = point.value
- "idle" -> server._cpuIdleTime = point.value
- "steal" -> server._cpuStealTime = point.value
- "lost" -> server._cpuLostTime = point.value
- }
- server._host = agg.host
- } else {
- when (state) {
- "active" -> agg._cpuActiveTime = point.value
- "idle" -> agg._cpuIdleTime = point.value
- "steal" -> agg._cpuStealTime = point.value
- "lost" -> agg._cpuLostTime = point.value
- }
- }
- }
- }
- "system.power.usage" -> {
- val agg = getHost(hosts, resource) ?: continue
- agg._powerUsage = metric.doubleGaugeData.points.first().value
- }
- "system.power.total" -> {
- val agg = getHost(hosts, resource) ?: continue
- agg._powerTotal = metric.doubleSumData.points.first().value
- }
- "system.time" -> {
- val agg = getHost(hosts, resource) ?: continue
-
- for (point in metric.longSumData.points) {
- val server = getServer(servers, point)
-
- if (server != null) {
- server.recordTimestamp(point)
-
- when (point.attributes[STATE_KEY]) {
- "up" -> server._uptime = point.value
- "down" -> server._downtime = point.value
- }
- server._host = agg.host
- } else {
- agg.recordTimestamp(point)
-
- when (point.attributes[STATE_KEY]) {
- "up" -> agg._uptime = point.value
- "down" -> agg._downtime = point.value
- }
- }
- }
- }
- "system.time.boot" -> {
- val agg = getHost(hosts, resource) ?: continue
-
- for (point in metric.longGaugeData.points) {
- val server = getServer(servers, point)
-
- if (server != null) {
- server._bootTime = Instant.ofEpochMilli(point.value)
- server._host = agg.host
- } else {
- agg._bootTime = Instant.ofEpochMilli(point.value)
- }
- }
- }
- "system.time.provision" -> {
- for (point in metric.longGaugeData.points) {
- val server = getServer(servers, point) ?: continue
- server.recordTimestamp(point)
- server._provisionTime = Instant.ofEpochMilli(point.value)
- }
- }
- }
- }
- }
-
- /**
- * Collect the data via the [monitor].
- */
- public fun collect(monitor: ComputeMonitor) {
- monitor.record(_service)
-
- for (host in _hosts.values) {
- monitor.record(host)
- host.reset()
- }
-
- for (server in _servers.values) {
- monitor.record(server)
- server.reset()
- }
- }
-
- /**
- * Obtain the [HostAggregator] for the specified [resource].
- */
- private fun getHost(hosts: MutableMap<String, HostAggregator>, resource: Resource): HostAggregator? {
- val id = resource.attributes[HOST_ID]
- return if (id != null) {
- hosts.getOrPut(id) { HostAggregator(resource) }
- } else {
- null
- }
- }
-
- /**
- * Obtain the [ServerAggregator] for the specified [point].
- */
- private fun getServer(servers: MutableMap<String, ServerAggregator>, point: PointData): ServerAggregator? {
- val id = point.attributes[ResourceAttributes.HOST_ID]
- return if (id != null) {
- servers.getOrPut(id) { ServerAggregator(point.attributes) }
- } else {
- null
- }
- }
-
- /**
- * An aggregator for service metrics before they are reported.
- */
- internal class ServiceAggregator : ServiceTableReader {
- private var _timestamp: Instant = Instant.MIN
- override val timestamp: Instant
- get() = _timestamp
-
- override val hostsUp: Int
- get() = _hostsUp
- @JvmField var _hostsUp = 0
-
- override val hostsDown: Int
- get() = _hostsDown
- @JvmField var _hostsDown = 0
-
- override val serversPending: Int
- get() = _serversPending
- @JvmField var _serversPending = 0
-
- override val serversActive: Int
- get() = _serversActive
- @JvmField var _serversActive = 0
-
- override val attemptsSuccess: Int
- get() = _attemptsSuccess
- @JvmField var _attemptsSuccess = 0
-
- override val attemptsFailure: Int
- get() = _attemptsFailure
- @JvmField var _attemptsFailure = 0
-
- override val attemptsError: Int
- get() = _attemptsError
- @JvmField var _attemptsError = 0
-
- /**
- * Record the timestamp of a [point] for this aggregator.
- */
- fun recordTimestamp(point: PointData) {
- _timestamp = Instant.ofEpochMilli(point.epochNanos / 1_000_000L) // ns to ms
- }
- }
-
- /**
- * An aggregator for host metrics before they are reported.
- */
- internal class HostAggregator(resource: Resource) : HostTableReader {
- /**
- * The static information about this host.
- */
- override val host = HostInfo(
- resource.attributes[HOST_ID]!!,
- resource.attributes[HOST_NAME] ?: "",
- resource.attributes[HOST_ARCH] ?: "",
- resource.attributes[HOST_NCPUS]?.toInt() ?: 0,
- resource.attributes[HOST_MEM_CAPACITY] ?: 0,
- )
-
- override val timestamp: Instant
- get() = _timestamp
- private var _timestamp = Instant.MIN
-
- override val guestsTerminated: Int
- get() = _guestsTerminated
- @JvmField var _guestsTerminated = 0
-
- override val guestsRunning: Int
- get() = _guestsRunning
- @JvmField var _guestsRunning = 0
-
- override val guestsError: Int
- get() = _guestsError
- @JvmField var _guestsError = 0
-
- override val guestsInvalid: Int
- get() = _guestsInvalid
- @JvmField var _guestsInvalid = 0
-
- override val cpuLimit: Double
- get() = _cpuLimit
- @JvmField var _cpuLimit = 0.0
-
- override val cpuUsage: Double
- get() = _cpuUsage
- @JvmField var _cpuUsage = 0.0
-
- override val cpuDemand: Double
- get() = _cpuDemand
- @JvmField var _cpuDemand = 0.0
-
- override val cpuUtilization: Double
- get() = _cpuUtilization
- @JvmField var _cpuUtilization = 0.0
-
- override val cpuActiveTime: Long
- get() = _cpuActiveTime - previousCpuActiveTime
- @JvmField var _cpuActiveTime = 0L
- private var previousCpuActiveTime = 0L
-
- override val cpuIdleTime: Long
- get() = _cpuIdleTime - previousCpuIdleTime
- @JvmField var _cpuIdleTime = 0L
- private var previousCpuIdleTime = 0L
-
- override val cpuStealTime: Long
- get() = _cpuStealTime - previousCpuStealTime
- @JvmField var _cpuStealTime = 0L
- private var previousCpuStealTime = 0L
-
- override val cpuLostTime: Long
- get() = _cpuLostTime - previousCpuLostTime
- @JvmField var _cpuLostTime = 0L
- private var previousCpuLostTime = 0L
-
- override val powerUsage: Double
- get() = _powerUsage
- @JvmField var _powerUsage = 0.0
-
- override val powerTotal: Double
- get() = _powerTotal - previousPowerTotal
- @JvmField var _powerTotal = 0.0
- private var previousPowerTotal = 0.0
-
- override val uptime: Long
- get() = _uptime - previousUptime
- @JvmField var _uptime = 0L
- private var previousUptime = 0L
-
- override val downtime: Long
- get() = _downtime - previousDowntime
- @JvmField var _downtime = 0L
- private var previousDowntime = 0L
-
- override val bootTime: Instant?
- get() = _bootTime
- @JvmField var _bootTime: Instant? = null
-
- /**
- * Finish the aggregation for this cycle.
- */
- fun reset() {
- // Reset intermediate state for next aggregation
- previousCpuActiveTime = _cpuActiveTime
- previousCpuIdleTime = _cpuIdleTime
- previousCpuStealTime = _cpuStealTime
- previousCpuLostTime = _cpuLostTime
- previousPowerTotal = _powerTotal
- previousUptime = _uptime
- previousDowntime = _downtime
-
- _guestsTerminated = 0
- _guestsRunning = 0
- _guestsError = 0
- _guestsInvalid = 0
-
- _cpuLimit = 0.0
- _cpuUsage = 0.0
- _cpuDemand = 0.0
- _cpuUtilization = 0.0
-
- _powerUsage = 0.0
- }
-
- /**
- * Record the timestamp of a [point] for this aggregator.
- */
- fun recordTimestamp(point: PointData) {
- _timestamp = Instant.ofEpochMilli(point.epochNanos / 1_000_000L) // ns to ms
- }
- }
-
- /**
- * An aggregator for server metrics before they are reported.
- */
- internal class ServerAggregator(attributes: Attributes) : ServerTableReader {
- /**
- * The static information about this server.
- */
- override val server = ServerInfo(
- attributes[ResourceAttributes.HOST_ID]!!,
- attributes[ResourceAttributes.HOST_NAME]!!,
- attributes[ResourceAttributes.HOST_TYPE]!!,
- attributes[ResourceAttributes.HOST_ARCH]!!,
- attributes[ResourceAttributes.HOST_IMAGE_ID]!!,
- attributes[ResourceAttributes.HOST_IMAGE_NAME]!!,
- attributes[AttributeKey.longKey("host.num_cpus")]!!.toInt(),
- attributes[AttributeKey.longKey("host.mem_capacity")]!!,
- )
-
- /**
- * The [HostInfo] of the host on which the server is hosted.
- */
- override val host: HostInfo?
- get() = _host
- @JvmField var _host: HostInfo? = null
-
- private var _timestamp = Instant.MIN
- override val timestamp: Instant
- get() = _timestamp
-
- override val uptime: Long
- get() = _uptime - previousUptime
- @JvmField var _uptime: Long = 0
- private var previousUptime = 0L
-
- override val downtime: Long
- get() = _downtime - previousDowntime
- @JvmField var _downtime: Long = 0
- private var previousDowntime = 0L
-
- override val provisionTime: Instant?
- get() = _provisionTime
- @JvmField var _provisionTime: Instant? = null
-
- override val bootTime: Instant?
- get() = _bootTime
- @JvmField var _bootTime: Instant? = null
-
- override val cpuLimit: Double
- get() = _cpuLimit
- @JvmField var _cpuLimit = 0.0
-
- override val cpuActiveTime: Long
- get() = _cpuActiveTime - previousCpuActiveTime
- @JvmField var _cpuActiveTime = 0L
- private var previousCpuActiveTime = 0L
-
- override val cpuIdleTime: Long
- get() = _cpuIdleTime - previousCpuIdleTime
- @JvmField var _cpuIdleTime = 0L
- private var previousCpuIdleTime = 0L
-
- override val cpuStealTime: Long
- get() = _cpuStealTime - previousCpuStealTime
- @JvmField var _cpuStealTime = 0L
- private var previousCpuStealTime = 0L
-
- override val cpuLostTime: Long
- get() = _cpuLostTime - previousCpuLostTime
- @JvmField var _cpuLostTime = 0L
- private var previousCpuLostTime = 0L
-
- /**
- * Finish the aggregation for this cycle.
- */
- fun reset() {
- previousUptime = _uptime
- previousDowntime = _downtime
- previousCpuActiveTime = _cpuActiveTime
- previousCpuIdleTime = _cpuIdleTime
- previousCpuStealTime = _cpuStealTime
- previousCpuLostTime = _cpuLostTime
-
- _host = null
- _cpuLimit = 0.0
- }
-
- /**
- * Record the timestamp of a [point] for this aggregator.
- */
- fun recordTimestamp(point: PointData) {
- _timestamp = Instant.ofEpochMilli(point.epochNanos / 1_000_000L) // ns to ms
- }
- }
-
- private companion object {
- private val STATE_KEY = AttributeKey.stringKey("state")
- private val RESULT_KEY = AttributeKey.stringKey("result")
- }
-}
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMetricExporter.kt b/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMetricExporter.kt
deleted file mode 100644
index 3ab6c7b2..00000000
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/ComputeMetricExporter.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.telemetry.compute
-
-import io.opentelemetry.sdk.common.CompletableResultCode
-import io.opentelemetry.sdk.metrics.data.*
-import io.opentelemetry.sdk.metrics.export.MetricExporter
-import mu.KotlinLogging
-
-/**
- * A [MetricExporter] that redirects data to a [ComputeMonitor] implementation.
- */
-public abstract class ComputeMetricExporter : MetricExporter, ComputeMonitor {
- /**
- * The logging instance for this exporter.
- */
- private val logger = KotlinLogging.logger {}
-
- /**
- * A [ComputeMetricAggregator] that actually performs the aggregation.
- */
- private val agg = ComputeMetricAggregator()
-
- override fun export(metrics: Collection<MetricData>): CompletableResultCode {
- return try {
- agg.process(metrics)
- agg.collect(this)
-
- CompletableResultCode.ofSuccess()
- } catch (e: Throwable) {
- logger.warn(e) { "Failed to export results" }
- CompletableResultCode.ofFailure()
- }
- }
-
- override fun flush(): CompletableResultCode = CompletableResultCode.ofSuccess()
-
- override fun shutdown(): CompletableResultCode = CompletableResultCode.ofSuccess()
-}
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/Helpers.kt b/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/Helpers.kt
deleted file mode 100644
index 41315b15..00000000
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/Helpers.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.telemetry.compute
-
-import io.opentelemetry.sdk.metrics.export.MetricProducer
-import org.opendc.telemetry.compute.table.ServiceData
-import org.opendc.telemetry.compute.table.ServiceTableReader
-import org.opendc.telemetry.compute.table.toServiceData
-
-/**
- * Collect the metrics of the compute service.
- */
-public fun collectServiceMetrics(metricProducer: MetricProducer): ServiceData {
- lateinit var serviceData: ServiceData
- val agg = ComputeMetricAggregator()
- val monitor = object : ComputeMonitor {
- override fun record(reader: ServiceTableReader) {
- serviceData = reader.toServiceData()
- }
- }
-
- agg.process(metricProducer.collectAllMetrics())
- agg.collect(monitor)
- return serviceData
-}
diff --git a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/HostAttributes.kt b/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/HostAttributes.kt
deleted file mode 100644
index 7dca6186..00000000
--- a/opendc-telemetry/opendc-telemetry-compute/src/main/kotlin/org/opendc/telemetry/compute/HostAttributes.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-@file:JvmName("HostAttributes")
-package org.opendc.telemetry.compute
-
-import io.opentelemetry.api.common.AttributeKey
-
-/**
- * The identifier of the node hosting virtual machines.
- */
-public val HOST_ID: AttributeKey<String> = AttributeKey.stringKey("node.id")
-
-/**
- * The name of the node hosting virtual machines.
- */
-public val HOST_NAME: AttributeKey<String> = AttributeKey.stringKey("node.name")
-
-/**
- * The CPU architecture of the host node.
- */
-public val HOST_ARCH: AttributeKey<String> = AttributeKey.stringKey("node.arch")
-
-/**
- * The number of CPUs in the host node.
- */
-public val HOST_NCPUS: AttributeKey<Long> = AttributeKey.longKey("node.num_cpus")
-
-/**
- * The amount of memory installed in the host node in MiB.
- */
-public val HOST_MEM_CAPACITY: AttributeKey<Long> = AttributeKey.longKey("node.mem_capacity")
diff --git a/opendc-web/opendc-web-runner/build.gradle.kts b/opendc-web/opendc-web-runner/build.gradle.kts
index 3c80f605..c1e3b976 100644
--- a/opendc-web/opendc-web-runner/build.gradle.kts
+++ b/opendc-web/opendc-web-runner/build.gradle.kts
@@ -37,8 +37,6 @@ dependencies {
implementation(projects.opendcCompute.opendcComputeSimulator)
implementation(projects.opendcCompute.opendcComputeWorkload)
implementation(projects.opendcSimulator.opendcSimulatorCore)
- implementation(projects.opendcTelemetry.opendcTelemetrySdk)
- implementation(projects.opendcTelemetry.opendcTelemetryCompute)
implementation(projects.opendcTrace.opendcTraceApi)
implementation(projects.opendcWeb.opendcWebClient)
diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt
index 7c0c43ed..9c9a866d 100644
--- a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt
+++ b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt
@@ -25,7 +25,7 @@ package org.opendc.web.runner
import mu.KotlinLogging
import org.opendc.compute.api.Server
import org.opendc.compute.workload.*
-import org.opendc.compute.workload.telemetry.NoopTelemetryManager
+import org.opendc.compute.workload.telemetry.ComputeMetricReader
import org.opendc.compute.workload.topology.HostSpec
import org.opendc.compute.workload.topology.Topology
import org.opendc.compute.workload.topology.apply
@@ -36,7 +36,6 @@ import org.opendc.simulator.compute.model.ProcessingUnit
import org.opendc.simulator.compute.power.LinearPowerModel
import org.opendc.simulator.compute.power.SimplePowerDriver
import org.opendc.simulator.core.runBlockingSimulation
-import org.opendc.telemetry.compute.ComputeMetricReader
import org.opendc.web.client.runner.OpenDCRunnerClient
import org.opendc.web.proto.runner.Job
import org.opendc.web.proto.runner.Scenario
@@ -209,7 +208,6 @@ public class OpenDCRunner(
val simulator = ComputeServiceHelper(
coroutineContext,
clock,
- NoopTelemetryManager(),
computeScheduler,
failureModel,
interferenceModel.takeIf { phenomena.interference }
diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/WebComputeMonitor.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/WebComputeMonitor.kt
index 69350d8c..01002c70 100644
--- a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/WebComputeMonitor.kt
+++ b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/WebComputeMonitor.kt
@@ -22,9 +22,9 @@
package org.opendc.web.runner.internal
-import org.opendc.telemetry.compute.ComputeMonitor
-import org.opendc.telemetry.compute.table.HostTableReader
-import org.opendc.telemetry.compute.table.ServiceTableReader
+import org.opendc.compute.workload.telemetry.ComputeMonitor
+import org.opendc.compute.workload.telemetry.table.HostTableReader
+import org.opendc.compute.workload.telemetry.table.ServiceTableReader
import kotlin.math.max
import kotlin.math.roundToLong
diff --git a/opendc-workflow/opendc-workflow-service/src/test/kotlin/org/opendc/workflow/service/WorkflowServiceTest.kt b/opendc-workflow/opendc-workflow-service/src/test/kotlin/org/opendc/workflow/service/WorkflowServiceTest.kt
index d5f06587..73d1b23b 100644
--- a/opendc-workflow/opendc-workflow-service/src/test/kotlin/org/opendc/workflow/service/WorkflowServiceTest.kt
+++ b/opendc-workflow/opendc-workflow-service/src/test/kotlin/org/opendc/workflow/service/WorkflowServiceTest.kt
@@ -32,7 +32,6 @@ import org.opendc.compute.service.scheduler.filters.RamFilter
import org.opendc.compute.service.scheduler.filters.VCpuFilter
import org.opendc.compute.service.scheduler.weights.VCpuWeigher
import org.opendc.compute.workload.ComputeServiceHelper
-import org.opendc.compute.workload.telemetry.NoopTelemetryManager
import org.opendc.compute.workload.topology.HostSpec
import org.opendc.simulator.compute.kernel.SimSpaceSharedHypervisorProvider
import org.opendc.simulator.compute.model.MachineModel
@@ -70,7 +69,12 @@ internal class WorkflowServiceTest {
weighers = listOf(VCpuWeigher(1.0, multiplier = 1.0))
)
- val computeHelper = ComputeServiceHelper(coroutineContext, clock, NoopTelemetryManager(), computeScheduler, schedulingQuantum = Duration.ofSeconds(1))
+ val computeHelper = ComputeServiceHelper(
+ coroutineContext,
+ clock,
+ computeScheduler,
+ schedulingQuantum = Duration.ofSeconds(1)
+ )
val hostCount = 4
repeat(hostCount) { computeHelper.registerHost(createHostSpec(it)) }
diff --git a/settings.gradle.kts b/settings.gradle.kts
index a779edcc..06289e72 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -49,7 +49,6 @@ include(":opendc-simulator:opendc-simulator-network")
include(":opendc-simulator:opendc-simulator-compute")
include(":opendc-telemetry:opendc-telemetry-api")
include(":opendc-telemetry:opendc-telemetry-sdk")
-include(":opendc-telemetry:opendc-telemetry-compute")
include(":opendc-trace:opendc-trace-api")
include(":opendc-trace:opendc-trace-gwf")
include(":opendc-trace:opendc-trace-swf")