diff --git a/src/workerd/io/trace-stream.c++ b/src/workerd/io/trace-stream.c++ index cb7dcae0dae..76c552664b1 100644 --- a/src/workerd/io/trace-stream.c++ +++ b/src/workerd/io/trace-stream.c++ @@ -62,6 +62,7 @@ namespace { V(OK, "ok") \ V(ONSET, "onset") \ V(OUTCOME, "outcome") \ + V(PREVIEW, "preview") \ V(QUEUE, "queue") \ V(QUEUENAME, "queueName") \ V(RAWSIZE, "rawSize") \ @@ -81,6 +82,7 @@ namespace { V(SPANOPEN, "spanOpen") \ V(STACK, "stack") \ V(STATUSCODE, "statusCode") \ + V(SLUG, "slug") \ V(STREAMDIAGEVENT, "streamDiagEvent") \ V(STREAMDIAGNOSTIC, "streamDiagnostic") \ V(TAG, "tag") \ @@ -366,6 +368,13 @@ jsg::JsValue ToJs(jsg::Lock& js, const Onset& onset, StringCache& cache) { } obj.set(js, SCRIPTVERSION_STR, vobj); } + KJ_IF_SOME(preview, onset.workerInfo.preview) { + auto pobj = js.obj(); + pobj.set(js, ID_STR, js.str(preview.id)); + pobj.set(js, SLUG_STR, js.str(preview.slug)); + pobj.set(js, NAME_STR, js.str(preview.name)); + obj.set(js, PREVIEW_STR, pobj); + } KJ_SWITCH_ONEOF(onset.info) { KJ_CASE_ONEOF(fetch, FetchEventInfo) { diff --git a/src/workerd/io/trace-test.c++ b/src/workerd/io/trace-test.c++ index 25e7a9ce32b..4193f9dfc0a 100644 --- a/src/workerd/io/trace-test.c++ +++ b/src/workerd/io/trace-test.c++ @@ -481,6 +481,8 @@ KJ_TEST("Read/Write Onset works") { Onset info(staticSpanId, Onset::Info(kj::mv(fetchInfo)), { .scriptName = kj::str("foo"), + .preview = TracePreview(kj::str("63bafce9179948688866bb22268eb1c6"), + kj::str("feature-my-branch"), kj::str("feature/my-branch")), }, nullptr); info.copyTo(infoBuilder); @@ -491,12 +493,20 @@ KJ_TEST("Read/Write Onset works") { KJ_ASSERT(fetchInfo2.method == kj::HttpMethod::GET); KJ_ASSERT(fetchInfo2.url == "https://example.com"_kj); KJ_ASSERT(info2.workerInfo.executionModel == ExecutionModel::STATELESS); + auto& preview2 = KJ_ASSERT_NONNULL(info2.workerInfo.preview); + KJ_ASSERT(preview2.id == "63bafce9179948688866bb22268eb1c6"_kj); + KJ_ASSERT(preview2.slug == "feature-my-branch"_kj); + KJ_ASSERT(preview2.name == "feature/my-branch"_kj); Onset info3 = info.clone(); FetchEventInfo& fetchInfo3 = KJ_ASSERT_NONNULL(info3.info.tryGet()); KJ_ASSERT(fetchInfo3.method == kj::HttpMethod::GET); KJ_ASSERT(fetchInfo3.url == "https://example.com"_kj); KJ_ASSERT(info3.workerInfo.executionModel == ExecutionModel::STATELESS); + auto& preview3 = KJ_ASSERT_NONNULL(info3.workerInfo.preview); + KJ_ASSERT(preview3.id == "63bafce9179948688866bb22268eb1c6"_kj); + KJ_ASSERT(preview3.slug == "feature-my-branch"_kj); + KJ_ASSERT(preview3.name == "feature/my-branch"_kj); } KJ_TEST("Read/Write Outcome works") { diff --git a/src/workerd/io/trace.c++ b/src/workerd/io/trace.c++ index 4e2f48fb128..8476ba48551 100644 --- a/src/workerd/io/trace.c++ +++ b/src/workerd/io/trace.c++ @@ -1265,11 +1265,20 @@ kj::Maybe getEntrypointFromReader(const rpc::Trace::Onset::Reader& r } return kj::none; } + +kj::Maybe getPreviewFromReader(const rpc::Trace::Onset::Reader& reader) { + if (reader.hasPreview()) { + return tracing::TracePreview(reader.getPreview()); + } + return kj::none; +} + Onset::WorkerInfo getWorkerInfoFromReader(const rpc::Trace::Onset::Reader& reader) { return Onset::WorkerInfo{ .executionModel = reader.getExecutionModel(), .scriptName = getScriptNameFromReader(reader), .scriptVersion = getScriptVersionFromReader(reader), + .preview = getPreviewFromReader(reader), .dispatchNamespace = getDispatchNamespaceFromReader(reader), .scriptId = getScriptIdFromReader(reader), .scriptTags = getScriptTagsFromReader(reader), @@ -1315,6 +1324,9 @@ void Onset::copyTo(rpc::Trace::Onset::Builder builder) const { KJ_IF_SOME(e, workerInfo.entrypoint) { builder.setEntryPoint(e); } + KJ_IF_SOME(p, workerInfo.preview) { + p.copyTo(builder.initPreview()); + } auto infoBuilder = builder.initInfo(); writeOnsetInfo(info, infoBuilder); @@ -1329,6 +1341,7 @@ Onset::WorkerInfo Onset::WorkerInfo::clone() const { .executionModel = executionModel, .scriptName = mapCopyString(scriptName), .scriptVersion = scriptVersion.map([](auto& version) { return capnp::clone(*version); }), + .preview = preview.map([](auto& preview) { return preview.clone(); }), .dispatchNamespace = mapCopyString(dispatchNamespace), .scriptId = mapCopyString(scriptId), .scriptTags = diff --git a/src/workerd/io/trace.h b/src/workerd/io/trace.h index 69493566085..1ef515166e5 100644 --- a/src/workerd/io/trace.h +++ b/src/workerd/io/trace.h @@ -782,6 +782,7 @@ struct Onset final { ExecutionModel executionModel = ExecutionModel::STATELESS; kj::Maybe scriptName; kj::Maybe> scriptVersion; + kj::Maybe preview; kj::Maybe dispatchNamespace; kj::Maybe scriptId; kj::Maybe> scriptTags; diff --git a/src/workerd/io/tracer.c++ b/src/workerd/io/tracer.c++ index eb4d9a56228..27746c2ba77 100644 --- a/src/workerd/io/tracer.c++ +++ b/src/workerd/io/tracer.c++ @@ -363,6 +363,7 @@ void WorkerTracer::setEventInfoInternal( trace->scriptVersion.map([](auto& scriptVersion) -> kj::Own { return capnp::clone(*scriptVersion); }), + .preview = trace->preview.map([](auto& preview) { return preview.clone(); }), .dispatchNamespace = mapCopyString(trace->dispatchNamespace), .scriptId = mapCopyString(trace->scriptId), .scriptTags = KJ_MAP(tag, trace->scriptTags) { return kj::str(tag); }, diff --git a/src/workerd/io/worker-interface.capnp b/src/workerd/io/worker-interface.capnp index 885db96225f..9a5bcfcfb3d 100644 --- a/src/workerd/io/worker-interface.capnp +++ b/src/workerd/io/worker-interface.capnp @@ -271,6 +271,7 @@ struct Trace @0x8e8d911203762d34 { scriptId @4 :Text; scriptTags @5 :List(Text); entryPoint @6 :Text; + preview @10 :TracePreviewInfo; struct Info { union { fetch @0 :FetchEventInfo;