Skip to content

Commit 2416e90

Browse files
authored
[receiver/otlpjsonfile] Add support for profiles signal (#35995)
#### Description Add support for profiles signal to `otlpjsonfilereceiver`. #### Link to tracking issue Fixes #35977 #### Testing - add `TestFileProfilesReceiver` - update `TestFileMixedSignals`
1 parent dca11d4 commit 2416e90

File tree

9 files changed

+196
-14
lines changed

9 files changed

+196
-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: otlpjsonfilereceiver
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Add support for profiles signal
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: [35977]
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: []

receiver/otlpjsonfilereceiver/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 | [alpha]: traces, metrics, logs |
6+
| Stability | [development]: profiles |
7+
| | [alpha]: traces, metrics, logs |
78
| Distributions | [contrib] |
89
| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Areceiver%2Fotlpjsonfile%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Areceiver%2Fotlpjsonfile) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Areceiver%2Fotlpjsonfile%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Areceiver%2Fotlpjsonfile) |
910
| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@djaglowski](https://www.github.com/djaglowski), [@atoulme](https://www.github.com/atoulme) |
1011

12+
[development]: https://github.com/open-telemetry/opentelemetry-collector#development
1113
[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha
1214
[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib
1315
<!-- end autogenerated section -->

receiver/otlpjsonfilereceiver/file.go

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

99
"go.opentelemetry.io/collector/component"
1010
"go.opentelemetry.io/collector/consumer"
11+
"go.opentelemetry.io/collector/consumer/consumerprofiles"
1112
"go.opentelemetry.io/collector/pdata/plog"
1213
"go.opentelemetry.io/collector/pdata/pmetric"
14+
"go.opentelemetry.io/collector/pdata/pprofile"
1315
"go.opentelemetry.io/collector/pdata/ptrace"
1416
"go.opentelemetry.io/collector/receiver"
1517
"go.opentelemetry.io/collector/receiver/receiverhelper"
18+
"go.opentelemetry.io/collector/receiver/receiverprofiles"
1619

1720
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/adapter"
1821
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer"
@@ -25,12 +28,13 @@ const (
2528

2629
// NewFactory creates a factory for file receiver
2730
func NewFactory() receiver.Factory {
28-
return receiver.NewFactory(
31+
return receiverprofiles.NewFactory(
2932
metadata.Type,
3033
createDefaultConfig,
31-
receiver.WithMetrics(createMetricsReceiver, metadata.MetricsStability),
32-
receiver.WithLogs(createLogsReceiver, metadata.LogsStability),
33-
receiver.WithTraces(createTracesReceiver, metadata.TracesStability))
34+
receiverprofiles.WithMetrics(createMetricsReceiver, metadata.MetricsStability),
35+
receiverprofiles.WithLogs(createLogsReceiver, metadata.LogsStability),
36+
receiverprofiles.WithTraces(createTracesReceiver, metadata.TracesStability),
37+
receiverprofiles.WithProfiles(createProfilesReceiver, metadata.ProfilesStability))
3438
}
3539

3640
type Config struct {
@@ -171,3 +175,24 @@ func createTracesReceiver(_ context.Context, settings receiver.Settings, configu
171175

172176
return &otlpjsonfilereceiver{input: input, id: settings.ID, storageID: cfg.StorageID}, nil
173177
}
178+
179+
func createProfilesReceiver(_ context.Context, settings receiver.Settings, configuration component.Config, profiles consumerprofiles.Profiles) (receiverprofiles.Profiles, error) {
180+
profilesUnmarshaler := &pprofile.JSONUnmarshaler{}
181+
cfg := configuration.(*Config)
182+
opts := make([]fileconsumer.Option, 0)
183+
if cfg.ReplayFile {
184+
opts = append(opts, fileconsumer.WithNoTracking())
185+
}
186+
input, err := cfg.Config.Build(settings.TelemetrySettings, func(ctx context.Context, token []byte, _ map[string]any) error {
187+
p, _ := profilesUnmarshaler.UnmarshalProfiles(token)
188+
if p.ResourceProfiles().Len() != 0 {
189+
_ = profiles.ConsumeProfiles(ctx, p)
190+
}
191+
return nil
192+
}, opts...)
193+
if err != nil {
194+
return nil, err
195+
}
196+
197+
return &otlpjsonfilereceiver{input: input, id: settings.ID, storageID: cfg.StorageID}, nil
198+
}

receiver/otlpjsonfilereceiver/file_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ import (
1818
"go.opentelemetry.io/collector/consumer/consumertest"
1919
"go.opentelemetry.io/collector/pdata/plog"
2020
"go.opentelemetry.io/collector/pdata/pmetric"
21+
"go.opentelemetry.io/collector/pdata/pprofile"
2122
"go.opentelemetry.io/collector/pdata/ptrace"
2223
"go.opentelemetry.io/collector/pdata/testdata"
24+
"go.opentelemetry.io/collector/receiver/receiverprofiles"
2325
"go.opentelemetry.io/collector/receiver/receivertest"
2426

2527
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer"
@@ -35,6 +37,33 @@ func TestDefaultConfig(t *testing.T) {
3537
require.NoError(t, componenttest.CheckConfigStruct(cfg))
3638
}
3739

40+
func TestFileProfilesReceiver(t *testing.T) {
41+
tempFolder := t.TempDir()
42+
factory := NewFactory()
43+
cfg := createDefaultConfig().(*Config)
44+
cfg.Config.Include = []string{filepath.Join(tempFolder, "*")}
45+
cfg.Config.StartAt = "beginning"
46+
sink := new(consumertest.ProfilesSink)
47+
receiver, err := factory.(receiverprofiles.Factory).CreateProfiles(context.Background(), receivertest.NewNopSettings(), cfg, sink)
48+
assert.NoError(t, err)
49+
err = receiver.Start(context.Background(), nil)
50+
require.NoError(t, err)
51+
52+
pd := testdata.GenerateProfiles(5)
53+
marshaler := &pprofile.JSONMarshaler{}
54+
b, err := marshaler.MarshalProfiles(pd)
55+
assert.NoError(t, err)
56+
b = append(b, '\n')
57+
err = os.WriteFile(filepath.Join(tempFolder, "profiles.json"), b, 0600)
58+
assert.NoError(t, err)
59+
time.Sleep(1 * time.Second)
60+
61+
require.Len(t, sink.AllProfiles(), 1)
62+
assert.EqualValues(t, pd, sink.AllProfiles()[0])
63+
err = receiver.Shutdown(context.Background())
64+
assert.NoError(t, err)
65+
}
66+
3867
func TestFileTracesReceiver(t *testing.T) {
3968
tempFolder := t.TempDir()
4069
factory := NewFactory()
@@ -213,6 +242,11 @@ func TestFileMixedSignals(t *testing.T) {
213242
assert.NoError(t, err)
214243
err = lr.Start(context.Background(), nil)
215244
assert.NoError(t, err)
245+
ps := new(consumertest.ProfilesSink)
246+
pr, err := factory.(receiverprofiles.Factory).CreateProfiles(context.Background(), cs, cfg, ps)
247+
assert.NoError(t, err)
248+
err = pr.Start(context.Background(), nil)
249+
assert.NoError(t, err)
216250

217251
md := testdata.GenerateMetrics(5)
218252
marshaler := &pmetric.JSONMarshaler{}
@@ -226,11 +260,17 @@ func TestFileMixedSignals(t *testing.T) {
226260
lmarshaler := &plog.JSONMarshaler{}
227261
b3, err := lmarshaler.MarshalLogs(ld)
228262
assert.NoError(t, err)
263+
pd := testdata.GenerateProfiles(5)
264+
pmarshaler := &pprofile.JSONMarshaler{}
265+
b4, err := pmarshaler.MarshalProfiles(pd)
266+
assert.NoError(t, err)
229267
b = append(b, '\n')
230268
b = append(b, b2...)
231269
b = append(b, '\n')
232270
b = append(b, b3...)
233271
b = append(b, '\n')
272+
b = append(b, b4...)
273+
b = append(b, '\n')
234274
err = os.WriteFile(filepath.Join(tempFolder, "metrics.json"), b, 0600)
235275
assert.NoError(t, err)
236276
time.Sleep(1 * time.Second)
@@ -241,10 +281,14 @@ func TestFileMixedSignals(t *testing.T) {
241281
assert.EqualValues(t, td, ts.AllTraces()[0])
242282
require.Len(t, ls.AllLogs(), 1)
243283
assert.EqualValues(t, ld, ls.AllLogs()[0])
284+
require.Len(t, ps.AllProfiles(), 1)
285+
assert.EqualValues(t, pd, ps.AllProfiles()[0])
244286
err = mr.Shutdown(context.Background())
245287
assert.NoError(t, err)
246288
err = tr.Shutdown(context.Background())
247289
assert.NoError(t, err)
248290
err = lr.Shutdown(context.Background())
249291
assert.NoError(t, err)
292+
err = pr.Shutdown(context.Background())
293+
assert.NoError(t, err)
250294
}

receiver/otlpjsonfilereceiver/go.mod

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,17 @@ require (
1212
go.opentelemetry.io/collector/pdata/testdata v0.112.0
1313
go.opentelemetry.io/collector/receiver v0.112.0
1414
go.opentelemetry.io/collector/semconv v0.112.0 // indirect
15-
go.opentelemetry.io/otel/metric v1.31.0 // indirect
16-
go.opentelemetry.io/otel/trace v1.31.0 // indirect
15+
go.opentelemetry.io/otel/metric v1.31.0
16+
go.opentelemetry.io/otel/trace v1.31.0
1717
go.uber.org/goleak v1.3.0
1818
)
1919

20-
require go.opentelemetry.io/collector/consumer/consumertest v0.112.0
20+
require (
21+
go.opentelemetry.io/collector/consumer/consumerprofiles v0.112.0
22+
go.opentelemetry.io/collector/consumer/consumertest v0.112.0
23+
go.opentelemetry.io/collector/pdata/pprofile v0.112.0
24+
go.opentelemetry.io/collector/receiver/receiverprofiles v0.112.0
25+
)
2126

2227
require (
2328
github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect
@@ -50,13 +55,10 @@ require (
5055
github.com/valyala/fastjson v1.6.4 // indirect
5156
go.opentelemetry.io/collector/config/configtelemetry v0.112.0 // indirect
5257
go.opentelemetry.io/collector/consumer/consumererror v0.112.0 // indirect
53-
go.opentelemetry.io/collector/consumer/consumerprofiles v0.112.0 // indirect
5458
go.opentelemetry.io/collector/extension v0.112.0 // indirect
5559
go.opentelemetry.io/collector/extension/experimental/storage v0.112.0 // indirect
5660
go.opentelemetry.io/collector/featuregate v1.18.0 // indirect
57-
go.opentelemetry.io/collector/pdata/pprofile v0.112.0 // indirect
5861
go.opentelemetry.io/collector/pipeline v0.112.0 // indirect
59-
go.opentelemetry.io/collector/receiver/receiverprofiles v0.112.0 // indirect
6062
go.opentelemetry.io/otel v1.31.0 // indirect
6163
go.opentelemetry.io/otel/sdk v1.31.0 // indirect
6264
go.opentelemetry.io/otel/sdk/metric v1.31.0 // indirect

receiver/otlpjsonfilereceiver/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.

receiver/otlpjsonfilereceiver/internal/metadata/generated_telemetry.go

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

receiver/otlpjsonfilereceiver/internal/metadata/generated_telemetry_test.go

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

receiver/otlpjsonfilereceiver/metadata.yaml

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

0 commit comments

Comments
 (0)