Don't escape UTF-8 names by default for OpenMetrics 2.0
Maintainer antworten meist innerhalb von 1 Tag
Ein zugehöriger Pull Request wurde bereits gemerged.
- #2519 von @KR-Ravindra — gemerged
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Veraltet
- Tech-Stack
- java
- Bereich
- api, backend, documentation
Rechercherichtung
Start with prometheus-metrics-config/.../EscapingScheme.java, PrometheusScrapeHandler.java, and ExpositionFormats.java, then inspect how Accept clauses are parsed and matched. Add coverage in ExpositionFormatsTest and a scrape-handler test for OM 2.0, explicit escaping, older formats, and contentNegotiation=false. Update the referenced escaping schemes documentation and verify the linked pull request before starting.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
When a scraper negotiates OpenMetrics 2.0 (Accept: application/openmetrics-text;version=2.0.0) without an escaping parameter, PrometheusScrapeHandler escapes UTF-8 metric and label names with EscapingScheme.DEFAULT (underscores). OpenMetrics 2.0 supports UTF-8 names natively and doesn't define an escaping parameter at all, so we could assume that scraper asking for 2.0.0 already supports UTF-8 names. In that case we shouldn't escape by default.
Prometheus main doesn't send escaping for OM 2.0 (https://github.com/prometheus/prometheus/blob/961c9ba40923ca4d7adf4a7a9167e56d0406df83/scrape/scrape.go#L794-L800), so UTF-8 names are currently escaped to underscores when scraping a Java target with OM 2.0. There's a Prometheus-side workaround in https://github.com/prometheus/prometheus/compare/main...bwplotka/om2-accept-escaping, but the default here should be fixed regardless.
The escaping scheme is chosen without looking at the selected format:
EscapingScheme.fromAcceptHeaderreturnsDEFAULTwhen there's noescapingterm: https://github.com/prometheus/client_java/blob/9e9deb6b9e591c2a62b12882d8a987f120661b71/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/EscapingScheme.java#L29-L67.PrometheusScrapeHandlercomputes it before, and separately from,findWriter: https://github.com/prometheus/client_java/blob/9e9deb6b9e591c2a62b12882d8a987f120661b71/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandler.java#L73-L91.ExpositionFormats.findWriterpicks the OM 2.0 writer: https://github.com/prometheus/client_java/blob/9e9deb6b9e591c2a62b12882d8a987f120661b71/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/ExpositionFormats.java#L63-L86.
Proposed change (pseudo code):
// PrometheusScrapeHandler
String acceptHeader = request.getHeader("Accept");
ExpositionFormatWriter writer = expositionFormats.findWriter(acceptHeader);
EscapingScheme escapingScheme = EscapingScheme.fromAcceptHeader(acceptHeader, defaultFor(acceptHeader));
// Only default to UTF-8 when 2.0.0 was explicitly requested. With
// contentNegotiation=false the OM 2.0 writer also serves OM 1.0 / unversioned
// requests, e.g. from pre-3.0 Prometheus that can't parse UTF-8 names.
EscapingScheme defaultFor(String acceptHeader) {
return "2.0.0".equals(parseOpenMetricsVersion(acceptHeader))
? EscapingScheme.ALLOW_UTF8
: EscapingScheme.DEFAULT;
}
// EscapingScheme
public static EscapingScheme fromAcceptHeader(@Nullable String acceptHeader, EscapingScheme fallback) {
// Same parsing as today. An explicit escaping term always wins, also for OM 2.0
// (e.g. a Prometheus with legacy name validation asking for underscores).
// Return fallback instead of DEFAULT when the term is missing or unknown.
}
Existing fromAcceptHeader(String) can keep delegating with DEFAULT to stay API compatible. Ideally the version and escaping term should come from the same Accept clause that findWriter matched. Today both helpers scan the whole header, so a parameter from another clause can leak in.
Tests to add (e.g. ExpositionFormatsTest, plus a scrape handler test):
version=2.0.0withoutescapingwrites unescaped UTF-8 names.version=2.0.0;escaping=underscoresstill escapes.version=1.0.0, unversioned OpenMetrics andtext/plainwithoutescapingkeep the underscores default, including withcontentNegotiation=false.
The escaping schemes doc should get the same OM 2.0 exception, since its "Default Behavior" section says to use underscores whenever escaping is missing: https://github.com/prometheus/docs/blob/605cf81fefc2e8e91f8ba89bb1555ae52a43a318/docs/instrumenting/escaping_schemes.md#default-behavior.
Matching client_golang issue: https://github.com/prometheus/client_golang/issues/2149
- Vorherrschende Sprache
- Java
- Sterne
- 2.3k
- Forks
- 832
- Ø Merge
- 1 T. 9 Std.
- Gemergte PRs (30 T.)
- 73
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus prometheus/client_java
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
prometheus/client_java#2416 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Switch Micrometer compatibility workflow to upstream once typed-descriptor path becomes defaultEvtl. wieder frei Ein Pull Request dazu wurde ohne Merge geschlossen. Offen
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 86/100
prometheus/client_java#2182 ·
Maintainer antworten meist innerhalb von 1 Tag
-
OpenMetrics 2.0: option to keep _total and unit suffixes, so switching from OM1 doesn't rename seriesEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 62/100
prometheus/client_java#2518 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 35/100
prometheus/client_java#2306 · 10 Kommentare · 4 Reaktionen ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 32/100
prometheus/client_java#2084 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in prometheus/client_java
Ähnliche Issues
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
portfolio-performance/portfolio#6119 ·
Maintainer antworten meist innerhalb von 8 Tagen
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
jenkinsci/ec2-plugin#2041 ·
-
L: github:actions L: php:composer
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
dependabot/dependabot-core#16493 ·
Maintainer antworten meist innerhalb von 1 Tag
-
SHOW EDIT of a subclass for an object of its superclass: the form fails to open with AssertionErrorOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 72/100