Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .chloggen/tailsampling-default-error-mode-ignore.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
change_type: enhancement
component: processor/tailsampling
note: Add `processor.tailsamplingprocessor.defaultErrorModeIgnore` feature gate to change default `error_mode` to `ignore` for ottl_condition policies
issues: [48420]
subtext: |
When the feature gate is enabled, the processor defaults to `ignore` mode for OTTL condition
evaluations which preserves valid data when an OTTL condition error occurs, improving resiliency.
This is a breaking change rolled out via feature gate to allow gradual adoption.
change_logs: [user]
4 changes: 4 additions & 0 deletions processor/tailsamplingprocessor/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,10 @@ type BooleanAttributeCfg struct {
// OTTLConditionCfg holds the configurable setting to create a OTTL condition filter
// sampling policy evaluator.
type OTTLConditionCfg struct {
// ErrorMode determines how the processor reacts to OTTL condition errors.
// Valid values are `ignore`, `silent`, and `propagate`.
// The default value is `propagate`, but when the `processor.tailsamplingprocessor.defaultErrorModeIgnore`
// feature gate is enabled, the default changes to `ignore`.
ErrorMode ottl.ErrorMode `mapstructure:"error_mode"`
SpanConditions []string `mapstructure:"span"`
SpanEventConditions []string `mapstructure:"spanevent"`
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions processor/tailsamplingprocessor/metadata.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ feature_gates:
from_version: v0.150.0
reference_url: https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/47331

- id: "processor.tailsamplingprocessor.defaultErrorModeIgnore"
description: When enabled, the default error_mode for ottl_condition policies is `ignore` instead of `propagate`.
stage: alpha
reference_url: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/48420

tests:
config:

Expand Down
11 changes: 10 additions & 1 deletion processor/tailsamplingprocessor/processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"go.opentelemetry.io/otel/trace"
"go.uber.org/zap"

"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl"
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor/cache"
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor/internal/idbatcher"
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor/internal/metadata"
Expand Down Expand Up @@ -450,7 +451,15 @@ func getSharedPolicyEvaluator(settings component.TelemetrySettings, cfg *sharedP
return sampling.NewBooleanAttributeFilter(settings, bafCfg.Key, bafCfg.Value, bafCfg.InvertMatch), nil
case OTTLCondition:
ottlfCfg := cfg.OTTLConditionCfg
return sampling.NewOTTLConditionFilter(settings, ottlfCfg.SpanConditions, ottlfCfg.SpanEventConditions, ottlfCfg.ErrorMode)
errorMode := ottlfCfg.ErrorMode
if errorMode == "" {
if metadata.ProcessorTailsamplingprocessorDefaultErrorModeIgnoreFeatureGate.IsEnabled() {
errorMode = ottl.IgnoreError
} else {
errorMode = ottl.PropagateError
}
}
return sampling.NewOTTLConditionFilter(settings, ottlfCfg.SpanConditions, ottlfCfg.SpanEventConditions, errorMode)
case TraceFlags:
return sampling.NewTraceFlags(settings), nil
default:
Expand Down
50 changes: 50 additions & 0 deletions processor/tailsamplingprocessor/processor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (
"go.uber.org/zap"
"go.uber.org/zap/zaptest/observer"

"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl"
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor/internal/idbatcher"
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor/internal/metadata"
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor/internal/tailstorageextension"
Expand Down Expand Up @@ -1788,3 +1789,52 @@ func (*nonTailStorageExtension) Start(context.Context, component.Host) error {
func (*nonTailStorageExtension) Shutdown(context.Context) error {
return nil
}

func TestOTTLConditionDefaultErrorModeFeatureGate(t *testing.T) {
tests := []struct {
name string
featureGateEnabled bool
expectedErrorMode ottl.ErrorMode
}{
{
name: "feature gate disabled",
featureGateEnabled: false,
expectedErrorMode: ottl.PropagateError,
},
{
name: "feature gate enabled",
featureGateEnabled: true,
expectedErrorMode: ottl.IgnoreError,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
prev := metadata.ProcessorTailsamplingprocessorDefaultErrorModeIgnoreFeatureGate.IsEnabled()
require.NoError(t, featuregate.GlobalRegistry().Set(
metadata.ProcessorTailsamplingprocessorDefaultErrorModeIgnoreFeatureGate.ID(),
tt.featureGateEnabled,
))
t.Cleanup(func() {
require.NoError(t, featuregate.GlobalRegistry().Set(
metadata.ProcessorTailsamplingprocessorDefaultErrorModeIgnoreFeatureGate.ID(),
prev,
))
})

cfg := PolicyCfg{
sharedPolicyCfg: sharedPolicyCfg{
Name: "ottl-test",
Type: OTTLCondition,
OTTLConditionCfg: OTTLConditionCfg{
SpanConditions: []string{"true"},
},
},
}

evaluator, err := getSharedPolicyEvaluator(processortest.NewNopSettings(metadata.Type), &cfg, nil)
require.NoError(t, err)
require.NotNil(t, evaluator)
})
}
}
Loading