@@ -127,8 +127,8 @@ void WorkerTracer::addSpan(tracing::CompleteSpan&& span) {
127127 // The span information is not transmitted via RPC at this point, we can decompose the span into
128128 // spanOpen/spanEnd.
129129 addSpanOpen (span.spanId , span.parentSpanId , kj::mv (span.operationName ), span.startTime );
130- tracing::SpanEndData spanEnd (kj::mv (span));
131- addSpanEnd (kj::mv (spanEnd));
130+ tracing::SpanEndData spanEnd (span. spanId , span. endTime , kj::mv (span. tags ));
131+ addSpanEnd (kj::mv (spanEnd), span. startTime );
132132}
133133
134134void WorkerTracer::addSpanOpen (tracing::SpanId spanId,
@@ -154,7 +154,7 @@ void WorkerTracer::addSpanOpen(tracing::SpanId spanId,
154154 spanOpenContext, tracing::SpanOpen (spanId, kj::mv (operationName)), startTime, spanNameSize);
155155}
156156
157- void WorkerTracer::addSpanEnd (tracing::SpanEndData&& span) {
157+ void WorkerTracer::addSpanEnd (tracing::SpanEndData&& span, kj::Maybe<kj::Date> maybeStartTime ) {
158158 if (pipelineLogLevel == PipelineLogLevel::NONE) {
159159 return ;
160160 }
@@ -163,7 +163,7 @@ void WorkerTracer::addSpanEnd(tracing::SpanEndData&& span) {
163163 // variable for it and it can't cause truncation.
164164 auto & tailStreamWriter = KJ_UNWRAP_OR_RETURN (maybeTailStreamWriter);
165165
166- adjustSpanTime (span);
166+ adjustSpanTime (span, maybeStartTime );
167167
168168 size_t spanTagsSize = 0 ;
169169 for (const Span::TagMap::Entry& tag: span.tags ) {
@@ -192,7 +192,7 @@ void WorkerTracer::addSpanEnd(tracing::SpanEndData&& span) {
192192 tracing::CustomInfo attr = KJ_MAP (tag, span.tags ) {
193193 return tracing::Attribute (kj::mv (tag.key ), kj::mv (tag.value ));
194194 };
195- tailStreamWriter->report (spanComponentContext, kj::mv (attr), span.startTime , spanTagsSize);
195+ tailStreamWriter->report (spanComponentContext, kj::mv (attr), span.endTime , spanTagsSize);
196196 }
197197 tailStreamWriter->report (spanComponentContext, tracing::SpanClose (), span.endTime , 0 );
198198}
@@ -459,14 +459,18 @@ void BaseTracer::adjustSpanTime(tracing::CompleteSpan& span) {
459459 }
460460}
461461
462- void BaseTracer::adjustSpanTime (tracing::SpanEndData& span) {
462+ void BaseTracer::adjustSpanTime (tracing::SpanEndData& span, kj::Maybe<kj::Date> maybeStartTime ) {
463463 // To report I/O time, we need the IOContext to still be alive.
464464 // weakIoContext is only none if we are tracing via RPC (in this case span times have already been
465465 // adjusted) or if we failed to transmit an Onset event (in that case we'll get an error based on
466466 // missing topLevelInvocationSpanContext right after).
467467 if (weakIoContext != kj::none) {
468468 auto & weakIoCtx = KJ_ASSERT_NONNULL (weakIoContext);
469- weakIoCtx->runIfAlive ([this , &span](IoContext& context) {
469+ // startTime is generally available when we are not tracing via RPC, so we can assert that it is
470+ // present. For the RPC case, the adjustment will already have been done earlier and it's ok
471+ // for maybeStartTime to be none as this code won't run based on weakIoContext being none.
472+ kj::Date startTime = KJ_ASSERT_NONNULL (maybeStartTime);
473+ weakIoCtx->runIfAlive ([this , &span, &startTime](IoContext& context) {
470474 if (context.hasCurrentIncomingRequest ()) {
471475 span.endTime = context.now ();
472476 } else {
@@ -478,7 +482,7 @@ void BaseTracer::adjustSpanTime(tracing::SpanEndData& span) {
478482 span.endTime = completeTime;
479483 hasCompleteTime = true ;
480484 } else {
481- span.endTime = span. startTime ;
485+ span.endTime = startTime;
482486 }
483487 if (isPredictableModeForTest ()) {
484488 KJ_FAIL_ASSERT (" reported span without current request" , hasCompleteTime);
@@ -498,7 +502,7 @@ void BaseTracer::adjustSpanTime(tracing::SpanEndData& span) {
498502 } else {
499503 // Otherwise, we can't actually get an end timestamp that makes sense. Report a zero-duration
500504 // span and log a warning (or fail assert in test mode).
501- span.endTime = span. startTime ;
505+ span.endTime = startTime;
502506 if (isPredictableModeForTest ()) {
503507 KJ_FAIL_ASSERT (" reported span after IoContext was deallocated" );
504508 } else {
0 commit comments