@@ -13,15 +13,18 @@ import (
1313 "github.com/onflow/flow/protobuf/go/flow/executiondata"
1414 "github.com/rs/zerolog/log"
1515 "github.com/spf13/cobra"
16+ "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
1617 "golang.org/x/exp/slices"
1718 "google.golang.org/grpc"
1819 "google.golang.org/grpc/credentials/insecure"
1920
2021 sdk "github.com/onflow/flow-go-sdk"
2122
23+ "github.com/onflow/flow-go/fvm"
2224 "github.com/onflow/flow-go/fvm/storage/snapshot"
2325 "github.com/onflow/flow-go/model/flow"
2426 "github.com/onflow/flow-go/module/grpcclient"
27+ "github.com/onflow/flow-go/module/trace"
2528 "github.com/onflow/flow-go/utils/debug"
2629)
2730
3639 flagProposalKeySeq uint64
3740 flagUseExecutionDataAPI bool
3841 flagDumpRegisters bool
42+ flagTracePath string
43+ flagTraceCadence bool
3944)
4045
4146var Cmd = & cobra.Command {
@@ -67,6 +72,10 @@ func init() {
6772 Cmd .Flags ().BoolVar (& flagUseExecutionDataAPI , "use-execution-data-api" , false , "use the execution data API" )
6873
6974 Cmd .Flags ().BoolVar (& flagDumpRegisters , "dump-registers" , false , "dump registers" )
75+
76+ Cmd .Flags ().StringVar (& flagTracePath , "trace" , "" , "enable tracing to given path" )
77+
78+ Cmd .Flags ().BoolVar (& flagTraceCadence , "trace-cadence" , false , "trace Cadence" )
7079}
7180
7281func run (_ * cobra.Command , args []string ) {
@@ -178,7 +187,55 @@ func runTransactionID(txID flow.Identifier, flowClient *client.Client, chain flo
178187
179188 blockSnapshot := newBlockSnapshot (remoteSnapshot )
180189
181- debugger := debug .NewRemoteDebugger (chain , log .Logger )
190+ var fvmOptions []fvm.Option
191+
192+ if flagTracePath != "" {
193+
194+ var traceFile * os.File
195+ if flagTracePath == "-" {
196+ traceFile = os .Stdout
197+ } else {
198+ traceFile , err = os .Create (flagTracePath )
199+ if err != nil {
200+ log .Fatal ().Err (err ).Msg ("failed to create trace file" )
201+ }
202+ defer traceFile .Close ()
203+ }
204+
205+ exporter , err := stdouttrace .New (
206+ stdouttrace .WithWriter (traceFile ),
207+ )
208+ if err != nil {
209+ log .Fatal ().Err (err ).Msg ("failed to create trace exporter" )
210+ }
211+
212+ tracer , err := trace .NewTracerWithExporter (
213+ log .Logger ,
214+ "debug-tx" ,
215+ flagChain ,
216+ trace .SensitivityCaptureAll ,
217+ exporter ,
218+ )
219+ if err != nil {
220+ log .Fatal ().Err (err ).Msg ("failed to create tracer" )
221+ }
222+
223+ span , _ := tracer .StartTransactionSpan (context .TODO (), txID , "" )
224+ defer span .End ()
225+
226+ fvmOptions = append (
227+ fvmOptions ,
228+ fvm .WithTracer (tracer ),
229+ fvm .WithSpan (span ),
230+ )
231+ }
232+
233+ debugger := debug .NewRemoteDebugger (
234+ chain ,
235+ log .Logger ,
236+ flagTraceCadence ,
237+ fvmOptions ... ,
238+ )
182239
183240 for _ , blockTx := range txsResult {
184241 blockTxID := flow .Identifier (blockTx .ID ())
0 commit comments