Skip to content

Commit 0106a27

Browse files
atoulmecrobert-1
authored andcommitted
[receiver/stef] Add enough code to make the stefreceiver function (open-telemetry#39044)
<!--Ex. Fixing a bug - Describe the bug and how this fixes the issue. Ex. Adding a feature - Explain what this achieves.--> #### Description Adds just enough code to make the stefreceiver work. <!-- Issue number (e.g. open-telemetry#1234) or full URL to issue, if applicable. --> #### Link to tracking issue Fixes open-telemetry#38979 <!--Describe what testing was performed and which tests were added.--> #### Testing Roundtrip with the exporter <!--Describe the documentation added.--> #### Documentation README <!--Please delete paragraphs that you did not use before submitting.--> --------- Co-authored-by: Curtis Robert <[email protected]>
1 parent 0350832 commit 0106a27

File tree

11 files changed

+632
-25
lines changed

11 files changed

+632
-25
lines changed

.chloggen/stefreceiver.yaml

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: new_component
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver)
7+
component: stefreceiver
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Make the receiver initially code complete
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: [38979]
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/stefreceiver/README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,24 @@
1111
[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development
1212
<!-- end autogenerated section -->
1313

14+
The STEF receiver runs a gRPC server accepting data using the Sequential Tabular Encoding Format (STEF).
15+
16+
## Configuration
17+
18+
- `endpoint` (default = localhost:4320 for grpc protocol):
19+
host:port on which the receiver is going to receive data. Refer to
20+
[naming documentation](https://github.com/grpc/grpc/blob/master/doc/naming.md)
21+
for valid syntax.
22+
- `ack_interval` (default: 10ms). The periodical interval of time when sending acknowledgements back to the client.
23+
24+
Example:
25+
26+
```yaml
27+
stef:
28+
endpoint: 0.0.0.0:4320
29+
```
30+
31+
Several common configuration structures provide additional capabilities automatically:
32+
33+
- [gRPC settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configgrpc/README.md)
34+
- [TLS and mTLS settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configtls/README.md)

receiver/stefreceiver/config.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,17 @@
33

44
package stefreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/stefreceiver"
55

6+
import (
7+
"time"
8+
9+
"go.opentelemetry.io/collector/config/configgrpc"
10+
)
11+
612
// Config defines configuration for STEF receiver.
7-
type Config struct{}
13+
type Config struct {
14+
configgrpc.ServerConfig `mapstructure:",squash"`
15+
AckInterval time.Duration `mapstructure:"ack_interval"`
16+
}
817

918
func (c *Config) Validate() error {
1019
return nil

receiver/stefreceiver/config_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package stefreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/stefreceiver"
5+
import (
6+
"fmt"
7+
"path/filepath"
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/require"
12+
"go.opentelemetry.io/collector/config/configtls"
13+
"go.opentelemetry.io/collector/confmap/confmaptest"
14+
)
15+
16+
func TestConfig(t *testing.T) {
17+
tests := []struct {
18+
name string
19+
expectedConfig *Config
20+
}{
21+
{
22+
name: "endpoint",
23+
expectedConfig: func() *Config {
24+
cfg := createDefaultConfig().(*Config)
25+
cfg.ServerConfig.NetAddr.Endpoint = "0.0.0.0:3456"
26+
return cfg
27+
}(),
28+
},
29+
{
30+
name: "tls",
31+
expectedConfig: func() *Config {
32+
cfg := createDefaultConfig().(*Config)
33+
tls := configtls.NewDefaultServerConfig()
34+
cfg.ServerConfig.TLSSetting = &tls
35+
cfg.ServerConfig.TLSSetting.KeyFile = "server.key"
36+
return cfg
37+
}(),
38+
},
39+
}
40+
41+
for _, test := range tests {
42+
t.Run(test.name, func(t *testing.T) {
43+
cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml"))
44+
require.NoError(t, err)
45+
conf, err := cm.Sub(fmt.Sprintf("stef/%s", test.name))
46+
require.NoError(t, err)
47+
cfg := createDefaultConfig()
48+
require.NoError(t, conf.Unmarshal(cfg))
49+
assert.Equal(t, test.expectedConfig, cfg)
50+
})
51+
}
52+
}

receiver/stefreceiver/e2e_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package stefreceiver
5+
6+
import (
7+
"context"
8+
"testing"
9+
"time"
10+
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
13+
"go.opentelemetry.io/collector/component/componenttest"
14+
"go.opentelemetry.io/collector/consumer/consumertest"
15+
"go.opentelemetry.io/collector/exporter/exportertest"
16+
"go.opentelemetry.io/collector/pdata/pcommon"
17+
"go.opentelemetry.io/collector/pdata/pmetric"
18+
"go.opentelemetry.io/collector/receiver/receivertest"
19+
"go.uber.org/zap"
20+
21+
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/stefexporter"
22+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/stefreceiver/internal/metadata"
23+
)
24+
25+
func TestRoundtrip(t *testing.T) {
26+
sink := &consumertest.MetricsSink{}
27+
settings := receivertest.NewNopSettings(metadata.Type)
28+
settings.Logger, _ = zap.NewDevelopment()
29+
m, err := NewFactory().CreateMetrics(context.Background(), settings, createDefaultConfig(), sink)
30+
t.Cleanup(func() {
31+
err = m.Shutdown(context.Background())
32+
require.NoError(t, err)
33+
})
34+
require.NoError(t, m.Start(context.Background(), componenttest.NewNopHost()))
35+
require.NoError(t, err)
36+
cfg := stefexporter.NewFactory().CreateDefaultConfig().(*stefexporter.Config)
37+
cfg.Endpoint = "localhost:4320"
38+
cfg.TLSSetting.Insecure = true
39+
exporterSettings := exportertest.NewNopSettings(metadata.Type)
40+
exporterSettings.Logger, _ = zap.NewDevelopment()
41+
exporter, err := stefexporter.NewFactory().CreateMetrics(context.Background(), exporterSettings, cfg)
42+
require.NoError(t, err)
43+
t.Cleanup(func() {
44+
err = exporter.Shutdown(context.Background())
45+
require.NoError(t, err)
46+
})
47+
48+
require.NoError(t, exporter.Start(context.Background(), componenttest.NewNopHost()))
49+
data := pmetric.NewMetrics()
50+
metricPoint := data.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty().Metrics().AppendEmpty()
51+
metricPoint.SetName("foo")
52+
gauge := metricPoint.SetEmptyGauge()
53+
dp := gauge.DataPoints().AppendEmpty()
54+
dp.SetIntValue(1)
55+
dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now()))
56+
err = exporter.ConsumeMetrics(context.Background(), data)
57+
require.NoError(t, err)
58+
assert.EventuallyWithT(t, func(tt *assert.CollectT) {
59+
assert.Len(tt, sink.AllMetrics(), 1)
60+
}, 1*time.Minute, 10*time.Millisecond)
61+
}

receiver/stefreceiver/factory.go

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ package stefreceiver // import "github.com/open-telemetry/opentelemetry-collecto
55

66
import (
77
"context"
8+
"time"
89

910
"go.opentelemetry.io/collector/component"
11+
"go.opentelemetry.io/collector/config/configgrpc"
12+
"go.opentelemetry.io/collector/config/confignet"
1013
"go.opentelemetry.io/collector/consumer"
1114
"go.opentelemetry.io/collector/receiver"
1215

@@ -23,24 +26,28 @@ func NewFactory() receiver.Factory {
2326
}
2427

2528
func createDefaultConfig() component.Config {
26-
return &Config{}
29+
grpcCfg := configgrpc.NewDefaultServerConfig()
30+
grpcCfg.NetAddr = confignet.NewDefaultAddrConfig()
31+
grpcCfg.NetAddr.Endpoint = "localhost:4320"
32+
grpcCfg.NetAddr.Transport = confignet.TransportTypeTCP
33+
grpcCfg.ReadBufferSize = 512 * 1024
34+
35+
return &Config{
36+
ServerConfig: *grpcCfg,
37+
AckInterval: 10 * time.Millisecond,
38+
}
2739
}
2840

2941
func createMetricsReceiver(
3042
_ context.Context,
31-
_ receiver.Settings,
32-
_ component.Config,
33-
_ consumer.Metrics,
43+
set receiver.Settings,
44+
cfg component.Config,
45+
nextConsumer consumer.Metrics,
3446
) (receiver.Metrics, error) {
35-
return &stefReceiver{}, nil
36-
}
37-
38-
type stefReceiver struct{}
39-
40-
func (s stefReceiver) Start(_ context.Context, _ component.Host) error {
41-
return nil
42-
}
43-
44-
func (s stefReceiver) Shutdown(_ context.Context) error {
45-
return nil
47+
oCfg := cfg.(*Config)
48+
return &stefReceiver{
49+
cfg: oCfg,
50+
nextMetricsConsumer: nextConsumer,
51+
settings: set,
52+
}, nil
4653
}

receiver/stefreceiver/go.mod

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,89 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/receiver/stefre
33
go 1.23.0
44

55
require (
6+
github.com/open-telemetry/opentelemetry-collector-contrib/exporter/stefexporter v0.123.0
7+
github.com/splunk/stef/go/grpc v0.0.5-0.20250328192643-20ae67012e0c
8+
github.com/splunk/stef/go/otel v0.0.5-0.20250328192643-20ae67012e0c
9+
github.com/splunk/stef/go/pdata v0.0.5-0.20250328192643-20ae67012e0c
610
github.com/stretchr/testify v1.10.0
711
go.opentelemetry.io/collector/component v1.29.1-0.20250402200755-cb5c3f4fb9dc
12+
go.opentelemetry.io/collector/component/componentstatus v0.123.1-0.20250402200755-cb5c3f4fb9dc
813
go.opentelemetry.io/collector/component/componenttest v0.123.1-0.20250402200755-cb5c3f4fb9dc
14+
go.opentelemetry.io/collector/config/configgrpc v0.123.1-0.20250402200755-cb5c3f4fb9dc
15+
go.opentelemetry.io/collector/config/confignet v1.29.1-0.20250402200755-cb5c3f4fb9dc
16+
go.opentelemetry.io/collector/config/configtls v1.29.1-0.20250402200755-cb5c3f4fb9dc
917
go.opentelemetry.io/collector/confmap v1.29.1-0.20250402200755-cb5c3f4fb9dc
1018
go.opentelemetry.io/collector/consumer v1.29.1-0.20250402200755-cb5c3f4fb9dc
19+
go.opentelemetry.io/collector/consumer/consumererror v0.123.1-0.20250402200755-cb5c3f4fb9dc
1120
go.opentelemetry.io/collector/consumer/consumertest v0.123.1-0.20250402200755-cb5c3f4fb9dc
21+
go.opentelemetry.io/collector/exporter/exportertest v0.123.1-0.20250402200755-cb5c3f4fb9dc
22+
go.opentelemetry.io/collector/pdata v1.29.1-0.20250402200755-cb5c3f4fb9dc
1223
go.opentelemetry.io/collector/receiver v1.29.1-0.20250402200755-cb5c3f4fb9dc
1324
go.opentelemetry.io/collector/receiver/receivertest v0.123.1-0.20250402200755-cb5c3f4fb9dc
1425
go.uber.org/goleak v1.3.0
26+
go.uber.org/zap v1.27.0
27+
golang.org/x/sync v0.12.0
28+
google.golang.org/grpc v1.71.1
1529
)
1630

1731
require (
32+
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
1833
github.com/davecgh/go-spew v1.1.1 // indirect
34+
github.com/fsnotify/fsnotify v1.8.0 // indirect
1935
github.com/go-logr/logr v1.4.2 // indirect
2036
github.com/go-logr/stdr v1.2.2 // indirect
2137
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
2238
github.com/gogo/protobuf v1.3.2 // indirect
39+
github.com/golang/snappy v0.0.4 // indirect
2340
github.com/google/uuid v1.6.0 // indirect
2441
github.com/hashicorp/go-version v1.7.0 // indirect
2542
github.com/json-iterator/go v1.1.12 // indirect
43+
github.com/klauspost/compress v1.17.9 // indirect
2644
github.com/knadh/koanf/maps v0.1.2 // indirect
2745
github.com/knadh/koanf/providers/confmap v0.1.0 // indirect
2846
github.com/knadh/koanf/v2 v2.1.2 // indirect
2947
github.com/mitchellh/copystructure v1.2.0 // indirect
3048
github.com/mitchellh/reflectwalk v1.0.2 // indirect
3149
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3250
github.com/modern-go/reflect2 v1.0.2 // indirect
51+
github.com/mostynb/go-grpc-compression v1.2.3 // indirect
3352
github.com/pmezard/go-difflib v1.0.0 // indirect
53+
github.com/splunk/stef/go/pkg v0.0.5-0.20250328192643-20ae67012e0c // indirect
3454
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
35-
go.opentelemetry.io/collector/consumer/consumererror v0.123.1-0.20250402200755-cb5c3f4fb9dc // indirect
55+
go.opentelemetry.io/collector/client v1.29.1-0.20250402200755-cb5c3f4fb9dc // indirect
56+
go.opentelemetry.io/collector/config/configauth v0.123.1-0.20250402200755-cb5c3f4fb9dc // indirect
57+
go.opentelemetry.io/collector/config/configcompression v1.29.1-0.20250402200755-cb5c3f4fb9dc // indirect
58+
go.opentelemetry.io/collector/config/configopaque v1.29.1-0.20250402200755-cb5c3f4fb9dc // indirect
59+
go.opentelemetry.io/collector/config/configretry v1.29.1-0.20250402200755-cb5c3f4fb9dc // indirect
3660
go.opentelemetry.io/collector/consumer/xconsumer v0.123.1-0.20250402200755-cb5c3f4fb9dc // indirect
61+
go.opentelemetry.io/collector/exporter v0.123.1-0.20250402200755-cb5c3f4fb9dc // indirect
62+
go.opentelemetry.io/collector/exporter/xexporter v0.123.1-0.20250402200755-cb5c3f4fb9dc // indirect
63+
go.opentelemetry.io/collector/extension v1.29.1-0.20250402200755-cb5c3f4fb9dc // indirect
64+
go.opentelemetry.io/collector/extension/extensionauth v1.29.1-0.20250402200755-cb5c3f4fb9dc // indirect
65+
go.opentelemetry.io/collector/extension/xextension v0.123.1-0.20250402200755-cb5c3f4fb9dc // indirect
3766
go.opentelemetry.io/collector/featuregate v1.29.1-0.20250402200755-cb5c3f4fb9dc // indirect
3867
go.opentelemetry.io/collector/internal/telemetry v0.123.1-0.20250402200755-cb5c3f4fb9dc // indirect
39-
go.opentelemetry.io/collector/pdata v1.29.1-0.20250402200755-cb5c3f4fb9dc // indirect
4068
go.opentelemetry.io/collector/pdata/pprofile v0.123.1-0.20250402200755-cb5c3f4fb9dc // indirect
4169
go.opentelemetry.io/collector/pipeline v0.123.1-0.20250402200755-cb5c3f4fb9dc // indirect
4270
go.opentelemetry.io/collector/receiver/xreceiver v0.123.1-0.20250402200755-cb5c3f4fb9dc // indirect
4371
go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 // indirect
72+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect
4473
go.opentelemetry.io/otel v1.35.0 // indirect
4574
go.opentelemetry.io/otel/log v0.11.0 // indirect
4675
go.opentelemetry.io/otel/metric v1.35.0 // indirect
4776
go.opentelemetry.io/otel/sdk v1.35.0 // indirect
4877
go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect
4978
go.opentelemetry.io/otel/trace v1.35.0 // indirect
5079
go.uber.org/multierr v1.11.0 // indirect
51-
go.uber.org/zap v1.27.0 // indirect
5280
golang.org/x/net v0.37.0 // indirect
5381
golang.org/x/sys v0.31.0 // indirect
5482
golang.org/x/text v0.23.0 // indirect
55-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
56-
google.golang.org/grpc v1.71.1 // indirect
83+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a // indirect
5784
google.golang.org/protobuf v1.36.6 // indirect
5885
gopkg.in/yaml.v3 v3.0.1 // indirect
86+
modernc.org/b/v2 v2.1.0 // indirect
5987
)
88+
89+
replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/stefexporter => ../../exporter/stefexporter
90+
91+
replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common

0 commit comments

Comments
 (0)