@@ -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
3943)
4044
4145var Cmd = & cobra.Command {
@@ -67,6 +71,8 @@ func init() {
6771 Cmd .Flags ().BoolVar (& flagUseExecutionDataAPI , "use-execution-data-api" , false , "use the execution data API" )
6872
6973 Cmd .Flags ().BoolVar (& flagDumpRegisters , "dump-registers" , false , "dump registers" )
74+
75+ Cmd .Flags ().StringVar (& flagTracePath , "trace" , "" , "enable tracing to given path" )
7076}
7177
7278func run (_ * cobra.Command , args []string ) {
@@ -178,7 +184,54 @@ func runTransactionID(txID flow.Identifier, flowClient *client.Client, chain flo
178184
179185 blockSnapshot := newBlockSnapshot (remoteSnapshot )
180186
181- debugger := debug .NewRemoteDebugger (chain , log .Logger )
187+ var fvmOptions []fvm.Option
188+
189+ if flagTracePath != "" {
190+
191+ var traceFile * os.File
192+ if flagTracePath == "-" {
193+ traceFile = os .Stdout
194+ } else {
195+ traceFile , err = os .Create (flagTracePath )
196+ if err != nil {
197+ log .Fatal ().Err (err ).Msg ("failed to create trace file" )
198+ }
199+ defer traceFile .Close ()
200+ }
201+
202+ exporter , err := stdouttrace .New (
203+ stdouttrace .WithWriter (traceFile ),
204+ )
205+ if err != nil {
206+ log .Fatal ().Err (err ).Msg ("failed to create trace exporter" )
207+ }
208+
209+ tracer , err := trace .NewTracerWithExporter (
210+ log .Logger ,
211+ "debug-tx" ,
212+ flagChain ,
213+ trace .SensitivityCaptureAll ,
214+ exporter ,
215+ )
216+ if err != nil {
217+ log .Fatal ().Err (err ).Msg ("failed to create tracer" )
218+ }
219+
220+ span , _ := tracer .StartTransactionSpan (context .TODO (), txID , "" )
221+ defer span .End ()
222+
223+ fvmOptions = append (
224+ fvmOptions ,
225+ fvm .WithTracer (tracer ),
226+ fvm .WithSpan (span ),
227+ )
228+ }
229+
230+ debugger := debug .NewRemoteDebugger (
231+ chain ,
232+ log .Logger ,
233+ fvmOptions ... ,
234+ )
182235
183236 for _ , blockTx := range txsResult {
184237 blockTxID := flow .Identifier (blockTx .ID ())
0 commit comments