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

Merge branch 'replace-khttp' into 'main'

Replace khttp

Closes #287

See merge request !313
parents a11e3a49 0b9a6c3b
No related branches found
No related tags found
1 merge request!313Replace khttp
Pipeline #12770 passed
...@@ -9,7 +9,6 @@ plugins { ...@@ -9,7 +9,6 @@ plugins {
repositories { repositories {
mavenCentral() mavenCentral()
mavenLocal() mavenLocal()
jcenter()
} }
dependencies { dependencies {
...@@ -26,7 +25,6 @@ dependencies { ...@@ -26,7 +25,6 @@ dependencies {
implementation 'org.slf4j:slf4j-simple:1.7.32' implementation 'org.slf4j:slf4j-simple:1.7.32'
implementation 'io.github.microutils:kotlin-logging:2.1.16' implementation 'io.github.microutils:kotlin-logging:2.1.16'
implementation 'org.apache.kafka:kafka-clients:2.8.0' implementation 'org.apache.kafka:kafka-clients:2.8.0'
implementation 'khttp:khttp:1.0.0'
implementation 'net.objecthunter:exp4j:0.4.8' implementation 'net.objecthunter:exp4j:0.4.8'
testImplementation 'io.quarkus:quarkus-junit5' testImplementation 'io.quarkus:quarkus-junit5'
......
package rocks.theodolite.kubernetes.slo package rocks.theodolite.kubernetes.slo
import khttp.post
import mu.KotlinLogging import mu.KotlinLogging
import java.net.ConnectException import java.net.ConnectException
import java.net.URI
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse.BodyHandlers
import java.time.Duration
/** /**
* [SloChecker] that uses an external source for the concrete evaluation. * [SloChecker] that uses an external source for the concrete evaluation.
...@@ -15,7 +20,7 @@ class ExternalSloChecker( ...@@ -15,7 +20,7 @@ class ExternalSloChecker(
) : SloChecker { ) : SloChecker {
private val RETRIES = 2 private val RETRIES = 2
private val TIMEOUT = 60.0 private val TIMEOUT = Duration.ofSeconds(60)
private val logger = KotlinLogging.logger {} private val logger = KotlinLogging.logger {}
...@@ -36,12 +41,19 @@ class ExternalSloChecker( ...@@ -36,12 +41,19 @@ class ExternalSloChecker(
).toJson() ).toJson()
while (counter < RETRIES) { while (counter < RETRIES) {
val result = post(externalSlopeURL, data = data, timeout = TIMEOUT) val request = HttpRequest.newBuilder()
if (result.statusCode != 200) { .uri(URI.create(externalSlopeURL))
.POST(HttpRequest.BodyPublishers.ofString(data))
.timeout(TIMEOUT)
.build()
val response = HttpClient.newBuilder()
.build()
.send(request, BodyHandlers.ofString())
if (response.statusCode() != 200) {
counter++ counter++
logger.error { "Could not reach external SLO checker at $externalSlopeURL." } logger.error { "Could not reach external SLO checker at $externalSlopeURL." }
} else { } else {
val booleanResult = result.text.toBoolean() val booleanResult = response.body().toBoolean()
logger.info { "SLO checker result is: $booleanResult." } logger.info { "SLO checker result is: $booleanResult." }
return booleanResult return booleanResult
} }
......
package rocks.theodolite.kubernetes.slo package rocks.theodolite.kubernetes.slo
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import khttp.get
import khttp.responses.Response
import mu.KotlinLogging import mu.KotlinLogging
import java.net.ConnectException import java.net.ConnectException
import java.net.URI
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
import java.time.Duration import java.time.Duration
import java.time.Instant import java.time.Instant
...@@ -18,7 +20,7 @@ private val logger = KotlinLogging.logger {} ...@@ -18,7 +20,7 @@ private val logger = KotlinLogging.logger {}
*/ */
class MetricFetcher(private val prometheusURL: String, private val offset: Duration) { class MetricFetcher(private val prometheusURL: String, private val offset: Duration) {
private val RETRIES = 2 private val RETRIES = 2
private val TIMEOUT = 60.0 private val TIMEOUT = Duration.ofSeconds(60)
/** /**
* Tries to fetch a metric by a query to a Prometheus server. * Tries to fetch a metric by a query to a Prometheus server.
...@@ -36,26 +38,27 @@ class MetricFetcher(private val prometheusURL: String, private val offset: Durat ...@@ -36,26 +38,27 @@ class MetricFetcher(private val prometheusURL: String, private val offset: Durat
val offsetEnd = end.minus(offset) val offsetEnd = end.minus(offset)
var counter = 0 var counter = 0
val parameter = mapOf(
"query" to query,
"start" to offsetStart.toString(),
"end" to offsetEnd.toString(),
"step" to "5s"
)
while (counter < RETRIES) { while (counter < RETRIES) {
logger.info { "Request collected metrics from Prometheus for interval [$offsetStart,$offsetEnd]." } logger.info { "Request collected metrics from Prometheus for interval [$offsetStart,$offsetEnd]." }
val response = get("$prometheusURL/api/v1/query_range", params = parameter, timeout = TIMEOUT) val request = HttpRequest.newBuilder()
if (response.statusCode != 200) { .uri(URI.create("$prometheusURL/api/v1/query_range?query=$query&start=$offsetStart&end=$offsetEnd&step=5s"))
val message = response.jsonObject.toString() .GET()
.timeout(TIMEOUT)
.build()
val response = HttpClient.newBuilder()
.build()
.send(request, HttpResponse.BodyHandlers.ofString())
if (response.statusCode() != 200) {
val message = response.body()
logger.warn { "Could not connect to Prometheus: $message. Retry $counter/$RETRIES." } logger.warn { "Could not connect to Prometheus: $message. Retry $counter/$RETRIES." }
counter++ counter++
} else { } else {
val values = parseValues(response) val values = parseValues(response.body())
if (values.data?.result.isNullOrEmpty()) { if (values.data?.result.isNullOrEmpty()) {
throw NoSuchFieldException("Empty query result: $values between for query '$query' in interval [$offsetStart,$offsetEnd] .") throw NoSuchFieldException("Empty query result: $values between for query '$query' in interval [$offsetStart,$offsetEnd] .")
} }
return parseValues(response) return parseValues(response.body())
} }
} }
throw ConnectException("No answer from Prometheus received.") throw ConnectException("No answer from Prometheus received.")
...@@ -66,9 +69,9 @@ class MetricFetcher(private val prometheusURL: String, private val offset: Durat ...@@ -66,9 +69,9 @@ class MetricFetcher(private val prometheusURL: String, private val offset: Durat
* @param values Response from Prometheus. * @param values Response from Prometheus.
* @return a [PrometheusResponse] * @return a [PrometheusResponse]
*/ */
private fun parseValues(values: Response): PrometheusResponse { private fun parseValues(values: String): PrometheusResponse {
return ObjectMapper().readValue<PrometheusResponse>( return ObjectMapper().readValue<PrometheusResponse>(
values.jsonObject.toString(), values,
PrometheusResponse::class.java PrometheusResponse::class.java
) )
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment