Skip to content

Commit 6cd2a16

Browse files
committed
[pipeline] Dreprecate MustNewID and MustNewIDWithName
Signed-off-by: Bogdan Drutu <[email protected]>
1 parent 28ca163 commit 6cd2a16

File tree

11 files changed

+115
-164
lines changed

11 files changed

+115
-164
lines changed

pipeline/internal/globalsignal/signal.go

+27-27
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,18 @@
44
package globalsignal // import "go.opentelemetry.io/collector/pipeline/internal/globalsignal"
55

66
import (
7-
"errors"
7+
"encoding"
88
"fmt"
9-
"regexp"
9+
)
10+
11+
var (
12+
SignalProfiles = Signal{name: "profiles"}
13+
SignalTraces = Signal{name: "traces"}
14+
SignalMetrics = Signal{name: "metrics"}
15+
SignalLogs = Signal{name: "logs"}
16+
17+
_ encoding.TextMarshaler = (*Signal)(nil)
18+
_ encoding.TextUnmarshaler = (*Signal)(nil)
1019
)
1120

1221
// Signal represents the signals supported by the collector.
@@ -15,37 +24,28 @@ type Signal struct {
1524
}
1625

1726
// String returns the string representation of the signal.
18-
func (s Signal) String() string {
27+
func (s *Signal) String() string {
1928
return s.name
2029
}
2130

2231
// MarshalText marshals the Signal.
23-
func (s Signal) MarshalText() (text []byte, err error) {
32+
func (s *Signal) MarshalText() ([]byte, error) {
2433
return []byte(s.name), nil
2534
}
2635

27-
// signalRegex is used to validate the signal.
28-
// A signal must consist of 1 to 62 lowercase ASCII alphabetic characters.
29-
var signalRegex = regexp.MustCompile(`^[a-z]{1,62}$`)
30-
31-
// NewSignal creates a Signal. It returns an error if the Signal is invalid.
32-
// A Signal must consist of 1 to 62 lowercase ASCII alphabetic characters.
33-
func NewSignal(signal string) (Signal, error) {
34-
if len(signal) == 0 {
35-
return Signal{}, errors.New("signal must not be empty")
36-
}
37-
if !signalRegex.MatchString(signal) {
38-
return Signal{}, fmt.Errorf("invalid character(s) in type %q", signal)
39-
}
40-
return Signal{name: signal}, nil
41-
}
42-
43-
// MustNewSignal creates a Signal. It panics if the Signal is invalid.
44-
// A signal must consist of 1 to 62 lowercase ASCII alphabetic characters.
45-
func MustNewSignal(signal string) Signal {
46-
s, err := NewSignal(signal)
47-
if err != nil {
48-
panic(err)
36+
// UnmarshalText marshals the Signal.
37+
func (s *Signal) UnmarshalText(text []byte) error {
38+
switch string(text) {
39+
case SignalProfiles.name:
40+
*s = SignalProfiles
41+
case SignalTraces.name:
42+
*s = SignalTraces
43+
case SignalMetrics.name:
44+
*s = SignalMetrics
45+
case SignalLogs.name:
46+
*s = SignalLogs
47+
default:
48+
return fmt.Errorf("unknown pipeline signal: %q", string(text))
4949
}
50-
return s
50+
return nil
5151
}

pipeline/internal/globalsignal/signal_test.go

+39-22
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,49 @@ import (
1010
"github.com/stretchr/testify/require"
1111
)
1212

13-
func Test_NewSignal(t *testing.T) {
14-
s, err := NewSignal("traces")
15-
require.NoError(t, err)
16-
assert.Equal(t, Signal{name: "traces"}, s)
13+
func TestSignal_String(t *testing.T) {
14+
assert.Equal(t, "traces", SignalTraces.String())
15+
assert.Equal(t, "metrics", SignalMetrics.String())
16+
assert.Equal(t, "logs", SignalLogs.String())
17+
assert.Equal(t, "profiles", SignalProfiles.String())
1718
}
1819

19-
func Test_NewSignal_Invalid(t *testing.T) {
20-
_, err := NewSignal("")
21-
require.Error(t, err)
22-
_, err = NewSignal("TRACES")
23-
require.Error(t, err)
24-
}
20+
func TestSignal_MarshalText(t *testing.T) {
21+
b, err := SignalTraces.MarshalText()
22+
require.NoError(t, err)
23+
assert.Equal(t, []byte("traces"), b)
2524

26-
func Test_MustNewSignal(t *testing.T) {
27-
s := MustNewSignal("traces")
28-
assert.Equal(t, Signal{name: "traces"}, s)
29-
}
25+
b, err = SignalMetrics.MarshalText()
26+
require.NoError(t, err)
27+
assert.Equal(t, []byte("metrics"), b)
3028

31-
func Test_Signal_String(t *testing.T) {
32-
s := MustNewSignal("traces")
33-
assert.Equal(t, "traces", s.String())
34-
}
29+
b, err = SignalLogs.MarshalText()
30+
require.NoError(t, err)
31+
assert.Equal(t, []byte("logs"), b)
3532

36-
func Test_Signal_MarshalText(t *testing.T) {
37-
s := MustNewSignal("traces")
38-
b, err := s.MarshalText()
33+
b, err = SignalProfiles.MarshalText()
3934
require.NoError(t, err)
40-
assert.Equal(t, []byte("traces"), b)
35+
assert.Equal(t, []byte("profiles"), b)
36+
37+
var s Signal
38+
b, err = s.MarshalText()
39+
require.NoError(t, err)
40+
assert.Equal(t, []byte(""), b)
41+
}
42+
43+
func TestSignal_UnmarshalText(t *testing.T) {
44+
var s Signal
45+
require.NoError(t, s.UnmarshalText([]byte("traces")))
46+
assert.Equal(t, SignalTraces, s)
47+
48+
require.NoError(t, s.UnmarshalText([]byte("metrics")))
49+
assert.Equal(t, SignalMetrics, s)
50+
51+
require.NoError(t, s.UnmarshalText([]byte("logs")))
52+
assert.Equal(t, SignalLogs, s)
53+
54+
require.NoError(t, s.UnmarshalText([]byte("profiles")))
55+
assert.Equal(t, SignalProfiles, s)
56+
57+
require.Error(t, s.UnmarshalText([]byte("unknown")))
4158
}

pipeline/pipeline.go

+14-17
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import (
77
"fmt"
88
"regexp"
99
"strings"
10-
11-
"go.opentelemetry.io/collector/pipeline/internal/globalsignal"
1210
)
1311

1412
// typeAndNameSeparator is the separator that is used between type and name in type/name composite keys.
@@ -27,24 +25,24 @@ func NewID(signal Signal) ID {
2725
return ID{signal: signal}
2826
}
2927

30-
// MustNewID builds a Signal and returns a new ID with the given Signal and empty name.
31-
// It panics if the Signal is invalid.
32-
// A signal must consist of 1 to 62 lowercase ASCII alphabetic characters.
28+
// Deprecated: [v0.124.0] use NewIDWithName.
3329
func MustNewID(signal string) ID {
34-
return ID{signal: globalsignal.MustNewSignal(signal)}
30+
id := ID{}
31+
err := id.signal.UnmarshalText([]byte(signal))
32+
if err != nil {
33+
panic(err)
34+
}
35+
return id
3536
}
3637

3738
// NewIDWithName returns a new ID with the given Signal and name.
3839
func NewIDWithName(signal Signal, name string) ID {
3940
return ID{signal: signal, name: name}
4041
}
4142

42-
// MustNewIDWithName builds a Signal and returns a new ID with the given Signal and name.
43-
// It panics if the Signal is invalid or name is invalid.
44-
// A signal must consist of 1 to 62 lowercase ASCII alphabetic characters.
45-
// A name must consist of 1 to 1024 unicode characters excluding whitespace, control characters, and symbols.
43+
// Deprecated: [v0.124.0] use NewIDWithName.
4644
func MustNewIDWithName(signal string, name string) ID {
47-
id := ID{signal: globalsignal.MustNewSignal(signal)}
45+
id := MustNewID(signal)
4846
err := validateName(name)
4947
if err != nil {
5048
panic(err)
@@ -54,18 +52,18 @@ func MustNewIDWithName(signal string, name string) ID {
5452
}
5553

5654
// Signal returns the Signal of the ID.
57-
func (i ID) Signal() Signal {
55+
func (i *ID) Signal() Signal {
5856
return i.signal
5957
}
6058

6159
// Name returns the name of the ID.
62-
func (i ID) Name() string {
60+
func (i *ID) Name() string {
6361
return i.name
6462
}
6563

6664
// MarshalText implements the encoding.TextMarshaler interface.
6765
// This marshals the Signal and name as one string in the config.
68-
func (i ID) MarshalText() (text []byte, err error) {
66+
func (i *ID) MarshalText() (text []byte, err error) {
6967
return []byte(i.String()), nil
7068
}
7169

@@ -93,8 +91,7 @@ func (i *ID) UnmarshalText(text []byte) error {
9391
}
9492
}
9593

96-
var err error
97-
if i.signal, err = globalsignal.NewSignal(signalStr); err != nil {
94+
if err := i.signal.UnmarshalText([]byte(signalStr)); err != nil {
9895
return fmt.Errorf("in %q id: %w", idStr, err)
9996
}
10097
i.name = nameStr
@@ -103,7 +100,7 @@ func (i *ID) UnmarshalText(text []byte) error {
103100
}
104101

105102
// String returns the ID string representation as "signal[/name]" format.
106-
func (i ID) String() string {
103+
func (i *ID) String() string {
107104
if i.name == "" {
108105
return i.signal.String()
109106
}

pipeline/pipeline_test.go

+18-19
Original file line numberDiff line numberDiff line change
@@ -41,40 +41,39 @@ func TestMarshalText(t *testing.T) {
4141
}
4242

4343
func TestUnmarshalText(t *testing.T) {
44-
validSignal := globalsignal.MustNewSignal("valid")
4544
testCases := []struct {
4645
idStr string
4746
expectedErr bool
4847
expectedID ID
4948
}{
5049
{
51-
idStr: "valid",
52-
expectedID: ID{signal: validSignal, name: ""},
50+
idStr: "traces",
51+
expectedID: ID{signal: globalsignal.SignalTraces, name: ""},
5352
},
5453
{
55-
idStr: "valid/valid_name",
56-
expectedID: ID{signal: validSignal, name: "valid_name"},
54+
idStr: "traces/valid_name",
55+
expectedID: ID{signal: globalsignal.SignalTraces, name: "valid_name"},
5756
},
5857
{
59-
idStr: " valid / valid_name ",
60-
expectedID: ID{signal: validSignal, name: "valid_name"},
58+
idStr: " traces / valid_name ",
59+
expectedID: ID{signal: globalsignal.SignalTraces, name: "valid_name"},
6160
},
6261
{
63-
idStr: "valid/中文好",
64-
expectedID: ID{signal: validSignal, name: "中文好"},
62+
idStr: "traces/中文好",
63+
expectedID: ID{signal: globalsignal.SignalTraces, name: "中文好"},
6564
},
6665
{
67-
idStr: "valid/name-with-dashes",
68-
expectedID: ID{signal: validSignal, name: "name-with-dashes"},
66+
idStr: "traces/name-with-dashes",
67+
expectedID: ID{signal: globalsignal.SignalTraces, name: "name-with-dashes"},
6968
},
7069
// issue 10816
7170
{
72-
idStr: "valid/Linux-Messages-File_01J49HCH3SWFXRVASWFZFRT3J2__processor0__logs",
73-
expectedID: ID{signal: validSignal, name: "Linux-Messages-File_01J49HCH3SWFXRVASWFZFRT3J2__processor0__logs"},
71+
idStr: "traces/Linux-Messages-File_01J49HCH3SWFXRVASWFZFRT3J2__processor0__logs",
72+
expectedID: ID{signal: globalsignal.SignalTraces, name: "Linux-Messages-File_01J49HCH3SWFXRVASWFZFRT3J2__processor0__logs"},
7473
},
7574
{
76-
idStr: "valid/1",
77-
expectedID: ID{signal: validSignal, name: "1"},
75+
idStr: "traces/1",
76+
expectedID: ID{signal: globalsignal.SignalTraces, name: "1"},
7877
},
7978
{
8079
idStr: "/valid_name",
@@ -85,23 +84,23 @@ func TestUnmarshalText(t *testing.T) {
8584
expectedErr: true,
8685
},
8786
{
88-
idStr: "valid/",
87+
idStr: "traces/",
8988
expectedErr: true,
9089
},
9190
{
92-
idStr: "valid/ ",
91+
idStr: "traces/ ",
9392
expectedErr: true,
9493
},
9594
{
9695
idStr: " ",
9796
expectedErr: true,
9897
},
9998
{
100-
idStr: "valid/invalid name",
99+
idStr: "traces/invalid name",
101100
expectedErr: true,
102101
},
103102
{
104-
idStr: "valid/" + strings.Repeat("a", 1025),
103+
idStr: "traces/" + strings.Repeat("a", 1025),
105104
expectedErr: true,
106105
},
107106
{

pipeline/signal.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ type Signal = globalsignal.Signal
1616
var ErrSignalNotSupported = errors.New("telemetry type is not supported")
1717

1818
var (
19-
SignalTraces = globalsignal.MustNewSignal("traces")
20-
SignalMetrics = globalsignal.MustNewSignal("metrics")
21-
SignalLogs = globalsignal.MustNewSignal("logs")
19+
SignalTraces = globalsignal.SignalTraces
20+
SignalMetrics = globalsignal.SignalMetrics
21+
SignalLogs = globalsignal.SignalLogs
2222
)

pipeline/signal_test.go

-31
This file was deleted.

pipeline/xpipeline/config.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ package xpipeline // import "go.opentelemetry.io/collector/pipeline/xpipeline"
55

66
import "go.opentelemetry.io/collector/pipeline/internal/globalsignal"
77

8-
var SignalProfiles = globalsignal.MustNewSignal("profiles")
8+
var SignalProfiles = globalsignal.SignalProfiles

service/config_test.go

-13
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,6 @@ func TestConfigValidate(t *testing.T) {
5353
},
5454
expected: errors.New(`references processor "nop" multiple times`),
5555
},
56-
{
57-
name: "invalid-service-pipeline-type",
58-
cfgFn: func() *Config {
59-
cfg := generateConfig()
60-
cfg.Pipelines[pipeline.MustNewID("wrongtype")] = &pipelines.PipelineConfig{
61-
Receivers: []component.ID{component.MustNewID("nop")},
62-
Processors: []component.ID{component.MustNewID("nop")},
63-
Exporters: []component.ID{component.MustNewID("nop")},
64-
}
65-
return cfg
66-
},
67-
expected: errors.New(`pipeline "wrongtype": unknown signal "wrongtype"`),
68-
},
6956
{
7057
name: "invalid-telemetry-metric-config",
7158
cfgFn: func() *Config {

0 commit comments

Comments
 (0)