Skip to content

Commit 30bc3e2

Browse files
committed
Avoid including startTime in SpanEnd, sending it via RPC
1 parent c302bb5 commit 30bc3e2

File tree

6 files changed

+23
-34
lines changed

6 files changed

+23
-34
lines changed

src/workerd/io/trace.c++

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1529,15 +1529,8 @@ void SpanOpenData::copyTo(rpc::SpanOpenData::Builder builder) const {
15291529
builder.setParentSpanId(parentSpanId);
15301530
}
15311531

1532-
SpanEndData::SpanEndData(CompleteSpan&& span)
1533-
: spanId(span.spanId),
1534-
startTime(span.startTime),
1535-
endTime(span.endTime),
1536-
tags(kj::mv(span.tags)) {}
1537-
15381532
SpanEndData::SpanEndData(rpc::SpanEndData::Reader reader)
15391533
: spanId(reader.getSpanId()),
1540-
startTime(kj::UNIX_EPOCH + reader.getStartTimeNs() * kj::NANOSECONDS),
15411534
endTime(kj::UNIX_EPOCH + reader.getEndTimeNs() * kj::NANOSECONDS) {
15421535
auto tagsParam = reader.getTags();
15431536
tags.reserve(tagsParam.size());
@@ -1548,7 +1541,6 @@ SpanEndData::SpanEndData(rpc::SpanEndData::Reader reader)
15481541
}
15491542

15501543
void SpanEndData::copyTo(rpc::SpanEndData::Builder builder) const {
1551-
builder.setStartTimeNs((startTime - kj::UNIX_EPOCH) / kj::NANOSECONDS);
15521544
builder.setEndTimeNs((endTime - kj::UNIX_EPOCH) / kj::NANOSECONDS);
15531545
builder.setSpanId(spanId);
15541546

src/workerd/io/trace.capnp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,10 @@ struct SpanEndData {
5757
# Representation of an event that indicates completion of a user span. This information is
5858
# provided to the streaming tail worker in the Attributes and SpanClose events.
5959

60-
# TODO(cleanup): startTimeNs is merely used as a fallback timestamp, consider obsoleting it.
61-
startTimeNs @0 :Int64;
62-
# Nanoseconds since Unix epoch
63-
endTimeNs @1 :Int64;
60+
endTimeNs @0 :Int64;
6461
# Nanoseconds since Unix epoch
6562

6663
# List of span attributes
67-
tags @2 :List(Tag);
68-
spanId @3 :UInt64;
64+
tags @1 :List(Tag);
65+
spanId @2 :UInt64;
6966
}

src/workerd/io/trace.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -671,22 +671,17 @@ struct SpanEndData {
671671
// Represents the data needed when closing a span, including the Attributes and SpanClose events.
672672
tracing::SpanId spanId;
673673

674-
kj::Date startTime;
675674
kj::Date endTime;
676675
// Should be Span::TagMap, but we can't forward-declare that.
677676
kj::HashMap<kj::ConstString, tracing::Attribute::Value> tags;
678677

679-
// Convert CompleteSpan to SpanEndData
680-
explicit SpanEndData(CompleteSpan&& span);
681678
SpanEndData(rpc::SpanEndData::Reader reader);
682679
void copyTo(rpc::SpanEndData::Builder builder) const;
683680
explicit SpanEndData(tracing::SpanId spanId,
684-
kj::Date startTime,
685681
kj::Date endTime,
686682
kj::HashMap<kj::ConstString, tracing::Attribute::Value> tags =
687683
kj::HashMap<kj::ConstString, tracing::Attribute::Value>())
688684
: spanId(spanId),
689-
startTime(startTime),
690685
endTime(endTime),
691686
tags(kj::mv(tags)) {}
692687
};

src/workerd/io/tracer.c++

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

134134
void 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 {

src/workerd/io/tracer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class BaseTracer: public kj::Refcounted {
3939
kj::ConstString operationName,
4040
kj::Date startTime) = 0;
4141
// Add span events when the span is complete (Attributes and SpanClose).
42-
virtual void addSpanEnd(tracing::SpanEndData&& span) = 0;
42+
virtual void addSpanEnd(tracing::SpanEndData&& span, kj::Maybe<kj::Date> maybeStartTime) = 0;
4343

4444
virtual void addException(const tracing::InvocationSpanContext& context,
4545
kj::Date timestamp,
@@ -97,7 +97,7 @@ class BaseTracer: public kj::Refcounted {
9797

9898
// helper method for addSpan() implementations
9999
void adjustSpanTime(tracing::CompleteSpan& span);
100-
void adjustSpanTime(tracing::SpanEndData& span);
100+
void adjustSpanTime(tracing::SpanEndData& span, kj::Maybe<kj::Date> maybeStartTime);
101101

102102
// Function to create the root span for the new tracing format.
103103
kj::Maybe<MakeUserRequestSpanFunc> makeUserRequestSpanFunc;
@@ -138,7 +138,7 @@ class WorkerTracer final: public BaseTracer {
138138
tracing::SpanId parentSpanId,
139139
kj::ConstString operationName,
140140
kj::Date startTime) override;
141-
void addSpanEnd(tracing::SpanEndData&& span) override;
141+
void addSpanEnd(tracing::SpanEndData&& span, kj::Maybe<kj::Date> maybeStartTime) override;
142142
void addException(const tracing::InvocationSpanContext& context,
143143
kj::Date timestamp,
144144
kj::String name,

src/workerd/server/server.c++

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1703,16 +1703,17 @@ class SequentialSpanSubmitter final: public SpanSubmitter {
17031703
void submitSpan(tracing::SpanId spanId, tracing::SpanId parentSpanId, const Span& span) override {
17041704
// This code path is workerd-only, we can safely utilize submitSpanOpen here.
17051705
submitSpanOpen(spanId, parentSpanId, span.operationName.clone(), span.startTime);
1706-
tracing::SpanEndData span2(spanId, span.startTime, span.endTime);
1706+
kj::Date startTime = span.startTime;
1707+
tracing::SpanEndData span2(spanId, span.endTime);
17071708
span2.tags.reserve(span.tags.size());
17081709
for (auto& tag: span.tags) {
17091710
span2.tags.insert(tag.key.clone(), spanTagClone(tag.value));
17101711
}
17111712
if (isPredictableModeForTest()) {
1712-
span2.startTime = span2.endTime = kj::UNIX_EPOCH;
1713+
startTime = span2.endTime = kj::UNIX_EPOCH;
17131714
}
17141715

1715-
workerTracer->addSpanEnd(kj::mv(span2));
1716+
workerTracer->addSpanEnd(kj::mv(span2), startTime);
17161717
}
17171718

17181719
void submitSpanOpen(tracing::SpanId spanId,

0 commit comments

Comments
 (0)