Skip to content

Commit

Permalink
Add initial draft of the oneof generator, fixes issue in contrib (#1677)
Browse files Browse the repository at this point in the history
Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com>
  • Loading branch information
bogdandrutu authored Aug 30, 2020
1 parent 7c315f9 commit 52c9e7f
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 0 deletions.
24 changes: 24 additions & 0 deletions cmd/pdatagen/internal/base_fields.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,3 +314,27 @@ func (ptf *primitiveTypedField) generateCopyToValue(sb *strings.Builder) {
}

var _ baseField = (*primitiveTypedField)(nil)

// oneofField is used in case where the proto defines an "oneof".
type oneofField struct {
copyFuncName string
originFieldName string
testVal string
fillTestName string
}

func (one oneofField) generateAccessors(*messageStruct, *strings.Builder) {}

func (one oneofField) generateAccessorsTest(*messageStruct, *strings.Builder) {}

func (one oneofField) generateSetWithTestValue(sb *strings.Builder) {
sb.WriteString("\t(*tv.orig)." + one.originFieldName + " = " + one.testVal + "\n")
sb.WriteString("\ttv." + one.fillTestName + "().InitEmpty()\n")
sb.WriteString("\tfillTest" + one.fillTestName + "(tv." + one.fillTestName + "())")
}

func (one oneofField) generateCopyToValue(sb *strings.Builder) {
sb.WriteString("\t" + one.copyFuncName + "((*ms.orig), (*dest.orig))")
}

var _ baseField = (*oneofField)(nil)
8 changes: 8 additions & 0 deletions cmd/pdatagen/internal/metrics_structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ var metric = &messageStruct{
defaultVal: `""`,
testVal: `"1"`,
},
oneofDataField,
},
}

Expand Down Expand Up @@ -419,3 +420,10 @@ var aggregationTemporalityField = &primitiveTypedField{
defaultVal: "AggregationTemporalityUnspecified",
testVal: "AggregationTemporalityCumulative",
}

var oneofDataField = &oneofField{
copyFuncName: "copyData",
originFieldName: "Data",
testVal: "&otlpmetrics.Metric_IntGauge{}",
fillTestName: "IntGauge",
}
3 changes: 3 additions & 0 deletions consumer/pdata/generated_metrics.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions consumer/pdata/generated_metrics_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 29 additions & 0 deletions consumer/pdata/metric.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,35 @@ func (ms Metric) SetDoubleHistogram(data DoubleHistogram) {
}
}

func copyData(src, dest *otlpmetrics.Metric) {
switch (src).Data.(type) {
case *otlpmetrics.Metric_IntGauge:
dest.Data = &otlpmetrics.Metric_IntGauge{
IntGauge: src.Data.(*otlpmetrics.Metric_IntGauge).IntGauge,
}
case *otlpmetrics.Metric_DoubleGauge:
dest.Data = &otlpmetrics.Metric_DoubleGauge{
DoubleGauge: src.Data.(*otlpmetrics.Metric_DoubleGauge).DoubleGauge,
}
case *otlpmetrics.Metric_IntSum:
dest.Data = &otlpmetrics.Metric_IntSum{
IntSum: src.Data.(*otlpmetrics.Metric_IntSum).IntSum,
}
case *otlpmetrics.Metric_DoubleSum:
dest.Data = &otlpmetrics.Metric_DoubleSum{
DoubleSum: src.Data.(*otlpmetrics.Metric_DoubleSum).DoubleSum,
}
case *otlpmetrics.Metric_IntHistogram:
dest.Data = &otlpmetrics.Metric_IntHistogram{
IntHistogram: src.Data.(*otlpmetrics.Metric_IntHistogram).IntHistogram,
}
case *otlpmetrics.Metric_DoubleHistogram:
dest.Data = &otlpmetrics.Metric_DoubleHistogram{
DoubleHistogram: src.Data.(*otlpmetrics.Metric_DoubleHistogram).DoubleHistogram,
}
}
}

// DeprecatedNewResource temporary public function.
func DeprecatedNewResource(orig **otlpresource.Resource) Resource {
return newResource(orig)
Expand Down
66 changes: 66 additions & 0 deletions consumer/pdata/metric_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,72 @@ import (
otlpmetrics "go.opentelemetry.io/collector/internal/data/opentelemetry-proto-gen/metrics/v1"
)

func TestCopyData(t *testing.T) {
tests := []struct {
name string
src *otlpmetrics.Metric
}{
{
name: "IntGauge",
src: &otlpmetrics.Metric{
Data: &otlpmetrics.Metric_IntGauge{
IntGauge: &otlpmetrics.IntGauge{},
},
},
},
{
name: "DoubleGauge",
src: &otlpmetrics.Metric{
Data: &otlpmetrics.Metric_DoubleGauge{
DoubleGauge: &otlpmetrics.DoubleGauge{},
},
},
},
{
name: "IntSum",
src: &otlpmetrics.Metric{
Data: &otlpmetrics.Metric_IntSum{
IntSum: &otlpmetrics.IntSum{},
},
},
},
{
name: "DoubleSum",
src: &otlpmetrics.Metric{
Data: &otlpmetrics.Metric_DoubleSum{
DoubleSum: &otlpmetrics.DoubleSum{},
},
},
},
{
name: "IntHistogram",
src: &otlpmetrics.Metric{
Data: &otlpmetrics.Metric_IntHistogram{
IntHistogram: &otlpmetrics.IntHistogram{},
},
},
},
{
name: "DoubleHistogram",
src: &otlpmetrics.Metric{
Data: &otlpmetrics.Metric_DoubleHistogram{
DoubleHistogram: &otlpmetrics.DoubleHistogram{},
},
},
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
dest := &otlpmetrics.Metric{}
assert.Nil(t, dest.Data)
assert.NotNil(t, test.src.Data)
copyData(test.src, dest)
assert.EqualValues(t, test.src, dest)
})
}
}

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
Expand Down

0 comments on commit 52c9e7f

Please sign in to comment.