Skip to content

Commit ff57adc

Browse files
[receiver/statsdreceiver] add ability to customize socket permissions when transport is unixgram (open-telemetry#37807)
Signed-off-by: thomas-gouveia <[email protected]>
1 parent e84ec19 commit ff57adc

File tree

7 files changed

+79
-2
lines changed

7 files changed

+79
-2
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
change_type: enhancement
2+
component: statsdreceiver
3+
note: Add new config to customize socket permissions when transport is set to `unixgram`.
4+
issues:
5+
- 37807
6+
7+
subtext:
8+
change_logs: [user]

receiver/statsdreceiver/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ The Following settings are optional:
2727

2828
- `transport` (default = `udp`): Protocol used by the StatsD server. Currently supported transports can be found in [this file](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/statsdreceiver/internal/transport/transport.go).
2929

30+
- `socket_permissions` (default = `0622`): When transport is set to `unixgram`, can be used to customize permissions of the binded socket.
31+
3032
- `aggregation_interval: 70s`(default value is 60s): The aggregation time that the receiver aggregates the metrics (similar to the flush interval in StatsD server)
3133

3234
- `enable_metric_type: true`(default value is false): Enable the statsd receiver to be able to emit the metric type(gauge, counter, timer(in the future), histogram(in the future)) as a label.

receiver/statsdreceiver/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package statsdreceiver // import "github.com/open-telemetry/opentelemetry-collec
66
import (
77
"errors"
88
"fmt"
9+
"os"
910
"time"
1011

1112
"github.com/lightstep/go-expohisto/structure"
@@ -24,6 +25,8 @@ type Config struct {
2425
EnableSimpleTags bool `mapstructure:"enable_simple_tags"`
2526
IsMonotonicCounter bool `mapstructure:"is_monotonic_counter"`
2627
TimerHistogramMapping []protocol.TimerHistogramMapping `mapstructure:"timer_histogram_mapping"`
28+
// Will only be used when transport set to 'unixgram'.
29+
SocketPermissions os.FileMode `mapstructure:socket_permissions`
2730
}
2831

2932
func (c *Config) Validate() error {

receiver/statsdreceiver/factory.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const (
2121
defaultAggregationInterval = 60 * time.Second
2222
defaultEnableMetricType = false
2323
defaultIsMonotonicCounter = false
24+
defaultSocketPermissions = 0622
2425
)
2526

2627
var defaultTimerHistogramMapping = []protocol.TimerHistogramMapping{{StatsdType: "timer", ObserverType: "gauge"}, {StatsdType: "histogram", ObserverType: "gauge"}, {StatsdType: "distribution", ObserverType: "gauge"}}
@@ -44,6 +45,7 @@ func createDefaultConfig() component.Config {
4445
EnableMetricType: defaultEnableMetricType,
4546
IsMonotonicCounter: defaultIsMonotonicCounter,
4647
TimerHistogramMapping: defaultTimerHistogramMapping,
48+
SocketPermissions: defaultSocketPermissions,
4749
}
4850
}
4951

receiver/statsdreceiver/internal/transport/uds_server.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type udsServer struct {
1717
var _ (Server) = (*udsServer)(nil)
1818

1919
// NewUDSServer creates a transport.Server using Unixgram as its transport.
20-
func NewUDSServer(transport Transport, socketPath string) (Server, error) {
20+
func NewUDSServer(transport Transport, socketPath string, socketPermissions os.FileMode) (Server, error) {
2121
if !transport.IsPacketTransport() {
2222
return nil, fmt.Errorf("NewUDSServer with %s: %w", transport.String(), ErrUnsupportedPacketTransport)
2323
}
@@ -27,6 +27,10 @@ func NewUDSServer(transport Transport, socketPath string) (Server, error) {
2727
return nil, fmt.Errorf("starting to listen %s socket: %w", transport.String(), err)
2828
}
2929

30+
if err := os.Chmod(socketPath, socketPermissions); err != nil {
31+
return nil, fmt.Errorf("running chmod %v: %w", socketPermissions, err)
32+
}
33+
3034
return &udsServer{
3135
packetServer: packetServer{
3236
packetConn: conn,
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package transport
5+
6+
import (
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
"os"
10+
"testing"
11+
)
12+
13+
func Test_NewUDSServer_ListenPacketFailure(t *testing.T) {
14+
invalidPath := "/invalid_path/test_socket"
15+
16+
server, err := NewUDSServer("unixgram", invalidPath, 0622)
17+
18+
assert.Error(t, err)
19+
assert.Nil(t, server)
20+
assert.Contains(t, err.Error(), "starting to listen")
21+
}
22+
23+
func Test_UDSServer_Close(t *testing.T) {
24+
socketPath := "/tmp/test_socket_close"
25+
defer os.Remove(socketPath)
26+
27+
server, err := NewUDSServer("unixgram", socketPath, 0622)
28+
require.NoError(t, err)
29+
require.NotNil(t, server)
30+
31+
_, err = os.Stat(socketPath)
32+
require.NoError(t, err)
33+
34+
err = server.Close()
35+
assert.NoError(t, err)
36+
37+
_, err = os.Stat(socketPath)
38+
assert.True(t, os.IsNotExist(err))
39+
}
40+
41+
func Test_NewUDSServer_AppliesChmod(t *testing.T) {
42+
socketPath := "/tmp/test_socket_chmod"
43+
defer os.Remove(socketPath) // Cleanup after test
44+
45+
expectedPermissions := os.FileMode(0622)
46+
47+
server, err := NewUDSServer("unixgram", socketPath, expectedPermissions)
48+
require.NoError(t, err)
49+
require.NotNil(t, server)
50+
51+
fileInfo, err := os.Stat(socketPath)
52+
require.NoError(t, err)
53+
54+
actualPermissions := fileInfo.Mode().Perm()
55+
assert.Equal(t, expectedPermissions, actualPermissions, "Expected file permissions to be set correctly")
56+
57+
server.Close()
58+
}

receiver/statsdreceiver/receiver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func buildTransportServer(config Config) (transport.Server, error) {
9292
case transport.TCP, transport.TCP4, transport.TCP6:
9393
return transport.NewTCPServer(trans, config.NetAddr.Endpoint)
9494
case transport.UDS:
95-
return transport.NewUDSServer(trans, config.NetAddr.Endpoint)
95+
return transport.NewUDSServer(trans, config.NetAddr.Endpoint, config.SocketPermissions)
9696
}
9797

9898
return nil, fmt.Errorf("unsupported transport %q", string(config.NetAddr.Transport))

0 commit comments

Comments
 (0)