Skip to content

Commit 2e35bc9

Browse files
committed
[processor/resource] Add support for profiles signal type
1 parent 54896e7 commit 2e35bc9

File tree

9 files changed

+109
-14
lines changed

9 files changed

+109
-14
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Use this changelog template to create an entry for release notes.
2+
3+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
4+
change_type: enhancement
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver)
7+
component: resourceprocessor
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: "Introduce support for Profiles signal type."
11+
12+
# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
13+
issues: [37513]
14+
15+
# (Optional) One or more lines of additional information to render under the primary note.
16+
# These lines will be padded with 2 spaces and then inserted directly into the document.
17+
# Use pipe (|) for multiline entries.
18+
subtext:
19+
20+
# If your change doesn't affect end users or the exported elements of any package,
21+
# you should instead start your pull request title with [chore] or use the "Skip Changelog" label.
22+
# Optional: The change log or logs in which this entry should be included.
23+
# e.g. '[user]' or '[user, api]'
24+
# Include 'user' if the change is relevant to end users.
25+
# Include 'api' if there is a change to a library API.
26+
# Default: '[user]'
27+
change_logs: []

processor/resourceprocessor/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
<!-- status autogenerated section -->
44
| Status | |
55
| ------------- |-----------|
6-
| Stability | [beta]: traces, metrics, logs |
6+
| Stability | [development]: profiles |
7+
| | [beta]: traces, metrics, logs |
78
| Distributions | [core], [contrib], [k8s] |
89
| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fresource%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fresource) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fresource%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fresource) |
910
| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dmitryax](https://www.github.com/dmitryax) |
1011

12+
[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development
1113
[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta
1214
[core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol
1315
[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib

processor/resourceprocessor/factory.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ import (
88

99
"go.opentelemetry.io/collector/component"
1010
"go.opentelemetry.io/collector/consumer"
11+
"go.opentelemetry.io/collector/consumer/xconsumer"
1112
"go.opentelemetry.io/collector/processor"
1213
"go.opentelemetry.io/collector/processor/processorhelper"
14+
"go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper"
15+
"go.opentelemetry.io/collector/processor/xprocessor"
1316

1417
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/attraction"
1518
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor/internal/metadata"
@@ -19,12 +22,13 @@ var processorCapabilities = consumer.Capabilities{MutatesData: true}
1922

2023
// NewFactory returns a new factory for the Resource processor.
2124
func NewFactory() processor.Factory {
22-
return processor.NewFactory(
25+
return xprocessor.NewFactory(
2326
metadata.Type,
2427
createDefaultConfig,
25-
processor.WithTraces(createTracesProcessor, metadata.TracesStability),
26-
processor.WithMetrics(createMetricsProcessor, metadata.MetricsStability),
27-
processor.WithLogs(createLogsProcessor, metadata.LogsStability))
28+
xprocessor.WithTraces(createTracesProcessor, metadata.TracesStability),
29+
xprocessor.WithMetrics(createMetricsProcessor, metadata.MetricsStability),
30+
xprocessor.WithLogs(createLogsProcessor, metadata.LogsStability),
31+
xprocessor.WithProfiles(createProfilesProcessor, metadata.ProfilesStability))
2832
}
2933

3034
// Note: This isn't a valid configuration because the processor would do no work.
@@ -91,3 +95,23 @@ func createLogsProcessor(
9195
proc.processLogs,
9296
processorhelper.WithCapabilities(processorCapabilities))
9397
}
98+
99+
func createProfilesProcessor(
100+
ctx context.Context,
101+
set processor.Settings,
102+
cfg component.Config,
103+
nextConsumer xconsumer.Profiles,
104+
) (xprocessor.Profiles, error) {
105+
attrProc, err := attraction.NewAttrProc(&attraction.Settings{Actions: cfg.(*Config).AttributesActions})
106+
if err != nil {
107+
return nil, err
108+
}
109+
proc := &resourceProcessor{logger: set.Logger, attrProc: attrProc}
110+
return xprocessorhelper.NewProfiles(
111+
ctx,
112+
set,
113+
cfg,
114+
nextConsumer,
115+
proc.processProfiles,
116+
xprocessorhelper.WithCapabilities(processorCapabilities))
117+
}

processor/resourceprocessor/go.mod

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@ require (
1111
go.opentelemetry.io/collector/confmap v1.24.1-0.20250130000211-c119b2a55eb4
1212
go.opentelemetry.io/collector/consumer v1.24.1-0.20250130000211-c119b2a55eb4
1313
go.opentelemetry.io/collector/consumer/consumertest v0.118.1-0.20250130000211-c119b2a55eb4
14+
go.opentelemetry.io/collector/consumer/xconsumer v0.118.1-0.20250130000211-c119b2a55eb4
1415
go.opentelemetry.io/collector/pdata v1.24.1-0.20250130000211-c119b2a55eb4
16+
go.opentelemetry.io/collector/pdata/pprofile v0.118.1-0.20250130000211-c119b2a55eb4
1517
go.opentelemetry.io/collector/processor v0.118.1-0.20250130000211-c119b2a55eb4
18+
go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.118.1-0.20250130000211-c119b2a55eb4
1619
go.opentelemetry.io/collector/processor/processortest v0.118.1-0.20250130000211-c119b2a55eb4
20+
go.opentelemetry.io/collector/processor/xprocessor v0.118.1-0.20250130000211-c119b2a55eb4
1721
go.uber.org/goleak v1.3.0
1822
go.uber.org/zap v1.27.0
1923
)
@@ -40,18 +44,15 @@ require (
4044
go.opentelemetry.io/collector/client v1.24.1-0.20250130000211-c119b2a55eb4 // indirect
4145
go.opentelemetry.io/collector/component/componentstatus v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
4246
go.opentelemetry.io/collector/config/configtelemetry v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
43-
go.opentelemetry.io/collector/consumer/xconsumer v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
44-
go.opentelemetry.io/collector/pdata/pprofile v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
4547
go.opentelemetry.io/collector/pdata/testdata v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
4648
go.opentelemetry.io/collector/pipeline v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
47-
go.opentelemetry.io/collector/processor/xprocessor v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
4849
go.opentelemetry.io/otel v1.34.0 // indirect
4950
go.opentelemetry.io/otel/metric v1.34.0 // indirect
5051
go.opentelemetry.io/otel/sdk v1.34.0 // indirect
5152
go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
5253
go.opentelemetry.io/otel/trace v1.34.0 // indirect
5354
go.uber.org/multierr v1.11.0 // indirect
54-
golang.org/x/net v0.33.0 // indirect
55+
golang.org/x/net v0.34.0 // indirect
5556
golang.org/x/sys v0.29.0 // indirect
5657
golang.org/x/text v0.21.0 // indirect
5758
google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a // indirect

processor/resourceprocessor/go.sum

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

processor/resourceprocessor/internal/metadata/generated_status.go

Lines changed: 4 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

processor/resourceprocessor/metadata.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ status:
44
class: processor
55
stability:
66
beta: [traces, metrics, logs]
7+
development: [profiles]
78
distributions: [core, contrib, k8s]
89
codeowners:
910
active: [dmitryax]

processor/resourceprocessor/resource_processor.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"go.opentelemetry.io/collector/pdata/plog"
1010
"go.opentelemetry.io/collector/pdata/pmetric"
11+
"go.opentelemetry.io/collector/pdata/pprofile"
1112
"go.opentelemetry.io/collector/pdata/ptrace"
1213
"go.uber.org/zap"
1314

@@ -42,3 +43,11 @@ func (rp *resourceProcessor) processLogs(ctx context.Context, ld plog.Logs) (plo
4243
}
4344
return ld, nil
4445
}
46+
47+
func (rp *resourceProcessor) processProfiles(ctx context.Context, pd pprofile.Profiles) (pprofile.Profiles, error) {
48+
rps := pd.ResourceProfiles()
49+
for i := 0; i < rps.Len(); i++ {
50+
rp.attrProc.Process(ctx, rp.logger, rps.At(i).Resource().Attributes())
51+
}
52+
return pd, nil
53+
}

processor/resourceprocessor/resource_processor_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import (
1212
"go.opentelemetry.io/collector/consumer/consumertest"
1313
"go.opentelemetry.io/collector/pdata/plog"
1414
"go.opentelemetry.io/collector/pdata/pmetric"
15+
"go.opentelemetry.io/collector/pdata/pprofile"
1516
"go.opentelemetry.io/collector/pdata/ptrace"
1617
"go.opentelemetry.io/collector/processor/processortest"
1718

1819
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/attraction"
1920
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/testdata"
2021
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/plogtest"
2122
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest"
23+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pprofiletest"
2224
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/ptracetest"
2325
)
2426

@@ -129,6 +131,20 @@ func TestResourceProcessorAttributesUpsert(t *testing.T) {
129131
logs := tln.AllLogs()
130132
require.Len(t, logs, 1)
131133
assert.NoError(t, plogtest.CompareLogs(wantLogData, logs[0]))
134+
135+
// Test profiles consumer
136+
tpn := new(consumertest.ProfilesSink)
137+
rpp, err := createProfilesProcessor(context.Background(), processortest.NewNopSettings(), tt.config, tpn)
138+
require.NoError(t, err)
139+
assert.True(t, rpp.Capabilities().MutatesData)
140+
141+
sourceProfileData := generateProfileData(tt.sourceAttributes)
142+
wantProfileData := generateProfileData(tt.wantAttributes)
143+
err = rpp.ConsumeProfiles(context.Background(), sourceProfileData)
144+
require.NoError(t, err)
145+
profiles := tpn.AllProfiles()
146+
require.Len(t, profiles, 1)
147+
assert.NoError(t, pprofiletest.CompareProfiles(wantProfileData, profiles[0]))
132148
})
133149
}
134150
}
@@ -168,3 +184,15 @@ func generateLogData(attributes map[string]string) plog.Logs {
168184
}
169185
return ld
170186
}
187+
188+
func generateProfileData(attributes map[string]string) pprofile.Profiles {
189+
pd := testdata.GenerateProfilesOneEmptyResourceProfiles()
190+
if attributes == nil {
191+
return pd
192+
}
193+
resource := pd.ResourceProfiles().At(0).Resource()
194+
for k, v := range attributes {
195+
resource.Attributes().PutStr(k, v)
196+
}
197+
return pd
198+
}

0 commit comments

Comments
 (0)