diff --git a/.chloggen/refactor-target-allocator.yaml b/.chloggen/refactor-target-allocator.yaml deleted file mode 100644 index ea632a87843a..000000000000 --- a/.chloggen/refactor-target-allocator.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Use this changelog template to create an entry for release notes. - -# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' -change_type: breaking - -# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) -component: prometheusreceiver - -# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). -note: Move the TargetAllocator configuration struct to an internal directory - -# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. -issues: [33146] - -# (Optional) One or more lines of additional information to render under the primary note. -# These lines will be padded with 2 spaces and then inserted directly into the document. -# Use pipe (|) for multiline entries. -subtext: - -# If your change doesn't affect end users or the exported elements of any package, -# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. -# Optional: The change log or logs in which this entry should be included. -# e.g. '[user]' or '[user, api]' -# Include 'user' if the change is relevant to end users. -# Include 'api' if there is a change to a library API. -# Default: '[user]' -change_logs: [api] diff --git a/pkg/ottl/README.md b/pkg/ottl/README.md index b4962f84a2d7..57a53ac9e053 100644 --- a/pkg/ottl/README.md +++ b/pkg/ottl/README.md @@ -151,21 +151,3 @@ service: 2024-05-29T16:38:09.600-0600 debug ottl@v0.101.0/parser.go:268 TransformContext after statement execution {"kind": "processor", "name": "transform", "pipeline": "logs", "statement": "set(instrumentation_scope.attributes[\"test\"], [\"pass\"])", "condition matched": true, "TransformContext": {"resource": {"attributes": {"test": "pass"}, "dropped_attribute_count": 0}, "scope": {"attributes": {"test": ["pass"]}, "dropped_attribute_count": 0, "name": "", "version": ""}, "log_record": {"attributes": {"log.file.name": "test.log"}, "body": "test", "dropped_attribute_count": 0, "flags": 0, "observed_time_unix_nano": 1717022289500721000, "severity_number": 0, "severity_text": "", "span_id": "", "time_unix_nano": 0, "trace_id": ""}, "cache": {}}} 2024-05-29T16:38:09.601-0600 debug ottl@v0.101.0/parser.go:268 TransformContext after statement execution {"kind": "processor", "name": "transform", "pipeline": "logs", "statement": "set(attributes[\"test\"], true)", "condition matched": true, "TransformContext": {"resource": {"attributes": {"test": "pass"}, "dropped_attribute_count": 0}, "scope": {"attributes": {"test": ["pass"]}, "dropped_attribute_count": 0, "name": "", "version": ""}, "log_record": {"attributes": {"log.file.name": "test.log", "test": true}, "body": "test", "dropped_attribute_count": 0, "flags": 0, "observed_time_unix_nano": 1717022289500721000, "severity_number": 0, "severity_text": "", "span_id": "", "time_unix_nano": 0, "trace_id": ""}, "cache": {}}} ``` - -If configured to do so, the collector also emits traces for the execution of OTTL statement sequences. -These traces contain spans for the execution of each statement, including the statement itself and whether it has -been applied or not. To make use of this, enable the self monitoring of the collector by setting the -`--feature-gates=telemetry.useOtelWithSDKConfigurationForInternalTelemetry` flag, and using the following configuration -to export the traces to e.g. an OTLP API endpoint: - -```yaml -service: - telemetry: - traces: - processors: - - batch: - exporter: - otlp: - protocol: http/protobuf - endpoint: ${env:OTLP_ENDPOINT}/v1/traces -``` diff --git a/pkg/ottl/go.mod b/pkg/ottl/go.mod index e9ba4dddab18..049cc4366395 100644 --- a/pkg/ottl/go.mod +++ b/pkg/ottl/go.mod @@ -2,27 +2,25 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl go 1.22.0 +toolchain go1.22.6 + require ( github.com/alecthomas/participle/v2 v2.1.1 - github.com/elastic/go-grok v0.3.1 github.com/gobwas/glob v0.2.3 github.com/google/uuid v1.6.0 github.com/iancoleman/strcase v0.3.0 github.com/json-iterator/go v1.1.12 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.104.0 github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.108.0 github.com/stretchr/testify v1.9.0 - github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 go.opentelemetry.io/collector/component v0.108.1 go.opentelemetry.io/collector/pdata v1.14.1 go.opentelemetry.io/collector/semconv v0.108.1 - go.opentelemetry.io/otel v1.29.0 - go.opentelemetry.io/otel/sdk v1.29.0 go.opentelemetry.io/otel/trace v1.29.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 - golang.org/x/net v0.28.0 + golang.org/x/net v0.26.0 ) require ( @@ -32,12 +30,8 @@ require ( github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect - github.com/klauspost/compress v1.17.9 // indirect - github.com/magefile/mage v1.15.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.108.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.20.1 // indirect @@ -45,16 +39,17 @@ require ( github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect go.opentelemetry.io/collector/config/configtelemetry v0.108.1 // indirect + go.opentelemetry.io/otel v1.29.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.50.0 // indirect go.opentelemetry.io/otel/metric v1.29.0 // indirect + go.opentelemetry.io/otel/sdk v1.28.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.28.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.24.0 // indirect + golang.org/x/sys v0.22.0 // indirect golang.org/x/text v0.17.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect google.golang.org/grpc v1.65.0 // indirect google.golang.org/protobuf v1.34.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/ottl/parser.go b/pkg/ottl/parser.go index f8d5ab7dabc8..4a0b3cabe7be 100644 --- a/pkg/ottl/parser.go +++ b/pkg/ottl/parser.go @@ -10,18 +10,9 @@ import ( "github.com/alecthomas/participle/v2" "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/codes" - "go.opentelemetry.io/otel/trace" - "go.opentelemetry.io/otel/trace/noop" "go.uber.org/zap" ) -const ( - logAttributeTraceID = "trace_id" - logAttributeSpanID = "span_id" -) - // Statement holds a top level Statement for processing telemetry data. A Statement is a combination of a function // invocation and the boolean expression to match telemetry for invoking the function. type Statement[K any] struct { @@ -240,7 +231,6 @@ type StatementSequence[K any] struct { statements []*Statement[K] errorMode ErrorMode telemetrySettings component.TelemetrySettings - tracer trace.Tracer } type StatementSequenceOption[K any] func(*StatementSequence[K]) @@ -260,10 +250,6 @@ func NewStatementSequence[K any](statements []*Statement[K], telemetrySettings c statements: statements, errorMode: PropagateError, telemetrySettings: telemetrySettings, - tracer: &noop.Tracer{}, - } - if telemetrySettings.TracerProvider != nil { - s.tracer = telemetrySettings.TracerProvider.Tracer("ottl") } for _, op := range options { op(&s) @@ -276,62 +262,20 @@ func NewStatementSequence[K any](statements []*Statement[K], telemetrySettings c // When the ErrorMode of the StatementSequence is `ignore`, errors are logged and execution continues to the next statement. // When the ErrorMode of the StatementSequence is `silent`, errors are not logged and execution continues to the next statement. func (s *StatementSequence[K]) Execute(ctx context.Context, tCtx K) error { - ctx, sequenceSpan := s.tracer.Start(ctx, "ottl/StatementSequenceExecution") - defer sequenceSpan.End() - s.telemetrySettings.Logger.Debug( - "initial TransformContext", - zap.Any("TransformContext", tCtx), - zap.String(logAttributeTraceID, sequenceSpan.SpanContext().TraceID().String()), - zap.String(logAttributeSpanID, sequenceSpan.SpanContext().SpanID().String()), - ) + s.telemetrySettings.Logger.Debug("initial TransformContext", zap.Any("TransformContext", tCtx)) for _, statement := range s.statements { - statementCtx, statementSpan := s.tracer.Start(ctx, "ottl/StatementExecution") - statementSpan.SetAttributes( - attribute.KeyValue{ - Key: "statement", - Value: attribute.StringValue(statement.origText), - }, - ) - _, condition, err := statement.Execute(statementCtx, tCtx) - statementSpan.SetAttributes( - attribute.KeyValue{ - Key: "condition.matched", - Value: attribute.BoolValue(condition), - }, - ) - s.telemetrySettings.Logger.Debug( - "TransformContext after statement execution", - zap.String("statement", statement.origText), - zap.Bool("condition matched", condition), - zap.Any("TransformContext", tCtx), - zap.String(logAttributeTraceID, statementSpan.SpanContext().TraceID().String()), - zap.String(logAttributeSpanID, statementSpan.SpanContext().SpanID().String()), - ) + _, condition, err := statement.Execute(ctx, tCtx) + s.telemetrySettings.Logger.Debug("TransformContext after statement execution", zap.String("statement", statement.origText), zap.Bool("condition matched", condition), zap.Any("TransformContext", tCtx)) if err != nil { - statementSpan.RecordError(err) - errMsg := fmt.Sprintf("failed to execute statement '%s': %v", statement.origText, err) - statementSpan.SetStatus(codes.Error, errMsg) if s.errorMode == PropagateError { - sequenceSpan.SetStatus(codes.Error, errMsg) - statementSpan.End() err = fmt.Errorf("failed to execute statement: %v, %w", statement.origText, err) return err } if s.errorMode == IgnoreError { - s.telemetrySettings.Logger.Warn( - "failed to execute statement", - zap.Error(err), - zap.String("statement", statement.origText), - zap.String(logAttributeTraceID, statementSpan.SpanContext().TraceID().String()), - zap.String(logAttributeSpanID, statementSpan.SpanContext().SpanID().String()), - ) + s.telemetrySettings.Logger.Warn("failed to execute statement", zap.Error(err), zap.String("statement", statement.origText)) } - } else { - statementSpan.SetStatus(codes.Ok, "statement executed successfully") } - statementSpan.End() } - sequenceSpan.SetStatus(codes.Ok, "statement sequence executed successfully") return nil } diff --git a/pkg/ottl/parser_test.go b/pkg/ottl/parser_test.go index 409d5ab34b5d..dc475b2b7d6a 100644 --- a/pkg/ottl/parser_test.go +++ b/pkg/ottl/parser_test.go @@ -13,12 +13,7 @@ import ( "time" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/codes" - "go.opentelemetry.io/otel/sdk/trace" - "go.opentelemetry.io/otel/sdk/trace/tracetest" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottltest" ) @@ -2217,11 +2212,10 @@ func Test_Condition_Eval(t *testing.T) { func Test_Statements_Execute_Error(t *testing.T) { tests := []struct { - name string - condition boolExpressionEvaluator[any] - function ExprFunc[any] - errorMode ErrorMode - expectedSpans []expectedSpan + name string + condition boolExpressionEvaluator[any] + function ExprFunc[any] + errorMode ErrorMode }{ { name: "IgnoreError error from condition", @@ -2232,31 +2226,6 @@ func Test_Statements_Execute_Error(t *testing.T) { return 1, nil }, errorMode: IgnoreError, - expectedSpans: []expectedSpan{ - { - name: "ottl/StatementExecution", - attributes: []attribute.KeyValue{ - { - Key: "statement", - Value: attribute.StringValue("test"), - }, - { - Key: "condition.matched", - Value: attribute.BoolValue(false), - }, - }, - status: trace.Status{ - Code: codes.Error, - Description: "failed to execute statement 'test': test", - }, - }, - { - name: "ottl/StatementSequenceExecution", - status: trace.Status{ - Code: codes.Ok, - }, - }, - }, }, { name: "PropagateError error from condition", @@ -2267,32 +2236,6 @@ func Test_Statements_Execute_Error(t *testing.T) { return 1, nil }, errorMode: PropagateError, - expectedSpans: []expectedSpan{ - { - name: "ottl/StatementExecution", - attributes: []attribute.KeyValue{ - { - Key: "statement", - Value: attribute.StringValue("test"), - }, - { - Key: "condition.matched", - Value: attribute.BoolValue(false), - }, - }, - status: trace.Status{ - Code: codes.Error, - Description: "failed to execute statement 'test': test", - }, - }, - { - name: "ottl/StatementSequenceExecution", - status: trace.Status{ - Code: codes.Error, - Description: "failed to execute statement 'test': test", - }, - }, - }, }, { name: "IgnoreError error from function", @@ -2303,31 +2246,6 @@ func Test_Statements_Execute_Error(t *testing.T) { return 1, fmt.Errorf("test") }, errorMode: IgnoreError, - expectedSpans: []expectedSpan{ - { - name: "ottl/StatementExecution", - attributes: []attribute.KeyValue{ - { - Key: "statement", - Value: attribute.StringValue("test"), - }, - { - Key: "condition.matched", - Value: attribute.BoolValue(true), - }, - }, - status: trace.Status{ - Code: codes.Error, - Description: "failed to execute statement 'test': test", - }, - }, - { - name: "ottl/StatementSequenceExecution", - status: trace.Status{ - Code: codes.Ok, - }, - }, - }, }, { name: "PropagateError error from function", @@ -2338,32 +2256,6 @@ func Test_Statements_Execute_Error(t *testing.T) { return 1, fmt.Errorf("test") }, errorMode: PropagateError, - expectedSpans: []expectedSpan{ - { - name: "ottl/StatementExecution", - attributes: []attribute.KeyValue{ - { - Key: "statement", - Value: attribute.StringValue("test"), - }, - { - Key: "condition.matched", - Value: attribute.BoolValue(true), - }, - }, - status: trace.Status{ - Code: codes.Error, - Description: "failed to execute statement 'test': test", - }, - }, - { - name: "ottl/StatementSequenceExecution", - status: trace.Status{ - Code: codes.Error, - Description: "failed to execute statement 'test': test", - }, - }, - }, }, { name: "SilentError error from condition", @@ -2374,31 +2266,6 @@ func Test_Statements_Execute_Error(t *testing.T) { return 1, nil }, errorMode: SilentError, - expectedSpans: []expectedSpan{ - { - name: "ottl/StatementExecution", - attributes: []attribute.KeyValue{ - { - Key: "statement", - Value: attribute.StringValue("test"), - }, - { - Key: "condition.matched", - Value: attribute.BoolValue(false), - }, - }, - status: trace.Status{ - Code: codes.Error, - Description: "failed to execute statement 'test': test", - }, - }, - { - name: "ottl/StatementSequenceExecution", - status: trace.Status{ - Code: codes.Ok, - }, - }, - }, }, { name: "SilentError error from function", @@ -2409,31 +2276,6 @@ func Test_Statements_Execute_Error(t *testing.T) { return 1, fmt.Errorf("test") }, errorMode: SilentError, - expectedSpans: []expectedSpan{ - { - name: "ottl/StatementExecution", - attributes: []attribute.KeyValue{ - { - Key: "statement", - Value: attribute.StringValue("test"), - }, - { - Key: "condition.matched", - Value: attribute.BoolValue(true), - }, - }, - status: trace.Status{ - Code: codes.Error, - Description: "failed to execute statement 'test': test", - }, - }, - { - name: "ottl/StatementSequenceExecution", - status: trace.Status{ - Code: codes.Ok, - }, - }, - }, }, } for _, tt := range tests { @@ -2443,15 +2285,11 @@ func Test_Statements_Execute_Error(t *testing.T) { { condition: BoolExpr[any]{tt.condition}, function: Expr[any]{exprFunc: tt.function}, - origText: "test", }, }, errorMode: tt.errorMode, telemetrySettings: componenttest.NewNopTelemetrySettings(), } - spanRecorder := tracetest.NewSpanRecorder() - statements.telemetrySettings.TracerProvider = trace.NewTracerProvider(trace.WithSpanProcessor(spanRecorder)) - statements.tracer = statements.telemetrySettings.TracerProvider.Tracer("ottl") err := statements.Execute(context.Background(), nil) if tt.errorMode == PropagateError { @@ -2459,14 +2297,6 @@ func Test_Statements_Execute_Error(t *testing.T) { } else { assert.NoError(t, err) } - - require.Len(t, spanRecorder.Ended(), len(tt.expectedSpans)) - - for i, es := range tt.expectedSpans { - require.Equal(t, es.name, spanRecorder.Ended()[i].Name()) - require.Equal(t, es.attributes, spanRecorder.Ended()[i].Attributes()) - require.Equal(t, es.status, spanRecorder.Ended()[i].Status()) - } }) } } @@ -2670,9 +2500,3 @@ func Test_ConditionSequence_Eval_Error(t *testing.T) { }) } } - -type expectedSpan struct { - name string - attributes []attribute.KeyValue - status trace.Status -}