Skip to content

feat: OM2 writer outputs names as provided, no suffix appending - #1957

Merged
zeitlinger merged 2 commits into
mainfrom
scrape-time-suffix-om2
Mar 20, 2026
Merged

feat: OM2 writer outputs names as provided, no suffix appending#1957
zeitlinger merged 2 commits into
mainfrom
scrape-time-suffix-om2

Conversation

@zeitlinger

@zeitlinger zeitlinger commented Mar 17, 2026

Copy link
Copy Markdown
Member

Summary

The OM2 writer now uses expositionBaseName directly instead of
appending _total (counters) or unit suffixes. The _info suffix
is enforced per the OM2 spec (MUST). Part of #1942.

Key table

User provides OM1 OM2
Counter("events") events_total events
Counter("events_total") events_total events_total
Counter("req").unit(BYTES) req_bytes_total req_bytes
Counter("req_bytes").unit(BYTES) req_bytes_total req_bytes
Gauge("events_total") events_total events_total
Info("target") target_info target_info

PR stack

  1. Core model + OM1/protobuf writers (feat: move suffix handling to scrape time #1955)
  2. OTel preserve_names (independent)
  3. This PR — OM2 writer no-suffix

Test plan

  • mise run compile passes
  • OM2-specific tests verify no _total/unit suffix appending
  • _info suffix enforcement tested

Part of #1912.

@zeitlinger
zeitlinger marked this pull request as ready for review March 17, 2026 10:31
@zeitlinger
zeitlinger changed the base branch from scrape-time-suffix-core to main March 17, 2026 10:32
@zeitlinger
zeitlinger force-pushed the scrape-time-suffix-om2 branch from 8a18993 to 23a0eb4 Compare March 18, 2026 08:00
@zeitlinger
zeitlinger force-pushed the scrape-time-suffix-om2 branch from 23a0eb4 to 9fb30c8 Compare March 18, 2026 09:01
The OM2 writer now uses expositionBaseName instead of appending
_total (counters) or unit suffixes. The _info suffix is enforced
per the OM2 spec (MUST). Tests updated to verify OM2-specific
output rather than asserting identity with OM1.
Signed-off-by: Gregor Zeitlinger <gregor.zeitlinger@grafana.com>
@zeitlinger
zeitlinger force-pushed the scrape-time-suffix-om2 branch from 9fb30c8 to d1b0517 Compare March 20, 2026 09:40
+ "my_counter 42.0\n"
+ "my_counter_created 1672850385.800\n"
+ "# EOF\n");
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how should info metrics work?

if we add a test:

  @Test
  void testInfoMetricEnforcesInfoSuffix() throws IOException {
    // User provides "jvm" → OM2 outputs "jvm_info"
    MetricSnapshots snapshots = MetricSnapshots.of(
      InfoSnapshot.builder().name("jvm").help("JVM info")
        .dataPoint(InfoSnapshot.InfoDataPointSnapshot.builder().build()).build());

    String om2Output = writeWithOM2(snapshots);

    // is this right?
    assertThat(om2Output).contains("# TYPE jvm info");
    assertThat(om2Output).contains("jvm_info 1");
  }

the result is:

# TYPE jvm info
# HELP jvm JVM info
jvm_info 1
# EOF

The writeInfo method enforces _info suffix, then removes it for the TYPE line, and then writes the time series with the full _info suffix

Do we require the TYPE line to use the base name or the full name?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good point - om2 should never strip - because metric names are never mutated.

Fixed and added a new test case.

OM2 spec requires metric name to match MetricFamily name.
The Info writer was stripping _info for TYPE/HELP lines
(OM1 convention) while keeping it on data lines.

Signed-off-by: Gregor Zeitlinger <gregor.zeitlinger@grafana.com>
@zeitlinger
zeitlinger force-pushed the scrape-time-suffix-om2 branch from f63d8b7 to 9389e8d Compare March 20, 2026 12:53
@zeitlinger
zeitlinger merged commit 5ce2b57 into main Mar 20, 2026
13 checks passed
@zeitlinger
zeitlinger deleted the scrape-time-suffix-om2 branch March 20, 2026 18:09
zeitlinger pushed a commit that referenced this pull request Apr 27, 2026
🤖 I have created a release *beep* *boop*
---


##
[1.6.0](v1.5.1...v1.6.0)
(2026-04-25)


### Features

* Add logic for handling content negotation flag with OM2
([#1986](#1986))
([0fa1ad7](0fa1ad7))
* Add OM2 native histogram text output
([#2042](#2042))
([dec8e5b](dec8e5b))
* add OTel preserve_names for scrape-time suffix handling
([#1956](#1956))
([f794288](f794288))
* compositeValues and exemplarCompliance flags for OM2 writer
([#1991](#1991))
([ff48ae8](ff48ae8))
* move suffix handling to scrape time
([#1955](#1955))
([5a5106c](5a5106c))
* OM2 writer outputs names as provided, no suffix appending
([#1957](#1957))
([5ce2b57](5ce2b57))


### Bug Fixes

* **deps:** update dependency com.google.guava:guava to v33.6.0-jre
([#2021](#2021))
([1382693](1382693))
* **deps:** update dependency commons-io:commons-io to v2.22.0
([#2044](#2044))
([9e05c1d](9e05c1d))
* **deps:** update dependency
io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha
to v2.27.0-alpha
([#2022](#2022))
([30ac534](30ac534))
* **deps:** update dependency
io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha
to v2.27.0-alpha
([#2023](#2023))
([2d51a32](2d51a32))
* **deps:** update dependency io.prometheus:prometheus-metrics-bom to
v1.5.1 ([#2004](#2004))
([650ce4b](650ce4b))
* **deps:** update dependency org.apache.tomcat.embed:tomcat-embed-core
to v11.0.21
([#2005](#2005))
([7a36df7](7a36df7))
* **deps:** update dependency
org.springframework.boot:spring-boot-starter-parent to v4.0.5
([#2006](#2006))
([0106c18](0106c18))
* **deps:** update dependency
org.springframework.boot:spring-boot-starter-parent to v4.0.6
([#2046](#2046))
([40a9db8](40a9db8))
* **deps:** update jetty monorepo to v12.1.8
([#2007](#2007))
([acab5b2](acab5b2))
* **deps:** update protobuf
([#2024](#2024))
([8e2214e](8e2214e))
* pass release tag as input to deploy workflow
([#1982](#1982))
([165c921](165c921))
* pin grafana/otel-lgtm to 0.7.2 in OATs acceptance test
([#1992](#1992))
([f17ad9a](f17ad9a))
* Relax metric name validation in Dropwizard5
([#1985](#1985))
([deb782f](deb782f))
* stabilize flaky timer and thread count tests
([#1973](#1973))
([ce5867b](ce5867b))
* Tighten OM2 summary and start timestamp output
([#2041](#2041))
([5699469](5699469))
* trigger Maven deploy from release-please via workflow_dispatch
([#1981](#1981))
([698f956](698f956))

---
> [!IMPORTANT]
> Close and reopen this PR to trigger CI checks.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants