Don't escape UTF-8 names by default for OpenMetrics 2.0
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- java
- Ambito
- api, backend, documentation
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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
- Lingua principale
- Java
- Stelle
- 2.3k
- Fork
- 832
- Merge medio
- 1g 7h
- PR unite (30g)
- 63
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di prometheus/client_java
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
prometheus/client_java#2516 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
prometheus/client_java#2416 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Switch Micrometer compatibility workflow to upstream once typed-descriptor path becomes defaultForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 86/100
prometheus/client_java#2182 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 62/100
prometheus/client_java#2518 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
prometheus/client_java#2306 · 10 commenti · 4 reazioni ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di prometheus/client_java
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
commonmark/commonmark-java#460 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
-
1.21.1见幽匿感测体就崩溃Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
Make branch and label autocomplete matching locale-independentForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
jenkinsci/gitlab-plugin#1950 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
commons-app/apps-android-commons#6984 ·
I maintainer di solito rispondono entro 2 giorni