Skip to content

Commit bff3829

Browse files
committed
Fix issue where span status wasn't properly passed to parents
1 parent ffe8de3 commit bff3829

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

eth/catalyst/api.go

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import (
4848
"go.opentelemetry.io/otel"
4949
"go.opentelemetry.io/otel/attribute"
5050
"go.opentelemetry.io/otel/codes"
51+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
5152
"go.opentelemetry.io/otel/trace"
5253
)
5354

@@ -628,11 +629,18 @@ func startNewPayloadSpan(ctx context.Context, name string, params engine.Executa
628629
attribute.Int("tx.count", len(params.Transactions)),
629630
)
630631
spanEnd := func(err *error) {
632+
ro, _ := span.(sdktrace.ReadOnlySpan)
631633
if *err != nil {
634+
// Error occurred, record it and set status on span and parent
632635
span.RecordError(*err)
633636
span.SetStatus(codes.Error, (*err).Error())
634637
parentSpan.SetStatus(codes.Error, (*err).Error())
635-
} else {
638+
} else if ro.Status().Code == codes.Error {
639+
// Span's child had an error, propagate it to parent
640+
// Note: Span's status was already set in the child
641+
parentSpan.SetStatus(codes.Error, ro.Status().Description)
642+
} else if ro.Status().Code == codes.Unset {
643+
// No error and no status set, mark as success
636644
span.SetStatus(codes.Ok, "")
637645
}
638646
span.End()
@@ -740,16 +748,10 @@ func (api *ConsensusAPI) newPayload(ctx context.Context, params engine.Executabl
740748

741749
log.Trace("Engine API request received", "method", "NewPayload", "number", params.Number, "hash", params.BlockHash)
742750

743-
tracer := otel.Tracer("")
744-
rootSpan := trace.SpanFromContext(ctx)
745-
_, span := tracer.Start(ctx, "engine.newPayload.ExecutableDataToBlock")
751+
_, spanEnd := startNewPayloadSpan(ctx, "engine.newPayload.ExecutableDataToBlock", params)
746752
block, err := engine.ExecutableDataToBlock(params, versionedHashes, beaconRoot, requests)
747-
if err != nil {
748-
span.RecordError(err)
749-
span.SetStatus(codes.Error, err.Error())
750-
rootSpan.SetStatus(codes.Error, err.Error())
751-
}
752-
span.End()
753+
spanEnd(&err)
754+
753755
if err != nil {
754756
bgu := "nil"
755757
if params.BlobGasUsed != nil {
@@ -822,14 +824,9 @@ func (api *ConsensusAPI) newPayload(ctx context.Context, params engine.Executabl
822824
return engine.PayloadStatusV1{Status: engine.ACCEPTED}, nil
823825
}
824826
log.Trace("Inserting block without sethead", "hash", block.Hash(), "number", block.Number())
825-
_, span = tracer.Start(ctx, "engine.newPayload.InsertBlockWithoutSetHead")
827+
_, spanEnd = startNewPayloadSpan(ctx, "engine.newPayload.InsertBlockWithoutSetHead", params)
826828
proofs, err := api.eth.BlockChain().InsertBlockWithoutSetHead(block, witness)
827-
if err != nil {
828-
span.RecordError(err)
829-
span.SetStatus(codes.Error, err.Error())
830-
rootSpan.SetStatus(codes.Error, err.Error())
831-
}
832-
span.End()
829+
spanEnd(&err)
833830
if err != nil {
834831
log.Warn("NewPayload: inserting block failed", "error", err)
835832

0 commit comments

Comments
 (0)