@@ -111,6 +111,26 @@ jsg::Optional<kj::Array<kj::String>> getTraceScriptTags(const Trace& trace) {
111111 }
112112}
113113
114+ TraceItem::TailAttributeValue getTraceTailAttributeValue (const tracing::Attribute& tag) {
115+ KJ_REQUIRE (tag.value .size () == 1 , " tail attributes must contain exactly one value" );
116+
117+ KJ_SWITCH_ONEOF (tag.value [0 ]) {
118+ KJ_CASE_ONEOF (boolean, bool ) {
119+ return TraceItem::TailAttributeValue (boolean);
120+ }
121+ KJ_CASE_ONEOF (number, double ) {
122+ return TraceItem::TailAttributeValue (number);
123+ }
124+ KJ_CASE_ONEOF (integer, int64_t ) {
125+ return TraceItem::TailAttributeValue (static_cast <double >(integer));
126+ }
127+ KJ_CASE_ONEOF (string, kj::ConstString) {
128+ return TraceItem::TailAttributeValue (kj::str (string));
129+ }
130+ }
131+ KJ_UNREACHABLE ;
132+ }
133+
114134kj::Own<TraceItem::FetchEventInfo::Request::Detail> getFetchRequestDetail (
115135 jsg::Lock& js, const Trace& trace, const tracing::FetchEventInfo& eventInfo) {
116136 const auto getCf = [&]() -> jsg::Optional<jsg::V8Ref<v8::Object>> {
@@ -191,6 +211,8 @@ TraceItem::TraceItem(jsg::Lock& js, const Trace& trace)
191211 scriptVersion(getTraceScriptVersion(trace)),
192212 dispatchNamespace(mapCopyString(trace.dispatchNamespace)),
193213 scriptTags(getTraceScriptTags(trace)),
214+ tailAttributes(trace.tailAttributes.map(
215+ [](auto & tags) { return KJ_MAP (tag, tags) { return tag.clone (); }; })),
194216 durableObjectId (mapCopyString(trace.durableObjectId)),
195217 executionModel(kj::str(trace.executionModel)),
196218 outcome(kj::str(trace.outcome)),
@@ -270,6 +292,19 @@ jsg::Optional<kj::Array<kj::StringPtr>> TraceItem::getScriptTags() {
270292 [](kj::Array<kj::String>& tags) { return KJ_MAP (t, tags) -> kj::StringPtr { return t; }; });
271293}
272294
295+ jsg::Optional<jsg::Dict<TraceItem::TailAttributeValue>> TraceItem::getTailAttributes () {
296+ return tailAttributes.map ([](kj::Array<tracing::Attribute>& tags) {
297+ return jsg::Dict<TraceItem::TailAttributeValue>{
298+ .fields = KJ_MAP (tag, tags) {
299+ return jsg::Dict<TraceItem::TailAttributeValue>::Field{
300+ .name = kj::str (tag.name ),
301+ .value = getTraceTailAttributeValue (tag),
302+ };
303+ },
304+ };
305+ });
306+ }
307+
273308jsg::Optional<kj::StringPtr> TraceItem::getDurableObjectId () {
274309 return durableObjectId.map ([](auto & id) -> kj::StringPtr { return id; });
275310}
@@ -732,6 +767,29 @@ void TraceItem::visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
732767 tracker.trackField (" scriptTag" , tag);
733768 }
734769 }
770+ KJ_IF_SOME (tags, tailAttributes) {
771+ for (const auto & tag: tags) {
772+ tracker.trackFieldWithSize (
773+ " tailAttributeName" , tag.name .size ());
774+ for (const auto & value: tag.value ) {
775+ KJ_SWITCH_ONEOF (value) {
776+ KJ_CASE_ONEOF (boolean, bool ) {
777+ tracker.trackFieldWithSize (" tailAttributeValue" , sizeof (boolean));
778+ }
779+ KJ_CASE_ONEOF (number, double ) {
780+ tracker.trackFieldWithSize (" tailAttributeValue" , sizeof (number));
781+ }
782+ KJ_CASE_ONEOF (integer, int64_t ) {
783+ tracker.trackFieldWithSize (" tailAttributeValue" , sizeof (integer));
784+ }
785+ KJ_CASE_ONEOF (string, kj::ConstString) {
786+ tracker.trackFieldWithSize (
787+ " tailAttributeValue" , string.size ());
788+ }
789+ }
790+ }
791+ }
792+ }
735793 tracker.trackField (" outcome" , outcome);
736794}
737795
0 commit comments