diff --git a/sdk/internal/env/env.go b/sdk/internal/env/env.go new file mode 100644 index 00000000000..397fd9593cc --- /dev/null +++ b/sdk/internal/env/env.go @@ -0,0 +1,88 @@ +// 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 env // import "go.opentelemetry.io/otel/sdk/internal/env" + +import ( + "os" + "strconv" + + "go.opentelemetry.io/otel/internal/global" +) + +// Environment variable names +const ( + // BatchSpanProcessorScheduleDelayKey + // Delay interval between two consecutive exports. + // i.e. 5000 + BatchSpanProcessorScheduleDelayKey = "OTEL_BSP_SCHEDULE_DELAY" + // BatchSpanProcessorExportTimeoutKey + // Maximum allowed time to export data. + // i.e. 3000 + BatchSpanProcessorExportTimeoutKey = "OTEL_BSP_EXPORT_TIMEOUT" + // BatchSpanProcessorMaxQueueSizeKey + // Maximum queue size + // i.e. 2048 + BatchSpanProcessorMaxQueueSizeKey = "OTEL_BSP_MAX_QUEUE_SIZE" + // BatchSpanProcessorMaxExportBatchSizeKey + // Maximum batch size + // Note: Must be less than or equal to EnvBatchSpanProcessorMaxQueueSize + // i.e. 512 + BatchSpanProcessorMaxExportBatchSizeKey = "OTEL_BSP_MAX_EXPORT_BATCH_SIZE" +) + +// IntEnvOr returns the int value of the environment variable with name key if +// it exists and the value is an int. Otherwise, defaultValue is returned. +func IntEnvOr(key string, defaultValue int) int { + value, ok := os.LookupEnv(key) + if !ok { + return defaultValue + } + + intValue, err := strconv.Atoi(value) + if err != nil { + global.Info("Got invalid value, number value expected.", key, value) + return defaultValue + } + + return intValue +} + +// BatchSpanProcessorScheduleDelay returns the environment variable value for +// the OTEL_BSP_SCHEDULE_DELAY key if it exists, otherwise defaultValue is +// returned. +func BatchSpanProcessorScheduleDelay(defaultValue int) int { + return IntEnvOr(BatchSpanProcessorScheduleDelayKey, defaultValue) +} + +// BatchSpanProcessorExportTimeout returns the environment variable value for +// the OTEL_BSP_EXPORT_TIMEOUT key if it exists, otherwise defaultValue is +// returned. +func BatchSpanProcessorExportTimeout(defaultValue int) int { + return IntEnvOr(BatchSpanProcessorExportTimeoutKey, defaultValue) +} + +// BatchSpanProcessorMaxQueueSize returns the environment variable value for +// the OTEL_BSP_MAX_QUEUE_SIZE key if it exists, otherwise defaultValue is +// returned. +func BatchSpanProcessorMaxQueueSize(defaultValue int) int { + return IntEnvOr(BatchSpanProcessorMaxQueueSizeKey, defaultValue) +} + +// BatchSpanProcessorMaxExportBatchSize returns the environment variable value for +// the OTEL_BSP_MAX_EXPORT_BATCH_SIZE key if it exists, otherwise defaultValue +// is returned. +func BatchSpanProcessorMaxExportBatchSize(defaultValue int) int { + return IntEnvOr(BatchSpanProcessorMaxExportBatchSizeKey, defaultValue) +} diff --git a/sdk/trace/env_test.go b/sdk/internal/env/env_test.go similarity index 86% rename from sdk/trace/env_test.go rename to sdk/internal/env/env_test.go index be37eae5744..8c293f65453 100644 --- a/sdk/trace/env_test.go +++ b/sdk/internal/env/env_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package trace +package env import ( "os" @@ -46,14 +46,14 @@ func TestIntEnvOr(t *testing.T) { } envStore := ottest.NewEnvStore() - envStore.Record(EnvBatchSpanProcessorMaxQueueSize) + envStore.Record(BatchSpanProcessorMaxQueueSizeKey) defer func() { require.NoError(t, envStore.Restore()) }() for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - require.NoError(t, os.Setenv(EnvBatchSpanProcessorMaxQueueSize, tc.envValue)) - actualValue := intEnvOr(EnvBatchSpanProcessorMaxQueueSize, tc.defaultValue) + require.NoError(t, os.Setenv(BatchSpanProcessorMaxQueueSizeKey, tc.envValue)) + actualValue := BatchSpanProcessorMaxQueueSize(tc.defaultValue) assert.Equal(t, tc.expectedValue, actualValue) }) } diff --git a/sdk/trace/batch_span_processor.go b/sdk/trace/batch_span_processor.go index 57f346aa08b..6a7b9dc31bd 100644 --- a/sdk/trace/batch_span_processor.go +++ b/sdk/trace/batch_span_processor.go @@ -23,6 +23,7 @@ import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/internal/global" + "go.opentelemetry.io/otel/sdk/internal/env" "go.opentelemetry.io/otel/trace" ) @@ -89,8 +90,8 @@ var _ SpanProcessor = (*batchSpanProcessor)(nil) // // If the exporter is nil, the span processor will preform no action. func NewBatchSpanProcessor(exporter SpanExporter, options ...BatchSpanProcessorOption) SpanProcessor { - maxQueueSize := intEnvOr(EnvBatchSpanProcessorMaxQueueSize, DefaultMaxQueueSize) - maxExportBatchSize := intEnvOr(EnvBatchSpanProcessorMaxExportBatchSize, DefaultMaxExportBatchSize) + maxQueueSize := env.BatchSpanProcessorMaxQueueSize(DefaultMaxQueueSize) + maxExportBatchSize := env.BatchSpanProcessorMaxExportBatchSize(DefaultMaxExportBatchSize) if maxExportBatchSize > maxQueueSize { if DefaultMaxExportBatchSize > maxQueueSize { @@ -101,8 +102,8 @@ func NewBatchSpanProcessor(exporter SpanExporter, options ...BatchSpanProcessorO } o := BatchSpanProcessorOptions{ - BatchTimeout: time.Duration(intEnvOr(EnvBatchSpanProcessorScheduleDelay, DefaultScheduleDelay)) * time.Millisecond, - ExportTimeout: time.Duration(intEnvOr(EnvBatchSpanProcessorExportTimeout, DefaultExportTimeout)) * time.Millisecond, + BatchTimeout: time.Duration(env.BatchSpanProcessorScheduleDelay(DefaultScheduleDelay)) * time.Millisecond, + ExportTimeout: time.Duration(env.BatchSpanProcessorExportTimeout(DefaultExportTimeout)) * time.Millisecond, MaxQueueSize: maxQueueSize, MaxExportBatchSize: maxExportBatchSize, } diff --git a/sdk/trace/batch_span_processor_test.go b/sdk/trace/batch_span_processor_test.go index f361b535d0f..255f8621160 100644 --- a/sdk/trace/batch_span_processor_test.go +++ b/sdk/trace/batch_span_processor_test.go @@ -31,6 +31,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/otel/internal/global" + "go.opentelemetry.io/otel/sdk/internal/env" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/sdk/trace/tracetest" "go.opentelemetry.io/otel/trace" @@ -233,8 +234,8 @@ func TestNewBatchSpanProcessorWithEnvOptions(t *testing.T) { wantBatchCount: 1, genNumSpans: 2053, envs: map[string]string{ - sdktrace.EnvBatchSpanProcessorMaxQueueSize: "5000", - sdktrace.EnvBatchSpanProcessorMaxExportBatchSize: "5000", + env.BatchSpanProcessorMaxQueueSizeKey: "5000", + env.BatchSpanProcessorMaxExportBatchSizeKey: "5000", }, }, { @@ -243,8 +244,8 @@ func TestNewBatchSpanProcessorWithEnvOptions(t *testing.T) { wantBatchCount: 4, genNumSpans: 2053, envs: map[string]string{ - sdktrace.EnvBatchSpanProcessorMaxQueueSize: "5000", - sdktrace.EnvBatchSpanProcessorMaxExportBatchSize: "10000", + env.BatchSpanProcessorMaxQueueSizeKey: "5000", + env.BatchSpanProcessorMaxExportBatchSizeKey: "10000", }, }, { @@ -253,17 +254,17 @@ func TestNewBatchSpanProcessorWithEnvOptions(t *testing.T) { wantBatchCount: 42, genNumSpans: 2053, envs: map[string]string{ - sdktrace.EnvBatchSpanProcessorMaxQueueSize: "50", - sdktrace.EnvBatchSpanProcessorMaxExportBatchSize: "10000", + env.BatchSpanProcessorMaxQueueSizeKey: "50", + env.BatchSpanProcessorMaxExportBatchSizeKey: "10000", }, }, } envStore := ottest.NewEnvStore() - envStore.Record(sdktrace.EnvBatchSpanProcessorScheduleDelay) - envStore.Record(sdktrace.EnvBatchSpanProcessorExportTimeout) - envStore.Record(sdktrace.EnvBatchSpanProcessorMaxQueueSize) - envStore.Record(sdktrace.EnvBatchSpanProcessorMaxExportBatchSize) + envStore.Record(env.BatchSpanProcessorScheduleDelayKey) + envStore.Record(env.BatchSpanProcessorExportTimeoutKey) + envStore.Record(env.BatchSpanProcessorMaxQueueSizeKey) + envStore.Record(env.BatchSpanProcessorMaxExportBatchSizeKey) defer func() { require.NoError(t, envStore.Restore()) diff --git a/sdk/trace/env.go b/sdk/trace/env.go deleted file mode 100644 index da7ea412e53..00000000000 --- a/sdk/trace/env.go +++ /dev/null @@ -1,59 +0,0 @@ -// 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 trace // import "go.opentelemetry.io/otel/sdk/trace" - -import ( - "os" - "strconv" - - "go.opentelemetry.io/otel/internal/global" -) - -// Environment variable names -const ( - // EnvBatchSpanProcessorScheduleDelay - // Delay interval between two consecutive exports. - // i.e. 5000 - EnvBatchSpanProcessorScheduleDelay = "OTEL_BSP_SCHEDULE_DELAY" - // EnvBatchSpanProcessorExportTimeout - // Maximum allowed time to export data. - // i.e. 3000 - EnvBatchSpanProcessorExportTimeout = "OTEL_BSP_EXPORT_TIMEOUT" - // EnvBatchSpanProcessorMaxQueueSize - // Maximum queue size - // i.e. 2048 - EnvBatchSpanProcessorMaxQueueSize = "OTEL_BSP_MAX_QUEUE_SIZE" - // EnvBatchSpanProcessorMaxExportBatchSize - // Maximum batch size - // Note: Must be less than or equal to EnvBatchSpanProcessorMaxQueueSize - // i.e. 512 - EnvBatchSpanProcessorMaxExportBatchSize = "OTEL_BSP_MAX_EXPORT_BATCH_SIZE" -) - -// intEnvOr returns an env variable's numeric value if it is exists (and valid) or the default if not -func intEnvOr(key string, defaultValue int) int { - value, ok := os.LookupEnv(key) - if !ok { - return defaultValue - } - - intValue, err := strconv.Atoi(value) - if err != nil { - global.Info("Got invalid value, number value expected.", key, value) - return defaultValue - } - - return intValue -}