Fix issue where span status wasn't properly passed to parents

This commit is contained in:
jonny rhea 2026-01-04 19:12:24 -06:00
parent 1c173805c6
commit 4b13763607

View file

@ -48,6 +48,7 @@ import (
"go.opentelemetry.io/otel" "go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/codes"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel/trace"
) )
@ -643,11 +644,18 @@ func startNewPayloadSpan(ctx context.Context, name string, params engine.Executa
attribute.Int("tx.count", len(params.Transactions)), attribute.Int("tx.count", len(params.Transactions)),
) )
spanEnd := func(err *error) { spanEnd := func(err *error) {
ro, _ := span.(sdktrace.ReadOnlySpan)
if *err != nil { if *err != nil {
// Error occurred, record it and set status on span and parent
span.RecordError(*err) span.RecordError(*err)
span.SetStatus(codes.Error, (*err).Error()) span.SetStatus(codes.Error, (*err).Error())
parentSpan.SetStatus(codes.Error, (*err).Error()) parentSpan.SetStatus(codes.Error, (*err).Error())
} else { } else if ro.Status().Code == codes.Error {
// Span's child had an error, propagate it to parent
// Note: Span's status was already set in the child
parentSpan.SetStatus(codes.Error, ro.Status().Description)
} else if ro.Status().Code == codes.Unset {
// No error and no status set, mark as success
span.SetStatus(codes.Ok, "") span.SetStatus(codes.Ok, "")
} }
span.End() span.End()
@ -755,16 +763,10 @@ func (api *ConsensusAPI) newPayload(ctx context.Context, params engine.Executabl
log.Trace("Engine API request received", "method", "NewPayload", "number", params.Number, "hash", params.BlockHash) log.Trace("Engine API request received", "method", "NewPayload", "number", params.Number, "hash", params.BlockHash)
tracer := otel.Tracer("") _, spanEnd := startNewPayloadSpan(ctx, "engine.newPayload.ExecutableDataToBlock", params)
rootSpan := trace.SpanFromContext(ctx)
_, span := tracer.Start(ctx, "engine.newPayload.ExecutableDataToBlock")
block, err := engine.ExecutableDataToBlock(params, versionedHashes, beaconRoot, requests) block, err := engine.ExecutableDataToBlock(params, versionedHashes, beaconRoot, requests)
if err != nil { spanEnd(&err)
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
rootSpan.SetStatus(codes.Error, err.Error())
}
span.End()
if err != nil { if err != nil {
bgu := "nil" bgu := "nil"
if params.BlobGasUsed != nil { if params.BlobGasUsed != nil {
@ -837,16 +839,11 @@ func (api *ConsensusAPI) newPayload(ctx context.Context, params engine.Executabl
return engine.PayloadStatusV1{Status: engine.ACCEPTED}, nil return engine.PayloadStatusV1{Status: engine.ACCEPTED}, nil
} }
log.Trace("Inserting block without sethead", "hash", block.Hash(), "number", block.Number()) log.Trace("Inserting block without sethead", "hash", block.Hash(), "number", block.Number())
_, spanEnd = startNewPayloadSpan(ctx, "engine.newPayload.InsertBlockWithoutSetHead", params)
start := time.Now() start := time.Now()
_, span = tracer.Start(ctx, "engine.newPayload.InsertBlockWithoutSetHead")
proofs, err := api.eth.BlockChain().InsertBlockWithoutSetHead(block, witness) proofs, err := api.eth.BlockChain().InsertBlockWithoutSetHead(block, witness)
processingTime := time.Since(start) processingTime := time.Since(start)
if err != nil { spanEnd(&err)
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
rootSpan.SetStatus(codes.Error, err.Error())
}
span.End()
if err != nil { if err != nil {
log.Warn("NewPayload: inserting block failed", "error", err) log.Warn("NewPayload: inserting block failed", "error", err)