diff --git a/helm/templates/kafka/kafka-cluster.yaml b/helm/templates/kafka/kafka-cluster.yaml index 1ff89396513a134e553bc4b97f771822f52ac2ed..f1a58077a78865c624706531b58c3150feeb83ae 100644 --- a/helm/templates/kafka/kafka-cluster.yaml +++ b/helm/templates/kafka/kafka-cluster.yaml @@ -39,6 +39,11 @@ spec: nodeSelectorTerms: {{- toYaml . | nindent 16 }} {{- end}} + {{- with .Values.strimzi.kafka.resources}} + resources: + {{- toYaml . | nindent 6 }} + {{- end}} + zookeeper: {{- with .Values.strimzi.zookeeper.replicas }} diff --git a/helm/values.yaml b/helm/values.yaml index 765f8e4e6bd0a0f9d59dc812d4b7a01d134e10b0..e3e2143a2694a58be7fb4f48efe0723fc05fb0f7 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -174,6 +174,7 @@ strimzi: "-Xmx": "512M" "-Xms": "512M" nodeSelectorTerms: [] + resources: {} zookeeper: replicas: 3 diff --git a/theodolite/src/main/kotlin/theodolite/benchmark/Action.kt b/theodolite/src/main/kotlin/theodolite/benchmark/Action.kt index 35efebdc0fb2a3748660cb76cdd5499b4ca5f622..8bd16d04d6a5e5ef3f362ff7d5611bf73e367a7e 100644 --- a/theodolite/src/main/kotlin/theodolite/benchmark/Action.kt +++ b/theodolite/src/main/kotlin/theodolite/benchmark/Action.kt @@ -23,7 +23,7 @@ class Action { timeout = exec.timeoutSeconds, command = exec.command ) - if(exitCode != 0){ + if (exitCode != 0){ throw ActionCommandFailedException("Error while executing action, finished with exit code $exitCode") } } @@ -38,7 +38,7 @@ class ActionSelector { @JsonDeserialize @RegisterForReflection class PodSelector { - lateinit var matchLabels: MutableMap<String, String> + lateinit var matchLabels: Map<String, String> } @JsonDeserialize @RegisterForReflection diff --git a/theodolite/src/main/kotlin/theodolite/benchmark/ActionCommand.kt b/theodolite/src/main/kotlin/theodolite/benchmark/ActionCommand.kt index a4345c43ac6a75667c3c3e85c8534697193e1458..9f0578f7d1456d823a29049daae6dbe886c95e2a 100644 --- a/theodolite/src/main/kotlin/theodolite/benchmark/ActionCommand.kt +++ b/theodolite/src/main/kotlin/theodolite/benchmark/ActionCommand.kt @@ -33,7 +33,7 @@ class ActionCommand(val client: NamespacedKubernetesClient) { * @return the exit code of this executed command */ fun exec( - matchLabels: MutableMap<String, String>, + matchLabels: Map<String, String>, command: Array<String>, timeout: Long = Configuration.TIMEOUT_SECONDS, container: String = "" @@ -58,7 +58,7 @@ class ActionCommand(val client: NamespacedKubernetesClient) { val latchTerminationStatus = execLatch.await(timeout, TimeUnit.SECONDS) if (!latchTerminationStatus) { - throw ActionCommandFailedException("Latch could not terminate within specified time") + throw ActionCommandFailedException("Timeout while running action command") } execWatch.close() } catch (e: Exception) { @@ -112,7 +112,7 @@ class ActionCommand(val client: NamespacedKubernetesClient) { * it can take a while until the status is ready and the pod can be selected. * @return the name of the pod or throws [ActionCommandFailedException] */ - fun getPodName(matchLabels: MutableMap<String, String>, tries: Int): String { + fun getPodName(matchLabels: Map<String, String>, tries: Int): String { for (i in 1..tries) { try { @@ -125,7 +125,7 @@ class ActionCommand(val client: NamespacedKubernetesClient) { throw ActionCommandFailedException("Couldn't find any pod that matches the specified labels.") } - private fun getPodName(matchLabels: MutableMap<String, String>): String { + private fun getPodName(matchLabels: Map<String, String>): String { return try { val podNames = this.client .pods() diff --git a/theodolite/src/main/kotlin/theodolite/evaluation/AnalysisExecutor.kt b/theodolite/src/main/kotlin/theodolite/evaluation/AnalysisExecutor.kt index be3e48be406b631e03ca2fd32909a442b592f259..b3cc174d2945bf13bc1cc29d4e60d8c9bfbaf7eb 100644 --- a/theodolite/src/main/kotlin/theodolite/evaluation/AnalysisExecutor.kt +++ b/theodolite/src/main/kotlin/theodolite/evaluation/AnalysisExecutor.kt @@ -38,7 +38,7 @@ class AnalysisExecutor( try { val ioHandler = IOHandler() - val resultsFolder: String = ioHandler.getResultFolderURL() + val resultsFolder = ioHandler.getResultFolderURL() val fileURL = "${resultsFolder}exp${executionId}_${load.get()}_${res.get()}_${slo.sloType.toSlug()}" val prometheusData = executionIntervals diff --git a/theodolite/src/main/kotlin/theodolite/evaluation/MetricFetcher.kt b/theodolite/src/main/kotlin/theodolite/evaluation/MetricFetcher.kt index e54d79fe0f95b9f6079bd4295a74e81250b73a90..b6a1857cba513f663876f88d7a7d69ad02c0bc40 100644 --- a/theodolite/src/main/kotlin/theodolite/evaluation/MetricFetcher.kt +++ b/theodolite/src/main/kotlin/theodolite/evaluation/MetricFetcher.kt @@ -45,15 +45,16 @@ class MetricFetcher(private val prometheusURL: String, private val offset: Durat ) while (counter < RETRIES) { + logger.info { "Request collected metrics from Prometheus for interval [$offsetStart,$offsetEnd]." } val response = get("$prometheusURL/api/v1/query_range", params = parameter, timeout = TIMEOUT) if (response.statusCode != 200) { val message = response.jsonObject.toString() - logger.warn { "Could not connect to Prometheus: $message. Retrying now." } + logger.warn { "Could not connect to Prometheus: $message. Retry $counter/$RETRIES." } counter++ } else { val values = parseValues(response) if (values.data?.result.isNullOrEmpty()) { - throw NoSuchFieldException("Empty query result: $values between $start and $end for query $query.") + throw NoSuchFieldException("Empty query result: $values between for query '$query' in interval [$offsetStart,$offsetEnd] .") } return parseValues(response) } diff --git a/theodolite/src/main/kotlin/theodolite/evaluation/SloConfigHandler.kt b/theodolite/src/main/kotlin/theodolite/evaluation/SloConfigHandler.kt index b2cd269e0a6157ea23cb319cb3cfb6cb87a9d4e9..089f40dc6b5ef7d8ac4b063cae68e5e9621d1f50 100644 --- a/theodolite/src/main/kotlin/theodolite/evaluation/SloConfigHandler.kt +++ b/theodolite/src/main/kotlin/theodolite/evaluation/SloConfigHandler.kt @@ -4,6 +4,7 @@ import theodolite.benchmark.BenchmarkExecution import theodolite.util.InvalidPatcherConfigurationException import javax.enterprise.context.ApplicationScoped +private const val DEFAULT_CONSUMER_LAG_METRIC_BASE = "kafka_consumergroup_lag" private const val DEFAULT_CONSUMER_LAG_QUERY = "sum by(consumergroup) (kafka_consumergroup_lag >= 0)" private const val DEFAULT_DROPPED_RECORDS_QUERY = "sum by(job) (kafka_streams_stream_task_metrics_dropped_records_total>=0)" @@ -13,9 +14,14 @@ class SloConfigHandler { fun getQueryString(slo: BenchmarkExecution.Slo): String { return when (slo.sloType.lowercase()) { SloTypes.GENERIC.value -> slo.properties["promQLQuery"] ?: throw IllegalArgumentException("promQLQuery expected") + SloTypes.LAG_TREND.value, SloTypes.LAG_TREND_RATIO.value -> slo.properties["promQLQuery"] ?: + (slo.properties["consumerGroup"]?.let { "{consumergroup='$it'}" } ?: "").let { + "sum by(consumergroup) ($DEFAULT_CONSUMER_LAG_METRIC_BASE$it >= 0)" + } + SloTypes.DROPPED_RECORDS.value, SloTypes.DROPPED_RECORDS_RATIO.value -> slo.properties["promQLQuery"] ?: DEFAULT_DROPPED_RECORDS_QUERY SloTypes.LAG_TREND.value, SloTypes.LAG_TREND_RATIO.value -> slo.properties["promQLQuery"] ?: DEFAULT_CONSUMER_LAG_QUERY SloTypes.DROPPED_RECORDS.value, SloTypes.DROPPED_RECORDS_RATIO.value -> slo.properties["promQLQuery"] ?: DEFAULT_DROPPED_RECORDS_QUERY - else -> throw InvalidPatcherConfigurationException("Could not find Prometheus query string for slo type $slo.sloType") + else -> throw InvalidPatcherConfigurationException("Could not find Prometheus query string for slo type ${slo.sloType}") } } } diff --git a/theodolite/src/main/kotlin/theodolite/execution/operator/BenchmarkStateChecker.kt b/theodolite/src/main/kotlin/theodolite/execution/operator/BenchmarkStateChecker.kt index 6dcfb582655ff9295aedd63d8c30cbac7daae2b3..c20b2ba87e386dc7c0a14245e03bedfb067720e6 100644 --- a/theodolite/src/main/kotlin/theodolite/execution/operator/BenchmarkStateChecker.kt +++ b/theodolite/src/main/kotlin/theodolite/execution/operator/BenchmarkStateChecker.kt @@ -190,7 +190,7 @@ class BenchmarkStateChecker( } } -private fun <K, V> MutableMap<K, V>.containsMatchLabels(matchLabels: MutableMap<V, V>): Boolean { +private fun <K, V> Map<K, V>.containsMatchLabels(matchLabels: Map<V, V>): Boolean { for (kv in matchLabels) { if (kv.value != this[kv.key as K]) { return false diff --git a/theodolite/src/test/kotlin/theodolite/benchmark/ActionCommandTest.kt b/theodolite/src/test/kotlin/theodolite/benchmark/ActionCommandTest.kt index 0e40fca5caf9fe721c547e09d2ba22c25860a1bf..47f0e52f45e46e3cda093ff1b9722071f22ef7e8 100644 --- a/theodolite/src/test/kotlin/theodolite/benchmark/ActionCommandTest.kt +++ b/theodolite/src/test/kotlin/theodolite/benchmark/ActionCommandTest.kt @@ -102,7 +102,7 @@ class ActionCommandTest { val action = Action() action.selector = ActionSelector() action.selector.pod = PodSelector() - action.selector.pod.matchLabels = mutableMapOf("app" to "pod") + action.selector.pod.matchLabels = mapOf("app" to "pod") action.exec = Command() action.exec.command = arrayOf("ls") action.exec.timeoutSeconds = 10L @@ -118,7 +118,7 @@ class ActionCommandTest { val action = Action() action.selector = ActionSelector() action.selector.pod = PodSelector() - action.selector.pod.matchLabels = mutableMapOf("app" to "pod") + action.selector.pod.matchLabels = mapOf("app" to "pod") action.exec = Command() action.exec.command = arrayOf("error-command") action.exec.timeoutSeconds = 10L