You've already forked opentelemetry-go
							
							
				mirror of
				https://github.com/open-telemetry/opentelemetry-go.git
				synced 2025-10-31 00:07:40 +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