@@ -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