From 7772e6690e82866cb8cfb997b038c6c20273e91b Mon Sep 17 00:00:00 2001 From: Antoine Toulme Date: Thu, 14 Mar 2024 12:05:22 -0700 Subject: [PATCH] [chore] Refactor mdatagen unmarshaling to use less custom Unmarshal calls now that embedded structs are supported --- cmd/mdatagen/loader_test.go | 4 +-- cmd/mdatagen/metricdata.go | 52 +++++++++++-------------------------- 2 files changed, 17 insertions(+), 39 deletions(-) diff --git a/cmd/mdatagen/loader_test.go b/cmd/mdatagen/loader_test.go index 677288258d2..b9040e23380 100644 --- a/cmd/mdatagen/loader_test.go +++ b/cmd/mdatagen/loader_test.go @@ -249,7 +249,7 @@ func TestLoadMetadata(t *testing.T) { }, { name: "testdata/unknown_value_type.yaml", - wantErr: "1 error(s) decoding:\n\n* error decoding 'metrics[system.cpu.time]': 1 error(s) decoding:\n\n* error decoding 'sum': 1 error(s) decoding:\n\n* error decoding 'value_type': invalid value_type: \"unknown\"", + wantErr: "1 error(s) decoding:\n\n* error decoding 'metrics[system.cpu.time]': 1 error(s) decoding:\n\n* error decoding 'sum': invalid value_type: \"unknown\"", }, { name: "testdata/no_aggregation.yaml", @@ -259,7 +259,7 @@ func TestLoadMetadata(t *testing.T) { { name: "testdata/invalid_aggregation.yaml", want: metadata{}, - wantErr: "1 error(s) decoding:\n\n* error decoding 'metrics[default.metric]': 1 error(s) decoding:\n\n* error decoding 'sum': 1 error(s) decoding:\n\n* error decoding 'aggregation_temporality': invalid aggregation: \"invalidaggregation\"", + wantErr: "1 error(s) decoding:\n\n* error decoding 'metrics[default.metric]': 1 error(s) decoding:\n\n* error decoding 'sum': invalid aggregation: \"invalidaggregation\"", }, { name: "testdata/invalid_type_attr.yaml", diff --git a/cmd/mdatagen/metricdata.go b/cmd/mdatagen/metricdata.go index 5bf77985cc9..d70e5324084 100644 --- a/cmd/mdatagen/metricdata.go +++ b/cmd/mdatagen/metricdata.go @@ -28,18 +28,20 @@ type MetricData interface { type AggregationTemporality struct { // Aggregation describes if the aggregator reports delta changes // since last report time, or cumulative changes since a fixed start time. - Aggregation pmetric.AggregationTemporality + Aggregation pmetric.AggregationTemporality `mapstructure:"aggregation_temporality"` } -// UnmarshalText implements the encoding.TextUnmarshaler interface. -func (agg *AggregationTemporality) UnmarshalText(text []byte) error { - switch vtStr := string(text); vtStr { +func (agg *AggregationTemporality) Unmarshal(parser *confmap.Conf) error { + if !parser.IsSet("aggregation_temporality") { + return errors.New("missing required field: `aggregation_temporality`") + } + switch vt := parser.Get("aggregation_temporality"); vt { case "cumulative": agg.Aggregation = pmetric.AggregationTemporalityCumulative case "delta": agg.Aggregation = pmetric.AggregationTemporalityDelta default: - return fmt.Errorf("invalid aggregation: %q", vtStr) + return fmt.Errorf("invalid aggregation: %q", vt) } return nil } @@ -73,36 +75,31 @@ func (mit MetricInputType) String() string { // MetricValueType defines the metric number type. type MetricValueType struct { // ValueType is type of the metric number, options are "double", "int". - ValueType pmetric.NumberDataPointValueType + ValueType pmetric.NumberDataPointValueType `mapstructure:"value_type"` } func (mvt *MetricValueType) Unmarshal(parser *confmap.Conf) error { if !parser.IsSet("value_type") { return errors.New("missing required field: `value_type`") } - return nil -} - -// UnmarshalText implements the encoding.TextUnmarshaler interface. -func (mvt *MetricValueType) UnmarshalText(text []byte) error { - switch vtStr := string(text); vtStr { + switch vt := parser.Get("value_type"); vt { case "int": mvt.ValueType = pmetric.NumberDataPointValueTypeInt case "double": mvt.ValueType = pmetric.NumberDataPointValueTypeDouble default: - return fmt.Errorf("invalid value_type: %q", vtStr) + return fmt.Errorf("invalid value_type: %q", vt) } return nil } // Type returns name of the datapoint type. -func (mvt MetricValueType) String() string { +func (mvt *MetricValueType) String() string { return mvt.ValueType.String() } // BasicType returns name of a golang basic type for the datapoint type. -func (mvt MetricValueType) BasicType() string { +func (mvt *MetricValueType) BasicType() string { switch mvt.ValueType { case pmetric.NumberDataPointValueTypeInt: return "int64" @@ -116,18 +113,10 @@ func (mvt MetricValueType) BasicType() string { } type gauge struct { - MetricValueType `mapstructure:"value_type"` + MetricValueType `mapstructure:",squash"` MetricInputType `mapstructure:",squash"` } -// Unmarshal is a custom unmarshaler for gauge. Needed mostly to avoid MetricValueType.Unmarshal inheritance. -func (d *gauge) Unmarshal(parser *confmap.Conf) error { - if err := d.MetricValueType.Unmarshal(parser); err != nil { - return err - } - return parser.Unmarshal(d, confmap.WithIgnoreUnused()) -} - func (d gauge) Type() string { return "Gauge" } @@ -141,23 +130,12 @@ func (d gauge) HasAggregated() bool { } type sum struct { - AggregationTemporality `mapstructure:"aggregation_temporality"` + AggregationTemporality `mapstructure:",squash"` Mono `mapstructure:",squash"` - MetricValueType `mapstructure:"value_type"` + MetricValueType `mapstructure:",squash"` MetricInputType `mapstructure:",squash"` } -// Unmarshal is a custom unmarshaler for sum. Needed mostly to avoid MetricValueType.Unmarshal inheritance. -func (d *sum) Unmarshal(parser *confmap.Conf) error { - if !parser.IsSet("aggregation_temporality") { - return errors.New("missing required field: `aggregation_temporality`") - } - if err := d.MetricValueType.Unmarshal(parser); err != nil { - return err - } - return parser.Unmarshal(d, confmap.WithIgnoreUnused()) -} - // TODO: Currently, this func will not be called because of https://github.com/open-telemetry/opentelemetry-collector/issues/6671. Uncomment function and // add a test case to Test_loadMetadata for file no_monotonic.yaml once the issue is solved. //