From cdb15048d9ed070a9c1be626a0a79238cb2a47ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 20:55:10 +0000 Subject: [PATCH 1/3] Bump io.micrometer:micrometer-registry-prometheus from 1.12.5 to 1.13.1 Bumps [io.micrometer:micrometer-registry-prometheus](https://github.com/micrometer-metrics/micrometer) from 1.12.5 to 1.13.1. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.12.5...v1.13.1) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-prometheus dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c799fef8..edda6c2d 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ <kotlin.version>2.0.0</kotlin.version> <ktor.version>2.3.11</ktor.version> <jackson.version>2.17.1</jackson.version> - <micrometer.version>1.12.5</micrometer.version> + <micrometer.version>1.13.1</micrometer.version> <jackson.version>2.17.1</jackson.version> <logback.version>1.5.6</logback.version> <slf4j.version>2.0.13</slf4j.version> From fd1e32b2c5c64095a3d7142832d63800fb41200c Mon Sep 17 00:00:00 2001 From: Tore Langedal Endestad <tore.langedal.endestad@nav.no> Date: Mon, 24 Jun 2024 20:34:06 +0200 Subject: [PATCH 2/3] =?UTF-8?q?Endringer=20for=20=C3=A5=20komme=20over=20p?= =?UTF-8?q?=C3=A5=20ny=20prometeus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dusseldorf-ktor-health/pom.xml | 3 ++- .../dusseldorf/ktor/health/HealthReporter.kt | 12 ++++----- dusseldorf-ktor-metrics/pom.xml | 7 +---- .../dusseldorf/ktor/metrics/MetricsRoute.kt | 26 +++++++------------ .../ktor/metrics/MicrometerConfiguration.kt | 18 ++++++------- .../dusseldorf/ktor/metrics/Operation.kt | 22 +++++++--------- dusseldorf-ktor-streams/pom.xml | 5 ++++ .../dusseldorf/ktor/streams/ManagedStream.kt | 12 ++++----- .../helse/dusseldorf/ktor/streams/Topology.kt | 8 +++--- gradle/dusseldorf-ktor.gradle.kts | 2 +- pom.xml | 7 +---- 11 files changed, 54 insertions(+), 68 deletions(-) diff --git a/dusseldorf-ktor-health/pom.xml b/dusseldorf-ktor-health/pom.xml index d245587a..114a9885 100644 --- a/dusseldorf-ktor-health/pom.xml +++ b/dusseldorf-ktor-health/pom.xml @@ -22,7 +22,8 @@ </dependency> <dependency> <groupId>io.prometheus</groupId> - <artifactId>simpleclient_common</artifactId> + <artifactId>prometheus-metrics-core</artifactId> + <version>${prometheus.version}</version> </dependency> </dependencies> diff --git a/dusseldorf-ktor-health/src/main/kotlin/no/nav/helse/dusseldorf/ktor/health/HealthReporter.kt b/dusseldorf-ktor-health/src/main/kotlin/no/nav/helse/dusseldorf/ktor/health/HealthReporter.kt index dd76112e..25a07658 100644 --- a/dusseldorf-ktor-health/src/main/kotlin/no/nav/helse/dusseldorf/ktor/health/HealthReporter.kt +++ b/dusseldorf-ktor-health/src/main/kotlin/no/nav/helse/dusseldorf/ktor/health/HealthReporter.kt @@ -1,6 +1,6 @@ package no.nav.helse.dusseldorf.ktor.health -import io.prometheus.client.Gauge +import io.prometheus.metrics.core.metrics.Gauge import kotlinx.coroutines.runBlocking import java.time.Duration import java.util.* @@ -16,9 +16,9 @@ class HealthReporter( private const val HEALTHY = 0.0 private const val UNHEALTHY = 1.0 - private val gauge = Gauge - .build("health_check_status", - "Indikerer applikasjonens helse status. 0 er OK, 1 indikerer feil.") + private val gauge = Gauge.builder() + .name("health_check_status") + .help("Indikerer applikasjonens helse status. 0 er OK, 1 indikerer feil.") .labelNames("app") .register() } @@ -41,9 +41,9 @@ class HealthReporter( private fun Gauge.setFromResults(results: List<Result>) { if (results.any { it is UnHealthy }) { - labels(app).set(UNHEALTHY) + labelValues(app).set(UNHEALTHY) } else { - labels(app).set(HEALTHY) + labelValues(app).set(HEALTHY) } } } \ No newline at end of file diff --git a/dusseldorf-ktor-metrics/pom.xml b/dusseldorf-ktor-metrics/pom.xml index 8b319358..294cc9d5 100644 --- a/dusseldorf-ktor-metrics/pom.xml +++ b/dusseldorf-ktor-metrics/pom.xml @@ -31,12 +31,7 @@ </dependency> <dependency> <groupId>io.prometheus</groupId> - <artifactId>simpleclient_common</artifactId> - <version>${prometheus.version}</version> - </dependency> - <dependency> - <groupId>io.prometheus</groupId> - <artifactId>simpleclient_hotspot</artifactId> + <artifactId>prometheus-metrics-core</artifactId> <version>${prometheus.version}</version> </dependency> </dependencies> diff --git a/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/MetricsRoute.kt b/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/MetricsRoute.kt index 1c7b58cd..494a5016 100644 --- a/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/MetricsRoute.kt +++ b/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/MetricsRoute.kt @@ -1,12 +1,12 @@ package no.nav.helse.dusseldorf.ktor.metrics import io.ktor.server.application.* -import io.ktor.http.* import io.ktor.server.response.* -import io.ktor.server.routing.Route -import io.ktor.server.routing.get -import io.prometheus.client.CollectorRegistry -import io.prometheus.client.exporter.common.TextFormat +import io.ktor.server.routing.* +import io.micrometer.core.instrument.Clock +import io.micrometer.prometheusmetrics.PrometheusConfig +import io.micrometer.prometheusmetrics.PrometheusMeterRegistry +import io.prometheus.metrics.model.registry.PrometheusRegistry import no.nav.helse.dusseldorf.ktor.core.Paths import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -14,20 +14,12 @@ import org.slf4j.LoggerFactory private val logger: Logger = LoggerFactory.getLogger("no.nav.helse.dusseldorf.ktor.metrics.MetricsRoute") fun Route.MetricsRoute( - collectorRegistry: CollectorRegistry = CollectorRegistry.defaultRegistry, - path: String = Paths.DEFAULT_METRICS_PATH) { - - fun ApplicationCall.names() = - request.queryParameters.getAll("name[]")?.toSet() ?: emptySet() - + registry : PrometheusMeterRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT, PrometheusRegistry.defaultRegistry, Clock.SYSTEM), + path: String = Paths.DEFAULT_METRICS_PATH +) { get(path) { logger.debug("Metrics hentes") - val names = call.names() - val metrics = collectorRegistry.filteredMetricFamilySamples(names) - - call.respondTextWriter(ContentType.parse(TextFormat.CONTENT_TYPE_004)) { - TextFormat.write004(this, metrics) - } + call.respondText { registry.scrape() } } } diff --git a/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/MicrometerConfiguration.kt b/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/MicrometerConfiguration.kt index 86c426af..6870d1ab 100644 --- a/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/MicrometerConfiguration.kt +++ b/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/MicrometerConfiguration.kt @@ -1,22 +1,22 @@ package no.nav.helse.dusseldorf.ktor.metrics -import io.ktor.server.application.ApplicationCall -import io.ktor.http.HttpStatusCode +import io.ktor.http.* import io.ktor.http.HttpStatusCode.Companion.Forbidden import io.ktor.http.HttpStatusCode.Companion.NotFound import io.ktor.http.HttpStatusCode.Companion.Unauthorized -import io.ktor.server.metrics.micrometer.MicrometerMetricsConfig -import io.ktor.util.AttributeKey +import io.ktor.server.application.* +import io.ktor.server.metrics.micrometer.* +import io.ktor.util.* import io.micrometer.core.instrument.Clock -import io.micrometer.prometheus.PrometheusConfig -import io.micrometer.prometheus.PrometheusMeterRegistry -import io.prometheus.client.CollectorRegistry +import io.micrometer.prometheusmetrics.PrometheusConfig +import io.micrometer.prometheusmetrics.PrometheusMeterRegistry +import io.prometheus.metrics.model.registry.PrometheusRegistry fun MicrometerMetricsConfig.init( app: String, - collectorRegistry: CollectorRegistry = CollectorRegistry.defaultRegistry + registry : PrometheusMeterRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT, PrometheusRegistry.defaultRegistry, Clock.SYSTEM) ) { - registry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT, collectorRegistry, Clock.SYSTEM) + this.registry = registry timers { call, throwable -> tag("app", app) tag("result", diff --git a/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/Operation.kt b/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/Operation.kt index ee136d57..0620e156 100644 --- a/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/Operation.kt +++ b/dusseldorf-ktor-metrics/src/main/kotlin/no/nav/helse/dusseldorf/ktor/metrics/Operation.kt @@ -1,20 +1,18 @@ package no.nav.helse.dusseldorf.ktor.metrics -import io.prometheus.client.Counter -import io.prometheus.client.Histogram +import io.prometheus.metrics.core.metrics.Counter +import io.prometheus.metrics.core.metrics.Histogram + class Operation { companion object { - private val histogram = Histogram - .build("monitored_operation_histogram", - "Histogram som måler operasjoner.") + private val histogram = Histogram.builder() + .name ("monitored_operation_histogram") .labelNames("app", "operation") .register() - private val counter = Counter - .build( - "monitored_operation_counter", - "Teller for alle målte operasjoenr.") + private val counter = Counter.builder() + .name("monitored_operation_counter") .labelNames("app", "operation", "result") .register() @@ -24,13 +22,13 @@ class Operation { resultResolver: (T) -> Boolean = { true }, block: suspend () -> T ) : T { - val timer = histogram.labels(app, operation).startTimer() + val timer = histogram.labelValues(app, operation).startTimer() return try { val result = block() - counter.labels(app, operation, resultResolver(result).toResult()) + counter.labelValues(app, operation, resultResolver(result).toResult()) result } catch (cause: Throwable) { - counter.labels(app, operation, false.toResult()).inc() + counter.labelValues(app, operation, false.toResult()).inc() throw cause } finally { timer.observeDuration() diff --git a/dusseldorf-ktor-streams/pom.xml b/dusseldorf-ktor-streams/pom.xml index f5a3b97a..12e23b45 100644 --- a/dusseldorf-ktor-streams/pom.xml +++ b/dusseldorf-ktor-streams/pom.xml @@ -51,6 +51,11 @@ <artifactId>json</artifactId> <version>${orgjson.version}</version> </dependency> + <dependency> + <groupId>io.prometheus</groupId> + <artifactId>prometheus-metrics-core</artifactId> + <version>${prometheus.version}</version> + </dependency> </dependencies> <build> diff --git a/dusseldorf-ktor-streams/src/main/kotlin/no/nav/helse/dusseldorf/ktor/streams/ManagedStream.kt b/dusseldorf-ktor-streams/src/main/kotlin/no/nav/helse/dusseldorf/ktor/streams/ManagedStream.kt index 792377c2..716d6b20 100644 --- a/dusseldorf-ktor-streams/src/main/kotlin/no/nav/helse/dusseldorf/ktor/streams/ManagedStream.kt +++ b/dusseldorf-ktor-streams/src/main/kotlin/no/nav/helse/dusseldorf/ktor/streams/ManagedStream.kt @@ -1,6 +1,6 @@ package no.nav.helse.dusseldorf.ktor.streams -import io.prometheus.client.Gauge +import io.prometheus.metrics.core.metrics.Gauge import no.nav.helse.dusseldorf.ktor.health.HealthCheck import no.nav.helse.dusseldorf.ktor.health.Result import no.nav.helse.dusseldorf.ktor.health.Healthy @@ -22,9 +22,9 @@ class ManagedStream( private val unreadyAfterStreamStoppedIn: Duration) { private companion object { - private val streamStatus = Gauge - .build("stream_status", - "Indikerer streamens status. 0 er Running, 1 er stopped.") + private val streamStatus = Gauge.builder() + .name("stream_status") + .help("Indikerer streamens status. 0 er Running, 1 er stopped.") .labelNames("stream") .register() } @@ -119,8 +119,8 @@ class ManagedStream( return streams } - private fun Gauge.running() = labels(name).set(0.0) - private fun Gauge.stopped() = labels(name).set(1.0) + private fun Gauge.running() = labelValues(name).set(0.0) + private fun Gauge.stopped() = labelValues(name).set(1.0) } class ManagedStreamHealthy(private val managedStream: ManagedStream) : HealthCheck { diff --git a/dusseldorf-ktor-streams/src/main/kotlin/no/nav/helse/dusseldorf/ktor/streams/Topology.kt b/dusseldorf-ktor-streams/src/main/kotlin/no/nav/helse/dusseldorf/ktor/streams/Topology.kt index 2b1d3664..9960ed92 100644 --- a/dusseldorf-ktor-streams/src/main/kotlin/no/nav/helse/dusseldorf/ktor/streams/Topology.kt +++ b/dusseldorf-ktor-streams/src/main/kotlin/no/nav/helse/dusseldorf/ktor/streams/Topology.kt @@ -1,6 +1,6 @@ package no.nav.helse.dusseldorf.ktor.streams -import io.prometheus.client.Counter +import io.prometheus.metrics.core.metrics.Counter import kotlinx.coroutines.runBlocking import kotlinx.coroutines.slf4j.MDCContext import no.nav.helse.dusseldorf.ktor.core.Retry @@ -11,13 +11,13 @@ import java.time.ZoneId import java.time.ZonedDateTime private object StreamCounter { - private val counter = Counter.build() + private val counter = Counter.builder() .name("stream_processing_status_counter") .help("Teller for status av prosessering av meldinger på streams.") .labelNames("stream", "status") .register() - internal fun ok(stream: String) = counter.labels(stream, "OK").inc() - internal fun feil(stream: String) = counter.labels(stream, "FEIL").inc() + internal fun ok(stream: String) = counter.labelValues(stream, "OK").inc() + internal fun feil(stream: String) = counter.labelValues(stream, "FEIL").inc() } fun process( diff --git a/gradle/dusseldorf-ktor.gradle.kts b/gradle/dusseldorf-ktor.gradle.kts index 3ff26ec2..1ed31f0e 100644 --- a/gradle/dusseldorf-ktor.gradle.kts +++ b/gradle/dusseldorf-ktor.gradle.kts @@ -2,7 +2,7 @@ val ktorVersion by extra("2.3.2") val kotlinVersion by extra("1.9.0") val logbackVersion by extra("1.4.8") val logstashLogbackVersion by extra("7.4") -val prometheusVersion by extra("0.16.0") +val prometheusVersion by extra("1.3.1") val jacksonVersion by extra("2.15.2") val caffeineVersion by extra("3.1.7") val slf4jVersion by extra("2.0.7") diff --git a/pom.xml b/pom.xml index edda6c2d..e26d0545 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ <logback.version>1.5.6</logback.version> <slf4j.version>2.0.13</slf4j.version> <logstash.logback.version>7.4</logstash.logback.version> - <prometheus.version>0.16.0</prometheus.version> + <prometheus.version>1.3.1</prometheus.version> <caffeine.version>3.1.8</caffeine.version> <kafka.version>3.7.0</kafka.version> <orgjson.version>20240303</orgjson.version> @@ -86,11 +86,6 @@ <version>${ktor.version}</version> <scope>test</scope> </dependency> - <dependency> - <groupId>io.prometheus</groupId> - <artifactId>simpleclient_common</artifactId> - <version>${prometheus.version}</version> - </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-test-junit</artifactId> From e2b1624b1e208fe06ff879cda5014eb3b0888e1b Mon Sep 17 00:00:00 2001 From: Tore Langedal Endestad <tore.langedal.endestad@nav.no> Date: Tue, 25 Jun 2024 08:40:17 +0200 Subject: [PATCH 3/3] =?UTF-8?q?Endringer=20for=20=C3=A5=20komme=20over=20p?= =?UTF-8?q?=C3=A5=20ny=20prometeus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dusseldorf-ktor-testapp/src/main/kotlin/no/nav/App.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/dusseldorf-ktor-testapp/src/main/kotlin/no/nav/App.kt b/dusseldorf-ktor-testapp/src/main/kotlin/no/nav/App.kt index d5d4cd56..45b4473f 100644 --- a/dusseldorf-ktor-testapp/src/main/kotlin/no/nav/App.kt +++ b/dusseldorf-ktor-testapp/src/main/kotlin/no/nav/App.kt @@ -8,7 +8,6 @@ import io.ktor.client.statement.* import io.ktor.http.* import io.ktor.server.response.* import io.ktor.server.routing.* -import io.prometheus.client.hotspot.DefaultExports import kotlinx.coroutines.delay import no.nav.helse.dusseldorf.ktor.client.HttpRequestHealthCheck import no.nav.helse.dusseldorf.ktor.client.HttpRequestHealthConfig @@ -30,18 +29,22 @@ fun main(args: Array<String>): Unit = EngineMain.main(args) private val logger: Logger = LoggerFactory.getLogger("no.nav.App") fun Application.app() { - DefaultExports.initialize() val preStopActions = listOf(FullførAktiveRequester(application = this)) preStopOnApplicationStopPreparing(preStopActions) + var prometheusMeterRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT, PrometheusRegistry.defaultRegistry, Clock.SYSTEM) + install(ContentNegotiation) { jackson {} } + install(MicrometerMetrics) { + init("testapp", registry = prometheusMeterRegistry) + } routing { DefaultProbeRoutes() - MetricsRoute() + MetricsRoute(registry = prometheusMeterRegistry) PreStopRoute(preStopActions) HealthRoute( healthService = HealthService(setOf(