Skip to content

Commit

Permalink
Add env support for span limits configuration (#2606)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
3 people committed Feb 17, 2022
1 parent b675dda commit 98c2c9d
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 0 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.md
Expand Up @@ -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)
Expand Down
15 changes: 15 additions & 0 deletions sdk/internal/env/env.go
Expand Up @@ -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
Expand Down
16 changes: 16 additions & 0 deletions sdk/trace/config.go
Expand Up @@ -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 {
Expand Down Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions sdk/trace/provider.go
Expand Up @@ -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)
}
Expand Down
61 changes: 61 additions & 0 deletions sdk/trace/provider_test.go
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
}

0 comments on commit 98c2c9d

Please sign in to comment.