From 03c0f1e50fdc40f2b7fa135412666770a74a6017 Mon Sep 17 00:00:00 2001 From: Bogdan Drutu Date: Mon, 22 Aug 2022 14:06:33 -0700 Subject: [PATCH] Added MarshalerSizer Interface to facilitate creation of Sizer implementations (#5929) (#5931) * Added NewProtoSizer to instantiate Sizer implementations Signed-off-by: Corbin Phelps * Updated changelog with PR number Signed-off-by: Corbin Phelps * Refactored to create a MarshalSizer interface that is returned by NewProtoMarshaller Signed-off-by: Corbin Phelps * Updated NewProtoMarshaler comments to inidicate return interface Signed-off-by: Corbin Phelps * Corrected interface name Signed-off-by: Corbin Phelps Signed-off-by: Corbin Phelps Signed-off-by: Corbin Phelps Co-authored-by: Corbin Phelps --- CHANGELOG.md | 1 + pdata/ptrace/json.go | 16 +++++------ pdata/ptrace/json_test.go | 59 ++++++++++++++++++--------------------- 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a6775c507c..ef80ad11a27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ ### 🧰 Bug fixes 🧰 - Fix reading scope attributes for trace JSON, remove duplicate code. (#5930) +- otlpjson/trace: skip unknown fields instead of error. (#5931) - Fix bug in setting the correct collector state after a configuration change event. (#5830) - Fix json trace unmarshalling for numbers (#5924): - Accept both string and number for int32/uint32. diff --git a/pdata/ptrace/json.go b/pdata/ptrace/json.go index f88c0a507ac..e3068321f39 100644 --- a/pdata/ptrace/json.go +++ b/pdata/ptrace/json.go @@ -72,7 +72,7 @@ func readTraceData(iter *jsoniter.Iterator) otlptrace.TracesData { return true }) default: - iter.ReportError("root", fmt.Sprintf("unknown field:%v", f)) + iter.Skip() } return true }) @@ -95,7 +95,7 @@ func readResourceSpans(iter *jsoniter.Iterator) *otlptrace.ResourceSpans { case "droppedAttributesCount", "dropped_attributes_count": rs.Resource.DroppedAttributesCount = json.ReadUint32(iter) default: - iter.ReportError("readResourceSpans.resource", fmt.Sprintf("unknown field:%v", f)) + iter.Skip() } return true }) @@ -107,7 +107,7 @@ func readResourceSpans(iter *jsoniter.Iterator) *otlptrace.ResourceSpans { case "schemaUrl", "schema_url": rs.SchemaUrl = iter.ReadString() default: - iter.ReportError("readResourceSpans", fmt.Sprintf("unknown field:%v", f)) + iter.Skip() } return true }) @@ -129,7 +129,7 @@ func readScopeSpans(iter *jsoniter.Iterator) *otlptrace.ScopeSpans { case "schemaUrl", "schema_url": ils.SchemaUrl = iter.ReadString() default: - iter.ReportError("readScopeSpans", fmt.Sprintf("unknown field:%v", f)) + iter.Skip() } return true }) @@ -192,12 +192,12 @@ func readSpan(iter *jsoniter.Iterator) *otlptrace.Span { case "code": sp.Status.Code = otlptrace.Status_StatusCode(json.ReadEnumValue(iter, otlptrace.Status_StatusCode_value)) default: - iter.ReportError("readSpan.status", fmt.Sprintf("unknown field:%v", f)) + iter.Skip() } return true }) default: - iter.ReportError("readSpan", fmt.Sprintf("unknown field:%v", f)) + iter.Skip() } return true }) @@ -227,7 +227,7 @@ func readSpanLink(iter *jsoniter.Iterator) *otlptrace.Span_Link { case "droppedAttributesCount", "dropped_attributes_count": link.DroppedAttributesCount = json.ReadUint32(iter) default: - iter.ReportError("readSpanLink", fmt.Sprintf("unknown field:%v", f)) + iter.Skip() } return true }) @@ -251,7 +251,7 @@ func readSpanEvent(iter *jsoniter.Iterator) *otlptrace.Span_Event { case "droppedAttributesCount", "dropped_attributes_count": event.DroppedAttributesCount = json.ReadUint32(iter) default: - iter.ReportError("readSpanEvent", fmt.Sprintf("unknown field:%v", f)) + iter.Skip() } return true }) diff --git a/pdata/ptrace/json_test.go b/pdata/ptrace/json_test.go index 7c3c4f0323d..04304793870 100644 --- a/pdata/ptrace/json_test.go +++ b/pdata/ptrace/json_test.go @@ -161,61 +161,56 @@ func TestReadTraceDataUnknownField(t *testing.T) { jsonStr := `{"extra":""}` iter := jsoniter.ConfigFastest.BorrowIterator([]byte(jsonStr)) defer jsoniter.ConfigFastest.ReturnIterator(iter) - readTraceData(iter) - if assert.Error(t, iter.Error) { - assert.Contains(t, iter.Error.Error(), "unknown field") - } + val := readTraceData(iter) + assert.NoError(t, iter.Error) + assert.Equal(t, otlptrace.TracesData{}, val) } func TestReadResourceSpansUnknownField(t *testing.T) { jsonStr := `{"extra":""}` iter := jsoniter.ConfigFastest.BorrowIterator([]byte(jsonStr)) defer jsoniter.ConfigFastest.ReturnIterator(iter) - readResourceSpans(iter) - if assert.Error(t, iter.Error) { - assert.Contains(t, iter.Error.Error(), "unknown field") - } + val := readResourceSpans(iter) + assert.NoError(t, iter.Error) + assert.Equal(t, &otlptrace.ResourceSpans{}, val) } func TestReadResourceSpansUnknownResourceField(t *testing.T) { jsonStr := `{"resource":{"extra":""}}` iter := jsoniter.ConfigFastest.BorrowIterator([]byte(jsonStr)) defer jsoniter.ConfigFastest.ReturnIterator(iter) - readResourceSpans(iter) - if assert.Error(t, iter.Error) { - assert.Contains(t, iter.Error.Error(), "unknown field") - } + val := readResourceSpans(iter) + assert.NoError(t, iter.Error) + assert.Equal(t, &otlptrace.ResourceSpans{}, val) } func TestReadScopeSpansUnknownField(t *testing.T) { jsonStr := `{"extra":""}` iter := jsoniter.ConfigFastest.BorrowIterator([]byte(jsonStr)) defer jsoniter.ConfigFastest.ReturnIterator(iter) - readScopeSpans(iter) - if assert.Error(t, iter.Error) { - assert.Contains(t, iter.Error.Error(), "unknown field") - } + val := readScopeSpans(iter) + assert.NoError(t, iter.Error) + assert.Equal(t, &otlptrace.ScopeSpans{}, val) } func TestReadSpanUnknownField(t *testing.T) { jsonStr := `{"extra":""}` iter := jsoniter.ConfigFastest.BorrowIterator([]byte(jsonStr)) defer jsoniter.ConfigFastest.ReturnIterator(iter) - readSpan(iter) - if assert.Error(t, iter.Error) { - assert.Contains(t, iter.Error.Error(), "unknown field") - } + val := readSpan(iter) + assert.NoError(t, iter.Error) + assert.Equal(t, &otlptrace.Span{}, val) } func TestReadSpanUnknownStatusField(t *testing.T) { jsonStr := `{"status":{"extra":""}}` iter := jsoniter.ConfigFastest.BorrowIterator([]byte(jsonStr)) defer jsoniter.ConfigFastest.ReturnIterator(iter) - readSpan(iter) - if assert.Error(t, iter.Error) { - assert.Contains(t, iter.Error.Error(), "unknown field") - } + val := readSpan(iter) + assert.NoError(t, iter.Error) + assert.Equal(t, &otlptrace.Span{}, val) } + func TestReadSpanInvalidTraceIDField(t *testing.T) { jsonStr := `{"trace_id":"--"}` iter := jsoniter.ConfigFastest.BorrowIterator([]byte(jsonStr)) @@ -225,6 +220,7 @@ func TestReadSpanInvalidTraceIDField(t *testing.T) { assert.Contains(t, iter.Error.Error(), "parse trace_id") } } + func TestReadSpanInvalidSpanIDField(t *testing.T) { jsonStr := `{"span_id":"--"}` iter := jsoniter.ConfigFastest.BorrowIterator([]byte(jsonStr)) @@ -234,6 +230,7 @@ func TestReadSpanInvalidSpanIDField(t *testing.T) { assert.Contains(t, iter.Error.Error(), "parse span_id") } } + func TestReadSpanInvalidParentSpanIDField(t *testing.T) { jsonStr := `{"parent_span_id":"--"}` iter := jsoniter.ConfigFastest.BorrowIterator([]byte(jsonStr)) @@ -248,10 +245,9 @@ func TestReadSpanLinkUnknownField(t *testing.T) { jsonStr := `{"extra":""}` iter := jsoniter.ConfigFastest.BorrowIterator([]byte(jsonStr)) defer jsoniter.ConfigFastest.ReturnIterator(iter) - readSpanLink(iter) - if assert.Error(t, iter.Error) { - assert.Contains(t, iter.Error.Error(), "unknown field") - } + val := readSpanLink(iter) + assert.NoError(t, iter.Error) + assert.Equal(t, &otlptrace.Span_Link{}, val) } func TestReadSpanLinkInvalidTraceIDField(t *testing.T) { @@ -278,8 +274,7 @@ func TestReadSpanEventUnknownField(t *testing.T) { jsonStr := `{"extra":""}` iter := jsoniter.ConfigFastest.BorrowIterator([]byte(jsonStr)) defer jsoniter.ConfigFastest.ReturnIterator(iter) - readSpanEvent(iter) - if assert.Error(t, iter.Error) { - assert.Contains(t, iter.Error.Error(), "unknown field") - } + val := readSpanEvent(iter) + assert.NoError(t, iter.Error) + assert.Equal(t, &otlptrace.Span_Event{}, val) }