diff --git a/src/workerd/io/trace.h b/src/workerd/io/trace.h index 3191a4f3d02..714ec8cd654 100644 --- a/src/workerd/io/trace.h +++ b/src/workerd/io/trace.h @@ -301,6 +301,7 @@ class MaybeSpan { }; bool operator==(std::nullptr_t) { return span == nullptr; } + explicit operator bool() { return span != nullptr; } kj::Maybe getSpanContext() { KJ_IF_MAYBE(s, span) { diff --git a/src/workerd/io/worker.c++ b/src/workerd/io/worker.c++ index 8b20de38bfe..27529b3eece 100644 --- a/src/workerd/io/worker.c++ +++ b/src/workerd/io/worker.c++ @@ -1253,8 +1253,21 @@ Worker::Worker(kj::Own scriptParam, } }); + auto maybeMakeSpan = [&](auto operationName) -> MaybeSpan { + if (auto span = systemTracer.makeSpan(operationName)) { + span.setTag("truncated_script_id"_kj, truncateScriptId(script->getId())); + return kj::mv(span); + } else { + return MaybeSpan(); + } + }; + + MaybeSpan currentSpan = maybeMakeSpan("lw:new_startup_metrics"_kj); + auto startupMetrics = metrics->startup(startType); + currentSpan = maybeMakeSpan("lw:new_context"); + // Create a stack-allocated handle scope. v8::HandleScope handleScope(lock.v8Isolate); @@ -1264,6 +1277,7 @@ Worker::Worker(kj::Own scriptParam, // const_cast OK because guarded by `lock`. context = const_cast*>(c) ->getHandle(lock.v8Isolate); + currentSpan.setTag("module_context", true); } else { // Create a new context. context = this->impl->context.emplace(script->isolate->apiIsolate->newContext(lock)) @@ -1286,11 +1300,8 @@ Worker::Worker(kj::Own scriptParam, try { try { - MaybeSpan instantiationSpan = systemTracer.makeSpan( - "lw:globals_instantiation"_kj, systemTracer.getSpanContext()); - if (instantiationSpan != nullptr) { - instantiationSpan.setTag("truncated_script_id"_kj, truncateScriptId(script->getId())); - } + currentSpan = maybeMakeSpan("lw:globals_instantiation"_kj); + v8::Local bindingsScope; if (script->isModular()) { // Use `env` variable. @@ -1317,11 +1328,8 @@ Worker::Worker(kj::Own scriptParam, compileBindings(lock, *script->isolate->apiIsolate, bindingsScope); // Execute script. - MaybeSpan executionSpan = systemTracer.makeSpan( - "lw:top_level_execution"_kj, systemTracer.getSpanContext()); - if (executionSpan != nullptr) { - executionSpan.setTag("truncated_script_id"_kj, truncateScriptId(script->getId())); - } + currentSpan = maybeMakeSpan("lw:top_level_execution"_kj); + KJ_SWITCH_ONEOF(script->impl->unboundScriptOrMainModule) { KJ_CASE_ONEOF(unboundScript, jsg::NonModuleScript) { auto limitScope = script->isolate->getLimitEnforcer().enterStartupJs(lock, maybeLimitError);