You've already forked opentelemetry-go
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:
10
CHANGELOG.md
10
CHANGELOG.md
@@ -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)
|
||||
|
15
sdk/internal/env/env.go
vendored
15
sdk/internal/env/env.go
vendored
@@ -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
|
||||
|
@@ -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.
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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)
|
||||
}
|
||||
|
Reference in New Issue
Block a user