Skip to content

Micrometer Prometheus client v1.0 breaking changes #2340

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions _posts/2025-06-18-micrometer-prometheus-v1.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
---
layout: post
title: 'Quarkus Micrometer using Prometheus client v1'
date: 2025-06-12
tags: micrometer prometheus
synopsis: Micrometer has moved to use the Prometheus client v1. This post explains the migration path and required changes for applications.
author: brunobat
---

== Quarkus Micrometer using Prometheus client v1

Micrometer adopted Prometheus Client v1.x starting with version 1.13. However, Quarkus still uses Prometheus Client v0.x by default through the `quarkus-micrometer-registry-prometheus` extension which has been using the legacy `io.prometheus:simpleclient`.

This existing extension will remain available throughout the Quarkus 3.x series but is now declared *deprecated*. In parallel, we’ll be introducing a new extension: `quarkus-micrometer-registry-prometheus-v1`, which integrates the new client.

[INFO]
====
Users should move to the new `quarkus-micrometer-registry-prometheus-v1` extension.
====

Since the new client introduces *breaking changes*, we’ve prepared a migration plan designed to reduce the impact on existing users.

=== Migration plan

1. Keep current extension as is until Quarkus 4.0 (whenever that happens) so users can migrate at a time of their choice.
2. Introduce a new extension called `quarkus-micrometer-registry-prometheus-v1`.
3. Remove current `quarkus-micrometer-registry-prometheus` on Quarkus 4.0 (no timeline at this moment) while providing an alternative on Quarkiverse. Quarkus users will get an additional migration period by using an upcoming community supported Quarkiverse extension.
4. Refactor code on Quarkus 4.0: Stramline https://quarkus.io/guides/telemetry-micrometer[`quarkus-micrometer`], the main extension and `quarkus-micrometer-registry-prometheus-v1` to remove legacy code from Quarkus 4.0. At some point after this, we might rename `quarkus-micrometer-registry-prometheus-v1` to `quarkus-micrometer-registry-prometheus` and provide automatic redirects for the artifacts. Users of the new client will not be impacted.



=== Prometheus Client v1.x changes

The `quarkus-micrometer-registry-prometheus-v1` extension will be using the Prometheus Client v1.x and includes *breaking changes* expressed in detail on the https://github.com/micrometer-metrics/micrometer/wiki/1.13-Migration-Guide[Micrometer 1.13 Migration Guide], featuring package, API and semantic convention changes.

These are the main points to consider when migrating to the new Quarkus extension:

* Counters now use Longs instead of Doubles.
** Before: `"registry=\"prometheus\",status=\"200\",uri=\"/example/prime/{number}\"} 2.0`
** Now: `"registry=\"prometheus\",status=\"200\",uri=\"/example/prime/{number}\"} 2`
* `io.micrometer.prometheusmetrics.PrometheusMeterRegistry` must be used instead of the old `io.micrometer.prometheus.PrometheusMeterRegistry`.
* `io.prometheus.metrics.tracer.common.SpanContext` must be used instead of the old `io.prometheus.client.exemplars.ExemplarSampler`
* The new Prometheus client uses some reserved words that must not be used to name metrics, therefore some metrics were renamed. Some examples of reserved words and renamed metrics:
** `info`. Before: `jvm_info_total`. Now: `jvm_total`
** `duration`. Before: `http_server_requests_duration_seconds`. Now: `http_server_requests_seconds`
* Some metrics would display Tags ending in a comma (`,`). This tailing comma has now been removed. Example: `"hibernate_flushes_total{entityManagerFactory=\"<default>\",env=\"test\",env2=\"test\",registry=\"prometheus\",} 1.0"`
* It is no longer possible to create a metric generating Service Level Objectives and Percentiles at the same time.

Other changes:

* Metrics must be registered always with the same tags. Micrometer will now send a warning if we register the same metric more than once with different Tag names.

Quarkus automatic instrumentation will generate metrics reflecting these changes. If your application defines custom metrics, be sure to update their creation, associated tests, and any dashboard queries to align with the guidelines above.

=== About metrics in Quarkus

The https://quarkus.io/guides/telemetry-micrometer[Micrometer extension] is the recommended approach to generate metrics in Quarkus and this a rare occasions were breaking changes are being introduced.

Micrometer has become the default metrics framework in Quarkus due to its stability, maturity, and widespread adoption — not https://quarkus.io/guides/opentelemetry-metrics[OpenTelemetry Metrics].

Micrometer support in Quarkus is built on top af a main extension `quarkus-micrometer`, then specific registries extensions include it as a dependency and implement a registry sending out the telemetry. The Prometheus registry (`quarkus-micrometer-registry-prometheus`) is the default and most commonly used, and it is the focus of this announcement.

However, there are alternative ways to export metrics using Micrometer:

* Through the https://github.com/quarkiverse/quarkus-micrometer-registry/[Quarkiverse Micrometer registries]
* Via OpenTelemetry, using a bridge provided by the https://quarkus.io/guides/telemetry-micrometer-to-opentelemetry[Micrometer and OpenTelemetry] extension. This setup allows Micrometer metrics to be sent as OpenTelemetry metrics, offering a unified output via the https://opentelemetry.io/docs/specs/otlp/[OpenTelemetry OTLP protocol].

For more details on Observability in Quarkus please visit https://quarkus.io/guides/observability[this guide].

=== Conclusion

While the existing Prometheus registry remains available for the Quarkus 3.x lifecycle, it is now deprecated, and users are encouraged to begin migrating to the new extension because the old client extension will be removed on Quarkus 4.0 (no timeline at this moment).

This change introduces a number of breaking updates aligned with Micrometer 1.13 and Prometheus Client v1.x, affecting metric types, naming conventions, and APIs.

To support users, a migration plan has been outlined to provide flexibility and minimize disruption.

The prometheus client is not the only option to send out telemetry, there are alternative options such as the Quarkiverse registries or our OpenTelemetry bridge.

You can follow Quarkus release dates here: https://github.com/quarkusio/quarkus/wiki/Release-Planning

Loading