// Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 package sdk import ( "log/slog" "os" "strconv" ) // maxSpan are the span limits resolved during startup. var maxSpan = newSpanLimits() type spanLimits struct { // Attrs is the number of allowed attributes for a span. // // This is resolved from the environment variable value for the // OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT key if it exists. Otherwise, the // environment variable value for OTEL_ATTRIBUTE_COUNT_LIMIT, or 128 if // that is not set, is used. Attrs int // AttrValueLen is the maximum attribute value length allowed for a span. // // This is resolved from the environment variable value for the // OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT key if it exists. Otherwise, the // environment variable value for OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT, or -1 // if that is not set, is used. AttrValueLen int // Events is the number of allowed events for a span. // // This is resolved from the environment variable value for the // OTEL_SPAN_EVENT_COUNT_LIMIT key, or 128 is used if that is not set. Events int // EventAttrs is the number of allowed attributes for a span event. // // The is resolved from the environment variable value for the // OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT key, or 128 is used if that is not set. EventAttrs int // Links is the number of allowed Links for a span. // // This is resolved from the environment variable value for the // OTEL_SPAN_LINK_COUNT_LIMIT, or 128 is used if that is not set. Links int // LinkAttrs is the number of allowed attributes for a span link. // // This is resolved from the environment variable value for the // OTEL_LINK_ATTRIBUTE_COUNT_LIMIT, or 128 is used if that is not set. LinkAttrs int } func newSpanLimits() spanLimits { return spanLimits{ Attrs: firstEnv( 128, "OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT", "OTEL_ATTRIBUTE_COUNT_LIMIT", ), AttrValueLen: firstEnv( -1, // Unlimited. "OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT", "OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT", ), Events: firstEnv(128, "OTEL_SPAN_EVENT_COUNT_LIMIT"), EventAttrs: firstEnv(128, "OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT"), Links: firstEnv(128, "OTEL_SPAN_LINK_COUNT_LIMIT"), LinkAttrs: firstEnv(128, "OTEL_LINK_ATTRIBUTE_COUNT_LIMIT"), } } // firstEnv returns the parsed integer value of the first matching environment // variable from keys. The defaultVal is returned if the value is not an // integer or no match is found. func firstEnv(defaultVal int, keys ...string) int { for _, key := range keys { strV := os.Getenv(key) if strV == "" { continue } v, err := strconv.Atoi(strV) if err == nil { return v } slog.Warn( "invalid limit environment variable", "error", err, "key", key, "value", strV, ) } return defaultVal }