diff --git a/CHANGELOG.md b/CHANGELOG.md index 571623bc4b4..617e016e714 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,12 @@ - `pdata.NewAttributeValue...` funcs are deprecated in favor of `pdata.NewValue...` - Deprecate LogRecord.Name(), it was deprecated in the data model (#5054) +### 💡 Enhancements 💡 + +- Change outcome of `pdata.Metric.()` functions misuse. + In case of type mismatch, they don't panic right away but return an invalid zero-initialized + instance for consistency with other OneOf field accessors (#5034) + ## v0.47.0 Beta ### 🛑 Breaking changes 🛑 diff --git a/model/internal/cmd/pdatagen/internal/base_fields.go b/model/internal/cmd/pdatagen/internal/base_fields.go index c677e45f297..498f1af01ba 100644 --- a/model/internal/cmd/pdatagen/internal/base_fields.go +++ b/model/internal/cmd/pdatagen/internal/base_fields.go @@ -64,10 +64,17 @@ const oneOfTypeAccessorHeaderTestTemplate = `func Test${structName}${originField assert.Equal(t, "", ${typeName}(1000).String())` const accessorsOneOfMessageTemplate = `// ${fieldName} returns the ${lowerFieldName} associated with this ${structName}. -// Calling this function when ${originOneOfFieldName}Type() != ${typeName} will cause a panic. +// +// Calling this function when ${originOneOfFieldName}Type() != ${typeName} returns an invalid +// zero-initialized instance of ${returnType}. Note that using such ${returnType} instance can cause panic. +// // Calling this function on zero-initialized ${structName} will cause a panic. func (ms ${structName}) ${fieldName}() ${returnType} { - return new${returnType}((*ms.orig).${originOneOfFieldName}.(*${originStructType}).${originFieldName}) + v, ok := ms.orig.Get${originOneOfFieldName}().(*${originStructType}) + if !ok { + return ${returnType}{} + } + return new${returnType}(v.${originFieldName}) }` const accessorsOneOfMessageTestTemplate = `func Test${structName}_${fieldName}(t *testing.T) { @@ -478,6 +485,11 @@ func (of *oneOfField) generateTypeAccessorsTest(ms baseStruct, sb *strings.Build } })) sb.WriteString("\n") + for _, v := range of.values { + if mv, ok := v.(*oneOfMessageValue); ok { + sb.WriteString("\tassert.Equal(t, " + mv.fieldName + "{}, tv." + mv.fieldName + "())\n") + } + } for _, v := range of.values { v.generateSetWithTestValue(of, sb) sb.WriteString("\n\tassert.Equal(t, " + of.typeName + v.getFieldType() + ", " + diff --git a/model/internal/pdata/generated_metrics.go b/model/internal/pdata/generated_metrics.go index 16eef86f412..ab544ff9a06 100644 --- a/model/internal/pdata/generated_metrics.go +++ b/model/internal/pdata/generated_metrics.go @@ -628,38 +628,73 @@ func (ms Metric) DataType() MetricDataType { } // Gauge returns the gauge associated with this Metric. -// Calling this function when DataType() != MetricDataTypeGauge will cause a panic. +// +// Calling this function when DataType() != MetricDataTypeGauge returns an invalid +// zero-initialized instance of Gauge. Note that using such Gauge instance can cause panic. +// // Calling this function on zero-initialized Metric will cause a panic. func (ms Metric) Gauge() Gauge { - return newGauge((*ms.orig).Data.(*otlpmetrics.Metric_Gauge).Gauge) + v, ok := ms.orig.GetData().(*otlpmetrics.Metric_Gauge) + if !ok { + return Gauge{} + } + return newGauge(v.Gauge) } // Sum returns the sum associated with this Metric. -// Calling this function when DataType() != MetricDataTypeSum will cause a panic. +// +// Calling this function when DataType() != MetricDataTypeSum returns an invalid +// zero-initialized instance of Sum. Note that using such Sum instance can cause panic. +// // Calling this function on zero-initialized Metric will cause a panic. func (ms Metric) Sum() Sum { - return newSum((*ms.orig).Data.(*otlpmetrics.Metric_Sum).Sum) + v, ok := ms.orig.GetData().(*otlpmetrics.Metric_Sum) + if !ok { + return Sum{} + } + return newSum(v.Sum) } // Histogram returns the histogram associated with this Metric. -// Calling this function when DataType() != MetricDataTypeHistogram will cause a panic. +// +// Calling this function when DataType() != MetricDataTypeHistogram returns an invalid +// zero-initialized instance of Histogram. Note that using such Histogram instance can cause panic. +// // Calling this function on zero-initialized Metric will cause a panic. func (ms Metric) Histogram() Histogram { - return newHistogram((*ms.orig).Data.(*otlpmetrics.Metric_Histogram).Histogram) + v, ok := ms.orig.GetData().(*otlpmetrics.Metric_Histogram) + if !ok { + return Histogram{} + } + return newHistogram(v.Histogram) } // ExponentialHistogram returns the exponentialhistogram associated with this Metric. -// Calling this function when DataType() != MetricDataTypeExponentialHistogram will cause a panic. +// +// Calling this function when DataType() != MetricDataTypeExponentialHistogram returns an invalid +// zero-initialized instance of ExponentialHistogram. Note that using such ExponentialHistogram instance can cause panic. +// // Calling this function on zero-initialized Metric will cause a panic. func (ms Metric) ExponentialHistogram() ExponentialHistogram { - return newExponentialHistogram((*ms.orig).Data.(*otlpmetrics.Metric_ExponentialHistogram).ExponentialHistogram) + v, ok := ms.orig.GetData().(*otlpmetrics.Metric_ExponentialHistogram) + if !ok { + return ExponentialHistogram{} + } + return newExponentialHistogram(v.ExponentialHistogram) } // Summary returns the summary associated with this Metric. -// Calling this function when DataType() != MetricDataTypeSummary will cause a panic. +// +// Calling this function when DataType() != MetricDataTypeSummary returns an invalid +// zero-initialized instance of Summary. Note that using such Summary instance can cause panic. +// // Calling this function on zero-initialized Metric will cause a panic. func (ms Metric) Summary() Summary { - return newSummary((*ms.orig).Data.(*otlpmetrics.Metric_Summary).Summary) + v, ok := ms.orig.GetData().(*otlpmetrics.Metric_Summary) + if !ok { + return Summary{} + } + return newSummary(v.Summary) } // CopyTo copies all properties from the current struct to the dest. diff --git a/model/internal/pdata/generated_metrics_test.go b/model/internal/pdata/generated_metrics_test.go index 10db30064a0..d37531ab6a4 100644 --- a/model/internal/pdata/generated_metrics_test.go +++ b/model/internal/pdata/generated_metrics_test.go @@ -469,6 +469,11 @@ func TestMetricDataType(t *testing.T) { tv := NewMetric() assert.Equal(t, MetricDataTypeNone, tv.DataType()) assert.Equal(t, "", MetricDataType(1000).String()) + assert.Equal(t, Gauge{}, tv.Gauge()) + assert.Equal(t, Sum{}, tv.Sum()) + assert.Equal(t, Histogram{}, tv.Histogram()) + assert.Equal(t, ExponentialHistogram{}, tv.ExponentialHistogram()) + assert.Equal(t, Summary{}, tv.Summary()) tv.SetDataType(MetricDataTypeGauge) fillTestGauge(tv.Gauge()) assert.Equal(t, MetricDataTypeGauge, tv.DataType())