diff --git a/model/pdata/logs.go b/model/pdata/logs.go index 212097f18ed..75982879c9d 100644 --- a/model/pdata/logs.go +++ b/model/pdata/logs.go @@ -65,6 +65,13 @@ func (ld Logs) InternalRep() internal.LogsWrapper { return internal.LogsFromOtlp(ld.orig) } +// MoveTo moves all properties from the current struct to dest +// resetting the current instance to its zero value. +func (ld Logs) MoveTo(dest Logs) { + *dest.orig = *ld.orig + *ld.orig = otlplogs.LogsData{} +} + // Clone returns a copy of Logs. func (ld Logs) Clone() Logs { cloneLd := NewLogs() diff --git a/model/pdata/logs_test.go b/model/pdata/logs_test.go index 9cbb9bfd93e..929e6d32d11 100644 --- a/model/pdata/logs_test.go +++ b/model/pdata/logs_test.go @@ -115,6 +115,15 @@ func TestResourceLogsWireCompatibility(t *testing.T) { assert.EqualValues(t, logs.orig, &gogoprotoRS2) } +func TestLogsMoveTo(t *testing.T) { + logs := NewLogs() + fillTestResourceLogsSlice(logs.ResourceLogs()) + dest := NewLogs() + logs.MoveTo(dest) + assert.EqualValues(t, NewLogs(), logs) + assert.EqualValues(t, generateTestResourceLogsSlice(), dest.ResourceLogs()) +} + func TestLogsClone(t *testing.T) { logs := NewLogs() fillTestResourceLogsSlice(logs.ResourceLogs()) diff --git a/model/pdata/metrics.go b/model/pdata/metrics.go index 9d5c6188260..39e253d2bda 100644 --- a/model/pdata/metrics.go +++ b/model/pdata/metrics.go @@ -70,6 +70,13 @@ func (md Metrics) Clone() Metrics { return cloneMd } +// MoveTo moves all properties from the current struct to dest +// resetting the current instance to its zero value. +func (md Metrics) MoveTo(dest Metrics) { + *dest.orig = *md.orig + *md.orig = otlpmetrics.MetricsData{} +} + // ResourceMetrics returns the ResourceMetricsSlice associated with this Metrics. func (md Metrics) ResourceMetrics() ResourceMetricsSlice { return newResourceMetricsSlice(&md.orig.ResourceMetrics) diff --git a/model/pdata/metrics_test.go b/model/pdata/metrics_test.go index 3dde15ee7ae..00954a3363b 100644 --- a/model/pdata/metrics_test.go +++ b/model/pdata/metrics_test.go @@ -192,6 +192,15 @@ func TestDataPointCountWithNilDataPoints(t *testing.T) { assert.EqualValues(t, 0, metrics.DataPointCount()) } +func TestMetricsMoveTo(t *testing.T) { + metrics := NewMetrics() + fillTestResourceMetricsSlice(metrics.ResourceMetrics()) + dest := NewMetrics() + metrics.MoveTo(dest) + assert.EqualValues(t, NewMetrics(), metrics) + assert.EqualValues(t, generateTestResourceMetricsSlice(), dest.ResourceMetrics()) +} + func TestOtlpToInternalReadOnly(t *testing.T) { md := Metrics{orig: &otlpmetrics.MetricsData{ ResourceMetrics: []*otlpmetrics.ResourceMetrics{ diff --git a/model/pdata/traces.go b/model/pdata/traces.go index 2cc3fc7faac..30196cd3a1c 100644 --- a/model/pdata/traces.go +++ b/model/pdata/traces.go @@ -63,6 +63,13 @@ func (td Traces) InternalRep() internal.TracesWrapper { return internal.TracesFromOtlp(td.orig) } +// MoveTo moves all properties from the current struct to dest +// resetting the current instance to its zero value. +func (td Traces) MoveTo(dest Traces) { + *dest.orig = *td.orig + *td.orig = otlptrace.TracesData{} +} + // Clone returns a copy of Traces. func (td Traces) Clone() Traces { cloneTd := NewTraces() diff --git a/model/pdata/traces_test.go b/model/pdata/traces_test.go index a6c1832c0f0..b6be7b258d2 100644 --- a/model/pdata/traces_test.go +++ b/model/pdata/traces_test.go @@ -116,6 +116,15 @@ func TestResourceSpansWireCompatibility(t *testing.T) { assert.EqualValues(t, traces.orig, &gogoprotoRS2) } +func TestTracesMoveTo(t *testing.T) { + traces := NewTraces() + fillTestResourceSpansSlice(traces.ResourceSpans()) + dest := NewTraces() + traces.MoveTo(dest) + assert.EqualValues(t, NewTraces(), traces) + assert.EqualValues(t, generateTestResourceSpansSlice(), dest.ResourceSpans()) +} + func TestTracesClone(t *testing.T) { traces := NewTraces() fillTestResourceSpansSlice(traces.ResourceSpans())