diff --git a/pkg/receiver/smartagentreceiver/converter/metrics.go b/pkg/receiver/smartagentreceiver/converter/metrics.go index 36ab6600f0..eb04d0f8b5 100644 --- a/pkg/receiver/smartagentreceiver/converter/metrics.go +++ b/pkg/receiver/smartagentreceiver/converter/metrics.go @@ -24,6 +24,10 @@ import ( "go.uber.org/zap" ) +const ( + monitorIDDim = "monitorID" +) + var ( errUnsupportedMetricTypeTimestamp = fmt.Errorf("unsupported metric type timestamp") ) @@ -72,6 +76,15 @@ func setDataTypeAndPoints(datapoint *sfx.Datapoint, ms pmetric.MetricSlice, time return fmt.Errorf("unsupported value type %T: %v", datapoint.Value, datapoint.Value) } + // isolated collectd plugins will set the "monitorID" dimension. We need to + // delete this dimension if it matches the meta value to prevent high cardinality values + // (especially a concern with receiver creator that uses endpoint IDs). + if mmID, metaSet := datapoint.Meta[monitorIDDim]; metaSet { + if dmID, dimSet := datapoint.Dimensions[monitorIDDim]; dimSet && dmID == mmID { + delete(datapoint.Dimensions, monitorIDDim) + } + } + switch sfxMetricType { case sfx.Gauge, sfx.Enum, sfx.Rate: m = ms.AppendEmpty() diff --git a/pkg/receiver/smartagentreceiver/converter/metrics_test.go b/pkg/receiver/smartagentreceiver/converter/metrics_test.go index f2706976c3..41a9befb4a 100644 --- a/pkg/receiver/smartagentreceiver/converter/metrics_test.go +++ b/pkg/receiver/smartagentreceiver/converter/metrics_test.go @@ -246,6 +246,32 @@ func TestDatapointsToPDataMetrics(t *testing.T) { }(), expectedMetrics: pdataMetrics(pmetric.MetricTypeGauge, 13, now), }, + { + name: "undesired monitorID dimension", + datapoints: func() []*sfx.Datapoint { + pt := sfxDatapoint() + pt.Meta = map[any]any{"monitorID": "undesired.value"} + pt.Dimensions["monitorID"] = "undesired.value" + return []*sfx.Datapoint{pt} + }(), + expectedMetrics: func() pmetric.Metrics { + return pdataMetrics(pmetric.MetricTypeGauge, 13, now) + }(), + }, + { + name: "desired monitorID dimension", + datapoints: func() []*sfx.Datapoint { + pt := sfxDatapoint() + pt.Meta = map[any]any{"monitorID": "undesired.value"} + pt.Dimensions["monitorID"] = "desired.value" + return []*sfx.Datapoint{pt} + }(), + expectedMetrics: func() pmetric.Metrics { + md := pdataMetrics(pmetric.MetricTypeGauge, 13, now) + md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).Gauge().DataPoints().At(0).Attributes().PutStr("monitorID", "desired.value") + return md + }(), + }, } for _, test := range tests {