@@ -13,6 +13,7 @@ import (
13
13
"github.com/cschleiden/go-workflows/backend/payload"
14
14
"github.com/cschleiden/go-workflows/internal/args"
15
15
"github.com/cschleiden/go-workflows/internal/log"
16
+ "github.com/cschleiden/go-workflows/internal/tracing"
16
17
"github.com/cschleiden/go-workflows/internal/workflowerrors"
17
18
"github.com/cschleiden/go-workflows/registry"
18
19
wf "github.com/cschleiden/go-workflows/workflow"
@@ -47,21 +48,6 @@ func NewExecutor(
47
48
func (e * Executor ) ExecuteActivity (ctx context.Context , task * backend.ActivityTask ) (payload.Payload , error ) {
48
49
a := task .Event .Attributes .(* history.ActivityScheduledAttributes )
49
50
50
- activity , err := e .r .GetActivity (a .Name )
51
- if err != nil {
52
- return nil , workflowerrors .NewPermanentError (fmt .Errorf ("activity not found: %w" , err ))
53
- }
54
-
55
- activityFn := reflect .ValueOf (activity )
56
- if activityFn .Type ().Kind () != reflect .Func {
57
- return nil , workflowerrors .NewPermanentError (errors .New ("activity not a function" ))
58
- }
59
-
60
- args , addContext , err := args .InputsToArgs (e .converter , activityFn , a .Inputs )
61
- if err != nil {
62
- return nil , workflowerrors .NewPermanentError (fmt .Errorf ("converting activity inputs: %w" , err ))
63
- }
64
-
65
51
// Add activity state to context
66
52
as := NewActivityState (
67
53
task .Event .ID ,
@@ -71,6 +57,7 @@ func (e *Executor) ExecuteActivity(ctx context.Context, task *backend.ActivityTa
71
57
activityCtx := WithActivityState (ctx , as )
72
58
73
59
for _ , propagator := range e .propagators {
60
+ var err error
74
61
activityCtx , err = propagator .Extract (activityCtx , a .Metadata )
75
62
if err != nil {
76
63
return nil , workflowerrors .NewPermanentError (fmt .Errorf ("extracting context from propagator: %w" , err ))
@@ -83,6 +70,22 @@ func (e *Executor) ExecuteActivity(ctx context.Context, task *backend.ActivityTa
83
70
attribute .String (log .ActivityIDKey , task .ID ),
84
71
attribute .Int (log .AttemptKey , a .Attempt ),
85
72
))
73
+
74
+ activity , err := e .r .GetActivity (a .Name )
75
+ if err != nil {
76
+ return nil , workflowerrors .NewPermanentError (tracing .WithSpanError (span , fmt .Errorf ("activity not found: %w" , err )))
77
+ }
78
+
79
+ activityFn := reflect .ValueOf (activity )
80
+ if activityFn .Type ().Kind () != reflect .Func {
81
+ return nil , workflowerrors .NewPermanentError (tracing .WithSpanError (span , errors .New ("activity not a function" )))
82
+ }
83
+
84
+ args , addContext , err := args .InputsToArgs (e .converter , activityFn , a .Inputs )
85
+ if err != nil {
86
+ return nil , workflowerrors .NewPermanentError (tracing .WithSpanError (span , fmt .Errorf ("converting activity inputs: %w" , err )))
87
+ }
88
+
86
89
defer span .End ()
87
90
88
91
// Execute activity
@@ -97,7 +100,7 @@ func (e *Executor) ExecuteActivity(ctx context.Context, task *backend.ActivityTa
97
100
// Recover any panic encountered during activity execution
98
101
defer func () {
99
102
if r := recover (); r != nil {
100
- err = workflowerrors .NewPanicError (fmt .Sprintf ("panic: %v" , r ))
103
+ err : = workflowerrors .NewPanicError (fmt .Sprintf ("panic: %v" , r ))
101
104
rv = []reflect.Value {reflect .ValueOf (err )}
102
105
}
103
106
@@ -110,7 +113,8 @@ func (e *Executor) ExecuteActivity(ctx context.Context, task *backend.ActivityTa
110
113
<- done
111
114
112
115
if len (rv ) < 1 || len (rv ) > 2 {
113
- return nil , workflowerrors .NewPermanentError (errors .New ("activity has to return either (error) or (<result>, error)" ))
116
+ return nil , workflowerrors .NewPermanentError (
117
+ tracing .WithSpanError (span , errors .New ("activity has to return either (error) or (<result>, error)" )))
114
118
}
115
119
116
120
var result payload.Payload
@@ -120,7 +124,7 @@ func (e *Executor) ExecuteActivity(ctx context.Context, task *backend.ActivityTa
120
124
var err error
121
125
result , err = e .converter .To (rv [0 ].Interface ())
122
126
if err != nil {
123
- return nil , workflowerrors .NewPermanentError (fmt .Errorf ("converting activity result: %w" , err ))
127
+ return nil , workflowerrors .NewPermanentError (tracing . WithSpanError ( span , fmt .Errorf ("converting activity result: %w" , err ) ))
124
128
}
125
129
}
126
130
@@ -133,8 +137,9 @@ func (e *Executor) ExecuteActivity(ctx context.Context, task *backend.ActivityTa
133
137
134
138
err , ok := errResult .Interface ().(error )
135
139
if ! ok {
136
- return nil , workflowerrors .NewPermanentError (fmt .Errorf ("activity error result does not satisfy error interface (%T): %v" , errResult , errResult ))
140
+ return nil , workflowerrors .NewPermanentError (
141
+ tracing .WithSpanError (span , fmt .Errorf ("activity error result does not satisfy error interface (%T): %v" , errResult , errResult )))
137
142
}
138
143
139
- return result , workflowerrors .FromError (err )
144
+ return result , workflowerrors .FromError (tracing . WithSpanError ( span , err ) )
140
145
}
0 commit comments