Skip to content

Commit 2d8f1a8

Browse files
Tigran Najaryantigrannajaryan
authored andcommitted
Change default OTLP/gRPC port number
This implements specification change open-telemetry/opentelemetry-specification#1221 To make transition to new port numbers less painful OTLP receiver will also accept data on the legacy port numbers when it is configured to use the default endpoint. Users who use the default Collector config can continue sending data to the legacy ports and have a graceful period to update their senders to start sending to the new ports. Note that OTLP/HTTP continues using a separate port number from OTLP/gRPC. There is separate work in progress to use one port for both.
1 parent 8b9b7d5 commit 2d8f1a8

File tree

6 files changed

+98
-48
lines changed

6 files changed

+98
-48
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
## 💡 Enhancements 💡
1010

1111
- Add --log-format command line option (default to "console") #2177.
12+
- Change default OTLP/gRPC port number to 4317, also continue receiving on legacy port
13+
55680 during transition period (#2104).
1214

1315
## v0.14.0 Beta
1416

receiver/otlpreceiver/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ receivers:
2525
2626
The following settings are configurable:
2727
28-
- `endpoint` (default = 0.0.0.0:55680): host:port to which the receiver is
29-
going to receive data. The valid syntax is described at
30-
https://github.com/grpc/grpc/blob/master/doc/naming.md.
28+
- `endpoint` (default = 0.0.0.0:4317 for grpc protocol, 0.0.0.0:55681 http protocol):
29+
host:port to which the receiver is going to receive data. The valid syntax is
30+
described at https://github.com/grpc/grpc/blob/master/doc/naming.md.
3131

3232
## Advanced Configuration
3333

receiver/otlpreceiver/config_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func TestLoadConfig(t *testing.T) {
8282
Protocols: Protocols{
8383
GRPC: &configgrpc.GRPCServerSettings{
8484
NetAddr: confignet.NetAddr{
85-
Endpoint: "0.0.0.0:55680",
85+
Endpoint: "0.0.0.0:4317",
8686
Transport: "tcp",
8787
},
8888
ReadBufferSize: 512 * 1024,
@@ -112,7 +112,7 @@ func TestLoadConfig(t *testing.T) {
112112
Protocols: Protocols{
113113
GRPC: &configgrpc.GRPCServerSettings{
114114
NetAddr: confignet.NetAddr{
115-
Endpoint: "0.0.0.0:55680",
115+
Endpoint: "0.0.0.0:4317",
116116
Transport: "tcp",
117117
},
118118
MaxRecvMsgSizeMiB: 32,
@@ -139,7 +139,7 @@ func TestLoadConfig(t *testing.T) {
139139
Protocols: Protocols{
140140
GRPC: &configgrpc.GRPCServerSettings{
141141
NetAddr: confignet.NetAddr{
142-
Endpoint: "0.0.0.0:55680",
142+
Endpoint: "0.0.0.0:4317",
143143
Transport: "tcp",
144144
},
145145
TLSSetting: &configtls.TLSServerSetting{

receiver/otlpreceiver/factory.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"fmt"
2020

2121
"github.com/spf13/viper"
22+
"go.uber.org/zap"
2223

2324
"go.opentelemetry.io/collector/component"
2425
"go.opentelemetry.io/collector/config/configgrpc"
@@ -37,6 +38,10 @@ const (
3738
protoGRPC = "grpc"
3839
protoHTTP = "http"
3940
protocolsFieldName = "protocols"
41+
42+
defaultGRPCEndpoint = "0.0.0.0:4317"
43+
defaultHTTPEndpoint = "0.0.0.0:55681"
44+
legacyGRPCEndpoint = "0.0.0.0:55680"
4045
)
4146

4247
func NewFactory() component.ReceiverFactory {
@@ -59,14 +64,14 @@ func createDefaultConfig() configmodels.Receiver {
5964
Protocols: Protocols{
6065
GRPC: &configgrpc.GRPCServerSettings{
6166
NetAddr: confignet.NetAddr{
62-
Endpoint: "0.0.0.0:55680",
67+
Endpoint: defaultGRPCEndpoint,
6368
Transport: "tcp",
6469
},
6570
// We almost write 0 bytes, so no need to tune WriteBufferSize.
6671
ReadBufferSize: 512 * 1024,
6772
},
6873
HTTP: &confighttp.HTTPServerSettings{
69-
Endpoint: "0.0.0.0:55681",
74+
Endpoint: defaultHTTPEndpoint,
7075
},
7176
},
7277
}
@@ -117,11 +122,11 @@ func customUnmarshaler(componentViperSection *viper.Viper, intoCfg interface{})
117122
// CreateTracesReceiver creates a trace receiver based on provided config.
118123
func createTraceReceiver(
119124
ctx context.Context,
120-
_ component.ReceiverCreateParams,
125+
params component.ReceiverCreateParams,
121126
cfg configmodels.Receiver,
122127
nextConsumer consumer.TracesConsumer,
123128
) (component.TracesReceiver, error) {
124-
r, err := createReceiver(cfg)
129+
r, err := createReceiver(cfg, params.Logger)
125130
if err != nil {
126131
return nil, err
127132
}
@@ -134,11 +139,11 @@ func createTraceReceiver(
134139
// CreateMetricsReceiver creates a metrics receiver based on provided config.
135140
func createMetricsReceiver(
136141
ctx context.Context,
137-
_ component.ReceiverCreateParams,
142+
params component.ReceiverCreateParams,
138143
cfg configmodels.Receiver,
139144
consumer consumer.MetricsConsumer,
140145
) (component.MetricsReceiver, error) {
141-
r, err := createReceiver(cfg)
146+
r, err := createReceiver(cfg, params.Logger)
142147
if err != nil {
143148
return nil, err
144149
}
@@ -151,11 +156,11 @@ func createMetricsReceiver(
151156
// CreateLogReceiver creates a log receiver based on provided config.
152157
func createLogReceiver(
153158
ctx context.Context,
154-
_ component.ReceiverCreateParams,
159+
params component.ReceiverCreateParams,
155160
cfg configmodels.Receiver,
156161
consumer consumer.LogsConsumer,
157162
) (component.LogsReceiver, error) {
158-
r, err := createReceiver(cfg)
163+
r, err := createReceiver(cfg, params.Logger)
159164
if err != nil {
160165
return nil, err
161166
}
@@ -165,7 +170,7 @@ func createLogReceiver(
165170
return r, nil
166171
}
167172

168-
func createReceiver(cfg configmodels.Receiver) (*otlpReceiver, error) {
173+
func createReceiver(cfg configmodels.Receiver, logger *zap.Logger) (*otlpReceiver, error) {
169174
rCfg := cfg.(*Config)
170175

171176
// There must be one receiver for both metrics and traces. We maintain a map of
@@ -176,7 +181,7 @@ func createReceiver(cfg configmodels.Receiver) (*otlpReceiver, error) {
176181
if !ok {
177182
var err error
178183
// We don't have a receiver, so create one.
179-
receiver, err = newOtlpReceiver(rCfg)
184+
receiver, err = newOtlpReceiver(rCfg, logger)
180185
if err != nil {
181186
return nil, err
182187
}

receiver/otlpreceiver/otlp.go

Lines changed: 72 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ import (
2222
"sync"
2323

2424
gatewayruntime "github.com/grpc-ecosystem/grpc-gateway/runtime"
25+
"go.uber.org/zap"
2526
"google.golang.org/grpc"
2627

2728
"go.opentelemetry.io/collector/component"
2829
"go.opentelemetry.io/collector/component/componenterror"
30+
"go.opentelemetry.io/collector/config/configgrpc"
2931
"go.opentelemetry.io/collector/config/confighttp"
3032
"go.opentelemetry.io/collector/consumer"
3133
collectorlog "go.opentelemetry.io/collector/internal/data/opentelemetry-proto-gen/collector/logs/v1"
@@ -49,14 +51,17 @@ type otlpReceiver struct {
4951

5052
stopOnce sync.Once
5153
startServerOnce sync.Once
54+
55+
logger *zap.Logger
5256
}
5357

5458
// newOtlpReceiver just creates the OpenTelemetry receiver services. It is the caller's
5559
// responsibility to invoke the respective Start*Reception methods as well
5660
// as the various Stop*Reception methods to end it.
57-
func newOtlpReceiver(cfg *Config) (*otlpReceiver, error) {
61+
func newOtlpReceiver(cfg *Config, logger *zap.Logger) (*otlpReceiver, error) {
5862
r := &otlpReceiver{
59-
cfg: cfg,
63+
cfg: cfg,
64+
logger: logger,
6065
}
6166
if cfg.GRPC != nil {
6267
opts, err := cfg.GRPC.ToServerOption()
@@ -84,6 +89,70 @@ func newOtlpReceiver(cfg *Config) (*otlpReceiver, error) {
8489
return r, nil
8590
}
8691

92+
func (r *otlpReceiver) startGRPCServer(cfg *configgrpc.GRPCServerSettings, host component.Host) error {
93+
r.logger.Info("Starting GRPC server on endpoint " + cfg.NetAddr.Endpoint)
94+
var gln net.Listener
95+
gln, err := cfg.ToListener()
96+
if err != nil {
97+
return err
98+
}
99+
go func() {
100+
if errGrpc := r.serverGRPC.Serve(gln); errGrpc != nil {
101+
host.ReportFatalError(errGrpc)
102+
}
103+
}()
104+
return nil
105+
}
106+
107+
func (r *otlpReceiver) startHTTPServer(cfg *confighttp.HTTPServerSettings, host component.Host) error {
108+
r.logger.Info("Starting HTTP server on endpoint " + cfg.Endpoint)
109+
var hln net.Listener
110+
hln, err := r.cfg.HTTP.ToListener()
111+
if err != nil {
112+
return err
113+
}
114+
go func() {
115+
if errHTTP := r.serverHTTP.Serve(hln); errHTTP != nil {
116+
host.ReportFatalError(errHTTP)
117+
}
118+
}()
119+
return nil
120+
}
121+
122+
func (r *otlpReceiver) startProtocolServers(host component.Host) error {
123+
var err error
124+
if r.cfg.GRPC != nil {
125+
err = r.startGRPCServer(r.cfg.GRPC, host)
126+
if err != nil {
127+
return err
128+
}
129+
if r.cfg.GRPC.NetAddr.Endpoint == defaultGRPCEndpoint {
130+
r.logger.Info("Setting up a second GRPC listener on legacy endpoint " + legacyGRPCEndpoint)
131+
132+
// Copy the config.
133+
cfgLegacyGRPC := r.cfg.GRPC
134+
// And use the legacy endpoint.
135+
cfgLegacyGRPC.NetAddr.Endpoint = legacyGRPCEndpoint
136+
err = r.startGRPCServer(cfgLegacyGRPC, host)
137+
if err != nil {
138+
return err
139+
}
140+
}
141+
}
142+
if r.cfg.HTTP != nil {
143+
r.serverHTTP = r.cfg.HTTP.ToServer(
144+
r.gatewayMux,
145+
confighttp.WithErrorHandler(errorHandler),
146+
)
147+
err = r.startHTTPServer(r.cfg.HTTP, host)
148+
if err != nil {
149+
return err
150+
}
151+
}
152+
153+
return err
154+
}
155+
87156
// Start runs the trace receiver on the gRPC server. Currently
88157
// it also enables the metrics receiver too.
89158
func (r *otlpReceiver) Start(_ context.Context, host component.Host) error {
@@ -93,34 +162,7 @@ func (r *otlpReceiver) Start(_ context.Context, host component.Host) error {
93162

94163
var err error
95164
r.startServerOnce.Do(func() {
96-
if r.cfg.GRPC != nil {
97-
var gln net.Listener
98-
gln, err = r.cfg.GRPC.ToListener()
99-
if err != nil {
100-
return
101-
}
102-
go func() {
103-
if errGrpc := r.serverGRPC.Serve(gln); errGrpc != nil {
104-
host.ReportFatalError(errGrpc)
105-
}
106-
}()
107-
}
108-
if r.cfg.HTTP != nil {
109-
r.serverHTTP = r.cfg.HTTP.ToServer(
110-
r.gatewayMux,
111-
confighttp.WithErrorHandler(errorHandler),
112-
)
113-
var hln net.Listener
114-
hln, err = r.cfg.HTTP.ToListener()
115-
if err != nil {
116-
return
117-
}
118-
go func() {
119-
if errHTTP := r.serverHTTP.Serve(hln); errHTTP != nil {
120-
host.ReportFatalError(errHTTP)
121-
}
122-
}()
123-
}
165+
err = r.startProtocolServers(host)
124166
})
125167
return err
126168
}

receiver/otlpreceiver/otlp_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"github.com/gogo/protobuf/jsonpb"
3131
"github.com/stretchr/testify/assert"
3232
"github.com/stretchr/testify/require"
33+
"go.uber.org/zap"
3334
spb "google.golang.org/genproto/googleapis/rpc/status"
3435
"google.golang.org/grpc"
3536
"google.golang.org/grpc/codes"
@@ -698,7 +699,7 @@ func TestGRPCInvalidTLSCredentials(t *testing.T) {
698699
}
699700

700701
// TLS is resolved during Creation of the receiver for GRPC.
701-
_, err := createReceiver(cfg)
702+
_, err := createReceiver(cfg, zap.NewNop())
702703
assert.EqualError(t, err,
703704
`failed to load TLS config: for auth via TLS, either both certificate and key must be supplied, or neither`)
704705
}
@@ -745,7 +746,7 @@ func newHTTPReceiver(t *testing.T, endpoint string, tc consumer.TracesConsumer,
745746
}
746747

747748
func newReceiver(t *testing.T, factory component.ReceiverFactory, cfg *Config, tc consumer.TracesConsumer, mc consumer.MetricsConsumer) *otlpReceiver {
748-
r, err := createReceiver(cfg)
749+
r, err := createReceiver(cfg, zap.NewNop())
749750
require.NoError(t, err)
750751
if tc != nil {
751752
params := component.ReceiverCreateParams{}

0 commit comments

Comments
 (0)