mirror of
https://github.com/prometheus/prometheus.git
synced 2025-03-05 20:59:13 -08:00
Address PR comments.
Signed-off-by: Arthur Silva Sens <arthursens2005@gmail.com>
This commit is contained in:
parent
13ea4dbf7f
commit
d5b2db34d5
|
@ -120,12 +120,17 @@ var (
|
||||||
|
|
||||||
// Build a normalized name for the specified metric.
|
// Build a normalized name for the specified metric.
|
||||||
func normalizeName(metric pmetric.Metric, namespace string) string {
|
func normalizeName(metric pmetric.Metric, namespace string) string {
|
||||||
var nameTokens = strings.FieldsFunc(
|
// Split metric name into "tokens" (of supported metric name runes).
|
||||||
|
// Note that this has the side effect of replacing multiple consecutive underscores 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.
|
||||||
|
nameTokens := strings.FieldsFunc(
|
||||||
metric.Name(),
|
metric.Name(),
|
||||||
func(r rune) bool { return nonMetricNameCharRE.MatchString(string(r)) },
|
func(r rune) bool { return nonMetricNameCharRE.MatchString(string(r)) },
|
||||||
)
|
)
|
||||||
|
|
||||||
mainUnitSuffix, perUnitSuffix := buildUnitSuffixes(metric.Unit())
|
mainUnitSuffix, perUnitSuffix := buildUnitSuffixes(metric.Unit())
|
||||||
|
mainUnitSuffix = cleanUpUnit(mainUnitSuffix)
|
||||||
|
perUnitSuffix = cleanUpUnit(perUnitSuffix)
|
||||||
if mainUnitSuffix != "" && !slices.Contains(nameTokens, mainUnitSuffix) {
|
if mainUnitSuffix != "" && !slices.Contains(nameTokens, mainUnitSuffix) {
|
||||||
nameTokens = append(nameTokens, mainUnitSuffix)
|
nameTokens = append(nameTokens, mainUnitSuffix)
|
||||||
}
|
}
|
||||||
|
@ -248,11 +253,15 @@ func buildUnitSuffixes(unit string) (mainUnitSuffix, perUnitSuffix string) {
|
||||||
unitTokens := strings.SplitN(unit, "/", 2)
|
unitTokens := strings.SplitN(unit, "/", 2)
|
||||||
|
|
||||||
if len(unitTokens) > 0 {
|
if len(unitTokens) > 0 {
|
||||||
|
// Main unit
|
||||||
|
// Append if not blank and doesn't contain '{}'
|
||||||
mainUnitOTel := strings.TrimSpace(unitTokens[0])
|
mainUnitOTel := strings.TrimSpace(unitTokens[0])
|
||||||
if mainUnitOTel != "" && !strings.ContainsAny(mainUnitOTel, "{}") {
|
if mainUnitOTel != "" && !strings.ContainsAny(mainUnitOTel, "{}") {
|
||||||
mainUnitSuffix = cleanUpUnit(unitMapGetOrDefault(mainUnitOTel))
|
mainUnitSuffix = unitMapGetOrDefault(mainUnitOTel)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Per unit
|
||||||
|
// Append if not blank and doesn't contain '{}'
|
||||||
if len(unitTokens) > 1 && unitTokens[1] != "" {
|
if len(unitTokens) > 1 && unitTokens[1] != "" {
|
||||||
perUnitOTel := strings.TrimSpace(unitTokens[1])
|
perUnitOTel := strings.TrimSpace(unitTokens[1])
|
||||||
if perUnitOTel != "" && !strings.ContainsAny(perUnitOTel, "{}") {
|
if perUnitOTel != "" && !strings.ContainsAny(perUnitOTel, "{}") {
|
||||||
|
@ -260,12 +269,9 @@ func buildUnitSuffixes(unit string) (mainUnitSuffix, perUnitSuffix string) {
|
||||||
}
|
}
|
||||||
if perUnitSuffix != "" {
|
if perUnitSuffix != "" {
|
||||||
perUnitSuffix = "per_" + perUnitSuffix
|
perUnitSuffix = "per_" + perUnitSuffix
|
||||||
|
mainUnitSuffix = strings.TrimSuffix(mainUnitSuffix, "_")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if perUnitSuffix != "" {
|
|
||||||
mainUnitSuffix = strings.TrimSuffix(mainUnitSuffix, "_")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return mainUnitSuffix, perUnitSuffix
|
return mainUnitSuffix, perUnitSuffix
|
||||||
|
|
|
@ -161,6 +161,7 @@ func TestBuildCompliantMetricNameWithSuffixes(t *testing.T) {
|
||||||
// Slashes in units are converted.
|
// Slashes in units are converted.
|
||||||
require.Equal(t, "system_io_foo_per_bar_total", BuildCompliantMetricName(createCounter("system.io", "foo/bar"), "", true))
|
require.Equal(t, "system_io_foo_per_bar_total", BuildCompliantMetricName(createCounter("system.io", "foo/bar"), "", true))
|
||||||
require.Equal(t, "metric_with_foreign_characters_total", BuildCompliantMetricName(createCounter("metric_with_字符_foreign_characters", ""), "", true))
|
require.Equal(t, "metric_with_foreign_characters_total", BuildCompliantMetricName(createCounter("metric_with_字符_foreign_characters", ""), "", true))
|
||||||
|
require.Equal(t, "temperature_C", BuildCompliantMetricName(createGauge("temperature", "%*()°C"), "", true)) // Removes non aplhanumerical characters from units
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBuildCompliantMetricNameWithoutSuffixes(t *testing.T) {
|
func TestBuildCompliantMetricNameWithoutSuffixes(t *testing.T) {
|
||||||
|
@ -188,6 +189,7 @@ func TestBuildMetricNameWithSuffixes(t *testing.T) {
|
||||||
// Slashes in units are converted.
|
// Slashes in units are converted.
|
||||||
require.Equal(t, "system.io_foo_per_bar_total", BuildMetricName(createCounter("system.io", "foo/bar"), "", true))
|
require.Equal(t, "system.io_foo_per_bar_total", BuildMetricName(createCounter("system.io", "foo/bar"), "", true))
|
||||||
require.Equal(t, "metric_with_字符_foreign_characters_total", BuildMetricName(createCounter("metric_with_字符_foreign_characters", ""), "", true))
|
require.Equal(t, "metric_with_字符_foreign_characters_total", BuildMetricName(createCounter("metric_with_字符_foreign_characters", ""), "", true))
|
||||||
|
require.Equal(t, "temperature_%*()°C", BuildMetricName(createGauge("temperature", "%*()°C"), "", true)) // Keeps the all characters in unit
|
||||||
|
|
||||||
// Tests below show weird interactions that users can have with the metric names.
|
// Tests below show weird interactions that users can have with the metric names.
|
||||||
// With BuildMetricName we don't check if units/type suffixes are already present in the metric name, we always add them.
|
// With BuildMetricName we don't check if units/type suffixes are already present in the metric name, we always add them.
|
||||||
|
|
Loading…
Reference in a new issue