Skip to content

Commit 3dc8195

Browse files
authored
Merge pull request #5800 from cloudflare/mar/alarm-event-order
Set tracing event info before marking request as delivered.
2 parents e46f4d8 + 7d269c2 commit 3dc8195

File tree

4 files changed

+33
-31
lines changed

4 files changed

+33
-31
lines changed

src/workerd/api/hibernatable-web-socket.c++

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -184,27 +184,23 @@ HibernatableWebSocketCustomEvent::HibernatableWebSocketCustomEvent(
184184
params(kj::mv(params)),
185185
manager(manager) {}
186186

187-
// TODO(cleanup): Try to reduce duplication with consumeParams()
188-
tracing::EventInfo HibernatableWebSocketCustomEvent::getEventInfo() const {
189-
// Try to extract event type from params if available
187+
// Try to extract event type from params if available
188+
tracing::HibernatableWebSocketEventInfo::Type HibernatableWebSocketCustomEvent::getEventType()
189+
const {
190190
KJ_SWITCH_ONEOF(params) {
191191
KJ_CASE_ONEOF(socketParams, HibernatableSocketParams) {
192192
KJ_SWITCH_ONEOF(socketParams.eventType) {
193-
KJ_CASE_ONEOF(text, HibernatableSocketParams::Text) {
194-
return tracing::HibernatableWebSocketEventInfo(
195-
tracing::HibernatableWebSocketEventInfo::Message());
193+
KJ_CASE_ONEOF(_, HibernatableSocketParams::Text) {
194+
return tracing::HibernatableWebSocketEventInfo::Message{};
196195
}
197-
KJ_CASE_ONEOF(data, HibernatableSocketParams::Data) {
198-
return tracing::HibernatableWebSocketEventInfo(
199-
tracing::HibernatableWebSocketEventInfo::Message());
196+
KJ_CASE_ONEOF(_, HibernatableSocketParams::Data) {
197+
return tracing::HibernatableWebSocketEventInfo::Message{};
200198
}
201199
KJ_CASE_ONEOF(close, HibernatableSocketParams::Close) {
202-
return tracing::HibernatableWebSocketEventInfo(
203-
tracing::HibernatableWebSocketEventInfo::Close{close.code, close.wasClean});
200+
return tracing::HibernatableWebSocketEventInfo::Close{close.code, close.wasClean};
204201
}
205-
KJ_CASE_ONEOF(error, HibernatableSocketParams::Error) {
206-
return tracing::HibernatableWebSocketEventInfo(
207-
tracing::HibernatableWebSocketEventInfo::Error());
202+
KJ_CASE_ONEOF(_, HibernatableSocketParams::Error) {
203+
return tracing::HibernatableWebSocketEventInfo::Error{};
208204
}
209205
}
210206
}
@@ -214,23 +210,24 @@ tracing::EventInfo HibernatableWebSocketCustomEvent::getEventInfo() const {
214210
switch (payload.which()) {
215211
case rpc::HibernatableWebSocketEventMessage::Payload::TEXT:
216212
case rpc::HibernatableWebSocketEventMessage::Payload::DATA:
217-
return tracing::HibernatableWebSocketEventInfo(
218-
tracing::HibernatableWebSocketEventInfo::Message());
213+
return tracing::HibernatableWebSocketEventInfo::Message{};
219214
case rpc::HibernatableWebSocketEventMessage::Payload::CLOSE: {
220215
auto close = payload.getClose();
221-
return tracing::HibernatableWebSocketEventInfo(
222-
tracing::HibernatableWebSocketEventInfo::Close{close.getCode(), close.getWasClean()});
216+
return tracing::HibernatableWebSocketEventInfo::Close{
217+
close.getCode(), close.getWasClean()};
223218
}
224219
case rpc::HibernatableWebSocketEventMessage::Payload::ERROR:
225-
return tracing::HibernatableWebSocketEventInfo(
226-
tracing::HibernatableWebSocketEventInfo::Error());
220+
return tracing::HibernatableWebSocketEventInfo::Error{};
227221
}
228-
KJ_UNREACHABLE;
229222
}
230223
}
231224
KJ_UNREACHABLE;
232225
}
233226

227+
tracing::EventInfo HibernatableWebSocketCustomEvent::getEventInfo() const {
228+
return tracing::HibernatableWebSocketEventInfo(getEventType());
229+
}
230+
234231
HibernatableSocketParams HibernatableWebSocketCustomEvent::consumeParams() {
235232
KJ_IF_SOME(p, params.tryGet<kj::Own<HibernationReader>>()) {
236233
kj::Maybe<HibernatableSocketParams> eventParameters;

src/workerd/api/hibernatable-web-socket.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ class HibernatableWebSocketCustomEvent final: public WorkerInterface::CustomEven
8888
// HibernatableSocketParams first.
8989
HibernatableSocketParams consumeParams();
9090

91+
// Peeks at params to extract the event type for tracing, without consuming them.
92+
tracing::HibernatableWebSocketEventInfo::Type getEventType() const;
93+
9194
uint16_t typeId;
9295
kj::OneOf<HibernatableSocketParams, kj::Own<HibernationReader>> params;
9396
kj::Maybe<uint32_t> timeoutMs;

src/workerd/io/worker-entrypoint.c++

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,6 @@ kj::Promise<void> WorkerEntrypoint::request(kj::HttpMethod method,
252252
auto incomingRequest =
253253
kj::mv(KJ_REQUIRE_NONNULL(this->incomingRequest, "request() can only be called once"));
254254
this->incomingRequest = kj::none;
255-
incomingRequest->delivered();
256255
auto& context = incomingRequest->getContext();
257256

258257
auto wrappedResponse = kj::heap<ResponseSentTracker>(response);
@@ -292,6 +291,8 @@ kj::Promise<void> WorkerEntrypoint::request(kj::HttpMethod method,
292291
workerTracer = t;
293292
}
294293

294+
incomingRequest->delivered();
295+
295296
auto metricsForCatch = kj::addRef(incomingRequest->getMetrics());
296297
auto metricsForProxyTask = kj::addRef(incomingRequest->getMetrics());
297298

@@ -575,7 +576,6 @@ kj::Promise<WorkerInterface::ScheduledResult> WorkerEntrypoint::runScheduled(
575576
auto incomingRequest =
576577
kj::mv(KJ_REQUIRE_NONNULL(this->incomingRequest, "runScheduled() can only be called once"));
577578
this->incomingRequest = kj::none;
578-
incomingRequest->delivered();
579579
auto& context = incomingRequest->getContext();
580580

581581
KJ_ASSERT(context.getActor() == kj::none);
@@ -585,10 +585,12 @@ kj::Promise<WorkerInterface::ScheduledResult> WorkerEntrypoint::runScheduled(
585585

586586
double eventTime = (scheduledTime - kj::UNIX_EPOCH) / kj::MILLISECONDS;
587587

588-
KJ_IF_SOME(t, context.getWorkerTracer()) {
588+
KJ_IF_SOME(t, incomingRequest->getWorkerTracer()) {
589589
t.setEventInfo(*incomingRequest, tracing::ScheduledEventInfo(eventTime, kj::str(cron)));
590590
}
591591

592+
incomingRequest->delivered();
593+
592594
// Scheduled handlers run entirely in waitUntil() tasks.
593595
context.addWaitUntil(context.run(
594596
[scheduledTime, cron, entrypointName = entrypointName, props = kj::mv(props), &context,
@@ -642,13 +644,14 @@ kj::Promise<WorkerInterface::AlarmResult> WorkerEntrypoint::runAlarmImpl(
642644
co_return result;
643645
}
644646

645-
// There isn't a pre-existing alarm, we can call `delivered()` (and emit metrics events).
646-
incomingRequest->delivered();
647-
647+
// There isn't a pre-existing alarm, we can set event info and call `delivered()` (which emits
648+
// metrics events).
648649
KJ_IF_SOME(t, incomingRequest->getWorkerTracer()) {
649650
t.setEventInfo(*incomingRequest, tracing::AlarmEventInfo(scheduledTime));
650651
}
651652

653+
incomingRequest->delivered();
654+
652655
auto scheduleAlarmResult = co_await actor.scheduleAlarm(scheduledTime);
653656
KJ_SWITCH_ONEOF(scheduleAlarmResult) {
654657
KJ_CASE_ONEOF(af, WorkerInterface::AlarmFulfiller) {
@@ -736,13 +739,13 @@ kj::Promise<bool> WorkerEntrypoint::test() {
736739
auto incomingRequest =
737740
kj::mv(KJ_REQUIRE_NONNULL(this->incomingRequest, "test() can only be called once"));
738741
this->incomingRequest = kj::none;
739-
incomingRequest->delivered();
740-
741742
auto& context = incomingRequest->getContext();
742-
KJ_IF_SOME(t, context.getWorkerTracer()) {
743+
KJ_IF_SOME(t, incomingRequest->getWorkerTracer()) {
743744
t.setEventInfo(*incomingRequest, tracing::CustomEventInfo());
744745
}
745746

747+
incomingRequest->delivered();
748+
746749
context.addWaitUntil(context.run([entrypointName = entrypointName, props = kj::mv(props),
747750
&context, &metrics = incomingRequest->getMetrics()](
748751
Worker::Lock& lock) mutable -> kj::Promise<void> {

src/workerd/io/worker-interface.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,6 @@ class WorkerInterface: public kj::HttpService {
132132
virtual uint16_t getType() = 0;
133133

134134
// Get event info for tracing.
135-
// Return none if this event type doesn't need tracing.
136135
virtual tracing::EventInfo getEventInfo() const = 0;
137136

138137
// If the CustomEvent fails before any of the other methods are called, this may be invoked

0 commit comments

Comments
 (0)