From 788f619dab1a5ecc7abdb9ec3ed24dc9f2f1b9af Mon Sep 17 00:00:00 2001 From: David Ashpole Date: Thu, 13 Jul 2023 16:59:51 +0000 Subject: [PATCH] prometheus exporters: Add add_type_and_unit_suffixes configuration option, which can disable the addition of type and unit suffixes. --- ...metheusexporters-normalization-config.yaml | 20 ++++++++ exporter/prometheusexporter/README.md | 2 + exporter/prometheusexporter/collector.go | 20 ++++---- exporter/prometheusexporter/config.go | 3 ++ exporter/prometheusexporter/config_test.go | 5 +- exporter/prometheusexporter/factory.go | 9 ++-- .../prometheusexporter/testdata/config.yaml | 1 + .../prometheusremotewriteexporter/README.md | 1 + .../prometheusremotewriteexporter/config.go | 3 ++ .../config_test.go | 5 +- .../prometheusremotewriteexporter/exporter.go | 9 ++-- .../prometheusremotewriteexporter/factory.go | 1 + .../testdata/config.yaml | 1 + pkg/translator/prometheus/normalize_name.go | 11 +++-- .../prometheus/normalize_name_test.go | 46 +++++++++++++------ .../prometheusremotewrite/helper.go | 4 +- .../prometheusremotewrite/histograms_test.go | 2 +- .../prometheusremotewrite/metrics_to_prw.go | 11 +++-- .../number_data_points.go | 4 +- 19 files changed, 109 insertions(+), 49 deletions(-) create mode 100644 .chloggen/prometheusexporters-normalization-config.yaml diff --git a/.chloggen/prometheusexporters-normalization-config.yaml b/.chloggen/prometheusexporters-normalization-config.yaml new file mode 100644 index 0000000000000..b333c2dcbd3c5 --- /dev/null +++ b/.chloggen/prometheusexporters-normalization-config.yaml @@ -0,0 +1,20 @@ +# Use this changelog template to create an entry for release notes. +# If your change doesn't affect end users, such as a test fix or a tooling change, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: 'enhancement' + +# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) +component: prometheusremotewriteexporter, prometheusexporter + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: "Add `add_type_and_unit_suffixes` configuration option, which can disable the addition of type and unit suffixes." + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [21743, 8950] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: diff --git a/exporter/prometheusexporter/README.md b/exporter/prometheusexporter/README.md index 6ba9c487b9760..10c157b9055af 100644 --- a/exporter/prometheusexporter/README.md +++ b/exporter/prometheusexporter/README.md @@ -33,6 +33,7 @@ The following settings can be optionally configured: - `resource_to_telemetry_conversion` - `enabled` (default = false): If `enabled` is `true`, all the resource attributes will be converted to metric labels by default. - `enable_open_metrics`: (default = `false`): If true, metrics will be exported using the OpenMetrics format. Exemplars are only exported in the OpenMetrics format, and only for histogram and monotonic sum (i.e. counter) metrics. +- `add_type_and_unit_suffixes`: (default = `true`): If false, addition of type and unit suffixes is disabled. Example: @@ -51,6 +52,7 @@ exporters: send_timestamps: true metric_expiration: 180m enable_open_metrics: true + add_type_and_unit_suffixes: false resource_to_telemetry_conversion: enabled: true ``` diff --git a/exporter/prometheusexporter/collector.go b/exporter/prometheusexporter/collector.go index 660c934c55026..81bf6528b4b50 100644 --- a/exporter/prometheusexporter/collector.go +++ b/exporter/prometheusexporter/collector.go @@ -30,18 +30,20 @@ type collector struct { accumulator accumulator logger *zap.Logger - sendTimestamps bool - namespace string - constLabels prometheus.Labels + sendTimestamps bool + typeAndUnitSuffixes bool + namespace string + constLabels prometheus.Labels } func newCollector(config *Config, logger *zap.Logger) *collector { return &collector{ - accumulator: newAccumulator(logger, config.MetricExpiration), - logger: logger, - namespace: prometheustranslator.CleanUpString(config.Namespace), - sendTimestamps: config.SendTimestamps, - constLabels: config.ConstLabels, + accumulator: newAccumulator(logger, config.MetricExpiration), + logger: logger, + namespace: prometheustranslator.CleanUpString(config.Namespace), + sendTimestamps: config.SendTimestamps, + constLabels: config.ConstLabels, + typeAndUnitSuffixes: config.AddTypeAndUnitSuffixes, } } @@ -127,7 +129,7 @@ func (c *collector) getMetricMetadata(metric pmetric.Metric, attributes pcommon. } return prometheus.NewDesc( - prometheustranslator.BuildPromCompliantName(metric, c.namespace), + prometheustranslator.BuildCompliantName(metric, c.namespace, c.typeAndUnitSuffixes), metric.Description(), keys, c.constLabels, diff --git a/exporter/prometheusexporter/config.go b/exporter/prometheusexporter/config.go index 419aa38cab1b5..2d38ef2b0dd02 100644 --- a/exporter/prometheusexporter/config.go +++ b/exporter/prometheusexporter/config.go @@ -34,6 +34,9 @@ type Config struct { // EnableOpenMetrics enables the use of the OpenMetrics encoding option for the prometheus exporter. EnableOpenMetrics bool `mapstructure:"enable_open_metrics"` + + // AddTypeAndUnitSuffixes controls whether suffixes are added to metric names. Defaults to true. + AddTypeAndUnitSuffixes bool `mapstructure:"add_type_and_unit_suffixes"` } var _ component.Config = (*Config)(nil) diff --git a/exporter/prometheusexporter/config_test.go b/exporter/prometheusexporter/config_test.go index 5bb2ac9ec0e5f..eb3d762dcae1f 100644 --- a/exporter/prometheusexporter/config_test.go +++ b/exporter/prometheusexporter/config_test.go @@ -50,8 +50,9 @@ func TestLoadConfig(t *testing.T) { "label1": "value1", "another label": "spaced value", }, - SendTimestamps: true, - MetricExpiration: 60 * time.Minute, + SendTimestamps: true, + MetricExpiration: 60 * time.Minute, + AddTypeAndUnitSuffixes: false, }, }, } diff --git a/exporter/prometheusexporter/factory.go b/exporter/prometheusexporter/factory.go index 8185b31ccbdf1..1850f9690d259 100644 --- a/exporter/prometheusexporter/factory.go +++ b/exporter/prometheusexporter/factory.go @@ -25,10 +25,11 @@ func NewFactory() exporter.Factory { func createDefaultConfig() component.Config { return &Config{ - ConstLabels: map[string]string{}, - SendTimestamps: false, - MetricExpiration: time.Minute * 5, - EnableOpenMetrics: false, + ConstLabels: map[string]string{}, + SendTimestamps: false, + MetricExpiration: time.Minute * 5, + EnableOpenMetrics: false, + AddTypeAndUnitSuffixes: true, } } diff --git a/exporter/prometheusexporter/testdata/config.yaml b/exporter/prometheusexporter/testdata/config.yaml index 47a8ad574b3f2..323513057fa5f 100644 --- a/exporter/prometheusexporter/testdata/config.yaml +++ b/exporter/prometheusexporter/testdata/config.yaml @@ -11,3 +11,4 @@ prometheus/2: "another label": spaced value send_timestamps: true metric_expiration: 60m + add_type_and_unit_suffixes: false diff --git a/exporter/prometheusremotewriteexporter/README.md b/exporter/prometheusremotewriteexporter/README.md index 33cc93fa02619..baa6e9b8b7991 100644 --- a/exporter/prometheusremotewriteexporter/README.md +++ b/exporter/prometheusremotewriteexporter/README.md @@ -50,6 +50,7 @@ The following settings can be optionally configured: - `headers`: additional headers attached to each HTTP request. - *Note the following headers cannot be changed: `Content-Encoding`, `Content-Type`, `X-Prometheus-Remote-Write-Version`, and `User-Agent`.* - `namespace`: prefix attached to each exported metric name. +- `add_type_and_unit_suffixes`: If set to false, type and unit suffixes will not be added to metrics. Default: true. - `remote_write_queue`: fine tuning for queueing and sending of the outgoing remote writes. - `enabled`: enable the sending queue - `queue_size`: number of OTLP metrics that can be queued. Ignored if `enabled` is `false` diff --git a/exporter/prometheusremotewriteexporter/config.go b/exporter/prometheusremotewriteexporter/config.go index f70b635ad8d22..fa06cbcf0acba 100644 --- a/exporter/prometheusremotewriteexporter/config.go +++ b/exporter/prometheusremotewriteexporter/config.go @@ -42,6 +42,9 @@ type Config struct { // CreatedMetric allows customizing creation of _created metrics CreatedMetric *CreatedMetric `mapstructure:"export_created_metric,omitempty"` + + // AddTypeAndUnitSuffixes, controls whether unit and type suffixes are added to metrics on export + AddTypeAndUnitSuffixes bool `mapstructure:"add_type_and_unit_suffixes,omitempty"` } type CreatedMetric struct { diff --git a/exporter/prometheusremotewriteexporter/config_test.go b/exporter/prometheusremotewriteexporter/config_test.go index 822d516185a24..481df913ab33c 100644 --- a/exporter/prometheusremotewriteexporter/config_test.go +++ b/exporter/prometheusremotewriteexporter/config_test.go @@ -54,8 +54,9 @@ func TestLoadConfig(t *testing.T) { QueueSize: 2000, NumConsumers: 10, }, - Namespace: "test-space", - ExternalLabels: map[string]string{"key1": "value1", "key2": "value2"}, + AddTypeAndUnitSuffixes: false, + Namespace: "test-space", + ExternalLabels: map[string]string{"key1": "value1", "key2": "value2"}, HTTPClientSettings: confighttp.HTTPClientSettings{ Endpoint: "localhost:8888", TLSSetting: configtls.TLSClientSetting{ diff --git a/exporter/prometheusremotewriteexporter/exporter.go b/exporter/prometheusremotewriteexporter/exporter.go index 102110994296a..fa759872ced8b 100644 --- a/exporter/prometheusremotewriteexporter/exporter.go +++ b/exporter/prometheusremotewriteexporter/exporter.go @@ -69,10 +69,11 @@ func newPRWExporter(cfg *Config, set exporter.CreateSettings) (*prwExporter, err clientSettings: &cfg.HTTPClientSettings, settings: set.TelemetrySettings, exporterSettings: prometheusremotewrite.Settings{ - Namespace: cfg.Namespace, - ExternalLabels: sanitizedLabels, - DisableTargetInfo: !cfg.TargetInfo.Enabled, - ExportCreatedMetric: cfg.CreatedMetric.Enabled, + Namespace: cfg.Namespace, + ExternalLabels: sanitizedLabels, + DisableTargetInfo: !cfg.TargetInfo.Enabled, + ExportCreatedMetric: cfg.CreatedMetric.Enabled, + AddTypeAndUnitSuffixes: cfg.AddTypeAndUnitSuffixes, }, } if cfg.WAL == nil { diff --git a/exporter/prometheusremotewriteexporter/factory.go b/exporter/prometheusremotewriteexporter/factory.go index bfbd1b6e222f7..1870fe3751a10 100644 --- a/exporter/prometheusremotewriteexporter/factory.go +++ b/exporter/prometheusremotewriteexporter/factory.go @@ -80,6 +80,7 @@ func createDefaultConfig() component.Config { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, + AddTypeAndUnitSuffixes: true, HTTPClientSettings: confighttp.HTTPClientSettings{ Endpoint: "http://some.url:9411/api/prom/push", // We almost read 0 bytes, so no need to tune ReadBufferSize. diff --git a/exporter/prometheusremotewriteexporter/testdata/config.yaml b/exporter/prometheusremotewriteexporter/testdata/config.yaml index 17df70aa8cbf5..2965d7b027902 100644 --- a/exporter/prometheusremotewriteexporter/testdata/config.yaml +++ b/exporter/prometheusremotewriteexporter/testdata/config.yaml @@ -11,6 +11,7 @@ prometheusremotewrite/2: tls: ca_file: "/var/lib/mycert.pem" write_buffer_size: 524288 + add_type_and_unit_suffixes: false headers: Prometheus-Remote-Write-Version: "0.1.0" X-Scope-OrgID: 234 diff --git a/pkg/translator/prometheus/normalize_name.go b/pkg/translator/prometheus/normalize_name.go index 7c4811e1715f2..5ed08f64eb79d 100644 --- a/pkg/translator/prometheus/normalize_name.go +++ b/pkg/translator/prometheus/normalize_name.go @@ -78,7 +78,12 @@ var normalizeNameGate = featuregate.GlobalRegistry().MustRegister( featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/8950"), ) -// Build a Prometheus-compliant metric name for the specified metric +// Deprecated: use BuildCompliantName instead. +func BuildPromCompliantName(metric pmetric.Metric, namespace string) string { + return BuildCompliantName(metric, namespace, true) +} + +// BuildCompliantName builds a Prometheus-compliant metric name for the specified metric // // Metric name is prefixed with specified namespace and underscore (if any). // Namespace is not cleaned up. Make sure specified namespace follows Prometheus @@ -86,11 +91,11 @@ var normalizeNameGate = featuregate.GlobalRegistry().MustRegister( // // See rules at https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels // and https://prometheus.io/docs/practices/naming/#metric-and-label-naming -func BuildPromCompliantName(metric pmetric.Metric, namespace string) string { +func BuildCompliantName(metric pmetric.Metric, namespace string, typeAndUnitSuffixes bool) string { var metricName string // Full normalization following standard Prometheus naming conventions - if normalizeNameGate.IsEnabled() { + if typeAndUnitSuffixes && normalizeNameGate.IsEnabled() { return normalizeName(metric, namespace) } diff --git a/pkg/translator/prometheus/normalize_name_test.go b/pkg/translator/prometheus/normalize_name_test.go index 0a41b536f2f42..3b525085d85f1 100644 --- a/pkg/translator/prometheus/normalize_name_test.go +++ b/pkg/translator/prometheus/normalize_name_test.go @@ -223,27 +223,43 @@ func TestRemoveItem(t *testing.T) { } -func TestBuildPromCompliantNameWithNormalize(t *testing.T) { +func TestBuildCompliantNameWithNormalize(t *testing.T) { defer testutil.SetFeatureGateForTest(t, normalizeNameGate, true)() - require.Equal(t, "system_io_bytes_total", BuildPromCompliantName(createCounter("system.io", "By"), "")) - require.Equal(t, "system_network_io_bytes_total", BuildPromCompliantName(createCounter("network.io", "By"), "system")) - require.Equal(t, "_3_14_digits", BuildPromCompliantName(createGauge("3.14 digits", ""), "")) - require.Equal(t, "envoy_rule_engine_zlib_buf_error", BuildPromCompliantName(createGauge("envoy__rule_engine_zlib_buf_error", ""), "")) - require.Equal(t, "foo_bar", BuildPromCompliantName(createGauge(":foo::bar", ""), "")) - require.Equal(t, "foo_bar_total", BuildPromCompliantName(createCounter(":foo::bar", ""), "")) + addUnitAndTypeSuffixes := true + require.Equal(t, "system_io_bytes_total", BuildCompliantName(createCounter("system.io", "By"), "", addUnitAndTypeSuffixes)) + require.Equal(t, "system_network_io_bytes_total", BuildCompliantName(createCounter("network.io", "By"), "system", addUnitAndTypeSuffixes)) + require.Equal(t, "_3_14_digits", BuildCompliantName(createGauge("3.14 digits", ""), "", addUnitAndTypeSuffixes)) + require.Equal(t, "envoy_rule_engine_zlib_buf_error", BuildCompliantName(createGauge("envoy__rule_engine_zlib_buf_error", ""), "", addUnitAndTypeSuffixes)) + require.Equal(t, "foo_bar", BuildCompliantName(createGauge(":foo::bar", ""), "", addUnitAndTypeSuffixes)) + require.Equal(t, "foo_bar_total", BuildCompliantName(createCounter(":foo::bar", ""), "", addUnitAndTypeSuffixes)) } -func TestBuildPromCompliantNameWithoutNormalize(t *testing.T) { +func TestBuildCompliantNameWithSuffixesFeatureGateDisabled(t *testing.T) { defer testutil.SetFeatureGateForTest(t, normalizeNameGate, false)() - require.Equal(t, "system_io", BuildPromCompliantName(createCounter("system.io", "By"), "")) - require.Equal(t, "system_network_io", BuildPromCompliantName(createCounter("network.io", "By"), "system")) - require.Equal(t, "system_network_I_O", BuildPromCompliantName(createCounter("network (I/O)", "By"), "system")) - require.Equal(t, "_3_14_digits", BuildPromCompliantName(createGauge("3.14 digits", "By"), "")) - require.Equal(t, "envoy__rule_engine_zlib_buf_error", BuildPromCompliantName(createGauge("envoy__rule_engine_zlib_buf_error", ""), "")) - require.Equal(t, ":foo::bar", BuildPromCompliantName(createGauge(":foo::bar", ""), "")) - require.Equal(t, ":foo::bar", BuildPromCompliantName(createCounter(":foo::bar", ""), "")) + addUnitAndTypeSuffixes := true + require.Equal(t, "system_io", BuildCompliantName(createCounter("system.io", "By"), "", addUnitAndTypeSuffixes)) + require.Equal(t, "system_network_io", BuildCompliantName(createCounter("network.io", "By"), "system", addUnitAndTypeSuffixes)) + require.Equal(t, "system_network_I_O", BuildCompliantName(createCounter("network (I/O)", "By"), "system", addUnitAndTypeSuffixes)) + require.Equal(t, "_3_14_digits", BuildCompliantName(createGauge("3.14 digits", "By"), "", addUnitAndTypeSuffixes)) + require.Equal(t, "envoy__rule_engine_zlib_buf_error", BuildCompliantName(createGauge("envoy__rule_engine_zlib_buf_error", ""), "", addUnitAndTypeSuffixes)) + require.Equal(t, ":foo::bar", BuildCompliantName(createGauge(":foo::bar", ""), "", addUnitAndTypeSuffixes)) + require.Equal(t, ":foo::bar", BuildCompliantName(createCounter(":foo::bar", ""), "", addUnitAndTypeSuffixes)) + +} + +func TestBuildCompliantNameWithoutSuffixes(t *testing.T) { + + defer testutil.SetFeatureGateForTest(t, normalizeNameGate, false)() + addUnitAndTypeSuffixes := false + require.Equal(t, "system_io", BuildCompliantName(createCounter("system.io", "By"), "", addUnitAndTypeSuffixes)) + require.Equal(t, "system_network_io", BuildCompliantName(createCounter("network.io", "By"), "system", addUnitAndTypeSuffixes)) + require.Equal(t, "system_network_I_O", BuildCompliantName(createCounter("network (I/O)", "By"), "system", addUnitAndTypeSuffixes)) + require.Equal(t, "_3_14_digits", BuildCompliantName(createGauge("3.14 digits", "By"), "", addUnitAndTypeSuffixes)) + require.Equal(t, "envoy__rule_engine_zlib_buf_error", BuildCompliantName(createGauge("envoy__rule_engine_zlib_buf_error", ""), "", addUnitAndTypeSuffixes)) + require.Equal(t, ":foo::bar", BuildCompliantName(createGauge(":foo::bar", ""), "", addUnitAndTypeSuffixes)) + require.Equal(t, ":foo::bar", BuildCompliantName(createCounter(":foo::bar", ""), "", addUnitAndTypeSuffixes)) } diff --git a/pkg/translator/prometheusremotewrite/helper.go b/pkg/translator/prometheusremotewrite/helper.go index b1ad78fc0c7e1..d8b3cbd43dddd 100644 --- a/pkg/translator/prometheusremotewrite/helper.go +++ b/pkg/translator/prometheusremotewrite/helper.go @@ -252,7 +252,7 @@ func isValidAggregationTemporality(metric pmetric.Metric) bool { func addSingleHistogramDataPoint(pt pmetric.HistogramDataPoint, resource pcommon.Resource, metric pmetric.Metric, settings Settings, tsMap map[string]*prompb.TimeSeries) { timestamp := convertTimeStamp(pt.Timestamp()) // sum, count, and buckets of the histogram should append suffix to baseName - baseName := prometheustranslator.BuildPromCompliantName(metric, settings.Namespace) + baseName := prometheustranslator.BuildCompliantName(metric, settings.Namespace, settings.AddTypeAndUnitSuffixes) // If the sum is unset, it indicates the _sum metric point should be // omitted @@ -442,7 +442,7 @@ func addSingleSummaryDataPoint(pt pmetric.SummaryDataPoint, resource pcommon.Res tsMap map[string]*prompb.TimeSeries) { timestamp := convertTimeStamp(pt.Timestamp()) // sum and count of the summary should append suffix to baseName - baseName := prometheustranslator.BuildPromCompliantName(metric, settings.Namespace) + baseName := prometheustranslator.BuildCompliantName(metric, settings.Namespace, settings.AddTypeAndUnitSuffixes) // treat sum as a sample in an individual TimeSeries sum := &prompb.Sample{ Value: pt.Sum(), diff --git a/pkg/translator/prometheusremotewrite/histograms_test.go b/pkg/translator/prometheusremotewrite/histograms_test.go index a5b9f47194eba..f0076bc54533c 100644 --- a/pkg/translator/prometheusremotewrite/histograms_test.go +++ b/pkg/translator/prometheusremotewrite/histograms_test.go @@ -372,7 +372,7 @@ func TestAddSingleExponentialHistogramDataPoint(t *testing.T) { for x := 0; x < metric.ExponentialHistogram().DataPoints().Len(); x++ { err := addSingleExponentialHistogramDataPoint( - prometheustranslator.BuildPromCompliantName(metric, ""), + prometheustranslator.BuildPromCompliantName(metric, "", true), metric.ExponentialHistogram().DataPoints().At(x), pcommon.NewResource(), Settings{}, diff --git a/pkg/translator/prometheusremotewrite/metrics_to_prw.go b/pkg/translator/prometheusremotewrite/metrics_to_prw.go index 205e279020f48..002c0a8f5608b 100644 --- a/pkg/translator/prometheusremotewrite/metrics_to_prw.go +++ b/pkg/translator/prometheusremotewrite/metrics_to_prw.go @@ -16,10 +16,11 @@ import ( ) type Settings struct { - Namespace string - ExternalLabels map[string]string - DisableTargetInfo bool - ExportCreatedMetric bool + Namespace string + ExternalLabels map[string]string + DisableTargetInfo bool + ExportCreatedMetric bool + AddTypeAndUnitSuffixes bool } // FromMetrics converts pmetric.Metrics to prometheus remote write format. @@ -79,7 +80,7 @@ func FromMetrics(md pmetric.Metrics, settings Settings) (tsMap map[string]*promp if dataPoints.Len() == 0 { errs = multierr.Append(errs, fmt.Errorf("empty data points. %s is dropped", metric.Name())) } - name := prometheustranslator.BuildPromCompliantName(metric, settings.Namespace) + name := prometheustranslator.BuildCompliantName(metric, settings.Namespace, settings.AddTypeAndUnitSuffixes) for x := 0; x < dataPoints.Len(); x++ { errs = multierr.Append( errs, diff --git a/pkg/translator/prometheusremotewrite/number_data_points.go b/pkg/translator/prometheusremotewrite/number_data_points.go index d50ed65265137..2a103dc88e0d6 100644 --- a/pkg/translator/prometheusremotewrite/number_data_points.go +++ b/pkg/translator/prometheusremotewrite/number_data_points.go @@ -25,7 +25,7 @@ func addSingleGaugeNumberDataPoint( settings Settings, series map[string]*prompb.TimeSeries, ) { - name := prometheustranslator.BuildPromCompliantName(metric, settings.Namespace) + name := prometheustranslator.BuildCompliantName(metric, settings.Namespace, settings.AddTypeAndUnitSuffixes) labels := createAttributes( resource, pt.Attributes(), @@ -58,7 +58,7 @@ func addSingleSumNumberDataPoint( settings Settings, series map[string]*prompb.TimeSeries, ) { - name := prometheustranslator.BuildPromCompliantName(metric, settings.Namespace) + name := prometheustranslator.BuildCompliantName(metric, settings.Namespace, settings.AddTypeAndUnitSuffixes) labels := createAttributes( resource, pt.Attributes(),