Skip to content

feat: add OTel preserve_names for scrape-time suffix handling - #1956

Merged
zeitlinger merged 3 commits into
mainfrom
scrape-time-suffix-otel
Mar 20, 2026
Merged

feat: add OTel preserve_names for scrape-time suffix handling#1956
zeitlinger merged 3 commits into
mainfrom
scrape-time-suffix-otel

Conversation

@zeitlinger

@zeitlinger zeitlinger commented Mar 17, 2026

Copy link
Copy Markdown
Member

Summary

Adds preserve_names configuration to the OpenTelemetry exporter.
When enabled, metric names are passed through exactly as the user
wrote them instead of stripping _total and unit suffixes.
Part of #1942.

Key changes

  • Add preserve_names to ExporterOpenTelemetryProperties
  • MetricDataFactory uses originalName + preserve_names to
    decide naming
  • OtelAutoConfig wires the new property

Key table

User provides OTel OTel preserve_names
Counter("events") events events
Counter("events_total") events events_total
Counter("req").unit(BYTES) name req, unit By name req, unit By
Counter("req_bytes").unit(BYTES) name req, unit By name req_bytes, unit By
Gauge("events_total") events_total events_total

PR stack

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

Test plan

  • mise run compile passes
  • Tests for preserve_names=true with units, unit already in
    name, and without unit
  • OtelAutoConfigTest covers new property wiring

Part of #1912.

@zeitlinger
zeitlinger changed the base branch from scrape-time-suffix-core to main March 17, 2026 10:32
@zeitlinger
zeitlinger marked this pull request as ready for review March 17, 2026 10:32
Add preserve_names configuration to the OpenTelemetry exporter. When
enabled, metric names are passed through exactly as the user wrote them
instead of stripping _total and unit suffixes.

- Add preserve_names to ExporterOpenTelemetryProperties
- MetricDataFactory uses originalName + preserve_names to decide naming
- OtelAutoConfig wires the new property
- Tests for preserve_names with units, unit-in-name, and without unit

Part of #1942
Signed-off-by: Gregor Zeitlinger <gregor.zeitlinger@grafana.com>
…ests

Avoids brittle reflective access to OpenTelemetryExtension internals.
Signed-off-by: Gregor Zeitlinger <gregor.zeitlinger@grafana.com>
@zeitlinger
zeitlinger force-pushed the scrape-time-suffix-otel branch from 9cbe09d to c822baf Compare March 20, 2026 09:40
Signed-off-by: Gregor Zeitlinger <gregor.zeitlinger@grafana.com>
@zeitlinger
zeitlinger merged commit f794288 into main Mar 20, 2026
13 checks passed
@zeitlinger
zeitlinger deleted the scrape-time-suffix-otel branch March 20, 2026 11:34
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