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 {
repositories {
mavenCentral()
mavenLocal()
jcenter()
}
dependencies {
......@@ -26,7 +25,6 @@ dependencies {
implementation 'org.slf4j:slf4j-simple:1.7.32'
implementation 'io.github.microutils:kotlin-logging:2.1.16'
implementation 'org.apache.kafka:kafka-clients:2.8.0'
implementation 'khttp:khttp:1.0.0'
implementation 'net.objecthunter:exp4j:0.4.8'
testImplementation 'io.quarkus:quarkus-junit5'
......
package rocks.theodolite.kubernetes.slo
import khttp.post
import mu.KotlinLogging
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.
......@@ -15,7 +20,7 @@ class ExternalSloChecker(
) : SloChecker {
private val RETRIES = 2
private val TIMEOUT = 60.0
private val TIMEOUT = Duration.ofSeconds(60)
private val logger = KotlinLogging.logger {}
......@@ -36,12 +41,19 @@ class ExternalSloChecker(
).toJson()
while (counter < RETRIES) {
val result = post(externalSlopeURL, data = data, timeout = TIMEOUT)
if (result.statusCode != 200) {
val request = HttpRequest.newBuilder()
.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++
logger.error { "Could not reach external SLO checker at $externalSlopeURL." }
} else {
val booleanResult = result.text.toBoolean()
val booleanResult = response.body().toBoolean()
logger.info { "SLO checker result is: $booleanResult." }
return booleanResult
}
......
package rocks.theodolite.kubernetes.slo
import com.fasterxml.jackson.databind.ObjectMapper
import khttp.get
import khttp.responses.Response
import mu.KotlinLogging
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.Instant
......@@ -18,7 +20,7 @@ private val logger = KotlinLogging.logger {}
*/
class MetricFetcher(private val prometheusURL: String, private val offset: Duration) {
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.
......@@ -36,26 +38,27 @@ class MetricFetcher(private val prometheusURL: String, private val offset: Durat
val offsetEnd = end.minus(offset)
var counter = 0
val parameter = mapOf(
"query" to query,
"start" to offsetStart.toString(),
"end" to offsetEnd.toString(),
"step" to "5s"
)
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()
val request = HttpRequest.newBuilder()
.uri(URI.create("$prometheusURL/api/v1/query_range?query=$query&start=$offsetStart&end=$offsetEnd&step=5s"))
.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." }
counter++
} else {
val values = parseValues(response)
val values = parseValues(response.body())
if (values.data?.result.isNullOrEmpty()) {
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.")
......@@ -66,9 +69,9 @@ class MetricFetcher(private val prometheusURL: String, private val offset: Durat
* @param values Response from Prometheus.
* @return a [PrometheusResponse]
*/
private fun parseValues(values: Response): PrometheusResponse {
private fun parseValues(values: String): PrometheusResponse {
return ObjectMapper().readValue<PrometheusResponse>(
values.jsonObject.toString(),
values,
PrometheusResponse::class.java
)
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment