summaryrefslogtreecommitdiff
path: root/opendc-compute/opendc-compute-service
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-10-13 15:42:41 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-10-25 17:58:53 +0200
commitf565afb1ef7b940804af62aa73b6859dcb78a847 (patch)
tree37bb2985c25e944939fb954026f8e816ec18bfe3 /opendc-compute/opendc-compute-service
parente76bebe9e81c3813422da6d67fbab7d9f471a317 (diff)
feat(telemetry): Report provisioning time of virtual machines
This change adds support for collecting the provisioning time of virtual machines in addition to their boot time.
Diffstat (limited to 'opendc-compute/opendc-compute-service')
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt20
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/InternalServer.kt9
2 files changed, 26 insertions, 3 deletions
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 2a07a208..292feabe 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
@@ -26,6 +26,7 @@ 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.compute.api.*
@@ -173,6 +174,12 @@ internal class ComputeServiceImpl(
result.observe(available, upState)
result.observe(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 {
@@ -324,8 +331,10 @@ internal class ComputeServiceImpl(
internal fun schedule(server: InternalServer): SchedulingRequest {
logger.debug { "Enqueueing server ${server.uid} to be assigned to host." }
+ val now = clock.millis()
+ val request = SchedulingRequest(server, now)
- val request = SchedulingRequest(server, clock.millis())
+ server.lastProvisioningTimestamp = now
queue.add(request)
_serversPending.add(1)
requestSchedulingCycle()
@@ -501,4 +510,13 @@ 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) {
+ result.observe(server.lastProvisioningTimestamp, 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 05a7e1bf..f1b92c66 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
@@ -55,7 +55,7 @@ internal class InternalServer(
/**
* The attributes of a server.
*/
- internal val attributes: Attributes = Attributes.builder()
+ @JvmField internal val attributes: Attributes = Attributes.builder()
.put(ResourceAttributes.HOST_NAME, name)
.put(ResourceAttributes.HOST_ID, uid.toString())
.put(ResourceAttributes.HOST_TYPE, flavor.name)
@@ -70,7 +70,12 @@ internal class InternalServer(
/**
* The [Host] that has been assigned to host the server.
*/
- internal var host: Host? = null
+ @JvmField internal var host: Host? = null
+
+ /**
+ * The most recent timestamp when the server entered a provisioning state.
+ */
+ @JvmField internal var lastProvisioningTimestamp: Long = Long.MIN_VALUE
/**
* The current scheduling request.