diff --git a/consumer/pdata/metric.go b/consumer/pdata/metric.go index 0cc2d26ecda..04e2bf3dfdd 100644 --- a/consumer/pdata/metric.go +++ b/consumer/pdata/metric.go @@ -76,12 +76,9 @@ func (mdt MetricDataType) String() string { return "" } -// Type returns the type of the data for this Metric. +// DataType returns the type of the data for this Metric. // Calling this function on zero-initialized Metric will cause a panic. func (ms Metric) DataType() MetricDataType { - if *ms.orig == nil || (*ms.orig).Data == nil { - return MetricDataTypeNone - } switch (*ms.orig).Data.(type) { case *otlpmetrics.Metric_IntGauge: return MetricDataTypeIntGauge @@ -99,6 +96,25 @@ func (ms Metric) DataType() MetricDataType { return MetricDataTypeNone } +// SetDataType clears any existing data and initialize it with an empty data of the given type. +// Calling this function on zero-initialized Metric will cause a panic. +func (ms Metric) SetDataType(ty MetricDataType) { + switch ty { + case MetricDataTypeIntGauge: + (*ms.orig).Data = &otlpmetrics.Metric_IntGauge{} + case MetricDataTypeDoubleGauge: + (*ms.orig).Data = &otlpmetrics.Metric_DoubleGauge{} + case MetricDataTypeIntSum: + (*ms.orig).Data = &otlpmetrics.Metric_IntSum{} + case MetricDataTypeDoubleSum: + (*ms.orig).Data = &otlpmetrics.Metric_DoubleSum{} + case MetricDataTypeIntHistogram: + (*ms.orig).Data = &otlpmetrics.Metric_IntHistogram{} + case MetricDataTypeDoubleHistogram: + (*ms.orig).Data = &otlpmetrics.Metric_DoubleHistogram{} + } +} + // IntGauge returns the data as IntGauge. This should be called iff DataType() == MetricDataTypeIntGauge. // Calling this function on zero-initialized Metric will cause a panic. func (ms Metric) IntGauge() IntGauge { @@ -153,54 +169,6 @@ func (ms Metric) DoubleHistogram() DoubleHistogram { return NewDoubleHistogram() } -// SetIntGauge replaces the metric data with the given IntGauge. -// Calling this function on zero-initialized Metric will cause a panic. -func (ms Metric) SetIntGauge(data IntGauge) { - (*ms.orig).Data = &otlpmetrics.Metric_IntGauge{ - IntGauge: *data.orig, - } -} - -// SetDoubleGauge replaces the metric data with the given DoubleGauge. -// Calling this function on zero-initialized Metric will cause a panic. -func (ms Metric) SetDoubleGauge(data DoubleGauge) { - (*ms.orig).Data = &otlpmetrics.Metric_DoubleGauge{ - DoubleGauge: *data.orig, - } -} - -// SetIntSum replaces the metric data with the given IntSum. -// Calling this function on zero-initialized Metric will cause a panic. -func (ms Metric) SetIntSum(data IntSum) { - (*ms.orig).Data = &otlpmetrics.Metric_IntSum{ - IntSum: *data.orig, - } -} - -// SetDoubleSum replaces the metric data with the given DoubleSum. -// Calling this function on zero-initialized Metric will cause a panic. -func (ms Metric) SetDoubleSum(data DoubleSum) { - (*ms.orig).Data = &otlpmetrics.Metric_DoubleSum{ - DoubleSum: *data.orig, - } -} - -// SetIntHistogram replaces the metric data with the given IntHistogram. -// Calling this function on zero-initialized Metric will cause a panic. -func (ms Metric) SetIntHistogram(data IntHistogram) { - (*ms.orig).Data = &otlpmetrics.Metric_IntHistogram{ - IntHistogram: *data.orig, - } -} - -// SetDoubleHistogram replaces the metric data with the given DoubleHistogram. -// Calling this function on zero-initialized Metric will cause a panic. -func (ms Metric) SetDoubleHistogram(data DoubleHistogram) { - (*ms.orig).Data = &otlpmetrics.Metric_DoubleHistogram{ - DoubleHistogram: *data.orig, - } -} - func copyData(src, dest *otlpmetrics.Metric) { switch (src).Data.(type) { case *otlpmetrics.Metric_IntGauge: diff --git a/consumer/pdata/metric_test.go b/consumer/pdata/metric_test.go index 5d414ca1b00..113b3fdacbd 100644 --- a/consumer/pdata/metric_test.go +++ b/consumer/pdata/metric_test.go @@ -91,6 +91,32 @@ func TestCopyData(t *testing.T) { } } +func TestDataType(t *testing.T) { + m := NewMetric() + m.InitEmpty() + assert.Equal(t, MetricDataTypeNone, m.DataType()) + m.SetDataType(MetricDataTypeIntGauge) + assert.Equal(t, MetricDataTypeIntGauge, m.DataType()) + assert.True(t, m.IntGauge().IsNil()) + m.SetDataType(MetricDataTypeDoubleGauge) + assert.Equal(t, MetricDataTypeDoubleGauge, m.DataType()) + assert.True(t, m.DoubleGauge().IsNil()) + m.SetDataType(MetricDataTypeIntSum) + assert.Equal(t, MetricDataTypeIntSum, m.DataType()) + assert.True(t, m.IntSum().IsNil()) + m.SetDataType(MetricDataTypeDoubleSum) + assert.Equal(t, MetricDataTypeDoubleSum, m.DataType()) + assert.True(t, m.DoubleSum().IsNil()) + m.SetDataType(MetricDataTypeIntHistogram) + assert.Equal(t, MetricDataTypeIntHistogram, m.DataType()) + assert.True(t, m.IntHistogram().IsNil()) + m.SetDataType(MetricDataTypeDoubleHistogram) + assert.Equal(t, MetricDataTypeDoubleHistogram, m.DataType()) + assert.True(t, m.DoubleHistogram().IsNil()) + m.InitEmpty() + assert.Equal(t, MetricDataTypeNone, m.DataType()) +} + func TestResourceMetricsWireCompatibility(t *testing.T) { // This test verifies that OTLP ProtoBufs generated using goproto lib in // opentelemetry-proto repository OTLP ProtoBufs generated using gogoproto lib in diff --git a/internal/data/metrics_test.go b/internal/data/metrics_test.go index 630664cb5f0..a1378d24ed8 100644 --- a/internal/data/metrics_test.go +++ b/internal/data/metrics_test.go @@ -61,12 +61,13 @@ func TestMetricSize(t *testing.T) { rms.Resize(1) rms.At(0).InstrumentationLibraryMetrics().Resize(1) rms.At(0).InstrumentationLibraryMetrics().At(0).Metrics().Resize(1) - doubleHistogram := pdata.NewDoubleHistogram() + metric := rms.At(0).InstrumentationLibraryMetrics().At(0).Metrics().At(0) + metric.SetDataType(pdata.MetricDataTypeDoubleHistogram) + doubleHistogram := metric.DoubleHistogram() doubleHistogram.InitEmpty() doubleHistogram.DataPoints().Resize(1) doubleHistogram.DataPoints().At(0).SetCount(123) doubleHistogram.DataPoints().At(0).SetSum(123) - rms.At(0).InstrumentationLibraryMetrics().At(0).Metrics().At(0).SetDoubleHistogram(doubleHistogram) otlp := MetricDataToOtlp(md) size := 0 sizeBytes := 0 @@ -124,10 +125,10 @@ func TestMetricAndDataPointCount(t *testing.T) { ms, dps = md.MetricAndDataPointCount() assert.EqualValues(t, 1, ms) assert.EqualValues(t, 0, dps) - intSum := pdata.NewIntSum() + ilms.At(0).Metrics().At(0).SetDataType(pdata.MetricDataTypeIntSum) + intSum := ilms.At(0).Metrics().At(0).IntSum() intSum.InitEmpty() intSum.DataPoints().Resize(3) - ilms.At(0).Metrics().At(0).SetIntSum(intSum) _, dps = md.MetricAndDataPointCount() assert.EqualValues(t, 3, dps) @@ -144,14 +145,14 @@ func TestMetricAndDataPointCount(t *testing.T) { ms, dps = md.MetricAndDataPointCount() assert.EqualValues(t, 6, ms) assert.EqualValues(t, 0, dps) - doubleGauge := pdata.NewDoubleGauge() + ilms.At(0).Metrics().At(1).SetDataType(pdata.MetricDataTypeDoubleGauge) + doubleGauge := ilms.At(0).Metrics().At(1).DoubleGauge() doubleGauge.InitEmpty() doubleGauge.DataPoints().Resize(1) - ilms.At(0).Metrics().At(1).SetDoubleGauge(doubleGauge) - intHistogram := pdata.NewIntHistogram() + ilms.At(0).Metrics().At(3).SetDataType(pdata.MetricDataTypeIntHistogram) + intHistogram := ilms.At(0).Metrics().At(3).IntHistogram() intHistogram.InitEmpty() intHistogram.DataPoints().Resize(3) - ilms.At(0).Metrics().At(3).SetIntHistogram(intHistogram) ms, dps = md.MetricAndDataPointCount() assert.EqualValues(t, 6, ms) assert.EqualValues(t, 4, dps) diff --git a/internal/data/testdata/metric.go b/internal/data/testdata/metric.go index b181c3c2c9d..6c5d4067466 100644 --- a/internal/data/testdata/metric.go +++ b/internal/data/testdata/metric.go @@ -597,37 +597,30 @@ func initMetric(m pdata.Metric, name string, ty pdata.MetricDataType) { m.SetName(name) m.SetDescription("") m.SetUnit("1") + m.SetDataType(ty) switch ty { case pdata.MetricDataTypeIntGauge: - md := pdata.NewIntGauge() - md.InitEmpty() - m.SetIntGauge(md) + m.IntGauge().InitEmpty() case pdata.MetricDataTypeDoubleGauge: - md := pdata.NewDoubleGauge() - md.InitEmpty() - m.SetDoubleGauge(md) + m.DoubleGauge().InitEmpty() case pdata.MetricDataTypeIntSum: - md := pdata.NewIntSum() - md.InitEmpty() - md.SetIsMonotonic(true) - md.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) - m.SetIntSum(md) + sum := m.IntSum() + sum.InitEmpty() + sum.SetIsMonotonic(true) + sum.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) case pdata.MetricDataTypeDoubleSum: - md := pdata.NewDoubleSum() - md.InitEmpty() - md.SetIsMonotonic(true) - md.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) - m.SetDoubleSum(md) + sum := m.DoubleSum() + sum.InitEmpty() + sum.SetIsMonotonic(true) + sum.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) case pdata.MetricDataTypeIntHistogram: - md := pdata.NewIntHistogram() - md.InitEmpty() - md.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) - m.SetIntHistogram(md) + histo := m.IntHistogram() + histo.InitEmpty() + histo.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) case pdata.MetricDataTypeDoubleHistogram: - md := pdata.NewDoubleHistogram() - md.InitEmpty() - md.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) - m.SetDoubleHistogram(md) + histo := m.DoubleHistogram() + histo.InitEmpty() + histo.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) } } diff --git a/translator/internaldata/oc_to_metrics.go b/translator/internaldata/oc_to_metrics.go index 1daae0fffb0..70a9e9a811d 100644 --- a/translator/internaldata/oc_to_metrics.go +++ b/translator/internaldata/oc_to_metrics.go @@ -165,38 +165,36 @@ func descriptorTypeToMetrics(t ocmetrics.MetricDescriptor_Type, metric pdata.Met switch t { case ocmetrics.MetricDescriptor_GAUGE_INT64: metric.InitEmpty() - md := pdata.NewIntGauge() - md.InitEmpty() - metric.SetIntGauge(md) + metric.SetDataType(pdata.MetricDataTypeIntGauge) + metric.IntGauge().InitEmpty() return pdata.MetricDataTypeIntGauge case ocmetrics.MetricDescriptor_GAUGE_DOUBLE: metric.InitEmpty() - md := pdata.NewDoubleGauge() - md.InitEmpty() - metric.SetDoubleGauge(md) + metric.SetDataType(pdata.MetricDataTypeDoubleGauge) + metric.DoubleGauge().InitEmpty() return pdata.MetricDataTypeDoubleGauge case ocmetrics.MetricDescriptor_CUMULATIVE_INT64: metric.InitEmpty() - md := pdata.NewIntSum() - md.InitEmpty() - md.SetIsMonotonic(true) - md.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) - metric.SetIntSum(md) + metric.SetDataType(pdata.MetricDataTypeIntSum) + sum := metric.IntSum() + sum.InitEmpty() + sum.SetIsMonotonic(true) + sum.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) return pdata.MetricDataTypeIntSum case ocmetrics.MetricDescriptor_CUMULATIVE_DOUBLE: metric.InitEmpty() - md := pdata.NewDoubleSum() - md.InitEmpty() - md.SetIsMonotonic(true) - md.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) - metric.SetDoubleSum(md) + metric.SetDataType(pdata.MetricDataTypeDoubleSum) + sum := metric.DoubleSum() + sum.InitEmpty() + sum.SetIsMonotonic(true) + sum.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) return pdata.MetricDataTypeDoubleSum case ocmetrics.MetricDescriptor_CUMULATIVE_DISTRIBUTION: metric.InitEmpty() - md := pdata.NewDoubleHistogram() - md.InitEmpty() - md.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) - metric.SetDoubleHistogram(md) + metric.SetDataType(pdata.MetricDataTypeDoubleHistogram) + histo := metric.DoubleHistogram() + histo.InitEmpty() + histo.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) return pdata.MetricDataTypeDoubleHistogram } // For the moment MetricDescriptor_SUMMARY is not supported diff --git a/translator/internaldata/oc_to_metrics_test.go b/translator/internaldata/oc_to_metrics_test.go index d24f1c92914..74eda499267 100644 --- a/translator/internaldata/oc_to_metrics_test.go +++ b/translator/internaldata/oc_to_metrics_test.go @@ -23,6 +23,7 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/consumer/consumerdata" + "go.opentelemetry.io/collector/consumer/pdata" "go.opentelemetry.io/collector/internal/data" "go.opentelemetry.io/collector/internal/data/testdata" ) @@ -32,12 +33,14 @@ func TestOCToMetrics(t *testing.T) { allTypesNoDataPoints := testdata.GenerateMetricsAllTypesNoDataPoints() dh := allTypesNoDataPoints.ResourceMetrics().At(0).InstrumentationLibraryMetrics().At(0).Metrics().At(4) ih := allTypesNoDataPoints.ResourceMetrics().At(0).InstrumentationLibraryMetrics().At(0).Metrics().At(5) - ih.SetDoubleHistogram(dh.DoubleHistogram()) + ih.SetDataType(pdata.MetricDataTypeDoubleHistogram) + dh.DoubleHistogram().CopyTo(ih.DoubleHistogram()) sampleMetricData := testdata.GenerateMetricsWithCountersHistograms() dh = sampleMetricData.ResourceMetrics().At(0).InstrumentationLibraryMetrics().At(0).Metrics().At(2) ih = sampleMetricData.ResourceMetrics().At(0).InstrumentationLibraryMetrics().At(0).Metrics().At(3) - ih.SetDoubleHistogram(dh.DoubleHistogram()) + ih.SetDataType(pdata.MetricDataTypeDoubleHistogram) + dh.DoubleHistogram().CopyTo(ih.DoubleHistogram()) tests := []struct { name string