1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2025-09-16 09:26:25 +02:00

Add env support for span limits configuration (#2606)

* add env support for otel_span configuration

Signed-off-by: Cuichen Li <cuichli@cisco.com>

* update changelog

* update changelog and some logic based on comment

* Update CHANGELOG.md

Co-authored-by: Anthony Mirabella <a9@aneurysm9.com>

* add document about retrieve value from environment variable

Signed-off-by: Cuichen Li <cuichli@cisco.com>

* remove trailing whitespace

Signed-off-by: Cuichen Li <cuichli@cisco.com>

* parse environment variable before apply the options

* Update CHANGELOG.md

Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>

* Update sdk/trace/provider_test.go

Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>

* Update CHANGELOG.md

Co-authored-by: Anthony Mirabella <a9@aneurysm9.com>
Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>
This commit is contained in:
Will Li
2022-02-18 00:21:13 +08:00
committed by GitHub
parent b675dda67e
commit 98c2c9d96c
5 changed files with 103 additions and 0 deletions

View File

@@ -8,6 +8,16 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
## [Unreleased]
### Added
- Added support to configure the span limits with environment variables.
The following environment variables are used. (#2606)
- `OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT`
- `OTEL_SPAN_EVENT_COUNT_LIMIT`
- `OTEL_SPAN_LINK_COUNT_LIMIT`
If the provided environment variables are invalid (negative), the default values would be used.
### Changed
- Add event and link drop counts to the exported data from the `oltptrace` exporter. (#2601)

View File

@@ -40,6 +40,21 @@ const (
// Note: Must be less than or equal to EnvBatchSpanProcessorMaxQueueSize
// i.e. 512
BatchSpanProcessorMaxExportBatchSizeKey = "OTEL_BSP_MAX_EXPORT_BATCH_SIZE"
// SpanAttributesCountKey
// Maximum allowed span attribute count
// Default: 128
SpanAttributesCountKey = "OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT"
// SpanEventCountKey
// Maximum allowed span event count
// Default: 128
SpanEventCountKey = "OTEL_SPAN_EVENT_COUNT_LIMIT"
// SpanLinkCountKey
// Maximum allowed span link count
// Default: 128
SpanLinkCountKey = "OTEL_SPAN_LINK_COUNT_LIMIT"
)
// IntEnvOr returns the int value of the environment variable with name key if

View File

@@ -13,6 +13,7 @@
// limitations under the License.
package trace // import "go.opentelemetry.io/otel/sdk/trace"
import "go.opentelemetry.io/otel/sdk/internal/env"
// SpanLimits represents the limits of a span.
type SpanLimits struct {
@@ -50,14 +51,29 @@ func (sl *SpanLimits) ensureDefault() {
}
}
func (sl *SpanLimits) parsePotentialEnvConfigs() {
sl.AttributeCountLimit = env.IntEnvOr(env.SpanAttributesCountKey, sl.AttributeCountLimit)
sl.LinkCountLimit = env.IntEnvOr(env.SpanLinkCountKey, sl.LinkCountLimit)
sl.EventCountLimit = env.IntEnvOr(env.SpanEventCountKey, sl.EventCountLimit)
}
const (
// DefaultAttributeCountLimit is the default maximum allowed span attribute count.
// If not specified via WithSpanLimits, will try to retrieve the value from
// environment variable `OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT`.
// If Invalid value (negative or zero) is provided, the default value 128 will be used.
DefaultAttributeCountLimit = 128
// DefaultEventCountLimit is the default maximum allowed span event count.
// If not specified via WithSpanLimits, will try to retrieve the value from
// environment variable `OTEL_SPAN_EVENT_COUNT_LIMIT`.
// If Invalid value (negative or zero) is provided, the default value 128 will be used.
DefaultEventCountLimit = 128
// DefaultLinkCountLimit is the default maximum allowed span link count.
// If the value is not specified via WithSpanLimits, will try to retrieve the value from
// environment variable `OTEL_SPAN_LINK_COUNT_LIMIT`.
// If Invalid value (negative or zero) is provided, the default value 128 will be used.
DefaultLinkCountLimit = 128
// DefaultAttributePerEventCountLimit is the default maximum allowed attribute per span event count.

View File

@@ -98,6 +98,7 @@ var _ trace.TracerProvider = &TracerProvider{}
func NewTracerProvider(opts ...TracerProviderOption) *TracerProvider {
o := tracerProviderConfig{}
o.spanLimits.parsePotentialEnvConfigs()
for _, opt := range opts {
o = opt.apply(o)
}

View File

@@ -17,8 +17,14 @@ package trace
import (
"context"
"errors"
"os"
"testing"
"github.com/stretchr/testify/require"
ottest "go.opentelemetry.io/otel/internal/internaltest"
"go.opentelemetry.io/otel/sdk/internal/env"
"github.com/stretchr/testify/assert"
"go.opentelemetry.io/otel/trace"
@@ -94,3 +100,58 @@ func TestSchemaURL(t *testing.T) {
tracerStruct := tracerIface.(*tracer)
assert.EqualValues(t, schemaURL, tracerStruct.instrumentationLibrary.SchemaURL)
}
func TestNewTraceProviderWithoutSpanLimitConfiguration(t *testing.T) {
envStore := ottest.NewEnvStore()
defer func() {
require.NoError(t, envStore.Restore())
}()
envStore.Record(env.SpanAttributesCountKey)
envStore.Record(env.SpanEventCountKey)
envStore.Record(env.SpanLinkCountKey)
require.NoError(t, os.Setenv(env.SpanEventCountKey, "111"))
require.NoError(t, os.Setenv(env.SpanAttributesCountKey, "222"))
require.NoError(t, os.Setenv(env.SpanLinkCountKey, "333"))
tp := NewTracerProvider()
assert.Equal(t, 111, tp.spanLimits.EventCountLimit)
assert.Equal(t, 222, tp.spanLimits.AttributeCountLimit)
assert.Equal(t, 333, tp.spanLimits.LinkCountLimit)
}
func TestNewTraceProviderWithSpanLimitConfigurationFromOptsAndEnvironmentVariable(t *testing.T) {
envStore := ottest.NewEnvStore()
defer func() {
require.NoError(t, envStore.Restore())
}()
envStore.Record(env.SpanAttributesCountKey)
envStore.Record(env.SpanEventCountKey)
envStore.Record(env.SpanLinkCountKey)
require.NoError(t, os.Setenv(env.SpanEventCountKey, "111"))
require.NoError(t, os.Setenv(env.SpanAttributesCountKey, "222"))
require.NoError(t, os.Setenv(env.SpanLinkCountKey, "333"))
tp := NewTracerProvider(WithSpanLimits(SpanLimits{
EventCountLimit: 1,
AttributeCountLimit: 2,
LinkCountLimit: 3,
}))
assert.Equal(t, 1, tp.spanLimits.EventCountLimit)
assert.Equal(t, 2, tp.spanLimits.AttributeCountLimit)
assert.Equal(t, 3, tp.spanLimits.LinkCountLimit)
}
func TestNewTraceProviderWithInvalidSpanLimitConfigurationFromEnvironmentVariable(t *testing.T) {
envStore := ottest.NewEnvStore()
defer func() {
require.NoError(t, envStore.Restore())
}()
envStore.Record(env.SpanAttributesCountKey)
envStore.Record(env.SpanEventCountKey)
envStore.Record(env.SpanLinkCountKey)
require.NoError(t, os.Setenv(env.SpanEventCountKey, "-111"))
require.NoError(t, os.Setenv(env.SpanAttributesCountKey, "-222"))
require.NoError(t, os.Setenv(env.SpanLinkCountKey, "-333"))
tp := NewTracerProvider()
assert.Equal(t, 128, tp.spanLimits.EventCountLimit)
assert.Equal(t, 128, tp.spanLimits.AttributeCountLimit)
assert.Equal(t, 128, tp.spanLimits.LinkCountLimit)
}