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(