Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Don't escape UTF-8 names by default for OpenMetrics 2.0

Đang mở
#2,517 0 bình luận 1 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@KR-Ravindra đang làm issue này rồi.

Từ ngày 4/10/2026.

  • #2519 của @KR-Ravindra — đang mở

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
35/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Đình trệ
Công nghệ
java
Lĩnh vực
api, backend, documentation

Hướng nghiên cứu

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.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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:

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.0 without escaping writes unescaped UTF-8 names.
  • version=2.0.0;escaping=underscores still escapes.
  • version=1.0.0, unversioned OpenMetrics and text/plain without escaping keep the underscores default, including with contentNegotiation=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

Ngôn ngữ chính
Java
Star
2.3k
Fork
832
Merge trung bình
1 ngày 7 giờ
Pull request đã merge (30 ngày)
63

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của prometheus/client_java

Tất cả issue của prometheus/client_java

Issue tương tự

Thêm issue về Java

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.