Skip to content
Snippets Groups Projects
Commit d8fc284d authored by Sören Henning's avatar Sören Henning
Browse files

Make Prometheus step resolution configurable

parent 9bf2e094
No related branches found
No related tags found
No related merge requests found
Pipeline #14212 failed
package rocks.theodolite.kubernetes.slo package rocks.theodolite.kubernetes.slo
import rocks.theodolite.core.strategies.Metric
import rocks.theodolite.core.IOHandler import rocks.theodolite.core.IOHandler
import rocks.theodolite.kubernetes.model.KubernetesBenchmark.Slo import rocks.theodolite.kubernetes.model.KubernetesBenchmark.Slo
import java.text.Normalizer import java.text.Normalizer
...@@ -9,6 +8,8 @@ import java.time.Instant ...@@ -9,6 +8,8 @@ import java.time.Instant
import java.util.* import java.util.*
import java.util.regex.Pattern import java.util.regex.Pattern
private val DEFAULT_STEP_SIZE = Duration.ofSeconds(5)
/** /**
* Contains the analysis. Fetches a metric from Prometheus, documents it, and evaluates it. * Contains the analysis. Fetches a metric from Prometheus, documents it, and evaluates it.
* @param slo Slo that is used for the analysis. * @param slo Slo that is used for the analysis.
...@@ -39,11 +40,14 @@ class AnalysisExecutor( ...@@ -39,11 +40,14 @@ class AnalysisExecutor(
val resultsFolder = ioHandler.getResultFolderURL() val resultsFolder = ioHandler.getResultFolderURL()
val fileURL = "${resultsFolder}exp${executionId}_${load}_${resource}_${slo.sloType.toSlug()}" val fileURL = "${resultsFolder}exp${executionId}_${load}_${resource}_${slo.sloType.toSlug()}"
val stepSize = slo.properties["promQLStepSeconds"]?.toLong()?.let { Duration.ofSeconds(it) } ?: DEFAULT_STEP_SIZE
val prometheusData = executionIntervals val prometheusData = executionIntervals
.map { interval -> .map { interval ->
fetcher.fetchMetric( fetcher.fetchMetric(
start = interval.first, start = interval.first,
end = interval.second, end = interval.second,
stepSize = stepSize,
query = SloConfigHandler.getQueryString(slo = slo) query = SloConfigHandler.getQueryString(slo = slo)
) )
} }
......
...@@ -34,7 +34,7 @@ class MetricFetcher(private val prometheusURL: String, private val offset: Durat ...@@ -34,7 +34,7 @@ class MetricFetcher(private val prometheusURL: String, private val offset: Durat
* @param query query for the prometheus server. * @param query query for the prometheus server.
* @throws ConnectException - if the prometheus server timed out/was not reached. * @throws ConnectException - if the prometheus server timed out/was not reached.
*/ */
fun fetchMetric(start: Instant, end: Instant, query: String): PrometheusResponse { fun fetchMetric(start: Instant, end: Instant, stepSize: Duration, query: String): PrometheusResponse {
val offsetStart = start.minus(offset) val offsetStart = start.minus(offset)
val offsetEnd = end.minus(offset) val offsetEnd = end.minus(offset)
...@@ -46,7 +46,7 @@ class MetricFetcher(private val prometheusURL: String, private val offset: Durat ...@@ -46,7 +46,7 @@ class MetricFetcher(private val prometheusURL: String, private val offset: Durat
val encodedQuery = URLEncoder.encode(query, StandardCharsets.UTF_8) val encodedQuery = URLEncoder.encode(query, StandardCharsets.UTF_8)
val request = HttpRequest.newBuilder() val request = HttpRequest.newBuilder()
.uri(URI.create( .uri(URI.create(
"$prometheusURL/api/v1/query_range?query=$encodedQuery&start=$offsetStart&end=$offsetEnd&step=5s")) "$prometheusURL/api/v1/query_range?query=$encodedQuery&start=$offsetStart&end=$offsetEnd&step={${stepSize.toSeconds()}}s"))
.GET() .GET()
.version(HttpClient.Version.HTTP_1_1) .version(HttpClient.Version.HTTP_1_1)
.timeout(TIMEOUT) .timeout(TIMEOUT)
......
...@@ -54,6 +54,7 @@ internal class MetricFetcherTest { ...@@ -54,6 +54,7 @@ internal class MetricFetcherTest {
val response = metricFetcher.fetchMetric( val response = metricFetcher.fetchMetric(
exampleDateTime.minus(Duration.ofMinutes(10)), exampleDateTime.minus(Duration.ofMinutes(10)),
exampleDateTime, exampleDateTime,
Duration.ofSeconds(5),
"sum by(consumergroup) (kafka_consumergroup_lag >= 0)") "sum by(consumergroup) (kafka_consumergroup_lag >= 0)")
assertEquals(emptyPrometheusResponse, response) assertEquals(emptyPrometheusResponse, response)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment