diff --git a/theodolite-quarkus/build.gradle b/theodolite-quarkus/build.gradle index 63d08a53f93fe9f275c1e5de01df47ec9dc2a27a..d6a4348da9cee6b1e2ea7f712ef57efc01c02282 100644 --- a/theodolite-quarkus/build.gradle +++ b/theodolite-quarkus/build.gradle @@ -20,6 +20,7 @@ dependencies { implementation 'io.quarkus:quarkus-resteasy' testImplementation 'io.quarkus:quarkus-junit5' testImplementation 'io.rest-assured:rest-assured' + implementation 'com.google.code.gson:gson:2.8.5' implementation 'org.slf4j:slf4j-simple:1.7.29' implementation 'io.github.microutils:kotlin-logging:1.12.0' diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/evaluation/MetricFetcher.kt b/theodolite-quarkus/src/main/kotlin/theodolite/evaluation/MetricFetcher.kt index d95d5971b41bdacf27002b94b2035d7edea10b21..883ead52c785722033ce9f8a4b86dd803f755fd5 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/evaluation/MetricFetcher.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/evaluation/MetricFetcher.kt @@ -1,13 +1,17 @@ package theodolite.evaluation +import com.google.gson.Gson import khttp.get +import khttp.responses.Response +import theodolite.util.PrometheusResponse +import java.net.ConnectException import java.util.* class MetricFetcher(private val prometheusURL: String) { - fun fetchMetric(start: Long, end: Long, query: String): Any { - + fun fetchMetric(start: Long, end: Long, query: String): PrometheusResponse { + var trys = 0 val parameter = mapOf( "query" to query, "start" to toISODate(start), @@ -15,19 +19,27 @@ class MetricFetcher(private val prometheusURL: String) { "step" to "5s" ) - val response = get("$prometheusURL/api/v1/query_range", params = parameter) - //TODO FIX: NOTHING RECEIVED - return response.jsonObject.getJSONObject("data").getJSONArray("result")//.getJSONObject(0)["values"] + while (trys < 2) { + val response = get("$prometheusURL/api/v1/query_range", params = parameter) + if (response.statusCode != 200) { + trys++ + } else { + return parseValues(response) + } + } + throw ConnectException("No answer from Prometheus received") } private fun toISODate(timestamp: Long): String { val sdf = java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sss'Z'") - val date = Date(timestamp - (3600 * 1000)) + val date = Date(timestamp - (3600 * 1000))//subtract 1h since cluster is in another timezone return sdf.format(date) } - private fun parseValues(values: String): Any { - // TODO("pars with gson") - return "" + private fun parseValues(values: Response): PrometheusResponse { + return Gson().fromJson<PrometheusResponse>( + values.jsonObject.toString(), + PrometheusResponse::class.java + ) } } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/evaluation/SLOCheckerImpl.kt b/theodolite-quarkus/src/main/kotlin/theodolite/evaluation/SLOCheckerImpl.kt index 8a638d7f2a970203166b96af607d0296b130a16f..084d07c95ddf23365bcf1c146aeb2cfd96752757 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/evaluation/SLOCheckerImpl.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/evaluation/SLOCheckerImpl.kt @@ -2,18 +2,25 @@ package theodolite.evaluation import khttp.post import org.json.JSONObject +import java.net.ConnectException class SLOCheckerImpl(private val prometheusURL: String) : SLOChecker { override fun evaluate(start: Long, end: Long): Boolean { + var counter = 0 val metricFetcher = MetricFetcher(prometheusURL = prometheusURL) - val totalLag = metricFetcher.fetchMetric(start, end, "sum by(group)(kafka_consumergroup_group_lag > 0)") - val parameter = mapOf("total_lag" to totalLag) + val fetchedData = metricFetcher.fetchMetric(start, end, "sum by(group)(kafka_consumergroup_group_lag > 0)") + val data = JSONObject(mapOf("total_lag" to fetchedData.data?.result)) + + while (counter < 2) { + val result = post("http://127.0.0.1:8000/evaluate-slope", data = data) + if (result.statusCode != 200) { + counter++ + } else { + return result.text.toBoolean() + } + } - //val response = get("http://127.0.0.1:8000/evaluate-slope", params = parameter) - val post = post("http://127.0.0.1:8000/evaluate-slope", data = JSONObject(parameter)) - //println(JSONObject(parameter)) - //println(post.text.toBoolean()) - return post.text.toBoolean()//response.jsonObject["suitable"] == "true" + throw ConnectException("Could not reach slope evaluation") } } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/PrometheusResponse.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/PrometheusResponse.kt new file mode 100644 index 0000000000000000000000000000000000000000..2c3b86a30ee21a26c6a6575f65f2d522e169f6a8 --- /dev/null +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/PrometheusResponse.kt @@ -0,0 +1,20 @@ +package theodolite.util + +data class PrometheusResponse( + var status: String? = null, + var data: PromData? = null +) + +data class PromData( + var resultType: String? = null, + var result: List<PromResult>? = null +) + +data class PromResult( + var metric: PromMetric? = null, + var values: List<Object>? = null +) + +data class PromMetric( + var group: String? = null +)