diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2021-05-04 21:43:46 +0200 |
|---|---|---|
| committer | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2021-05-05 12:12:30 +0200 |
| commit | ad65a05e3f41850807f95f7d643496a4d39a6197 (patch) | |
| tree | 238b0fc83a5836d3fc08e3e888cec298eb8e8cd1 | |
| parent | 6466d5e1b8da4582434f02dff2ab56e8f736ef85 (diff) | |
exp: Add support for experiment configuration
This change adds support for configuring the experiments via
configuration files using the TypeSafe config library. In the future, we
will also integrate support for configuration into the harness.
12 files changed, 43 insertions, 35 deletions
diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 6aa9260b..bb187a40 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -26,7 +26,6 @@ import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.kotlin.dsl.extra import kotlin.properties.ReadOnlyProperty -import kotlin.reflect.KProperty /** * This class contains the versions of the dependencies shared by the different @@ -46,6 +45,7 @@ public class Versions(private val project: Project) { val slf4j by version() val kotlinLogging by version(name = "kotlin-logging") val log4j by version() + val config by version() val kotlinxCoroutines by version(name = "kotlinx-coroutines") diff --git a/gradle.properties b/gradle.properties index cbe19a08..20f4b711 100644 --- a/gradle.properties +++ b/gradle.properties @@ -47,6 +47,7 @@ hadoop-client.version = 3.2.1 sentry-log4j2.version = 4.2.0 mongodb-driver-sync.version = 4.2.1 classgraph.version = 4.8.102 +config.version = 1.4.1 # Dependencies (Testing) junit-jupiter.version = 5.7.1 diff --git a/opendc-experiments/opendc-experiments-capelin/build.gradle.kts b/opendc-experiments/opendc-experiments-capelin/build.gradle.kts index 83d89574..06a35c4b 100644 --- a/opendc-experiments/opendc-experiments-capelin/build.gradle.kts +++ b/opendc-experiments/opendc-experiments-capelin/build.gradle.kts @@ -39,6 +39,7 @@ dependencies { implementation(project(":opendc-compute:opendc-compute-simulator")) implementation("io.github.microutils:kotlin-logging") + implementation("com.typesafe:config") implementation("me.tongfei:progressbar:${versions["progressbar"]}") implementation("com.github.ajalt.clikt:clikt:${versions["clikt"]}") 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 fc6f79d3..b70eefb2 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 @@ -22,6 +22,7 @@ package org.opendc.experiments.capelin +import com.typesafe.config.ConfigFactory import io.opentelemetry.sdk.metrics.export.MetricProducer import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.cancel @@ -60,19 +61,9 @@ public abstract class Portfolio(name: String) : Experiment(name) { private val logger = KotlinLogging.logger {} /** - * The path to where the environments are located. + * The configuration to use. */ - private val environmentPath by anyOf(File("input/environments/")) - - /** - * The path to where the traces are located. - */ - private val tracePath by anyOf(File("input/traces/")) - - /** - * The path to where the output results should be written. - */ - private val outputPath by anyOf(File("output/")) + private val config = ConfigFactory.load().getConfig("opendc.experiments.capelin") /** * The path to the original VM placements file. @@ -115,7 +106,7 @@ public abstract class Portfolio(name: String) : Experiment(name) { @OptIn(ExperimentalCoroutinesApi::class) override fun doRun(repeat: Int): Unit = runBlockingSimulation { val seeder = Random(repeat.toLong()) - val environment = Sc20ClusterEnvironmentReader(File(environmentPath, "${topology.name}.txt")) + val environment = Sc20ClusterEnvironmentReader(File(config.getString("env-path"), "${topology.name}.txt")) val chan = Channel<Unit>(Channel.CONFLATED) val allocationPolicy = createComputeScheduler(seeder) @@ -131,7 +122,7 @@ public abstract class Portfolio(name: String) : Experiment(name) { val rawReaders = workloadNames.map { workloadName -> traceReaders.computeIfAbsent(workloadName) { logger.info { "Loading trace $workloadName" } - Sc20RawParquetTraceReader(File(tracePath, workloadName)) + Sc20RawParquetTraceReader(File(config.getString("trace-path"), workloadName)) } } @@ -141,7 +132,7 @@ public abstract class Portfolio(name: String) : Experiment(name) { val trace = Sc20ParquetTraceReader(rawReaders, performanceInterferenceModel, workload, seeder.nextInt()) val monitor = ParquetExperimentMonitor( - outputPath, + File(config.getString("output-path")), "portfolio_id=$name/scenario_id=$id/run_id=$repeat", 4096 ) diff --git a/opendc-experiments/opendc-experiments-capelin/src/main/resources/application.conf b/opendc-experiments/opendc-experiments-capelin/src/main/resources/application.conf new file mode 100644 index 00000000..f0e0f2d3 --- /dev/null +++ b/opendc-experiments/opendc-experiments-capelin/src/main/resources/application.conf @@ -0,0 +1,6 @@ +# Default configuration for the Capelin experiments +opendc.experiments.capelin { + env-path = input/environments/ + trace-path = input/traces/ + output-path = output +} diff --git a/opendc-experiments/opendc-experiments-energy21/build.gradle.kts b/opendc-experiments/opendc-experiments-energy21/build.gradle.kts index 7d5fc98d..fc37fc1c 100644 --- a/opendc-experiments/opendc-experiments-energy21/build.gradle.kts +++ b/opendc-experiments/opendc-experiments-energy21/build.gradle.kts @@ -39,6 +39,7 @@ dependencies { implementation(project(":opendc-experiments:opendc-experiments-capelin")) implementation(project(":opendc-telemetry:opendc-telemetry-sdk")) implementation("io.github.microutils:kotlin-logging") + implementation("com.typesafe:config") implementation("org.apache.parquet:parquet-avro:${versions["parquet-avro"]}") implementation("org.apache.hadoop:hadoop-client:${versions["hadoop-client"]}") { diff --git a/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt b/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt index 772c9bcc..7460a1e7 100644 --- a/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt +++ b/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt @@ -22,6 +22,7 @@ package org.opendc.experiments.energy21 +import com.typesafe.config.ConfigFactory import io.opentelemetry.api.metrics.MeterProvider import io.opentelemetry.sdk.metrics.SdkMeterProvider import io.opentelemetry.sdk.metrics.export.MetricProducer @@ -65,14 +66,9 @@ public class EnergyExperiment : Experiment("Energy Modeling 2021") { private val logger = KotlinLogging.logger {} /** - * The path to where the traces are located. + * The configuration to use. */ - private val tracePath by anyOf(File("input/traces/")) - - /** - * The path to where the output results should be written. - */ - private val outputPath by anyOf(File("output/")) + private val config = ConfigFactory.load().getConfig("opendc.experiments.energy21") /** * The traces to test. @@ -96,8 +92,8 @@ public class EnergyExperiment : Experiment("Energy Modeling 2021") { .setClock(clock.toOtelClock()) .build() - val monitor = ParquetExperimentMonitor(outputPath, "power_model=$powerModel/run_id=$repeat", 4096) - val trace = Sc20StreamingParquetTraceReader(File(tracePath, trace), random = Random(1).asKotlinRandom()) + val monitor = ParquetExperimentMonitor(File(config.getString("output-path")), "power_model=$powerModel/run_id=$repeat", 4096) + val trace = Sc20StreamingParquetTraceReader(File(config.getString("trace-path"), trace), random = Random(1).asKotlinRandom()) withComputeService(clock, meterProvider, allocationPolicy) { scheduler -> withMonitor(monitor, clock, meterProvider as MetricProducer, scheduler) { diff --git a/opendc-experiments/opendc-experiments-energy21/src/main/resources/application.conf b/opendc-experiments/opendc-experiments-energy21/src/main/resources/application.conf new file mode 100644 index 00000000..3e011862 --- /dev/null +++ b/opendc-experiments/opendc-experiments-energy21/src/main/resources/application.conf @@ -0,0 +1,8 @@ +# Default configuration for the energy experiments +opendc.experiments.energy21 { + # Path to the directory containing the input traces + trace-path = input/traces + + # Path to the output directory to write the results to + output-path = output +} diff --git a/opendc-experiments/opendc-experiments-serverless20/build.gradle.kts b/opendc-experiments/opendc-experiments-serverless20/build.gradle.kts index 2dfa2d3f..f19d6067 100644 --- a/opendc-experiments/opendc-experiments-serverless20/build.gradle.kts +++ b/opendc-experiments/opendc-experiments-serverless20/build.gradle.kts @@ -37,6 +37,7 @@ dependencies { implementation(project(":opendc-telemetry:opendc-telemetry-sdk")) implementation(project(":opendc-harness:opendc-harness-cli")) implementation("io.github.microutils:kotlin-logging") + implementation("com.typesafe:config") implementation("org.apache.parquet:parquet-avro:${versions["parquet-avro"]}") implementation("org.apache.hadoop:hadoop-client:${versions["hadoop-client"]}") { diff --git a/opendc-experiments/opendc-experiments-serverless20/src/main/kotlin/org/opendc/experiments/serverless/ServerlessExperiment.kt b/opendc-experiments/opendc-experiments-serverless20/src/main/kotlin/org/opendc/experiments/serverless/ServerlessExperiment.kt index 67b5ea54..3ff01e39 100644 --- a/opendc-experiments/opendc-experiments-serverless20/src/main/kotlin/org/opendc/experiments/serverless/ServerlessExperiment.kt +++ b/opendc-experiments/opendc-experiments-serverless20/src/main/kotlin/org/opendc/experiments/serverless/ServerlessExperiment.kt @@ -22,9 +22,9 @@ package org.opendc.experiments.serverless +import com.typesafe.config.ConfigFactory import io.opentelemetry.api.metrics.MeterProvider import io.opentelemetry.sdk.metrics.SdkMeterProvider -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -59,14 +59,9 @@ public class ServerlessExperiment : Experiment("Serverless") { private val logger = KotlinLogging.logger {} /** - * The path to where the traces are located. + * The configuration to use. */ - private val tracePath by anyOf(File("../../input/traces/serverless")) - - /** - * The path to where the output results should be written. - */ - private val outputPath by anyOf(File("output/")) + private val config = ConfigFactory.load().getConfig("opendc.experiments.serverless20") /** * The routing policy to test. @@ -78,14 +73,13 @@ public class ServerlessExperiment : Experiment("Serverless") { */ private val coldStartModel by anyOf(ColdStartModel.LAMBDA, ColdStartModel.AZURE, ColdStartModel.GOOGLE) - @OptIn(ExperimentalCoroutinesApi::class) override fun doRun(repeat: Int): Unit = runBlockingSimulation { val meterProvider: MeterProvider = SdkMeterProvider .builder() .setClock(clock.toOtelClock()) .build() - val trace = ServerlessTraceReader().parse(tracePath) + val trace = ServerlessTraceReader().parse(File(config.getString("trace-path"))) val traceById = trace.associateBy { it.id } val delayInjector = StochasticDelayInjector(coldStartModel, Random()) val deployer = SimFunctionDeployer(clock, this, createMachineModel(), delayInjector) { FunctionTraceWorkload(traceById.getValue(it.name)) } diff --git a/opendc-experiments/opendc-experiments-serverless20/src/main/resources/application.conf b/opendc-experiments/opendc-experiments-serverless20/src/main/resources/application.conf new file mode 100644 index 00000000..a065c5d6 --- /dev/null +++ b/opendc-experiments/opendc-experiments-serverless20/src/main/resources/application.conf @@ -0,0 +1,8 @@ +# Default configuration for the serverless experiments +opendc.experiments.serverless20 { + # Path to the directory containing the serverless trace + trace-path = input/traces/serverless + + # Path to the output directory to write the results to + output-path = output +} diff --git a/opendc-platform/build.gradle.kts b/opendc-platform/build.gradle.kts index ea0591ad..3fbc144e 100644 --- a/opendc-platform/build.gradle.kts +++ b/opendc-platform/build.gradle.kts @@ -31,6 +31,7 @@ dependencies { api("org.jetbrains.kotlinx:kotlinx-coroutines-core:${versions.kotlinxCoroutines}") api("org.jetbrains.kotlinx:kotlinx-coroutines-test:${versions.kotlinxCoroutines}") + api("com.typesafe:config:1.4.1") api("io.github.microutils:kotlin-logging:${versions.kotlinLogging}") runtime("org.slf4j:slf4j-simple:${versions.slf4j}") runtime("org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j}") |
