Address PR comments.

Signed-off-by: Arthur Silva Sens <arthursens2005@gmail.com>
This commit is contained in:
Arthur Silva Sens 2024-12-17 14:36:42 -03:00
parent 13ea4dbf7f
commit d5b2db34d5
No known key found for this signature in database
2 changed files with 14 additions and 6 deletions

View file

@ -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

View file

@ -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.