@@ -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,20 @@ 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 =
299+ KJ_MAP (tag, tags) {
300+ return jsg::Dict<TraceItem::TailAttributeValue>::Field{
301+ .name = kj::str (tag.name ),
302+ .value = getTraceTailAttributeValue (tag),
303+ };
304+ },
305+ };
306+ });
307+ }
308+
273309jsg::Optional<kj::StringPtr> TraceItem::getDurableObjectId () {
274310 return durableObjectId.map ([](auto & id) -> kj::StringPtr { return id; });
275311}
@@ -732,6 +768,27 @@ void TraceItem::visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
732768 tracker.trackField (" scriptTag" , tag);
733769 }
734770 }
771+ KJ_IF_SOME (tags, tailAttributes) {
772+ for (const auto & tag: tags) {
773+ tracker.trackFieldWithSize (" 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 (" tailAttributeValue" , string.size ());
787+ }
788+ }
789+ }
790+ }
791+ }
735792 tracker.trackField (" outcome" , outcome);
736793}
737794
0 commit comments