summaryrefslogtreecommitdiff
path: root/opendc-format/src/main
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-08-31 16:18:56 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-09-02 11:30:15 +0200
commit214480d154771f0b783829b6e5ec82b837304ad2 (patch)
tree84d823132bdd0e351ec5a41c210be6551a98273d /opendc-format/src/main
parent9fcce6ade8714f7f0a9073fe5b7ddd3f0b35c375 (diff)
refactor(trace): Move Bitbrains format into separate module
This change moves Bitbrains trace support into a separate module and adds support for the new trace api.
Diffstat (limited to 'opendc-format/src/main')
-rw-r--r--opendc-format/src/main/kotlin/org/opendc/format/trace/bitbrains/BitbrainsRawTraceReader.kt100
-rw-r--r--opendc-format/src/main/kotlin/org/opendc/format/trace/bitbrains/BitbrainsTraceReader.kt127
2 files changed, 0 insertions, 227 deletions
diff --git a/opendc-format/src/main/kotlin/org/opendc/format/trace/bitbrains/BitbrainsRawTraceReader.kt b/opendc-format/src/main/kotlin/org/opendc/format/trace/bitbrains/BitbrainsRawTraceReader.kt
deleted file mode 100644
index ff6cdd02..00000000
--- a/opendc-format/src/main/kotlin/org/opendc/format/trace/bitbrains/BitbrainsRawTraceReader.kt
+++ /dev/null
@@ -1,100 +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.format.trace.bitbrains
-
-import com.fasterxml.jackson.annotation.JsonProperty
-import com.fasterxml.jackson.databind.MappingIterator
-import com.fasterxml.jackson.dataformat.csv.CsvMapper
-import com.fasterxml.jackson.dataformat.csv.CsvSchema
-import java.io.InputStream
-
-/**
- * A trace reader that enables the user to read Bitbrains specific trace data.
- */
-public class BitbrainsRawTraceReader(input: InputStream) : Iterator<BitbrainsRawTraceReader.Entry>, AutoCloseable {
- /**
- * The [CsvSchema] that is used to parse the trace.
- */
- private val schema = CsvSchema.builder()
- .addColumn("Timestamp [ms]", CsvSchema.ColumnType.NUMBER)
- .addColumn("CPU cores", CsvSchema.ColumnType.NUMBER)
- .addColumn("CPU capacity provisioned [MHZ]", CsvSchema.ColumnType.NUMBER)
- .addColumn("CPU usage [MHZ]", CsvSchema.ColumnType.NUMBER)
- .addColumn("CPU usage [%]", CsvSchema.ColumnType.NUMBER)
- .addColumn("Memory capacity provisioned [KB]", CsvSchema.ColumnType.NUMBER)
- .addColumn("Memory usage [KB]", CsvSchema.ColumnType.NUMBER)
- .addColumn("Disk read throughput [KB/s]", CsvSchema.ColumnType.NUMBER)
- .addColumn("Disk write throughput [KB/s]", CsvSchema.ColumnType.NUMBER)
- .addColumn("Network received throughput [KB/s]", CsvSchema.ColumnType.NUMBER)
- .addColumn("Network transmitted throughput [KB/s]", CsvSchema.ColumnType.NUMBER)
- .setAllowComments(true)
- .setUseHeader(true)
- .setColumnSeparator(';')
- .build()
-
- /**
- * The mapping iterator to use.
- */
- private val iterator: MappingIterator<Entry> = CsvMapper().readerFor(Entry::class.java).with(schema)
- .readValues(input)
-
- override fun hasNext(): Boolean {
- return iterator.hasNext()
- }
-
- override fun next(): Entry {
- return iterator.next()
- }
-
- override fun close() {
- iterator.close()
- }
-
- /**
- * A single entry in the trace.
- */
- public data class Entry(
- @JsonProperty("Timestamp [ms]")
- val timestamp: Long,
- @JsonProperty("CPU cores")
- val cpuCores: Int,
- @JsonProperty("CPU capacity provisioned [MHZ]")
- val cpuCapacity: Double,
- @JsonProperty("CPU usage [MHZ]")
- val cpuUsage: Double,
- @JsonProperty("CPU usage [%]")
- val cpuUsagePct: Double,
- @JsonProperty("Memory capacity provisioned [KB]")
- val memCapacity: Double,
- @JsonProperty("Memory usage [KB]")
- val memUsage: Double,
- @JsonProperty("Disk read throughput [KB/s]")
- val diskRead: Double,
- @JsonProperty("Disk write throughput [KB/s]")
- val diskWrite: Double,
- @JsonProperty("Network received throughput [KB/s]")
- val netReceived: Double,
- @JsonProperty("Network transmitted throughput [KB/s]")
- val netTransmitted: Double
- )
-}
diff --git a/opendc-format/src/main/kotlin/org/opendc/format/trace/bitbrains/BitbrainsTraceReader.kt b/opendc-format/src/main/kotlin/org/opendc/format/trace/bitbrains/BitbrainsTraceReader.kt
deleted file mode 100644
index 9e4876df..00000000
--- a/opendc-format/src/main/kotlin/org/opendc/format/trace/bitbrains/BitbrainsTraceReader.kt
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (c) 2020 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.format.trace.bitbrains
-
-import org.opendc.format.trace.TraceEntry
-import org.opendc.format.trace.TraceReader
-import org.opendc.simulator.compute.workload.SimTraceWorkload
-import org.opendc.simulator.compute.workload.SimWorkload
-import java.io.File
-import java.io.FileInputStream
-import java.util.*
-import kotlin.math.max
-import kotlin.math.min
-
-/**
- * A [TraceReader] for the public VM workload trace format.
- *
- * @param traceDirectory The directory of the traces.
- */
-public class BitbrainsTraceReader(traceDirectory: File) : TraceReader<SimWorkload> {
- /**
- * The internal iterator to use for this reader.
- */
- private val iterator: Iterator<TraceEntry<SimWorkload>>
-
- /**
- * Initialize the reader.
- */
- init {
- val entries = mutableMapOf<Long, TraceEntry<SimWorkload>>()
- val traceInterval = 5 * 60 * 1000L
-
- traceDirectory.walk()
- .filterNot { it.isDirectory }
- .filter { it.extension == "csv" }
- .forEach { vmFile ->
- val flopsHistory = mutableListOf<SimTraceWorkload.Fragment>()
- var vmId = -1L
- var maxCores = Int.MIN_VALUE
- var requiredMemory = Long.MIN_VALUE
- var startTime = Long.MAX_VALUE
- var lastTimestamp = Long.MIN_VALUE
-
- BitbrainsRawTraceReader(FileInputStream(vmFile)).use { reader ->
- reader.forEach { entry ->
- val timestamp = entry.timestamp * 1000L
- val cpuUsage = entry.cpuUsage
- vmId = vmFile.nameWithoutExtension.trim().toLong()
- val cores = entry.cpuCores
- maxCores = max(maxCores, cores)
- requiredMemory = max(requiredMemory, (entry.memCapacity / 1000).toLong())
-
- if (lastTimestamp < 0) {
- lastTimestamp = timestamp - 5 * 60 * 1000L
- startTime = min(startTime, lastTimestamp)
- }
-
- if (flopsHistory.isEmpty()) {
- flopsHistory.add(SimTraceWorkload.Fragment(lastTimestamp, traceInterval, cpuUsage, cores))
- } else {
- val last = flopsHistory.last()
- val duration = timestamp - lastTimestamp
- // Perform run-length encoding
- if (duration == 0L || last.usage == cpuUsage) {
- flopsHistory[flopsHistory.size - 1] = last.copy(duration = last.duration + duration)
- } else {
- flopsHistory.add(
- SimTraceWorkload.Fragment(
- lastTimestamp,
- duration,
- cpuUsage,
- cores
- )
- )
- }
- }
-
- lastTimestamp = timestamp
- }
- }
-
- val uuid = UUID(0L, vmId)
-
- val workload = SimTraceWorkload(flopsHistory.asSequence())
- entries[vmId] = TraceEntry(
- uuid,
- vmId.toString(),
- startTime,
- workload,
- mapOf(
- "cores" to maxCores,
- "required-memory" to requiredMemory,
- "workload" to workload
- )
- )
- }
-
- // Create the entry iterator
- iterator = entries.values.sortedBy { it.start }.iterator()
- }
-
- override fun hasNext(): Boolean = iterator.hasNext()
-
- override fun next(): TraceEntry<SimWorkload> = iterator.next()
-
- override fun close() {}
-}