Skip to content

Commit f7dd053

Browse files
committed
Add MergeTo method for profiles
Signed-off-by: Israel Blancas <[email protected]>
1 parent d7cc444 commit f7dd053

File tree

2 files changed

+129
-0
lines changed

2 files changed

+129
-0
lines changed

pdata/pprofile/profiles_merge.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package pprofile // import "go.opentelemetry.io/collector/pdata/pprofile"
5+
6+
// MergeTo merges the current Profiles into dest, updating the destination
7+
// dictionary as needed and appending the resource profiles.
8+
func (ms Profiles) MergeTo(dest Profiles) error {
9+
dest.getState().AssertMutable()
10+
if ms.getOrig() == dest.getOrig() {
11+
return nil
12+
}
13+
14+
tmp := NewProfiles()
15+
ms.CopyTo(tmp)
16+
17+
tmpDstDict := NewProfilesDictionary()
18+
dest.Dictionary().CopyTo(tmpDstDict)
19+
20+
if err := tmp.switchDictionary(tmp.Dictionary(), tmpDstDict); err != nil {
21+
return err
22+
}
23+
24+
tmpDstDict.CopyTo(dest.Dictionary())
25+
tmp.ResourceProfiles().MoveAndAppendTo(dest.ResourceProfiles())
26+
27+
return nil
28+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package pprofile
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
11+
12+
"go.opentelemetry.io/collector/pdata/pcommon"
13+
)
14+
15+
func TestProfilesMergeTo(t *testing.T) {
16+
src := NewProfiles()
17+
dest := NewProfiles()
18+
19+
destLinks := dest.Dictionary().LinkTable()
20+
destLinks.AppendEmpty()
21+
existingTraceID := pcommon.TraceID([16]byte{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1})
22+
existingSpanID := pcommon.SpanID([8]byte{2, 2, 2, 2, 2, 2, 2, 2})
23+
destLink := destLinks.AppendEmpty()
24+
destLink.SetTraceID(existingTraceID)
25+
destLink.SetSpanID(existingSpanID)
26+
27+
srcLinks := src.Dictionary().LinkTable()
28+
srcLinks.AppendEmpty()
29+
newTraceID := pcommon.TraceID([16]byte{3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3})
30+
newSpanID := pcommon.SpanID([8]byte{4, 4, 4, 4, 4, 4, 4, 4})
31+
srcLink := srcLinks.AppendEmpty()
32+
srcLink.SetTraceID(newTraceID)
33+
srcLink.SetSpanID(newSpanID)
34+
35+
sample := src.ResourceProfiles().AppendEmpty().
36+
ScopeProfiles().AppendEmpty().
37+
Profiles().AppendEmpty().
38+
Samples().AppendEmpty()
39+
sample.SetLinkIndex(1)
40+
41+
require.NoError(t, src.MergeTo(dest))
42+
43+
require.Equal(t, 1, dest.ResourceProfiles().Len())
44+
destSample := dest.ResourceProfiles().At(0).
45+
ScopeProfiles().At(0).
46+
Profiles().At(0).
47+
Samples().At(0)
48+
assert.Equal(t, int32(2), destSample.LinkIndex())
49+
50+
links := dest.Dictionary().LinkTable()
51+
require.Equal(t, 3, links.Len())
52+
assert.Equal(t, existingTraceID, links.At(1).TraceID())
53+
assert.Equal(t, existingSpanID, links.At(1).SpanID())
54+
assert.Equal(t, newTraceID, links.At(2).TraceID())
55+
assert.Equal(t, newSpanID, links.At(2).SpanID())
56+
57+
require.Equal(t, 1, src.ResourceProfiles().Len())
58+
srcSample := src.ResourceProfiles().At(0).
59+
ScopeProfiles().At(0).
60+
Profiles().At(0).
61+
Samples().At(0)
62+
assert.Equal(t, int32(1), srcSample.LinkIndex())
63+
assert.Equal(t, 2, src.Dictionary().LinkTable().Len())
64+
}
65+
66+
func TestProfilesMergeToError(t *testing.T) {
67+
src := NewProfiles()
68+
dest := NewProfiles()
69+
70+
stackTable := src.Dictionary().StackTable()
71+
stackTable.AppendEmpty()
72+
stack := stackTable.AppendEmpty()
73+
stack.LocationIndices().Append(1)
74+
75+
locationTable := src.Dictionary().LocationTable()
76+
locationTable.AppendEmpty()
77+
locationTable.AppendEmpty().SetMappingIndex(1)
78+
79+
sample := src.ResourceProfiles().AppendEmpty().
80+
ScopeProfiles().AppendEmpty().
81+
Profiles().AppendEmpty().
82+
Samples().AppendEmpty()
83+
sample.SetStackIndex(1)
84+
85+
err := src.MergeTo(dest)
86+
require.Error(t, err)
87+
require.ErrorContains(t, err, "invalid mapping index 1")
88+
89+
assert.Equal(t, 0, dest.ResourceProfiles().Len())
90+
assert.Equal(t, 0, dest.Dictionary().StackTable().Len())
91+
assert.Equal(t, 0, dest.Dictionary().LocationTable().Len())
92+
93+
require.Equal(t, 1, src.ResourceProfiles().Len())
94+
srcSample := src.ResourceProfiles().At(0).
95+
ScopeProfiles().At(0).
96+
Profiles().At(0).
97+
Samples().At(0)
98+
assert.Equal(t, int32(1), srcSample.StackIndex())
99+
assert.Equal(t, 2, src.Dictionary().StackTable().Len())
100+
assert.Equal(t, 2, src.Dictionary().LocationTable().Len())
101+
}

0 commit comments

Comments
 (0)