summaryrefslogtreecommitdiff
path: root/vendor/github.com/prometheus/otlptranslator/unit_namer.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/prometheus/otlptranslator/unit_namer.go')
-rw-r--r--vendor/github.com/prometheus/otlptranslator/unit_namer.go130
1 files changed, 0 insertions, 130 deletions
diff --git a/vendor/github.com/prometheus/otlptranslator/unit_namer.go b/vendor/github.com/prometheus/otlptranslator/unit_namer.go
deleted file mode 100644
index bb41fa89e..000000000
--- a/vendor/github.com/prometheus/otlptranslator/unit_namer.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2025 The Prometheus Authors
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-
-package otlptranslator
-
-import "strings"
-
-// UnitNamer is a helper for building compliant unit names.
-// It processes OpenTelemetry Protocol (OTLP) unit strings and converts them
-// to Prometheus-compliant unit names.
-//
-// Example usage:
-//
-// namer := UnitNamer{UTF8Allowed: false}
-// result := namer.Build("s") // "seconds"
-// result = namer.Build("By/s") // "bytes_per_second"
-type UnitNamer struct {
- UTF8Allowed bool
-}
-
-// Build builds a unit name for the specified unit string.
-// It processes the unit by splitting it into main and per components,
-// applying unit mappings, and cleaning up invalid characters when UTF8Allowed is false.
-//
-// Unit mappings include:
-// - Time: s→seconds, ms→milliseconds, h→hours
-// - Bytes: By→bytes, KBy→kilobytes, MBy→megabytes
-// - SI: m→meters, V→volts, W→watts
-// - Special: 1→"" (empty), %→percent
-//
-// Examples:
-//
-// namer := UnitNamer{UTF8Allowed: false}
-// namer.Build("s") // "seconds"
-// namer.Build("requests/s") // "requests_per_second"
-// namer.Build("1") // "" (dimensionless)
-func (un *UnitNamer) Build(unit string) string {
- mainUnit, perUnit := buildUnitSuffixes(unit)
- if !un.UTF8Allowed {
- mainUnit, perUnit = cleanUpUnit(mainUnit), cleanUpUnit(perUnit)
- }
-
- var u string
- switch {
- case mainUnit != "" && perUnit != "":
- u = mainUnit + "_" + perUnit
- case mainUnit != "":
- u = mainUnit
- default:
- u = perUnit
- }
-
- // Clean up leading and trailing underscores
- if len(u) > 0 && u[0:1] == "_" {
- u = u[1:]
- }
- if len(u) > 0 && u[len(u)-1:] == "_" {
- u = u[:len(u)-1]
- }
-
- return u
-}
-
-// Retrieve the Prometheus "basic" unit corresponding to the specified "basic" unit.
-// Returns the specified unit if not found in unitMap.
-func unitMapGetOrDefault(unit string) string {
- if promUnit, ok := unitMap[unit]; ok {
- return promUnit
- }
- return unit
-}
-
-// Retrieve the Prometheus "per" unit corresponding to the specified "per" unit.
-// Returns the specified unit if not found in perUnitMap.
-func perUnitMapGetOrDefault(perUnit string) string {
- if promPerUnit, ok := perUnitMap[perUnit]; ok {
- return promPerUnit
- }
- return perUnit
-}
-
-// buildUnitSuffixes builds the main and per unit suffixes for the specified unit
-// but doesn't do any special character transformation to accommodate Prometheus naming conventions.
-// Removing trailing underscores or appending suffixes is done in the caller.
-func buildUnitSuffixes(unit string) (mainUnitSuffix, perUnitSuffix string) {
- // Split unit at the '/' if any
- unitTokens := strings.SplitN(unit, "/", 2)
-
- if len(unitTokens) > 0 {
- // Main unit
- // Update if not blank and doesn't contain '{}'
- mainUnitOTel := strings.TrimSpace(unitTokens[0])
- if mainUnitOTel != "" && !strings.ContainsAny(mainUnitOTel, "{}") {
- mainUnitSuffix = unitMapGetOrDefault(mainUnitOTel)
- }
-
- // Per unit
- // Update if not blank and doesn't contain '{}'
- if len(unitTokens) > 1 && unitTokens[1] != "" {
- perUnitOTel := strings.TrimSpace(unitTokens[1])
- if perUnitOTel != "" && !strings.ContainsAny(perUnitOTel, "{}") {
- perUnitSuffix = perUnitMapGetOrDefault(perUnitOTel)
- }
- if perUnitSuffix != "" {
- perUnitSuffix = "per_" + perUnitSuffix
- }
- }
- }
-
- return mainUnitSuffix, perUnitSuffix
-}
-
-// cleanUpUnit cleans up unit so it matches model.LabelNameRE.
-func cleanUpUnit(unit string) string {
- // Multiple consecutive underscores are replaced with a single underscore.
- // This is part of the OTel to Prometheus specification: https://github.com/open-telemetry/opentelemetry-specification/blob/v1.38.0/specification/compatibility/prometheus_and_openmetrics.md#otlp-metric-points-to-prometheus.
- return strings.TrimPrefix(multipleUnderscoresRE.ReplaceAllString(
- strings.Map(replaceInvalidMetricChar, unit),
- "_",
- ), "_")
-}