Expose telemetry level in the configtelemetry (#1796)

Next PR will add a config setting that can be embedded in every component config.

Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com>
This commit is contained in:
Bogdan Drutu 2020-09-18 16:11:27 -07:00 committed by GitHub
parent 6d1c18940e
commit e7e6693926
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 107 additions and 71 deletions

View File

@ -0,0 +1,30 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package configtelemetry
const (
// LevelNone indicates that no telemetry data should be collected.
LevelNone Level = iota - 1
// LevelBasic is the default and covers the basics of the service telemetry.
LevelBasic
// LevelNormal adds some other indicators on top of basic.
LevelNormal
// LevelDetailed adds dimensions and views to the previous levels.
LevelDetailed
)
// Level is the level of internal telemetry (metrics, logs, traces about the component itself)
// that every component should generate.
type Level int8

View File

@ -0,0 +1,17 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package configtelemetry
// Package with interfaces and structs only.

View File

@ -20,6 +20,7 @@ import (
"fmt"
"strings"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/internal/version"
)
@ -27,17 +28,6 @@ const (
metricsAddrCfg = "metrics-addr"
metricsLevelCfg = "metrics-level"
metricsPrefixCfg = "metrics-prefix"
// Telemetry levels
//
// None indicates that no telemetry data should be collected.
None Level = iota - 1
// Basic is the default and covers the basics of the service telemetry.
Basic
// Normal adds some other indicators on top of basic.
Normal
// Detailed adds dimensions and views to the previous levels.
Detailed
)
var (
@ -97,17 +87,14 @@ func GetMetricsAddrDefault() string {
return ":8888"
}
// Level of telemetry data to be generated.
type Level int8
func GetAddInstanceID() bool {
return *addInstanceIDPtr
}
// GetLevel returns the Level represented by the string. The parsing is case-insensitive
// and it returns error if the string value is unknown.
func GetLevel() (Level, error) {
var level Level
func GetLevel() (configtelemetry.Level, error) {
var level configtelemetry.Level
var str string
if metricsLevelPtr != nil {
@ -116,13 +103,13 @@ func GetLevel() (Level, error) {
switch str {
case "none":
level = None
level = configtelemetry.LevelNone
case "", "basic":
level = Basic
level = configtelemetry.LevelBasic
case "normal":
level = Normal
level = configtelemetry.LevelNormal
case "detailed":
level = Detailed
level = configtelemetry.LevelDetailed
default:
return level, fmt.Errorf("unknown metrics level %q", str)
}

View File

@ -24,9 +24,9 @@ import (
"go.uber.org/zap"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/pdata"
"go.opentelemetry.io/collector/internal/collector/telemetry"
"go.opentelemetry.io/collector/processor"
)
@ -41,7 +41,7 @@ import (
type batchProcessor struct {
name string
logger *zap.Logger
telemetryLevel telemetry.Level
telemetryLevel configtelemetry.Level
sendBatchSize uint32
timeout time.Duration
@ -74,7 +74,7 @@ var _ consumer.TraceConsumer = (*batchProcessor)(nil)
var _ consumer.MetricsConsumer = (*batchProcessor)(nil)
var _ consumer.LogsConsumer = (*batchProcessor)(nil)
func newBatchProcessor(params component.ProcessorCreateParams, cfg *Config, batch batch, telemetryLevel telemetry.Level) *batchProcessor {
func newBatchProcessor(params component.ProcessorCreateParams, cfg *Config, batch batch, telemetryLevel configtelemetry.Level) *batchProcessor {
return &batchProcessor{
name: cfg.Name(),
logger: params.Logger,
@ -158,7 +158,7 @@ func (bp *batchProcessor) sendItems(measure *stats.Int64Measure) {
statsTags := []tag.Mutator{tag.Insert(processor.TagProcessorNameKey, bp.name)}
_ = stats.RecordWithTags(context.Background(), statsTags, measure.M(1), statBatchSendSize.M(int64(bp.batch.itemCount())))
if bp.telemetryLevel == telemetry.Detailed {
if bp.telemetryLevel == configtelemetry.LevelDetailed {
_ = stats.RecordWithTags(context.Background(), statsTags, statBatchSendSizeBytes.M(int64(bp.batch.size())))
}
@ -188,17 +188,17 @@ func (bp *batchProcessor) ConsumeLogs(_ context.Context, ld pdata.Logs) error {
}
// newBatchTracesProcessor creates a new batch processor that batches traces by size or with timeout
func newBatchTracesProcessor(params component.ProcessorCreateParams, trace consumer.TraceConsumer, cfg *Config, telemetryLevel telemetry.Level) *batchProcessor {
func newBatchTracesProcessor(params component.ProcessorCreateParams, trace consumer.TraceConsumer, cfg *Config, telemetryLevel configtelemetry.Level) *batchProcessor {
return newBatchProcessor(params, cfg, newBatchTraces(trace), telemetryLevel)
}
// newBatchMetricsProcessor creates a new batch processor that batches metrics by size or with timeout
func newBatchMetricsProcessor(params component.ProcessorCreateParams, metrics consumer.MetricsConsumer, cfg *Config, telemetryLevel telemetry.Level) *batchProcessor {
func newBatchMetricsProcessor(params component.ProcessorCreateParams, metrics consumer.MetricsConsumer, cfg *Config, telemetryLevel configtelemetry.Level) *batchProcessor {
return newBatchProcessor(params, cfg, newBatchMetrics(metrics), telemetryLevel)
}
// newBatchLogsProcessor creates a new batch processor that batches logs by size or with timeout
func newBatchLogsProcessor(params component.ProcessorCreateParams, logs consumer.LogsConsumer, cfg *Config, telemetryLevel telemetry.Level) *batchProcessor {
func newBatchLogsProcessor(params component.ProcessorCreateParams, logs consumer.LogsConsumer, cfg *Config, telemetryLevel configtelemetry.Level) *batchProcessor {
return newBatchProcessor(params, cfg, newBatchLogs(logs), telemetryLevel)
}

View File

@ -27,9 +27,9 @@ import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/consumer/pdata"
"go.opentelemetry.io/collector/exporter/exportertest"
"go.opentelemetry.io/collector/internal/collector/telemetry"
"go.opentelemetry.io/collector/internal/data/testdata"
)
@ -38,7 +38,7 @@ func TestBatchProcessorSpansDelivered(t *testing.T) {
cfg := createDefaultConfig().(*Config)
cfg.SendBatchSize = 128
creationParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchTracesProcessor(creationParams, sink, cfg, telemetry.Detailed)
batcher := newBatchTracesProcessor(creationParams, sink, cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
requestCount := 1000
@ -79,7 +79,7 @@ func TestBatchProcessorSpansDeliveredEnforceBatchSize(t *testing.T) {
cfg.SendBatchSize = 128
cfg.SendBatchMaxSize = 128
creationParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchTracesProcessor(creationParams, sink, cfg, telemetry.Basic)
batcher := newBatchTracesProcessor(creationParams, sink, cfg, configtelemetry.LevelBasic)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
requestCount := 1000
@ -116,7 +116,7 @@ func TestBatchProcessorSpansDeliveredEnforceBatchSize(t *testing.T) {
}
func TestBatchProcessorSentBySize(t *testing.T) {
views := MetricViews(telemetry.Detailed)
views := MetricViews(configtelemetry.LevelDetailed)
view.Register(views...)
defer view.Unregister(views...)
@ -126,7 +126,7 @@ func TestBatchProcessorSentBySize(t *testing.T) {
cfg.SendBatchSize = uint32(sendBatchSize)
cfg.Timeout = 500 * time.Millisecond
creationParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchTracesProcessor(creationParams, sink, cfg, telemetry.Detailed)
batcher := newBatchTracesProcessor(creationParams, sink, cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
requestCount := 100
@ -188,7 +188,7 @@ func TestBatchProcessorSentByTimeout(t *testing.T) {
spansPerRequest := 10
start := time.Now()
batcher := newBatchTracesProcessor(creationParams, sink, cfg, telemetry.Detailed)
batcher := newBatchTracesProcessor(creationParams, sink, cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
for requestNum := 0; requestNum < requestCount; requestNum++ {
@ -233,7 +233,7 @@ func TestBatchProcessorTraceSendWhenClosing(t *testing.T) {
sink := &exportertest.SinkTraceExporter{}
creationParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchTracesProcessor(creationParams, sink, &cfg, telemetry.Detailed)
batcher := newBatchTracesProcessor(creationParams, sink, &cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
requestCount := 10
@ -262,7 +262,7 @@ func TestBatchMetricProcessor_ReceivingData(t *testing.T) {
sink := &exportertest.SinkMetricsExporter{}
createParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchMetricsProcessor(createParams, sink, &cfg, telemetry.Detailed)
batcher := newBatchMetricsProcessor(createParams, sink, &cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
metricDataSlice := make([]pdata.Metrics, 0, requestCount)
@ -297,7 +297,7 @@ func TestBatchMetricProcessor_ReceivingData(t *testing.T) {
}
func TestBatchMetricProcessor_BatchSize(t *testing.T) {
views := MetricViews(telemetry.Detailed)
views := MetricViews(configtelemetry.LevelDetailed)
view.Register(views...)
defer view.Unregister(views...)
@ -313,7 +313,7 @@ func TestBatchMetricProcessor_BatchSize(t *testing.T) {
sink := &exportertest.SinkMetricsExporter{}
createParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchMetricsProcessor(createParams, sink, &cfg, telemetry.Detailed)
batcher := newBatchMetricsProcessor(createParams, sink, &cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
start := time.Now()
@ -368,7 +368,7 @@ func TestBatchMetricsProcessor_Timeout(t *testing.T) {
sink := &exportertest.SinkMetricsExporter{}
createParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchMetricsProcessor(createParams, sink, &cfg, telemetry.Detailed)
batcher := newBatchMetricsProcessor(createParams, sink, &cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
start := time.Now()
@ -415,7 +415,7 @@ func TestBatchMetricProcessor_Shutdown(t *testing.T) {
sink := &exportertest.SinkMetricsExporter{}
createParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchMetricsProcessor(createParams, sink, &cfg, telemetry.Detailed)
batcher := newBatchMetricsProcessor(createParams, sink, &cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
for requestNum := 0; requestNum < requestCount; requestNum++ {
@ -518,7 +518,7 @@ func TestBatchLogProcessor_ReceivingData(t *testing.T) {
sink := &exportertest.SinkLogsExporter{}
createParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchLogsProcessor(createParams, sink, &cfg, telemetry.Detailed)
batcher := newBatchLogsProcessor(createParams, sink, &cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
logDataSlice := make([]pdata.Logs, 0, requestCount)
@ -553,7 +553,7 @@ func TestBatchLogProcessor_ReceivingData(t *testing.T) {
}
func TestBatchLogProcessor_BatchSize(t *testing.T) {
views := MetricViews(telemetry.Detailed)
views := MetricViews(configtelemetry.LevelDetailed)
view.Register(views...)
defer view.Unregister(views...)
@ -569,7 +569,7 @@ func TestBatchLogProcessor_BatchSize(t *testing.T) {
sink := &exportertest.SinkLogsExporter{}
createParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchLogsProcessor(createParams, sink, &cfg, telemetry.Detailed)
batcher := newBatchLogsProcessor(createParams, sink, &cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
start := time.Now()
@ -624,7 +624,7 @@ func TestBatchLogsProcessor_Timeout(t *testing.T) {
sink := &exportertest.SinkLogsExporter{}
createParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchLogsProcessor(createParams, sink, &cfg, telemetry.Detailed)
batcher := newBatchLogsProcessor(createParams, sink, &cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
start := time.Now()
@ -671,7 +671,7 @@ func TestBatchLogProcessor_Shutdown(t *testing.T) {
sink := &exportertest.SinkLogsExporter{}
createParams := component.ProcessorCreateParams{Logger: zap.NewNop()}
batcher := newBatchLogsProcessor(createParams, sink, &cfg, telemetry.Detailed)
batcher := newBatchLogsProcessor(createParams, sink, &cfg, configtelemetry.LevelDetailed)
require.NoError(t, batcher.Start(context.Background(), componenttest.NewNopHost()))
for requestNum := 0; requestNum < requestCount; requestNum++ {

View File

@ -19,7 +19,7 @@ import (
"go.opencensus.io/stats/view"
"go.opencensus.io/tag"
"go.opentelemetry.io/collector/internal/collector/telemetry"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/obsreport"
"go.opentelemetry.io/collector/processor"
)
@ -32,8 +32,8 @@ var (
)
// MetricViews returns the metrics views related to batching
func MetricViews(level telemetry.Level) []*view.View {
if level == telemetry.None {
func MetricViews(level configtelemetry.Level) []*view.View {
if level == configtelemetry.LevelNone {
return nil
}

View File

@ -19,21 +19,21 @@ import (
"github.com/stretchr/testify/assert"
"go.opentelemetry.io/collector/internal/collector/telemetry"
"go.opentelemetry.io/collector/config/configtelemetry"
)
func TestBatchProcessorMetrics(t *testing.T) {
tests := []struct {
viewNames []string
level telemetry.Level
level configtelemetry.Level
}{
{
viewNames: []string{"batch_size_trigger_send", "timeout_trigger_send", "batch_send_size", "batch_send_size_bytes"},
level: telemetry.Detailed,
level: configtelemetry.LevelDetailed,
},
{
viewNames: []string{},
level: telemetry.None,
level: configtelemetry.LevelNone,
},
}
for _, test := range tests {

View File

@ -22,6 +22,7 @@ import (
"go.opencensus.io/stats/view"
"go.opencensus.io/tag"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/consumer/pdata"
"go.opentelemetry.io/collector/internal/collector/telemetry"
"go.opentelemetry.io/collector/obsreport"
@ -72,13 +73,13 @@ func (scm *SpanCountStats) GetAllSpansCount() int {
}
// MetricTagKeys returns the metric tag keys according to the given telemetry level.
func MetricTagKeys(level telemetry.Level) []tag.Key {
func MetricTagKeys(level configtelemetry.Level) []tag.Key {
var tagKeys []tag.Key
switch level {
case telemetry.Detailed:
case configtelemetry.LevelDetailed:
tagKeys = append(tagKeys, TagServiceNameKey)
fallthrough
case telemetry.Normal, telemetry.Basic:
case configtelemetry.LevelNormal, configtelemetry.LevelBasic:
tagKeys = append(tagKeys, TagProcessorNameKey)
default:
return nil
@ -88,7 +89,7 @@ func MetricTagKeys(level telemetry.Level) []tag.Key {
}
// MetricViews return the metrics views according to given telemetry level.
func MetricViews(level telemetry.Level) []*view.View {
func MetricViews(level configtelemetry.Level) []*view.View {
tagKeys := MetricTagKeys(level)
if tagKeys == nil {
return nil
@ -177,7 +178,7 @@ func RecordsSpanCountMetrics(ctx context.Context, scm *SpanCountStats, measure *
func serviceTagsEnabled() bool {
level, err := telemetry.GetLevel()
return err == nil && level == telemetry.Detailed
return err == nil && level == configtelemetry.LevelDetailed
}
// spanCountByResourceStringAttribute calculates the number of spans by resource specified by

View File

@ -19,7 +19,7 @@ import (
"go.opencensus.io/stats/view"
"go.opencensus.io/tag"
"go.opentelemetry.io/collector/internal/collector/telemetry"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/obsreport"
"go.opentelemetry.io/collector/processor"
)
@ -58,8 +58,8 @@ var (
)
// MetricViews return the metrics views according to given telemetry level.
func MetricViews(level telemetry.Level) []*view.View {
if level == telemetry.None {
func MetricViews(level configtelemetry.Level) []*view.View {
if level == configtelemetry.LevelNone {
return nil
}

View File

@ -30,10 +30,10 @@ import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumererror"
"go.opentelemetry.io/collector/consumer/pdata"
"go.opentelemetry.io/collector/internal/collector/telemetry"
"go.opentelemetry.io/collector/internal/data/testdata"
"go.opentelemetry.io/collector/obsreport/obsreporttest"
"go.opentelemetry.io/collector/processor"
@ -289,7 +289,7 @@ func TestTraceQueueProcessorHappyPath(t *testing.T) {
require.NoError(t, err)
defer doneFn()
views := processor.MetricViews(telemetry.Detailed)
views := processor.MetricViews(configtelemetry.LevelDetailed)
assert.NoError(t, view.Register(views...))
defer view.Unregister(views...)

View File

@ -19,7 +19,7 @@ import (
"go.opencensus.io/stats/view"
"go.opencensus.io/tag"
"go.opentelemetry.io/collector/internal/collector/telemetry"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/obsreport"
)
@ -45,8 +45,8 @@ var (
)
// SamplingProcessorMetricViews return the metrics views according to given telemetry level.
func SamplingProcessorMetricViews(level telemetry.Level) []*view.View {
if level == telemetry.None {
func SamplingProcessorMetricViews(level configtelemetry.Level) []*view.View {
if level == configtelemetry.LevelNone {
return nil
}

View File

@ -20,7 +20,7 @@ import (
"go.opencensus.io/stats"
"go.opencensus.io/stats/view"
"go.opentelemetry.io/collector/internal/collector/telemetry"
"go.opentelemetry.io/collector/config/configtelemetry"
)
var (
@ -80,8 +80,8 @@ var (
}
)
func Views(level telemetry.Level) []*view.View {
if level == telemetry.None {
func Views(level configtelemetry.Level) []*view.View {
if level == configtelemetry.LevelNone {
return nil
}

View File

@ -19,10 +19,10 @@ import (
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/internal/collector/telemetry"
"go.opentelemetry.io/collector/config/configtelemetry"
)
func TestViews(t *testing.T) {
require.Greater(t, len(Views(telemetry.Basic)), 2)
require.Len(t, Views(telemetry.None), 0)
require.Greater(t, len(Views(configtelemetry.LevelBasic)), 2)
require.Len(t, Views(configtelemetry.LevelNone), 0)
}

View File

@ -25,6 +25,7 @@ import (
"go.opencensus.io/stats/view"
"go.uber.org/zap"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/internal/collector/telemetry"
"go.opentelemetry.io/collector/obsreport"
"go.opentelemetry.io/collector/processor"
@ -58,7 +59,7 @@ func (tel *appTelemetry) init(asyncErrorChannel chan<- error, ballastSizeBytes u
metricsAddr := telemetry.GetMetricsAddr()
if level == telemetry.None || metricsAddr == "" {
if level == configtelemetry.LevelNone || metricsAddr == "" {
return nil
}