diff --git a/src/workerd/api/trace.c++ b/src/workerd/api/trace.c++ index 0885754f7d9..d5ecb2fbeed 100644 --- a/src/workerd/api/trace.c++ +++ b/src/workerd/api/trace.c++ @@ -216,6 +216,7 @@ TraceItem::TraceItem(jsg::Lock& js, const Trace& trace) scriptTags(getTraceScriptTags(trace)), tailAttributes(trace.tailAttributes.map( [](auto& tags) { return KJ_MAP(tag, tags) { return tag.clone(); }; })), + preview(trace.preview.map([](auto& p) { return TracePreviewInfo(p); })), durableObjectId(mapCopyString(trace.durableObjectId)), executionModel(kj::str(trace.executionModel)), outcome(kj::str(trace.outcome)), @@ -312,6 +313,10 @@ jsg::Optional> TraceItem::getTailAttrib }); } +jsg::Optional TraceItem::getPreview() { + return preview; +} + jsg::Optional TraceItem::getDurableObjectId() { return durableObjectId.map([](auto& id) -> kj::StringPtr { return id; }); } @@ -543,6 +548,16 @@ ScriptVersion::ScriptVersion(const ScriptVersion& other) tag{mapCopyString(other.tag)}, message{mapCopyString(other.message)} {} +TracePreviewInfo::TracePreviewInfo(const tracing::TracePreview& preview) + : id(kj::str(preview.id)), + slug(kj::str(preview.slug)), + name(kj::str(preview.name)) {} + +TracePreviewInfo::TracePreviewInfo(const TracePreviewInfo& other) + : id(kj::str(other.id)), + slug(kj::str(other.slug)), + name(kj::str(other.name)) {} + TraceItem::CustomEventInfo::CustomEventInfo( const Trace& trace, const tracing::CustomEventInfo& eventInfo) : eventInfo(eventInfo) {} @@ -787,6 +802,7 @@ void TraceItem::visitForMemoryInfo(jsg::MemoryTracker& tracker) const { } } } + tracker.trackField("preview", preview); tracker.trackField("outcome", outcome); } diff --git a/src/workerd/api/trace.h b/src/workerd/api/trace.h index 1fb7f17e3b7..eb47438459c 100644 --- a/src/workerd/api/trace.h +++ b/src/workerd/api/trace.h @@ -67,6 +67,23 @@ struct ScriptVersion { } }; +struct TracePreviewInfo { + explicit TracePreviewInfo(const tracing::TracePreview& preview); + TracePreviewInfo(const TracePreviewInfo&); + + kj::String id; + kj::String slug; + kj::String name; + + JSG_STRUCT(id, slug, name); + + JSG_MEMORY_INFO(TracePreviewInfo) { + tracker.trackField("id", id); + tracker.trackField("slug", slug); + tracker.trackField("name", name); + } +}; + class TraceItem final: public jsg::Object { public: using TailAttributeValue = kj::OneOf; @@ -105,6 +122,7 @@ class TraceItem final: public jsg::Object { jsg::Optional getScriptVersion(); jsg::Optional getDispatchNamespace(); jsg::Optional> getScriptTags(); + jsg::Optional getPreview(); jsg::Optional> getTailAttributes(); jsg::Optional getDurableObjectId(); kj::StringPtr getExecutionModel(); @@ -126,6 +144,7 @@ class TraceItem final: public jsg::Object { JSG_LAZY_READONLY_INSTANCE_PROPERTY(dispatchNamespace, getDispatchNamespace); JSG_LAZY_READONLY_INSTANCE_PROPERTY(scriptTags, getScriptTags); JSG_LAZY_READONLY_INSTANCE_PROPERTY(tailAttributes, getTailAttributes); + JSG_LAZY_READONLY_INSTANCE_PROPERTY(preview, getPreview); JSG_LAZY_READONLY_INSTANCE_PROPERTY(durableObjectId, getDurableObjectId); JSG_LAZY_READONLY_INSTANCE_PROPERTY(outcome, getOutcome); JSG_LAZY_READONLY_INSTANCE_PROPERTY(executionModel, getExecutionModel); @@ -148,6 +167,7 @@ class TraceItem final: public jsg::Object { kj::Maybe dispatchNamespace; jsg::Optional> scriptTags; kj::Maybe> tailAttributes; + jsg::Optional preview; kj::Maybe durableObjectId; kj::String executionModel; kj::String outcome; @@ -659,13 +679,14 @@ class TraceCustomEvent final: public WorkerInterface::CustomEvent { }; #define EW_TRACE_ISOLATE_TYPES \ - api::ScriptVersion, api::TailEvent, api::TraceItem, api::TraceItem::AlarmEventInfo, \ - api::TraceItem::ConnectEventInfo, api::TraceItem::CustomEventInfo, \ - api::TraceItem::ScheduledEventInfo, api::TraceItem::QueueEventInfo, \ - api::TraceItem::EmailEventInfo, api::TraceItem::TailEventInfo, \ - api::TraceItem::TailEventInfo::TailItem, api::TraceItem::FetchEventInfo, \ - api::TraceItem::FetchEventInfo::Request, api::TraceItem::FetchEventInfo::Response, \ - api::TraceItem::JsRpcEventInfo, api::TraceItem::HibernatableWebSocketEventInfo, \ + api::TracePreviewInfo, api::ScriptVersion, api::TailEvent, api::TraceItem, \ + api::TraceItem::AlarmEventInfo, api::TraceItem::ConnectEventInfo, \ + api::TraceItem::CustomEventInfo, api::TraceItem::ScheduledEventInfo, \ + api::TraceItem::QueueEventInfo, api::TraceItem::EmailEventInfo, \ + api::TraceItem::TailEventInfo, api::TraceItem::TailEventInfo::TailItem, \ + api::TraceItem::FetchEventInfo, api::TraceItem::FetchEventInfo::Request, \ + api::TraceItem::FetchEventInfo::Response, api::TraceItem::JsRpcEventInfo, \ + api::TraceItem::HibernatableWebSocketEventInfo, \ api::TraceItem::HibernatableWebSocketEventInfo::Message, \ api::TraceItem::HibernatableWebSocketEventInfo::Close, \ api::TraceItem::HibernatableWebSocketEventInfo::Error, api::TraceLog, api::TraceException, \ diff --git a/src/workerd/io/trace-test.c++ b/src/workerd/io/trace-test.c++ index 04d04cf8c4e..25e7a9ce32b 100644 --- a/src/workerd/io/trace-test.c++ +++ b/src/workerd/io/trace-test.c++ @@ -577,6 +577,27 @@ KJ_TEST("Read/Write TailEvent with Multiple Attributes") { KJ_ASSERT(attrs2[1].name == "bar"_kj); } +KJ_TEST("Trace with Preview") { + auto trace = kj::refcounted(kj::str("test-stable-id"), kj::str("test-script"), + kj::none, // scriptVersion + kj::str("test-namespace"), kj::str("test-script-id"), + kj::Array(), // scriptTags + kj::str("test-entrypoint"), ExecutionModel::STATELESS, + kj::none, // durableObjectId + TracePreview(kj::str("63bafce9179948688866bb22268eb1c6"), kj::str("feature-my-branch"), + kj::str("feature/my-branch"))); + + capnp::MallocMessageBuilder builder; + auto traceBuilder = builder.initRoot(); + trace->copyTo(traceBuilder); + + auto trace2 = kj::refcounted(traceBuilder.asReader()); + auto& preview = KJ_ASSERT_NONNULL(trace2->preview); + KJ_ASSERT(preview.id == "63bafce9179948688866bb22268eb1c6"_kj); + KJ_ASSERT(preview.slug == "feature-my-branch"_kj); + KJ_ASSERT(preview.name == "feature/my-branch"_kj); +} + KJ_TEST("Trace with Durable Object ID") { auto trace = kj::refcounted(kj::str("test-stable-id"), kj::str("test-script"), kj::none, // scriptVersion diff --git a/src/workerd/io/trace.c++ b/src/workerd/io/trace.c++ index 32f72e026b6..4e2f48fb128 100644 --- a/src/workerd/io/trace.c++ +++ b/src/workerd/io/trace.c++ @@ -508,6 +508,26 @@ TraceEventInfo TraceEventInfo::clone() const { return TraceEventInfo(KJ_MAP(item, traces) { return item.clone(); }); } +TracePreview::TracePreview(kj::String id, kj::String slug, kj::String name) + : id(kj::mv(id)), + slug(kj::mv(slug)), + name(kj::mv(name)) {} + +TracePreview::TracePreview(rpc::Trace::TracePreviewInfo::Reader reader) + : id(kj::str(reader.getId())), + slug(kj::str(reader.getSlug())), + name(kj::str(reader.getName())) {} + +void TracePreview::copyTo(rpc::Trace::TracePreviewInfo::Builder builder) const { + builder.setId(id); + builder.setSlug(slug); + builder.setName(name); +} + +TracePreview TracePreview::clone() const { + return TracePreview(kj::str(id), kj::str(slug), kj::str(name)); +} + TraceEventInfo::TraceItem::TraceItem(kj::Maybe scriptName) : scriptName(kj::mv(scriptName)) {} @@ -707,7 +727,8 @@ Trace::Trace(kj::Maybe stableId, kj::Array scriptTags, kj::Maybe entrypoint, ExecutionModel executionModel, - kj::Maybe durableObjectId) + kj::Maybe durableObjectId, + kj::Maybe preview) : stableId(kj::mv(stableId)), scriptName(kj::mv(scriptName)), scriptVersion(kj::mv(scriptVersion)), @@ -715,6 +736,7 @@ Trace::Trace(kj::Maybe stableId, scriptId(kj::mv(scriptId)), scriptTags(kj::mv(scriptTags)), entrypoint(kj::mv(entrypoint)), + preview(kj::mv(preview)), durableObjectId(kj::mv(durableObjectId)), executionModel(executionModel) {} Trace::Trace(rpc::Trace::Reader reader) { @@ -774,6 +796,10 @@ void Trace::copyTo(rpc::Trace::Builder builder) const { builder.setEntrypoint(e); } + KJ_IF_SOME(p, preview) { + p.copyTo(builder.initPreview()); + } + KJ_IF_SOME(id, durableObjectId) { builder.setDurableObjectId(id); } @@ -888,6 +914,10 @@ void Trace::mergeFrom(rpc::Trace::Reader reader, PipelineLogLevel pipelineLogLev entrypoint = kj::str(reader.getEntrypoint()); } + if (reader.hasPreview()) { + preview = tracing::TracePreview(reader.getPreview()); + } + if (reader.hasDurableObjectId()) { durableObjectId = kj::str(reader.getDurableObjectId()); } diff --git a/src/workerd/io/trace.h b/src/workerd/io/trace.h index e6377dc6e70..69493566085 100644 --- a/src/workerd/io/trace.h +++ b/src/workerd/io/trace.h @@ -432,6 +432,21 @@ struct EmailEventInfo final { }; // Describes a buffered tail worker request +struct TracePreview final { + explicit TracePreview(kj::String id, kj::String slug, kj::String name); + TracePreview(rpc::Trace::TracePreviewInfo::Reader reader); + TracePreview(TracePreview&&) = default; + TracePreview& operator=(TracePreview&&) = default; + KJ_DISALLOW_COPY(TracePreview); + + kj::String id; + kj::String slug; + kj::String name; + + void copyTo(rpc::Trace::TracePreviewInfo::Builder builder) const; + TracePreview clone() const; +}; + struct TraceEventInfo final { struct TraceItem; @@ -895,7 +910,8 @@ class Trace final: public kj::Refcounted { kj::Array scriptTags, kj::Maybe entrypoint, ExecutionModel executionModel, - kj::Maybe durableObjectId = kj::none); + kj::Maybe durableObjectId = kj::none, + kj::Maybe preview = kj::none); Trace(rpc::Trace::Reader reader); ~Trace() noexcept(false); KJ_DISALLOW_COPY_AND_MOVE(Trace); @@ -918,6 +934,7 @@ class Trace final: public kj::Refcounted { kj::Array scriptTags; kj::Maybe> tailAttributes; kj::Maybe entrypoint; + kj::Maybe preview; kj::Maybe durableObjectId; kj::Vector logs; diff --git a/src/workerd/io/worker-interface.capnp b/src/workerd/io/worker-interface.capnp index 6d70a4a90e5..885db96225f 100644 --- a/src/workerd/io/worker-interface.capnp +++ b/src/workerd/io/worker-interface.capnp @@ -138,6 +138,12 @@ struct Trace @0x8e8d911203762d34 { rawSize @2 :UInt32; } + struct TracePreviewInfo { + id @0 :Text; + slug @1 :Text; + name @2 :Text; + } + struct TraceEventInfo { struct TraceItem { scriptName @0 :Text; @@ -171,6 +177,7 @@ struct Trace @0x8e8d911203762d34 { scriptTags @14 :List(Text); entrypoint @22 :Text; + preview @30 :TracePreviewInfo; durableObjectId @27 :Text; tailAttributes @28 :List(Attribute); diff --git a/types/generated-snapshot/experimental/index.d.ts b/types/generated-snapshot/experimental/index.d.ts index a944dccca04..9b5f542cfde 100755 --- a/types/generated-snapshot/experimental/index.d.ts +++ b/types/generated-snapshot/experimental/index.d.ts @@ -3266,6 +3266,11 @@ interface QueuingStrategyInit { */ highWaterMark: number; } +interface TracePreviewInfo { + id: string; + slug: string; + name: string; +} interface ScriptVersion { id?: string; tag?: string; @@ -3300,6 +3305,7 @@ interface TraceItem { readonly dispatchNamespace?: string; readonly scriptTags?: string[]; readonly tailAttributes?: Record; + readonly preview?: TracePreviewInfo; readonly durableObjectId?: string; readonly outcome: string; readonly executionModel: string; diff --git a/types/generated-snapshot/experimental/index.ts b/types/generated-snapshot/experimental/index.ts index 32fcda365fd..9a1945a67a1 100755 --- a/types/generated-snapshot/experimental/index.ts +++ b/types/generated-snapshot/experimental/index.ts @@ -3272,6 +3272,11 @@ export interface QueuingStrategyInit { */ highWaterMark: number; } +export interface TracePreviewInfo { + id: string; + slug: string; + name: string; +} export interface ScriptVersion { id?: string; tag?: string; @@ -3306,6 +3311,7 @@ export interface TraceItem { readonly dispatchNamespace?: string; readonly scriptTags?: string[]; readonly tailAttributes?: Record; + readonly preview?: TracePreviewInfo; readonly durableObjectId?: string; readonly outcome: string; readonly executionModel: string; diff --git a/types/generated-snapshot/latest/index.d.ts b/types/generated-snapshot/latest/index.d.ts index ae08223f3e4..0b2fe65f1e1 100755 --- a/types/generated-snapshot/latest/index.d.ts +++ b/types/generated-snapshot/latest/index.d.ts @@ -3115,6 +3115,11 @@ interface QueuingStrategyInit { */ highWaterMark: number; } +interface TracePreviewInfo { + id: string; + slug: string; + name: string; +} interface ScriptVersion { id?: string; tag?: string; @@ -3149,6 +3154,7 @@ interface TraceItem { readonly dispatchNamespace?: string; readonly scriptTags?: string[]; readonly tailAttributes?: Record; + readonly preview?: TracePreviewInfo; readonly durableObjectId?: string; readonly outcome: string; readonly executionModel: string; diff --git a/types/generated-snapshot/latest/index.ts b/types/generated-snapshot/latest/index.ts index 0fb9521d84c..b7a6ad7b8e0 100755 --- a/types/generated-snapshot/latest/index.ts +++ b/types/generated-snapshot/latest/index.ts @@ -3121,6 +3121,11 @@ export interface QueuingStrategyInit { */ highWaterMark: number; } +export interface TracePreviewInfo { + id: string; + slug: string; + name: string; +} export interface ScriptVersion { id?: string; tag?: string; @@ -3155,6 +3160,7 @@ export interface TraceItem { readonly dispatchNamespace?: string; readonly scriptTags?: string[]; readonly tailAttributes?: Record; + readonly preview?: TracePreviewInfo; readonly durableObjectId?: string; readonly outcome: string; readonly executionModel: string;