Skip to content

Commit 7315ee4

Browse files
authored
Merge branch 'master' into leo/pebble-merge-master
2 parents 2203da7 + f67f354 commit 7315ee4

File tree

8 files changed

+172
-15
lines changed

8 files changed

+172
-15
lines changed

cmd/util/cmd/debug-tx/cmd.go

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

@@ -36,6 +39,7 @@ var (
3639
flagProposalKeySeq uint64
3740
flagUseExecutionDataAPI bool
3841
flagDumpRegisters bool
42+
flagTracePath string
3943
)
4044

4145
var 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

7278
func 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())

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ require (
112112
github.com/onflow/wal v1.0.2
113113
github.com/slok/go-http-metrics v0.12.0
114114
github.com/sony/gobreaker v0.5.0
115+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0
115116
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da
116117
google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a
117118
google.golang.org/genproto/googleapis/bytestream v0.0.0-20250603155806-513f23925822

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,6 +1352,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy
13521352
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o=
13531353
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc=
13541354
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I=
1355+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec=
1356+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0/go.mod h1:kB3ufRbfU+CQ4MlUcqtW8Z7YEOBeK2DJ6CmR5rYYF3E=
13551357
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
13561358
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
13571359
go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=

module/mock/tracer.go

Lines changed: 39 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

module/trace/noop.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@ func (t *NoopTracer) StartCollectionSpan(
6363
return NoopSpan, ctx
6464
}
6565

66+
func (t *NoopTracer) StartTransactionSpan(
67+
ctx context.Context,
68+
entityID flow.Identifier,
69+
spanName SpanName,
70+
opts ...trace.SpanStartOption,
71+
) (
72+
trace.Span,
73+
context.Context,
74+
) {
75+
return NoopSpan, ctx
76+
}
77+
6678
func (t *NoopTracer) StartSpanFromContext(
6779
ctx context.Context,
6880
operationName SpanName,

module/trace/trace.go

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,36 @@ func NewTracer(
5555
) (
5656
*Tracer,
5757
error,
58+
) {
59+
ctx := context.TODO()
60+
// OLTP trace gRPC client initialization. Connection parameters for the exporter are extracted
61+
// from environment variables. e.g.: `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`.
62+
//
63+
// For more information, see OpenTelemetry specification:
64+
// https://github.com/open-telemetry/opentelemetry-specification/blob/v1.12.0/specification/protocol/exporter.md
65+
traceExporter, err := otlptracegrpc.New(ctx)
66+
if err != nil {
67+
return nil, fmt.Errorf("failed to create trace exporter: %w", err)
68+
}
69+
70+
return NewTracerWithExporter(
71+
log,
72+
serviceName,
73+
chainID,
74+
sensitivity,
75+
traceExporter,
76+
)
77+
}
78+
79+
func NewTracerWithExporter(
80+
log zerolog.Logger,
81+
serviceName string,
82+
chainID string,
83+
sensitivity uint,
84+
traceExporter sdktrace.SpanExporter,
85+
) (
86+
*Tracer,
87+
error,
5888
) {
5989
ctx := context.TODO()
6090
res, err := resource.New(
@@ -68,16 +98,6 @@ func NewTracer(
6898
return nil, fmt.Errorf("failed to create resource: %w", err)
6999
}
70100

71-
// OLTP trace gRPC client initialization. Connection parameters for the exporter are extracted
72-
// from environment variables. e.g.: `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`.
73-
//
74-
// For more information, see OpenTelemetry specification:
75-
// https://github.com/open-telemetry/opentelemetry-specification/blob/v1.12.0/specification/protocol/exporter.md
76-
traceExporter, err := otlptracegrpc.New(ctx)
77-
if err != nil {
78-
return nil, fmt.Errorf("failed to create trace exporter: %w", err)
79-
}
80-
81101
tracerProvider := sdktrace.NewTracerProvider(
82102
sdktrace.WithResource(res),
83103
sdktrace.WithBatcher(traceExporter),
@@ -207,6 +227,18 @@ func (t *Tracer) StartCollectionSpan(
207227
return t.startEntitySpan(ctx, collectionID, EntityTypeCollection, spanName, opts...)
208228
}
209229

230+
func (t *Tracer) StartTransactionSpan(
231+
ctx context.Context,
232+
transactionID flow.Identifier,
233+
spanName SpanName,
234+
opts ...trace.SpanStartOption,
235+
) (
236+
trace.Span,
237+
context.Context,
238+
) {
239+
return t.startEntitySpan(ctx, transactionID, EntityTypeTransaction, spanName, opts...)
240+
}
241+
210242
func (t *Tracer) StartSpanFromContext(
211243
ctx context.Context,
212244
operationName SpanName,

module/tracer.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ type Tracer interface {
3535
context.Context,
3636
)
3737

38-
// StartCollectionSpan starts an span for a collection, built as a child of
38+
// StartCollectionSpan starts a span for a collection, built as a child of
3939
// rootSpan. It also returns the context including this span which can be
4040
// used for nested calls.
4141
StartCollectionSpan(
@@ -48,6 +48,16 @@ type Tracer interface {
4848
context.Context,
4949
)
5050

51+
StartTransactionSpan(
52+
ctx context.Context,
53+
transactionID flow.Identifier,
54+
spanName trace.SpanName,
55+
opts ...otelTrace.SpanStartOption,
56+
) (
57+
otelTrace.Span,
58+
context.Context,
59+
)
60+
5161
StartSpanFromContext(
5262
ctx context.Context,
5363
operationName trace.SpanName,

utils/debug/remoteDebugger.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,23 @@ type RemoteDebugger struct {
2121
func NewRemoteDebugger(
2222
chain flow.Chain,
2323
logger zerolog.Logger,
24+
options ...fvm.Option,
2425
) *RemoteDebugger {
2526
vm := fvm.NewVirtualMachine()
2627

2728
// no signature processor here
2829
// TODO Maybe we add fee-deduction step as well
30+
2931
ctx := fvm.NewContext(
30-
fvm.WithLogger(logger),
31-
fvm.WithChain(chain),
32-
fvm.WithAuthorizationChecksEnabled(false),
32+
append(
33+
[]fvm.Option{
34+
fvm.WithLogger(logger),
35+
fvm.WithChain(chain),
36+
fvm.WithAuthorizationChecksEnabled(false),
37+
fvm.WithEVMEnabled(true),
38+
},
39+
options...,
40+
)...,
3341
)
3442

3543
return &RemoteDebugger{

0 commit comments

Comments
 (0)