Skip to content

Commit 6ac579e

Browse files
authored
Add config settings for component telemetry, move the flag (#2148)
Next steps will be to use the new settings in the processors. Signed-off-by: Bogdan Drutu <[email protected]>
1 parent e063230 commit 6ac579e

File tree

7 files changed

+194
-44
lines changed

7 files changed

+194
-44
lines changed

config/configtelemetry/configtelemetry.go

Lines changed: 80 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,38 +15,112 @@
1515
package configtelemetry
1616

1717
import (
18+
"flag"
1819
"fmt"
1920
"strings"
2021
)
2122

2223
const (
2324
// LevelNone indicates that no telemetry data should be collected.
2425
LevelNone Level = iota - 1
25-
// LevelBasic is the default and covers the basics of the service telemetry.
26+
// LevelBasic is the recommended and covers the basics of the service telemetry.
2627
LevelBasic
2728
// LevelNormal adds some other indicators on top of basic.
2829
LevelNormal
2930
// LevelDetailed adds dimensions and views to the previous levels.
3031
LevelDetailed
32+
33+
levelNoneStr = "none"
34+
levelBasicStr = "basic"
35+
levelNormalStr = "normal"
36+
levelDetailedStr = "detailed"
37+
38+
metricsLevelCfg = "metrics-level"
3139
)
3240

41+
var metricsLevelPtr = new(Level)
42+
43+
// Flags is a helper func, to add the telemetry config flags to the service that exposes
44+
// the application flags.
45+
func Flags(flags *flag.FlagSet) {
46+
flags.Var(
47+
metricsLevelPtr,
48+
metricsLevelCfg,
49+
"Output level of telemetry metrics (none, basic, normal, detailed)")
50+
}
51+
3352
// Level is the level of internal telemetry (metrics, logs, traces about the component itself)
3453
// that every component should generate.
3554
type Level int8
3655

56+
var _ flag.Value = (*Level)(nil)
57+
58+
func (l *Level) String() string {
59+
switch *l {
60+
case LevelNone:
61+
return levelNoneStr
62+
case LevelBasic:
63+
return levelBasicStr
64+
case LevelNormal:
65+
return levelNormalStr
66+
case LevelDetailed:
67+
return levelDetailedStr
68+
}
69+
return "unknown"
70+
}
71+
72+
func (l *Level) Set(s string) error {
73+
lvl, err := parseLevel(s)
74+
if err != nil {
75+
return err
76+
}
77+
*l = lvl
78+
return nil
79+
}
80+
81+
// GetMetricsLevelFlagValue returns the value of the "--metrics-level" flag.
82+
// IMPORTANT: This must be used only in the core collector code for the moment.
83+
func GetMetricsLevelFlagValue() Level {
84+
return *metricsLevelPtr
85+
}
86+
87+
// TelemetrySetting exposes the common Telemetry configuration for one component.
88+
type TelemetrySetting struct {
89+
// MetricsLevelStr is the level of telemetry metrics, the possible values are:
90+
// - "none" indicates that no telemetry data should be collected;
91+
// - "basic" is the recommended and covers the basics of the service telemetry.
92+
// - "normal" adds some other indicators on top of basic.
93+
// - "detailed" adds dimensions and views to the previous levels.
94+
MetricsLevelStr string `mapstructure:"metrics_level"`
95+
}
96+
97+
// DefaultTelemetrySetting returns the default TelemetrySetting.
98+
// The level is set to the "--metrics-level" flag if set, otherwise the default "basic" level.
99+
func DefaultTelemetrySetting() TelemetrySetting {
100+
return TelemetrySetting{
101+
MetricsLevelStr: metricsLevelPtr.String(),
102+
}
103+
}
104+
105+
// GetMetricsLevel returns the parsed level, or error if unknown value.
106+
// Empty string is consider unknown value.
107+
func (ts TelemetrySetting) GetMetricsLevel() (Level, error) {
108+
return parseLevel(ts.MetricsLevelStr)
109+
}
110+
37111
// ParseLevel returns the Level represented by the string. The parsing is case-insensitive
38112
// and it returns error if the string value is unknown.
39-
func ParseLevel(str string) (Level, error) {
113+
func parseLevel(str string) (Level, error) {
40114
str = strings.ToLower(str)
41115

42116
switch str {
43-
case "none":
117+
case levelNoneStr:
44118
return LevelNone, nil
45-
case "basic":
119+
case levelBasicStr:
46120
return LevelBasic, nil
47-
case "normal":
121+
case levelNormalStr:
48122
return LevelNormal, nil
49-
case "detailed":
123+
case levelDetailedStr:
50124
return LevelDetailed, nil
51125
}
52126
return LevelNone, fmt.Errorf("unknown metrics level %q", str)

config/configtelemetry/configtelemetry_test.go

Lines changed: 105 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ import (
1818
"testing"
1919

2020
"github.com/stretchr/testify/assert"
21+
"github.com/stretchr/testify/require"
2122
)
2223

23-
func TestParseLevel(t *testing.T) {
24+
func TestParseFrom(t *testing.T) {
2425
tests := []struct {
2526
str string
2627
level Level
@@ -37,26 +38,26 @@ func TestParseLevel(t *testing.T) {
3738
err: true,
3839
},
3940
{
40-
str: "none",
41+
str: levelNoneStr,
4142
level: LevelNone,
4243
},
4344
{
44-
str: "basic",
45+
str: levelBasicStr,
4546
level: LevelBasic,
4647
},
4748
{
48-
str: "normal",
49+
str: levelNormalStr,
4950
level: LevelNormal,
5051
},
5152
{
52-
str: "detailed",
53+
str: levelDetailedStr,
5354
level: LevelDetailed,
5455
},
5556
}
5657

5758
for _, test := range tests {
5859
t.Run(test.str, func(t *testing.T) {
59-
lvl, err := ParseLevel(test.str)
60+
lvl, err := parseLevel(test.str)
6061
if test.err {
6162
assert.Error(t, err)
6263
} else {
@@ -66,3 +67,101 @@ func TestParseLevel(t *testing.T) {
6667
})
6768
}
6869
}
70+
71+
func TestLevelSet(t *testing.T) {
72+
tests := []struct {
73+
str string
74+
level Level
75+
err bool
76+
}{
77+
{
78+
str: "",
79+
level: LevelNone,
80+
err: true,
81+
},
82+
{
83+
str: "other_string",
84+
level: LevelNone,
85+
err: true,
86+
},
87+
{
88+
str: levelNoneStr,
89+
level: LevelNone,
90+
},
91+
{
92+
str: levelBasicStr,
93+
level: LevelBasic,
94+
},
95+
{
96+
str: levelNormalStr,
97+
level: LevelNormal,
98+
},
99+
{
100+
str: levelDetailedStr,
101+
level: LevelDetailed,
102+
},
103+
}
104+
for _, test := range tests {
105+
t.Run(test.str, func(t *testing.T) {
106+
lvl := new(Level)
107+
err := lvl.Set(test.str)
108+
if test.err {
109+
assert.Error(t, err)
110+
assert.Equal(t, LevelBasic, *lvl)
111+
} else {
112+
assert.NoError(t, err)
113+
assert.Equal(t, test.level, *lvl)
114+
}
115+
})
116+
}
117+
}
118+
119+
func TestLevelString(t *testing.T) {
120+
tests := []struct {
121+
str string
122+
level Level
123+
err bool
124+
}{
125+
{
126+
str: "unknown",
127+
level: Level(-10),
128+
},
129+
{
130+
str: levelNoneStr,
131+
level: LevelNone,
132+
},
133+
{
134+
str: levelBasicStr,
135+
level: LevelBasic,
136+
},
137+
{
138+
str: levelNormalStr,
139+
level: LevelNormal,
140+
},
141+
{
142+
str: levelDetailedStr,
143+
level: LevelDetailed,
144+
},
145+
}
146+
for _, test := range tests {
147+
t.Run(test.str, func(t *testing.T) {
148+
assert.Equal(t, test.str, test.level.String())
149+
})
150+
}
151+
}
152+
153+
func TestTelemetrySettings(t *testing.T) {
154+
ts := &TelemetrySetting{
155+
MetricsLevelStr: "unknown",
156+
}
157+
_, err := ts.GetMetricsLevel()
158+
assert.Error(t, err)
159+
}
160+
161+
func TestDefaultTelemetrySettings(t *testing.T) {
162+
ts := DefaultTelemetrySetting()
163+
assert.Equal(t, levelBasicStr, ts.MetricsLevelStr)
164+
lvl, err := ts.GetMetricsLevel()
165+
require.NoError(t, err)
166+
assert.Equal(t, LevelBasic, lvl)
167+
}

internal/collector/telemetry/telemetry.go

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,23 @@ package telemetry
1818
import (
1919
"flag"
2020

21-
"go.opentelemetry.io/collector/config/configtelemetry"
2221
"go.opentelemetry.io/collector/internal/version"
2322
)
2423

2524
const (
2625
metricsAddrCfg = "metrics-addr"
27-
metricsLevelCfg = "metrics-level"
2826
metricsPrefixCfg = "metrics-prefix"
2927
)
3028

3129
var (
3230
// Command-line flags that control publication of telemetry data.
33-
metricsLevelPtr *string
3431
metricsAddrPtr *string
3532
metricsPrefixPtr *string
3633

3734
addInstanceIDPtr *bool
3835
)
3936

4037
func Flags(flags *flag.FlagSet) {
41-
metricsLevelPtr = flags.String(
42-
metricsLevelCfg,
43-
"BASIC",
44-
"Output level of telemetry metrics (NONE, BASIC, NORMAL, DETAILED)")
45-
4638
// At least until we can use a generic, i.e.: OpenCensus, metrics exporter
4739
// we default to Prometheus at port 8888, if not otherwise specified.
4840
metricsAddrPtr = flags.String(
@@ -75,16 +67,6 @@ func GetAddInstanceID() bool {
7567
return *addInstanceIDPtr
7668
}
7769

78-
// GetLevel returns the Level represented by the string. The parsing is case-insensitive
79-
// and it returns error if the string value is unknown.
80-
func GetLevel() (configtelemetry.Level, error) {
81-
if metricsLevelPtr != nil && *metricsLevelPtr != "" {
82-
return configtelemetry.ParseLevel(*metricsLevelPtr)
83-
}
84-
85-
return configtelemetry.LevelBasic, nil
86-
}
87-
8870
func GetMetricsAddr() string {
8971
return *metricsAddrPtr
9072
}

processor/batchprocessor/factory.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import (
2020

2121
"go.opentelemetry.io/collector/component"
2222
"go.opentelemetry.io/collector/config/configmodels"
23+
"go.opentelemetry.io/collector/config/configtelemetry"
2324
"go.opentelemetry.io/collector/consumer"
24-
"go.opentelemetry.io/collector/internal/collector/telemetry"
2525
"go.opentelemetry.io/collector/processor/processorhelper"
2626
)
2727

@@ -61,8 +61,7 @@ func createTraceProcessor(
6161
nextConsumer consumer.TracesConsumer,
6262
) (component.TracesProcessor, error) {
6363
oCfg := cfg.(*Config)
64-
// error can be ignored, level is parsed at the service startup
65-
level, _ := telemetry.GetLevel()
64+
level := configtelemetry.GetMetricsLevelFlagValue()
6665
return newBatchTracesProcessor(params, nextConsumer, oCfg, level), nil
6766
}
6867

@@ -73,7 +72,7 @@ func createMetricsProcessor(
7372
nextConsumer consumer.MetricsConsumer,
7473
) (component.MetricsProcessor, error) {
7574
oCfg := cfg.(*Config)
76-
level, _ := telemetry.GetLevel()
75+
level := configtelemetry.GetMetricsLevelFlagValue()
7776
return newBatchMetricsProcessor(params, nextConsumer, oCfg, level), nil
7877
}
7978

@@ -84,6 +83,6 @@ func createLogsProcessor(
8483
nextConsumer consumer.LogsConsumer,
8584
) (component.LogsProcessor, error) {
8685
oCfg := cfg.(*Config)
87-
level, _ := telemetry.GetLevel()
86+
level := configtelemetry.GetMetricsLevelFlagValue()
8887
return newBatchLogsProcessor(params, nextConsumer, oCfg, level), nil
8988
}

processor/metrics.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323

2424
"go.opentelemetry.io/collector/config/configtelemetry"
2525
"go.opentelemetry.io/collector/consumer/pdata"
26-
"go.opentelemetry.io/collector/internal/collector/telemetry"
2726
"go.opentelemetry.io/collector/obsreport"
2827
"go.opentelemetry.io/collector/translator/conventions"
2928
)
@@ -147,8 +146,8 @@ func RecordsSpanCountMetrics(ctx context.Context, scm *SpanCountStats, measure *
147146
}
148147

149148
func serviceTagsEnabled() bool {
150-
level, err := telemetry.GetLevel()
151-
return err == nil && level == configtelemetry.LevelDetailed
149+
level := configtelemetry.GetMetricsLevelFlagValue()
150+
return level == configtelemetry.LevelDetailed
152151
}
153152

154153
// spanCountByResourceStringAttribute calculates the number of spans by resource specified by

service/service.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"go.opentelemetry.io/collector/config"
3939
"go.opentelemetry.io/collector/config/configcheck"
4040
"go.opentelemetry.io/collector/config/configmodels"
41+
"go.opentelemetry.io/collector/config/configtelemetry"
4142
"go.opentelemetry.io/collector/internal/collector/telemetry"
4243
"go.opentelemetry.io/collector/internal/version"
4344
"go.opentelemetry.io/collector/service/builder"
@@ -162,6 +163,7 @@ func New(params Parameters) (*Application, error) {
162163
// TODO: coalesce this code and expose this information to other components.
163164
flagSet := new(flag.FlagSet)
164165
addFlagsFns := []func(*flag.FlagSet){
166+
configtelemetry.Flags,
165167
telemetry.Flags,
166168
builder.Flags,
167169
loggerFlags,

0 commit comments

Comments
 (0)