@@ -261,7 +261,9 @@ kj::Promise<void> WorkerEntrypoint::request(kj::HttpMethod method,
261261
262262 bool isActor = context.getActor () != kj::none;
263263 // HACK: Capture workerTracer directly, it's unclear how to acquire the right tracer from context
264- // when we need it.
264+ // when we need it (for DOs, IoContext may point to a different WorkerTracer by the time we use
265+ // it). The tracer lives as long or longer than the IoContext (based on being co-owned
266+ // by IncomingRequest and PipelineTracer) so long enough.
265267 kj::Maybe<BaseTracer&> workerTracer;
266268
267269 KJ_IF_SOME (t, incomingRequest->getWorkerTracer ()) {
@@ -401,8 +403,8 @@ kj::Promise<void> WorkerEntrypoint::request(kj::HttpMethod method,
401403 proxyTask = kj::none;
402404 }))
403405 .catch_ ([this , wrappedResponse = kj::mv (wrappedResponse), isActor, method, url, &headers,
404- &requestBody, metrics = kj::mv (metricsForCatch)](
405- kj::Exception&& exception) mutable -> kj::Promise<void > {
406+ &requestBody, metrics = kj::mv (metricsForCatch),
407+ workerTracer]( kj::Exception&& exception) mutable -> kj::Promise<void > {
406408 // Don't return errors to end user.
407409 TRACE_EVENT (" workerd" , " WorkerEntrypoint::request() exception" ,
408410 PERFETTO_TERMINATING_FLOW_FROM_POINTER (this ));
@@ -467,7 +469,7 @@ kj::Promise<void> WorkerEntrypoint::request(kj::HttpMethod method,
467469 metrics->setFailedOpen (true );
468470 return promise.attach (kj::mv (service));
469471 });
470- return promise.catch_ ([this , wrappedResponse = kj::mv (wrappedResponse),
472+ return promise.catch_ ([this , wrappedResponse = kj::mv (wrappedResponse), workerTracer,
471473 metrics = kj::mv (metrics)](kj::Exception&& e) mutable {
472474 metrics->setFailedOpen (false );
473475 if (e.getType () != kj::Exception::Type::DISCONNECTED &&
@@ -480,6 +482,9 @@ kj::Promise<void> WorkerEntrypoint::request(kj::HttpMethod method,
480482 if (!wrappedResponse->isSent ()) {
481483 kj::HttpHeaders headers (threadContext.getHeaderTable ());
482484 wrappedResponse->send (500 , " Internal Server Error" , headers, uint64_t (0 ));
485+ KJ_IF_SOME (t, workerTracer) {
486+ t.setReturn (kj::none, tracing::FetchResponseInfo (500 ));
487+ }
483488 }
484489 });
485490 } else if (tunnelExceptions) {
@@ -503,6 +508,10 @@ kj::Promise<void> WorkerEntrypoint::request(kj::HttpMethod method,
503508 } else {
504509 wrappedResponse->send (500 , " Internal Server Error" , headers, uint64_t (0 ));
505510 }
511+ KJ_IF_SOME (t, workerTracer) {
512+ t.setReturn (
513+ kj::none, tracing::FetchResponseInfo (wrappedResponse->getHttpResponseStatus ()));
514+ }
506515 }
507516
508517 return kj::READY_NOW;
0 commit comments