Skip to content

Commit be92a1f

Browse files
authored
chore: split service metric views into an internal package (open-telemetry#14392)
Those metric views are getting quite frequent updates, and start becoming less and less trivial to have within a single file. This splits them into their own internal submodule, so we can start splitting them into their own submethods as needed later on.
1 parent d31b1e4 commit be92a1f

File tree

3 files changed

+194
-137
lines changed

3 files changed

+194
-137
lines changed
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package metricviews // import "go.opentelemetry.io/collector/service/internal/metricviews"
5+
6+
import (
7+
config "go.opentelemetry.io/contrib/otelconf/v0.3.0"
8+
9+
"go.opentelemetry.io/collector/config/configtelemetry"
10+
)
11+
12+
// DefaultViews builds the default metric views used by the service.
13+
func DefaultViews(level configtelemetry.Level) []config.View {
14+
views := []config.View{}
15+
16+
if level < configtelemetry.LevelDetailed {
17+
// Drop all otelhttp and otelgrpc metrics if the level is not detailed.
18+
views = append(views,
19+
dropViewOption(&config.ViewSelector{
20+
MeterName: ptr("go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"),
21+
}),
22+
dropViewOption(&config.ViewSelector{
23+
MeterName: ptr("go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"),
24+
}),
25+
// Drop duration metric if the level is not detailed
26+
dropViewOption(&config.ViewSelector{
27+
MeterName: ptr("go.opentelemetry.io/collector/processor/processorhelper"),
28+
InstrumentName: ptr("otelcol_processor_internal_duration"),
29+
}),
30+
)
31+
}
32+
33+
// otel-arrow library metrics
34+
// See https://github.com/open-telemetry/otel-arrow/blob/c39257/pkg/otel/arrow_record/consumer.go#L174-L176
35+
if level < configtelemetry.LevelNormal {
36+
scope := ptr("otel-arrow/pkg/otel/arrow_record")
37+
views = append(views,
38+
dropViewOption(&config.ViewSelector{
39+
MeterName: scope,
40+
InstrumentName: ptr("arrow_batch_records"),
41+
}),
42+
dropViewOption(&config.ViewSelector{
43+
MeterName: scope,
44+
InstrumentName: ptr("arrow_schema_resets"),
45+
}),
46+
dropViewOption(&config.ViewSelector{
47+
MeterName: scope,
48+
InstrumentName: ptr("arrow_memory_inuse"),
49+
}),
50+
)
51+
}
52+
53+
// contrib's internal/otelarrow/netstats metrics
54+
// See
55+
// - https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a25f05/internal/otelarrow/netstats/netstats.go#L130
56+
// - https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a25f05/internal/otelarrow/netstats/netstats.go#L165
57+
if level < configtelemetry.LevelDetailed {
58+
scope := ptr("github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats")
59+
60+
views = append(views,
61+
// Compressed size metrics.
62+
dropViewOption(&config.ViewSelector{
63+
MeterName: scope,
64+
InstrumentName: ptr("otelcol_*_compressed_size"),
65+
}),
66+
dropViewOption(&config.ViewSelector{
67+
MeterName: scope,
68+
InstrumentName: ptr("otelcol_*_compressed_size"),
69+
}),
70+
71+
// makeRecvMetrics for exporters.
72+
dropViewOption(&config.ViewSelector{
73+
MeterName: scope,
74+
InstrumentName: ptr("otelcol_exporter_recv"),
75+
}),
76+
dropViewOption(&config.ViewSelector{
77+
MeterName: scope,
78+
InstrumentName: ptr("otelcol_exporter_recv_wire"),
79+
}),
80+
81+
// makeSentMetrics for receivers.
82+
dropViewOption(&config.ViewSelector{
83+
MeterName: scope,
84+
InstrumentName: ptr("otelcol_receiver_sent"),
85+
}),
86+
dropViewOption(&config.ViewSelector{
87+
MeterName: scope,
88+
InstrumentName: ptr("otelcol_receiver_sent_wire"),
89+
}),
90+
)
91+
}
92+
93+
// Batch exporter metrics
94+
if level < configtelemetry.LevelDetailed {
95+
scope := ptr("go.opentelemetry.io/collector/exporter/exporterhelper")
96+
views = append(views, dropViewOption(&config.ViewSelector{
97+
MeterName: scope,
98+
InstrumentName: ptr("otelcol_exporter_queue_batch_send_size_bytes"),
99+
}))
100+
}
101+
102+
// Batch processor metrics
103+
scope := ptr("go.opentelemetry.io/collector/processor/batchprocessor")
104+
if level < configtelemetry.LevelNormal {
105+
views = append(views, dropViewOption(&config.ViewSelector{
106+
MeterName: scope,
107+
}))
108+
} else if level < configtelemetry.LevelDetailed {
109+
views = append(views, dropViewOption(&config.ViewSelector{
110+
MeterName: scope,
111+
InstrumentName: ptr("otelcol_processor_batch_batch_send_size_bytes"),
112+
}))
113+
}
114+
115+
// Internal graph metrics
116+
graphScope := ptr("go.opentelemetry.io/collector/service")
117+
if level < configtelemetry.LevelDetailed {
118+
views = append(views,
119+
dropViewOption(&config.ViewSelector{
120+
MeterName: graphScope,
121+
InstrumentName: ptr("otelcol.*.consumed.size"),
122+
}),
123+
dropViewOption(&config.ViewSelector{
124+
MeterName: graphScope,
125+
InstrumentName: ptr("otelcol.*.produced.size"),
126+
}))
127+
}
128+
129+
return views
130+
}
131+
132+
func dropViewOption(selector *config.ViewSelector) config.View {
133+
return config.View{
134+
Selector: selector,
135+
Stream: &config.ViewStream{
136+
Aggregation: &config.ViewStreamAggregation{
137+
Drop: config.ViewStreamAggregationDrop{},
138+
},
139+
},
140+
}
141+
}
142+
143+
func ptr[T any](v T) *T {
144+
return &v
145+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package metricviews
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
11+
"go.opentelemetry.io/collector/config/configtelemetry"
12+
)
13+
14+
func TestDefaultViews(t *testing.T) {
15+
for _, tt := range []struct {
16+
name string
17+
level configtelemetry.Level
18+
19+
wantViewsCount int
20+
}{
21+
{
22+
name: "None",
23+
level: configtelemetry.LevelNone,
24+
wantViewsCount: 16,
25+
},
26+
{
27+
name: "Basic",
28+
level: configtelemetry.LevelBasic,
29+
wantViewsCount: 16,
30+
},
31+
{
32+
name: "Normal",
33+
level: configtelemetry.LevelNormal,
34+
wantViewsCount: 13,
35+
},
36+
{
37+
name: "Detailed",
38+
level: configtelemetry.LevelDetailed,
39+
wantViewsCount: 0,
40+
},
41+
} {
42+
t.Run(tt.name, func(t *testing.T) {
43+
views := DefaultViews(tt.level)
44+
assert.Len(t, views, tt.wantViewsCount)
45+
})
46+
}
47+
}

service/service.go

Lines changed: 2 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,12 @@ import (
1111
"fmt"
1212
"runtime"
1313

14-
config "go.opentelemetry.io/contrib/otelconf/v0.3.0"
1514
noopmetric "go.opentelemetry.io/otel/metric/noop"
1615
nooptrace "go.opentelemetry.io/otel/trace/noop"
1716
"go.uber.org/multierr"
1817
"go.uber.org/zap"
1918

2019
"go.opentelemetry.io/collector/component"
21-
"go.opentelemetry.io/collector/config/configtelemetry"
2220
"go.opentelemetry.io/collector/confmap"
2321
"go.opentelemetry.io/collector/connector"
2422
"go.opentelemetry.io/collector/exporter"
@@ -29,6 +27,7 @@ import (
2927
"go.opentelemetry.io/collector/service/extensions"
3028
"go.opentelemetry.io/collector/service/internal/builders"
3129
"go.opentelemetry.io/collector/service/internal/graph"
30+
"go.opentelemetry.io/collector/service/internal/metricviews"
3231
"go.opentelemetry.io/collector/service/internal/moduleinfo"
3332
"go.opentelemetry.io/collector/service/internal/proctelemetry"
3433
"go.opentelemetry.io/collector/service/internal/status"
@@ -172,7 +171,7 @@ func New(ctx context.Context, set Settings, cfg Config) (_ *Service, resultErr e
172171
meterSettings := telemetry.MeterSettings{
173172
Settings: telemetrySettings,
174173
Logger: logger,
175-
DefaultViews: configureViews,
174+
DefaultViews: metricviews.DefaultViews,
176175
}
177176
meterProvider, err := set.TelemetryFactory.CreateMeterProvider(ctx, meterSettings, cfg.Telemetry)
178177
if err != nil {
@@ -343,140 +342,6 @@ func (srv *Service) Logger() *zap.Logger {
343342
return srv.telemetrySettings.Logger
344343
}
345344

346-
func dropViewOption(selector *config.ViewSelector) config.View {
347-
return config.View{
348-
Selector: selector,
349-
Stream: &config.ViewStream{
350-
Aggregation: &config.ViewStreamAggregation{
351-
Drop: config.ViewStreamAggregationDrop{},
352-
},
353-
},
354-
}
355-
}
356-
357-
func configureViews(level configtelemetry.Level) []config.View {
358-
views := []config.View{}
359-
360-
if level < configtelemetry.LevelDetailed {
361-
// Drop all otelhttp and otelgrpc metrics if the level is not detailed.
362-
views = append(views,
363-
dropViewOption(&config.ViewSelector{
364-
MeterName: ptr("go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"),
365-
}),
366-
dropViewOption(&config.ViewSelector{
367-
MeterName: ptr("go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"),
368-
}),
369-
// Drop duration metric if the level is not detailed
370-
dropViewOption(&config.ViewSelector{
371-
MeterName: ptr("go.opentelemetry.io/collector/processor/processorhelper"),
372-
InstrumentName: ptr("otelcol_processor_internal_duration"),
373-
}),
374-
)
375-
}
376-
377-
// otel-arrow library metrics
378-
// See https://github.com/open-telemetry/otel-arrow/blob/c39257/pkg/otel/arrow_record/consumer.go#L174-L176
379-
if level < configtelemetry.LevelNormal {
380-
scope := ptr("otel-arrow/pkg/otel/arrow_record")
381-
views = append(views,
382-
dropViewOption(&config.ViewSelector{
383-
MeterName: scope,
384-
InstrumentName: ptr("arrow_batch_records"),
385-
}),
386-
dropViewOption(&config.ViewSelector{
387-
MeterName: scope,
388-
InstrumentName: ptr("arrow_schema_resets"),
389-
}),
390-
dropViewOption(&config.ViewSelector{
391-
MeterName: scope,
392-
InstrumentName: ptr("arrow_memory_inuse"),
393-
}),
394-
)
395-
}
396-
397-
// contrib's internal/otelarrow/netstats metrics
398-
// See
399-
// - https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a25f05/internal/otelarrow/netstats/netstats.go#L130
400-
// - https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a25f05/internal/otelarrow/netstats/netstats.go#L165
401-
if level < configtelemetry.LevelDetailed {
402-
scope := ptr("github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats")
403-
404-
views = append(views,
405-
// Compressed size metrics.
406-
dropViewOption(&config.ViewSelector{
407-
MeterName: scope,
408-
InstrumentName: ptr("otelcol_*_compressed_size"),
409-
}),
410-
dropViewOption(&config.ViewSelector{
411-
MeterName: scope,
412-
InstrumentName: ptr("otelcol_*_compressed_size"),
413-
}),
414-
415-
// makeRecvMetrics for exporters.
416-
dropViewOption(&config.ViewSelector{
417-
MeterName: scope,
418-
InstrumentName: ptr("otelcol_exporter_recv"),
419-
}),
420-
dropViewOption(&config.ViewSelector{
421-
MeterName: scope,
422-
InstrumentName: ptr("otelcol_exporter_recv_wire"),
423-
}),
424-
425-
// makeSentMetrics for receivers.
426-
dropViewOption(&config.ViewSelector{
427-
MeterName: scope,
428-
InstrumentName: ptr("otelcol_receiver_sent"),
429-
}),
430-
dropViewOption(&config.ViewSelector{
431-
MeterName: scope,
432-
InstrumentName: ptr("otelcol_receiver_sent_wire"),
433-
}),
434-
)
435-
}
436-
437-
// Batch exporter metrics
438-
if level < configtelemetry.LevelDetailed {
439-
scope := ptr("go.opentelemetry.io/collector/exporter/exporterhelper")
440-
views = append(views, dropViewOption(&config.ViewSelector{
441-
MeterName: scope,
442-
InstrumentName: ptr("otelcol_exporter_queue_batch_send_size_bytes"),
443-
}))
444-
}
445-
446-
// Batch processor metrics
447-
scope := ptr("go.opentelemetry.io/collector/processor/batchprocessor")
448-
if level < configtelemetry.LevelNormal {
449-
views = append(views, dropViewOption(&config.ViewSelector{
450-
MeterName: scope,
451-
}))
452-
} else if level < configtelemetry.LevelDetailed {
453-
views = append(views, dropViewOption(&config.ViewSelector{
454-
MeterName: scope,
455-
InstrumentName: ptr("otelcol_processor_batch_batch_send_size_bytes"),
456-
}))
457-
}
458-
459-
// Internal graph metrics
460-
graphScope := ptr("go.opentelemetry.io/collector/service")
461-
if level < configtelemetry.LevelDetailed {
462-
views = append(views,
463-
dropViewOption(&config.ViewSelector{
464-
MeterName: graphScope,
465-
InstrumentName: ptr("otelcol.*.consumed.size"),
466-
}),
467-
dropViewOption(&config.ViewSelector{
468-
MeterName: graphScope,
469-
InstrumentName: ptr("otelcol.*.produced.size"),
470-
}))
471-
}
472-
473-
return views
474-
}
475-
476-
func ptr[T any](v T) *T {
477-
return &v
478-
}
479-
480345
// Validate verifies the graph by calling the internal graph.Build.
481346
func Validate(ctx context.Context, set Settings, cfg Config) error {
482347
tel := component.TelemetrySettings{

0 commit comments

Comments
 (0)