Don't escape UTF-8 names by default for OpenMetrics 2.0
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 35/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- À l'abandon
- Stack technique
- java
- Domaine
- api, backend, documentation
Piste de recherche
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.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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
- Langage dominant
- Java
- Étoiles
- 2.3k
- Forks
- 832
- Merge moyen
- 1 j 7 h
- PR mergées (30 j)
- 63
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de prometheus/client_java
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
prometheus/client_java#2516 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
prometheus/client_java#2416 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Switch Micrometer compatibility workflow to upstream once typed-descriptor path becomes defaultPeut-être à nouveau libre Une pull request pour cette issue a été fermée sans être fusionnée. Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 86/100
prometheus/client_java#2182 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 62/100
prometheus/client_java#2518 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
prometheus/client_java#2306 · 10 commentaires · 4 réactions ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de prometheus/client_java
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
-
Make branch and label autocomplete matching locale-independentPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
jenkinsci/gitlab-plugin#1950 ·
-
Place type search does not workOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
commons-app/apps-android-commons#6984 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
It's not necessary to copy the memory block in the readWrite() of org.h2.store.fs.mem.FileMemDataOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
h2database/h2database#4435 ·
Les mainteneurs répondent en général sous 1 jour