From c8973cb36c7afd7a346835f902033e907198c941 Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Mon, 14 Feb 2022 11:04:49 +0800 Subject: [PATCH 01/10] add env support for otel_span configuration Signed-off-by: Cuichen Li --- sdk/internal/env/env.go | 15 +++++++++++++++ sdk/trace/config.go | 7 +++++++ sdk/trace/provider.go | 1 + sdk/trace/provider_test.go | 24 ++++++++++++++++++++++++ 4 files changed, 47 insertions(+) diff --git a/sdk/internal/env/env.go b/sdk/internal/env/env.go index 397fd9593cc..df7a05626b3 100644 --- a/sdk/internal/env/env.go +++ b/sdk/internal/env/env.go @@ -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 diff --git a/sdk/trace/config.go b/sdk/trace/config.go index 61a30439251..251697fe45e 100644 --- a/sdk/trace/config.go +++ b/sdk/trace/config.go @@ -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,6 +51,12 @@ 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. DefaultAttributeCountLimit = 128 diff --git a/sdk/trace/provider.go b/sdk/trace/provider.go index c6b311f9cdc..20ef739654b 100644 --- a/sdk/trace/provider.go +++ b/sdk/trace/provider.go @@ -367,6 +367,7 @@ func ensureValidTracerProviderConfig(cfg tracerProviderConfig) tracerProviderCon cfg.idGenerator = defaultIDGenerator() } cfg.spanLimits.ensureDefault() + cfg.spanLimits.parsePotentialEnvConfigs() if cfg.resource == nil { cfg.resource = resource.Default() } diff --git a/sdk/trace/provider_test.go b/sdk/trace/provider_test.go index e2fce31d7f7..ae715d56f2f 100644 --- a/sdk/trace/provider_test.go +++ b/sdk/trace/provider_test.go @@ -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,21 @@ func TestSchemaURL(t *testing.T) { tracerStruct := tracerIface.(*tracer) assert.EqualValues(t, schemaURL, tracerStruct.instrumentationLibrary.SchemaURL) } + +func TestEnsureValidTracerProviderConfig(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")) + o := tracerProviderConfig{} + o = ensureValidTracerProviderConfig(o) + assert.Equal(t, 111, o.spanLimits.EventCountLimit) + assert.Equal(t, 222, o.spanLimits.AttributeCountLimit) + assert.Equal(t, 333, o.spanLimits.LinkCountLimit) +} From f4c526c093b16bb4782a9e3e576d8efec2abff84 Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Mon, 14 Feb 2022 11:09:06 +0800 Subject: [PATCH 02/10] update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e124d10a9f..9d49f334c4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,11 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `OTEL_BSP_EXPORT_TIMEOUT` - `OTEL_BSP_MAX_QUEUE_SIZE`. - `OTEL_BSP_MAX_EXPORT_BATCH_SIZE` +- 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` ### Changed From 8441ad57540e70169ebe25e86a09c749c97c449c Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Tue, 15 Feb 2022 13:55:13 +0800 Subject: [PATCH 03/10] update changelog and some logic based on comment --- CHANGELOG.md | 14 +++++++++----- sdk/trace/provider.go | 2 +- sdk/trace/provider_test.go | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d49f334c4b..e22b9b99ec9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,15 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +- 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. + ## [1.4.0] - 2022-02-11 ### Added @@ -21,11 +30,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `OTEL_BSP_EXPORT_TIMEOUT` - `OTEL_BSP_MAX_QUEUE_SIZE`. - `OTEL_BSP_MAX_EXPORT_BATCH_SIZE` -- 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` ### Changed diff --git a/sdk/trace/provider.go b/sdk/trace/provider.go index 20ef739654b..99e44cba0e7 100644 --- a/sdk/trace/provider.go +++ b/sdk/trace/provider.go @@ -366,8 +366,8 @@ func ensureValidTracerProviderConfig(cfg tracerProviderConfig) tracerProviderCon if cfg.idGenerator == nil { cfg.idGenerator = defaultIDGenerator() } - cfg.spanLimits.ensureDefault() cfg.spanLimits.parsePotentialEnvConfigs() + cfg.spanLimits.ensureDefault() if cfg.resource == nil { cfg.resource = resource.Default() } diff --git a/sdk/trace/provider_test.go b/sdk/trace/provider_test.go index ae715d56f2f..a5a70d5354d 100644 --- a/sdk/trace/provider_test.go +++ b/sdk/trace/provider_test.go @@ -118,3 +118,21 @@ func TestEnsureValidTracerProviderConfig(t *testing.T) { assert.Equal(t, 222, o.spanLimits.AttributeCountLimit) assert.Equal(t, 333, o.spanLimits.LinkCountLimit) } + +func TestEnsureValidTracerProviderConfigWithInvliadValue(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")) + o := tracerProviderConfig{} + o = ensureValidTracerProviderConfig(o) + assert.Equal(t, 128, o.spanLimits.EventCountLimit) + assert.Equal(t, 222, o.spanLimits.AttributeCountLimit) + assert.Equal(t, 128, o.spanLimits.LinkCountLimit) +} From c6787aaf3e212f59597582a36035030fbf424193 Mon Sep 17 00:00:00 2001 From: Will Li Date: Tue, 15 Feb 2022 14:03:10 +0800 Subject: [PATCH 04/10] Update CHANGELOG.md Co-authored-by: Anthony Mirabella --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e22b9b99ec9..570097ed4dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ 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` From 58541bd04e30b1bd2bd8cc61c5aac57894212534 Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Wed, 16 Feb 2022 11:59:11 +0800 Subject: [PATCH 05/10] add document about retrieve value from environment variable Signed-off-by: Cuichen Li --- sdk/trace/config.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sdk/trace/config.go b/sdk/trace/config.go index 251697fe45e..efea7b302f9 100644 --- a/sdk/trace/config.go +++ b/sdk/trace/config.go @@ -59,12 +59,21 @@ func (sl *SpanLimits) parsePotentialEnvConfigs() { 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. From 30f0292c6aa74694e943d07ebfe579a5616561c7 Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Wed, 16 Feb 2022 12:00:00 +0800 Subject: [PATCH 06/10] remove trailing whitespace Signed-off-by: Cuichen Li --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 570097ed4dc..bea139c56a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `OTEL_SPAN_LINK_COUNT_LIMIT` If the provided environment variables are invalid (negative), the default values would be - used. + used. ## [1.4.0] - 2022-02-11 From c0cf9bb0f4704b4790aacab577033af54d20db1c Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Wed, 16 Feb 2022 12:00:23 +0800 Subject: [PATCH 07/10] parse environment variable before apply the options --- sdk/trace/provider.go | 2 +- sdk/trace/provider_test.go | 43 +++++++++++++++++++++++++++----------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/sdk/trace/provider.go b/sdk/trace/provider.go index 99e44cba0e7..2de79f03397 100644 --- a/sdk/trace/provider.go +++ b/sdk/trace/provider.go @@ -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) } @@ -366,7 +367,6 @@ func ensureValidTracerProviderConfig(cfg tracerProviderConfig) tracerProviderCon if cfg.idGenerator == nil { cfg.idGenerator = defaultIDGenerator() } - cfg.spanLimits.parsePotentialEnvConfigs() cfg.spanLimits.ensureDefault() if cfg.resource == nil { cfg.resource = resource.Default() diff --git a/sdk/trace/provider_test.go b/sdk/trace/provider_test.go index a5a70d5354d..0ac96e7b2ae 100644 --- a/sdk/trace/provider_test.go +++ b/sdk/trace/provider_test.go @@ -101,7 +101,7 @@ func TestSchemaURL(t *testing.T) { assert.EqualValues(t, schemaURL, tracerStruct.instrumentationLibrary.SchemaURL) } -func TestEnsureValidTracerProviderConfig(t *testing.T) { +func TestNewTraceProviderWithoutSpanLimitConfiguration(t *testing.T) { envStore := ottest.NewEnvStore() defer func() { require.NoError(t, envStore.Restore()) @@ -112,14 +112,34 @@ func TestEnsureValidTracerProviderConfig(t *testing.T) { require.NoError(t, os.Setenv(env.SpanEventCountKey, "111")) require.NoError(t, os.Setenv(env.SpanAttributesCountKey, "222")) require.NoError(t, os.Setenv(env.SpanLinkCountKey, "333")) - o := tracerProviderConfig{} - o = ensureValidTracerProviderConfig(o) - assert.Equal(t, 111, o.spanLimits.EventCountLimit) - assert.Equal(t, 222, o.spanLimits.AttributeCountLimit) - assert.Equal(t, 333, o.spanLimits.LinkCountLimit) + tp := NewTracerProvider() + assert.Equal(t, 111, tp.spanLimits.EventCountLimit) + assert.Equal(t, 222, tp.spanLimits.AttributeCountLimit) + assert.Equal(t, 333, tp.spanLimits.LinkCountLimit) } -func TestEnsureValidTracerProviderConfigWithInvliadValue(t *testing.T) { +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()) @@ -130,9 +150,8 @@ func TestEnsureValidTracerProviderConfigWithInvliadValue(t *testing.T) { require.NoError(t, os.Setenv(env.SpanEventCountKey, "-111")) require.NoError(t, os.Setenv(env.SpanAttributesCountKey, "222")) require.NoError(t, os.Setenv(env.SpanLinkCountKey, "-333")) - o := tracerProviderConfig{} - o = ensureValidTracerProviderConfig(o) - assert.Equal(t, 128, o.spanLimits.EventCountLimit) - assert.Equal(t, 222, o.spanLimits.AttributeCountLimit) - assert.Equal(t, 128, o.spanLimits.LinkCountLimit) + tp := NewTracerProvider() + assert.Equal(t, 128, tp.spanLimits.EventCountLimit) + assert.Equal(t, 222, tp.spanLimits.AttributeCountLimit) + assert.Equal(t, 128, tp.spanLimits.LinkCountLimit) } From ef8417ffff9a3cde7986b7b8d639df036a202450 Mon Sep 17 00:00:00 2001 From: Will Li Date: Thu, 17 Feb 2022 09:43:28 +0800 Subject: [PATCH 08/10] Update CHANGELOG.md Co-authored-by: Tyler Yahn --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bea139c56a6..523e875bc27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,8 +16,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `OTEL_SPAN_EVENT_COUNT_LIMIT` - `OTEL_SPAN_LINK_COUNT_LIMIT` - If the provided environment variables are invalid (negative), the default values would be - used. + If the provided environment variables are invalid (negative), the default values would be used. ## [1.4.0] - 2022-02-11 From 6c9d3c0c2452961a7587184d5dfaa4467b6c4e2a Mon Sep 17 00:00:00 2001 From: Will Li Date: Thu, 17 Feb 2022 09:43:36 +0800 Subject: [PATCH 09/10] Update sdk/trace/provider_test.go Co-authored-by: Tyler Yahn --- sdk/trace/provider_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/trace/provider_test.go b/sdk/trace/provider_test.go index 0ac96e7b2ae..0633889bdc2 100644 --- a/sdk/trace/provider_test.go +++ b/sdk/trace/provider_test.go @@ -148,10 +148,10 @@ func TestNewTraceProviderWithInvalidSpanLimitConfigurationFromEnvironmentVariabl 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.SpanAttributesCountKey, "-222")) require.NoError(t, os.Setenv(env.SpanLinkCountKey, "-333")) tp := NewTracerProvider() assert.Equal(t, 128, tp.spanLimits.EventCountLimit) - assert.Equal(t, 222, tp.spanLimits.AttributeCountLimit) + assert.Equal(t, 128, tp.spanLimits.AttributeCountLimit) assert.Equal(t, 128, tp.spanLimits.LinkCountLimit) } From 49d04c26d1933da95e90e47ff1b3832646611f81 Mon Sep 17 00:00:00 2001 From: Tyler Yahn Date: Thu, 17 Feb 2022 08:03:30 -0800 Subject: [PATCH 10/10] Update CHANGELOG.md --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd0947db4f8..59d0b7bad66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Fix race condition in reading the dropped spans number for the `BatchSpanProcessor`. (#2615) - ## [1.4.0] - 2022-02-11 ### Added