@mastra/datadog 1.0.22 → 1.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/dist/bridge.d.ts +120 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/index.cjs +454 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +13 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +454 -28
- package/dist/index.js.map +1 -1
- package/dist/tracing.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/metrics.ts","../src/utils.ts","../src/tracing.ts"],"names":["SpanType","tracer","BaseExporter","omitKeys"],"mappings":";;;;;;;;;;;;;;AAKO,SAAS,mBAAmB,KAAA,EAA0D;AAC3F,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,EAAA,MAAM,SAAmC,EAAC;AAE1C,EAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAC1B,EAAA,IAAI,WAAA,KAAgB,MAAA,EAAW,MAAA,CAAO,WAAA,GAAc,WAAA;AAEpD,EAAA,MAAM,eAAe,KAAA,CAAM,YAAA;AAC3B,EAAA,IAAI,YAAA,KAAiB,MAAA,EAAW,MAAA,CAAO,YAAA,GAAe,YAAA;AAEtD,EAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,YAAA,KAAiB,MAAA,EAAW;AAC3D,IAAA,MAAA,CAAO,cAAc,WAAA,GAAc,YAAA;AAAA,EACrC;AAEA,EAAA,IAAI,KAAA,EAAO,aAAA,EAAe,SAAA,KAAc,MAAA,EAAW;AACjD,IAAA,MAAA,CAAO,qBAAA,GAAwB,MAAM,aAAA,CAAc,SAAA;AAAA,EACrD;AAEA,EAAA,MAAM,eAAA,GAAkB,OAAO,YAAA,EAAc,SAAA;AAC7C,EAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,IAAA,MAAA,CAAO,eAAA,GAAkB,eAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAO,YAAA,EAAc,UAAA;AAC9C,EAAA,IAAI,qBAAqB,MAAA,EAAW;AAClC,IAAA,MAAA,CAAO,gBAAA,GAAmB,gBAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AACnD;ACnBO,IAAM,iBAAA,GAAgE;AAAA,EAC3E,CAACA,wBAAA,CAAS,SAAS,GAAG,OAAA;AAAA;AAAA;AAAA,EAGtB,CAACA,wBAAA,CAAS,gBAAgB,GAAG,UAAA;AAAA;AAAA;AAAA,EAG7B,CAACA,wBAAA,CAAS,UAAU,GAAG,KAAA;AAAA,EACvB,CAACA,wBAAA,CAAS,SAAS,GAAG,MAAA;AAAA,EACtB,CAACA,wBAAA,CAAS,aAAa,GAAG,MAAA;AAAA,EAC1B,CAACA,wBAAA,CAAS,YAAY,GAAG;AAC3B,CAAA;AAMA,IAAM,cAAA,GAAiB,EAAE,IAAA,EAAM,KAAA,EAAM;AAM9B,SAAS,aAAa,MAAA,EAQpB;AACP,EAAA,IAAI,eAAe,IAAA,EAAM;AAMzB,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,MAAA,CAAO,IAAA;AAAA,EAC/B;AACA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,MAAA,CAAO,MAAA;AAAA,EAClC;AAGA,EAAA,MAAM,cAAA,GAAkBC,yBAAe,OAAA,EAAS,OAAA;AAEhD,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAAA,wBAAA,CAAO,IAAA,CAAK;AAAA,MACV,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,KAAA;AAAA,MAClC,GAAA,EAAK,MAAA,CAAO,GAAA,IAAO,OAAA,CAAQ,GAAA,CAAI,MAAA;AAAA;AAAA,MAE/B,OAAA,EAAS,OAAO,mBAAA,IAAuB;AAAA,KACxC,CAAA;AAAA,EACH;AAGA,EAAAA,wBAAA,CAAO,OAAO,MAAA,CAAO;AAAA,IACnB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,kBAAkB,MAAA,CAAO;AAAA,GAC1B,CAAA;AAED,EAAA,cAAA,CAAe,IAAA,GAAO,IAAA;AACxB;AAKO,SAAS,QAAQ,QAAA,EAAqC;AAC3D,EAAA,OAAO,iBAAA,CAAkB,QAAQ,CAAA,IAAK,MAAA;AACxC;AAKO,SAAS,OAAO,KAAA,EAAqC;AAC1D,EAAA,OAAO,KAAA,YAAiB,IAAA,GAAO,KAAA,GAAQ,IAAI,KAAK,KAAK,CAAA;AACvD;AAKO,SAAS,cAAc,IAAA,EAAuB;AACnD,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,MAAA,OAAO,CAAA,kBAAA,EAAqB,IAAA,CAAK,WAAA,EAAa,IAAA,IAAQ,QAAQ,CAAA,CAAA,CAAA;AAAA,IAChE;AACA,IAAA,OAAO,OAAO,IAAI,CAAA;AAAA,EACpB;AACF;AAKA,SAAS,eAAe,IAAA,EAA0D;AAChF,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,EAAG,IAAA,IAAQ,CAAA,EAAG,OAAA,KAAY,MAAS,CAAA;AACnF;AAKA,SAAS,qBAAqB,IAAA,EAA0D;AACtF,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,EAAG,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,KAAK,CAAC,CAAA;AAClF;AAMA,SAAS,uBAAuB,IAAA,EAAyE;AACvG,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CACf,GAAA,CAAI,CAAA,CAAA,KAAK;AACR,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,IAAA,IAAI,CAAA,EAAG,IAAA,EAAM,OAAO,CAAA,CAAE,IAAA;AACtB,IAAA,IAAI,GAAG,UAAA,EAAY,OAAO,IAAI,CAAA,CAAE,UAAA,CAAW,YAAY,QAAQ,CAAA,CAAA,CAAA;AAC/D,IAAA,IAAI,GAAG,YAAA,EAAc,OAAO,UAAU,CAAA,CAAE,YAAA,CAAa,QAAQ,SAAS,CAAA,CAAA,CAAA;AACtE,IAAA,OAAO,cAAc,CAAC,CAAA;AAAA,EACxB,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,SAAS,IAAA,EAAK;AAC1C;AAMO,SAAS,WAAA,CAAY,OAAY,QAAA,EAAyB;AAE/D,EAAA,IAAI,QAAA,KAAaD,wBAAA,CAAS,gBAAA,IAAoB,QAAA,KAAaA,yBAAS,UAAA,EAAY;AAE9E,IAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,MAAA,OAAO,KAAA,CAAM,IAAI,CAAA,CAAA,MAAM;AAAA,QACrB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,OAAA,EAAS,OAAO,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA,CAAE,OAAA,GAAU,aAAA,CAAc,CAAA,CAAE,OAAO;AAAA,OAC9E,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,IAAI,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAC/B,MAAA,OAAO,KAAA,CAAM,IAAI,sBAAsB,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,aAAA,CAAc,KAAK,GAAG,CAAA;AAAA,EACzD;AAGA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA;AAC9D,EAAA,OAAO,cAAc,KAAK,CAAA;AAC5B;AAMO,SAAS,YAAA,CAAa,QAAa,QAAA,EAAyB;AAEjE,EAAA,IAAI,QAAA,KAAaA,wBAAA,CAAS,gBAAA,IAAoB,QAAA,KAAaA,yBAAS,UAAA,EAAY;AAE9E,IAAA,IAAI,cAAA,CAAe,MAAM,CAAA,EAAG;AAC1B,MAAA,OAAO,MAAA,CAAO,IAAI,CAAA,CAAA,MAAM;AAAA,QACtB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,OAAA,EAAS,OAAO,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA,CAAE,OAAA,GAAU,aAAA,CAAc,CAAA,CAAE,OAAO;AAAA,OAC9E,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,QAAQ,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,WAAA,EAAa,SAAS,aAAA,CAAc,MAAM,GAAG,CAAA;AAAA,EAC/D;AAGA,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,MAAA;AACvC,EAAA,OAAO,cAAc,MAAM,CAAA;AAC7B;;;AC7HA,IAAM,qBAAA,GAAwB,KAAK,EAAA,GAAK,GAAA;AAKxC,IAAM,2BAAA,GAA8B,IAAI,EAAA,GAAK,GAAA;AA2EtC,IAAM,eAAA,GAAN,cAA8BE,0BAAA,CAAa;AAAA,EAChD,IAAA,GAAO,SAAA;AAAA,EAEC,MAAA;AAAA,EACA,YAAA,uBAAmB,GAAA,EAA0B;AAAA,EAC7C,UAAA,uBAAiB,GAAA,EAAwB;AAAA,EAEjD,WAAA,CAAY,MAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,KAAA,CAAM,MAAM,CAAA;AAGZ,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,gBAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,UAAA;AAC5C,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,OAAA,CAAQ,IAAI,OAAA,IAAW,eAAA;AACnD,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,IAAO,OAAA,CAAQ,GAAA,CAAI,MAAA;AAItC,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,2BAAA,EAA6B,WAAA,EAAY;AAC1E,IAAA,MAAM,YAAY,MAAA,CAAO,SAAA,KAAc,iBAAiB,OAAA,IAAW,YAAA,KAAiB,MAAM,KAAA,GAAQ,IAAA,CAAA;AAGlG,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAA,CAAK,YAAY,CAAA,0FAAA,CAA4F,CAAA;AAC7G,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,IAAa,CAAC,MAAA,EAAQ;AACxB,MAAA,IAAA,CAAK,WAAA;AAAA,QACH,CAAA,yGAAA;AAAA,OACF;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,OAAO,IAAA,EAAM,MAAA,EAAQ,WAAW,GAAA,EAAI;AAG/D,IAAA,YAAA,CAAa;AAAA,MACX,KAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,GAAA;AAAA,MACA,qBAAqB,MAAA,CAAO;AAAA,KAC7B,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,8BAAA,EAAgC,EAAE,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,oBAAoB,KAAA,EAAoC;AACtE,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,CAAED,wBAAAA,CAAe,MAAA,EAAQ;AAEhD,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,KAAA,CAAM,YAAA;AAGnB,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,UAAA,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAC7B,UAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,QACvB;AACA,QAAA;AAAA,MACF;AAGA,MAAA,QAAQ,MAAM,IAAA;AAAM,QAClB,KAAK,cAAA;AACH,UAAA,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAC7B,UAAA;AAAA,QAEF,KAAK,cAAA;AAEH,UAAA;AAAA,QAEF,KAAK,YAAA;AACH,UAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,UAAA;AAAA;AACJ,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wBAAA,EAA0B;AAAA,QAC1C,KAAA;AAAA,QACA,WAAW,KAAA,CAAM,IAAA;AAAA,QACjB,MAAA,EAAQ,MAAM,YAAA,EAAc,EAAA;AAAA,QAC5B,QAAA,EAAU,MAAM,YAAA,EAAc;AAAA,OAC/B,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,IAAA,EAA6B;AACvD,IAAA,IAAI,IAAA,CAAK,cAAc,CAAC,IAAA,CAAK,aAAa,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AAC3D,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS;AAAA,QAClC,MAAA,EAAQ,KAAK,QAAA,EAAU,MAAA;AAAA,QACvB,SAAA,EAAW,KAAK,QAAA,EAAU;AAAA,OAC3B,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,IAAA,EAA6B;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAAA,IACpB;AAEA,IAAA,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CAAa,QAAa,SAAA,EAA4D;AAC5F,IAAA,MAAA,CAAO,MAAA,CAAO,SAAS,IAAI,CAAA;AAC3B,IAAA,MAAA,CAAO,MAAA,CAAO,eAAA,EAAiB,SAAA,CAAU,OAAO,CAAA;AAChD,IAAA,MAAA,CAAO,OAAO,YAAA,EAAc,SAAA,CAAU,IAAA,IAAQ,SAAA,CAAU,YAAY,OAAO,CAAA;AAC3E,IAAA,IAAI,UAAU,KAAA,EAAO;AACnB,MAAA,MAAA,CAAO,MAAA,CAAO,aAAA,EAAe,SAAA,CAAU,KAAK,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB,IAAA,EAA4C;AACnE,IAAA,MAAM,cAAmC,EAAC;AAG1C,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,MAAA,WAAA,CAAY,SAAA,GAAY,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,KAAK,IAAI,CAAA;AAAA,IAC3D;AAGA,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,MAAA,WAAA,CAAY,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,KAAK,IAAI,CAAA;AAAA,IAC9D;AAKA,IAAA,IAAI,IAAA,CAAK,IAAA,KAASD,wBAAAA,CAAS,UAAA,EAAY;AACrC,MAAA,MAAM,KAAA,GAAS,KAAK,UAAA,EAAoC,KAAA;AACxD,MAAA,MAAM,OAAA,GAAU,mBAAmB,KAAK,CAAA;AACxC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,WAAA,CAAY,OAAA,GAAU,OAAA;AAAA,MACxB;AAAA,IACF;AAIA,IAAA,MAAM,WAAA,GAAc,CAAC,OAAA,EAAS,OAAA,EAAS,YAAY,YAAY,CAAA;AAC/D,IAAA,MAAM,kBAAkBG,cAAA,CAAU,IAAA,CAAK,UAAA,IAAc,IAA4B,WAAW,CAAA;AAM5F,IAAA,MAAM,gBAAgB,IAAI,GAAA,CAAI,KAAK,MAAA,CAAO,kBAAA,IAAsB,EAAE,CAAA;AAClE,IAAA,MAAM,kBAAuC,EAAC;AAC9C,IAAA,MAAM,oBAAyC,EAAC;AAEhD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,IAAA,CAAK,QAAA,IAAY,EAAE,CAAA,EAAG;AAC9D,MAAA,IAAI,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AAC1B,QAAA,eAAA,CAAgB,GAAG,CAAA,GAAI,KAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,iBAAA,CAAkB,GAAG,CAAA,GAAI,KAAA;AAAA,MAC3B;AAAA,IACF;AAIA,IAAA,MAAM,sBAA2C,EAAC;AAClD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC1D,MAAA,IAAI,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AAE1B,QAAA,IAAI,EAAE,OAAO,eAAA,CAAA,EAAkB;AAC7B,UAAA,eAAA,CAAgB,GAAG,CAAA,GAAI,KAAA;AAAA,QACzB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,GAAG,CAAA,GAAI,KAAA;AAAA,MAC7B;AAAA,IACF;AAKA,IAAA,MAAM,gBAAA,GAAwC;AAAA,MAC5C,GAAG,iBAAA;AAAA,MACH,GAAG;AAAA,KACL;AACA,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,gBAAA,CAAiB,eAAe,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,OAAA;AAAA,IACrD;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5C,MAAA,WAAA,CAAY,QAAA,GAAW,gBAAA;AAAA,IACzB;AAMA,IAAA,MAAM,IAAA,GAA4B;AAAA;AAAA,MAEhC,GAAG;AAAA,KACL;AAKA,IAAA,IAAI,IAAA,CAAK,MAAM,MAAA,EAAQ;AACrB,MAAA,KAAA,MAAW,GAAA,IAAO,KAAK,IAAA,EAAM;AAC3B,QAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAClC,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,EAAG,UAAU,CAAC,CAAA,GAAI,GAAA,CAAI,SAAA,CAAU,UAAA,GAAa,CAAC,CAAA;AAAA,QACnE,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAIA,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,MAAA,IAAI,IAAA,CAAK,UAAU,EAAA,EAAI;AACrB,QAAA,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,EAAA;AAAA,MACpC;AACA,MAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,QAAA,IAAA,CAAK,cAAc,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,MAAA;AAAA,MACxC;AACA,MAAA,IAAI,IAAA,CAAK,UAAU,QAAA,EAAU;AAC3B,QAAA,IAAA,CAAK,gBAAgB,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,QAAA;AAAA,MAC1C;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChC,MAAA,WAAA,CAAY,IAAA,GAAO,IAAA;AAAA,IACrB;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,CAAEF,wBAAAA,CAAe,MAAA,EAAQ;AAGhD,IAAA,IAAIA,wBAAAA,CAAO,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI;AACF,QAAA,MAAMA,wBAAAA,CAAO,OAAO,KAAA,EAAM;AAC1B,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wBAAwB,CAAA;AAAA,MAC5C,SAAS,CAAA,EAAG;AACV,QAAA,IAAA,CAAK,OAAO,KAAA,CAAM,uBAAA,EAAyB,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,MACzD;AAAA,IACF,CAAA,MAAA,IAAYA,yBAAe,KAAA,EAAO;AAChC,MAAA,IAAI;AACF,QAAA,MAAOA,yBAAe,KAAA,EAAM;AAC5B,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wBAAwB,CAAA;AAAA,MAC5C,SAAS,CAAA,EAAG;AACV,QAAA,IAAA,CAAK,OAAO,KAAA,CAAM,uBAAA,EAAyB,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAE9B,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,KAAK,UAAA,EAAY;AAC9C,MAAA,IAAI,MAAM,YAAA,EAAc;AACtB,QAAA,YAAA,CAAa,MAAM,YAAY,CAAA;AAAA,MACjC;AACA,MAAA,IAAI,MAAM,gBAAA,EAAkB;AAC1B,QAAA,YAAA,CAAa,MAAM,gBAAgB,CAAA;AAAA,MACrC;AACA,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,GAAO,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,6BAAA,EAA+B;AAAA,UAC9C,OAAA;AAAA,UACA,YAAA,EAAc,MAAM,MAAA,CAAO,IAAA;AAAA,UAC3B,SAAS,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM;AAAA,SACxC,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAGtB,IAAA,MAAM,KAAK,KAAA,EAAM;AAGjB,IAAA,IAAIA,wBAAAA,CAAO,QAAQ,OAAA,EAAS;AAC1B,MAAA,IAAI;AACF,QAAAA,wBAAAA,CAAO,OAAO,OAAA,EAAQ;AAAA,MACxB,SAAS,CAAA,EAAG;AACV,QAAA,IAAA,CAAK,OAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,MAC1D;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAExB,IAAA,MAAM,MAAM,QAAA,EAAS;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,OAAA,EAA6B;AACzD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAC5C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,YAAA,CAAa,SAAS,YAAY,CAAA;AAClC,QAAA,QAAA,CAAS,YAAA,GAAe,MAAA;AAAA,MAC1B;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAsB;AAAA,MAC1B,MAAA,sBAAY,GAAA,EAA6B;AAAA,MACzC,QAAA,sBAAc,GAAA,EAA6E;AAAA,MAC3F,SAAA,EAAW,KAAA;AAAA,MACX,WAAA,EAAa,KAAA;AAAA,MACb,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,YAAA,EAAc,MAAA;AAAA,MACd,gBAAA,EAAkB;AAAA,KACpB;AAIA,IAAA,MAAM,gBAAA,GAAmB,WAAW,MAAM;AACxC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AACzC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAI,MAAM,MAAA,CAAO,IAAA,GAAO,KAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AACpD,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,+CAAA,EAAiD;AAAA,YAChE,OAAA;AAAA,YACA,aAAA,EAAe,MAAM,MAAA,CAAO,IAAA;AAAA,YAC5B,YAAA,EAAc,MAAM,QAAA,CAAS,IAAA;AAAA,YAC7B,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM;AAAA,WAChC,CAAA;AAAA,QACH;AACA,QAAA,IAAI,MAAM,YAAA,EAAc;AACtB,UAAA,YAAA,CAAa,MAAM,YAAY,CAAA;AAAA,QACjC;AACA,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,OAAO,CAAA;AAC9B,QAAA,IAAA,CAAK,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,MAClC;AAAA,IACF,GAAG,qBAAqB,CAAA;AAExB,IAAC,iBAAyB,KAAA,IAAQ;AAClC,IAAA,OAAA,CAAQ,gBAAA,GAAmB,gBAAA;AAE3B,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACpC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,kBAAkB,OAAA,EAAuB;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,EAAO;AAGZ,IAAA,IAAI,CAAC,MAAM,WAAA,EAAa;AAEtB,MAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AAGtB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AAC5C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,YAAA,CAAa,MAAM,KAAK,CAAA;AAAA,MAC/B;AAGA,MAAA,KAAA,CAAM,OAAO,KAAA,EAAM;AACnB,MAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AAAA,IACtB,CAAA,MAAO;AAGL,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,GAAG;AACD,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,CAAA,IAAK,MAAM,MAAA,EAAQ;AACzC,UAAA,MAAM,SAAA,GAAY,KAAK,YAAA,GAAe,KAAA,CAAM,SAAS,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA,GAAI,MAAA;AAC9E,UAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,CAAC,SAAA,EAAW;AACnC,YAAA;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,MAAM,CAAA;AAClD,UAAA,KAAA,CAAM,MAAA,CAAO,OAAO,MAAM,CAAA;AAC1B,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF,CAAA,QAAS,OAAA;AAAA,IACX;AAGA,IAAA,IAAI,KAAA,CAAM,aAAa,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,IAAK,CAAC,MAAM,YAAA,EAAc;AACrE,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAChD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,IAAI,YAAA,CAAa,MAAA,CAAO,IAAA,GAAO,CAAA,EAAG;AAChC,YAAA,IAAA,CAAK,MAAA,CAAO,KAAK,0CAAA,EAA4C;AAAA,cAC3D,OAAA;AAAA,cACA,aAAA,EAAe,aAAa,MAAA,CAAO,IAAA;AAAA,cACnC,SAAS,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,MAAM;AAAA,aAC/C,CAAA;AAAA,UACH;AAEA,UAAA,IAAI,aAAa,gBAAA,EAAkB;AACjC,YAAA,YAAA,CAAa,aAAa,gBAAgB,CAAA;AAAA,UAC5C;AAAA,QACF;AACA,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,OAAO,CAAA;AAC9B,QAAA,IAAA,CAAK,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,MAClC,GAAG,2BAA2B,CAAA;AAE9B,MAAC,MAAc,KAAA,IAAQ;AACvB,MAAA,KAAA,CAAM,YAAA,GAAe,KAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,MAAA,EAA4D;AAEhF,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AACxC,IAAA,IAAI,QAAA;AAEJ,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,EAAO,EAAG;AAClC,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,EAAA,EAAI,EAAE,MAAM,QAAA,EAAU,IAAI,CAAA;AAAA,IAC3C;AAGA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,MAAA,EAAO,EAAG;AACjC,MAAA,IAAI,IAAA,CAAK,KAAK,UAAA,EAAY;AACxB,QAAA,QAAA,GAAW,IAAA;AAAA,MACb,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc;AACjC,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,KAAK,YAAY,CAAA;AACnD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,UAAA,CAAW,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,QAC/B,CAAA,MAAO;AAGL,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,0CAAA,EAA4C;AAAA,YAC3D,MAAA,EAAQ,KAAK,IAAA,CAAK,EAAA;AAAA,YAClB,YAAA,EAAc,KAAK,IAAA,CAAK,YAAA;AAAA,YACxB,OAAA,EAAS,KAAK,IAAA,CAAK;AAAA,WACpB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,MAAA,EAAO,EAAG;AACjC,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC3B,QAAA,MAAM,QACJ,CAAA,CAAE,IAAA,CAAK,SAAA,YAAqB,IAAA,GAAO,EAAE,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,SAAS,EAAE,OAAA,EAAQ;AACrG,QAAA,MAAM,QACJ,CAAA,CAAE,IAAA,CAAK,SAAA,YAAqB,IAAA,GAAO,EAAE,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,SAAS,EAAE,OAAA,EAAQ;AACrG,QAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,MACjB,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAA,CACN,MACA,mBAAA,EACwD;AACxD,IAAA,MAAM,WAAW,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,IAAK;AAAA,MACtD,MAAA,EAAQ,KAAK,QAAA,EAAU,MAAA;AAAA,MACvB,SAAA,EAAW,KAAK,QAAA,EAAU;AAAA,KAC5B;AAEA,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAE9B,IAAA,MAAM,WAAW,IAAA,CAAK,UAAA;AACtB,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,KAAA,EAAO,QAAA,EAAU,KAAA,IAAS,mBAAA,EAAqB,KAAA;AAAA,MAC/C,QAAA,EAAU,QAAA,EAAU,QAAA,IAAY,mBAAA,EAAqB;AAAA,KACvD;AAEA,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAGvC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA,GAAU,SAAA,mBAAY,IAAI,IAAA,EAAK;AAE1F,IAAA,OAAO;AAAA,MACL,YAAA,EAAc;AAAA,QACZ,IAAA;AAAA,QACA,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,WAAW,QAAA,CAAS,SAAA;AAAA,QACpB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,SAAA;AAAA,QACA,GAAI,IAAA,KAAS,KAAA,IAAS,KAAA,EAAO,KAAA,GAAQ,EAAE,SAAA,EAAW,KAAA,CAAM,KAAA,EAAM,GAAI,EAAC;AAAA,QACnE,GAAI,IAAA,KAAS,KAAA,IAAS,KAAA,EAAO,QAAA,GAAW,EAAE,aAAA,EAAe,KAAA,CAAM,QAAA,EAAS,GAAI;AAAC,OAC/E;AAAA;AAAA;AAAA,MAGA,SAAA,EAAW,QAAQ,OAAA;AAAQ,KAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAA,CACN,IAAA,EACA,KAAA,EACA,mBAAA,EACM;AACN,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,MAAM,EAAE,YAAA,EAAc,SAAA,KAAc,IAAA,CAAK,gBAAA,CAAiB,MAAM,mBAAmB,CAAA;AAInF,IAAA,MAAM,wBAAA,GACJ,IAAA,CAAK,IAAA,KAASD,wBAAAA,CAAS,gBAAA,GACnB;AAAA,MACE,KAAA,EAAQ,KAAK,UAAA,EAAsD,KAAA;AAAA,MACnE,QAAA,EAAW,KAAK,UAAA,EAAsD;AAAA,KACxE,GACA,mBAAA;AAIN,IAAAC,wBAAAA,CAAO,MAAA,CAAO,KAAA,CAAM,YAAA,EAAqB,CAAC,MAAA,KAAgB;AAExD,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AAC9C,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,CAAA,EAAG;AACvC,QAAAA,wBAAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,WAAW,CAAA;AAAA,MAC5C;AAGA,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,MAC1C;AAGA,MAAA,MAAM,QAAA,GAAWA,yBAAO,MAAA,CAAO,UAAA,GAAaA,yBAAO,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,GAAI,MAAA;AAC/E,MAAA,KAAA,CAAM,SAAS,GAAA,CAAI,IAAA,CAAK,IAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAIhD,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,QAAA,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,KAAA,EAAO,wBAAwB,CAAA;AAAA,MAC1D;AAMA,MAAA,IAAI,OAAO,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AACvC,QAAA,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA,MACzB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,CAAe,IAAA,EAAuB,KAAA,EAAmB,MAAA,EAAc;AAC7E,IAAA,MAAM,EAAE,YAAA,EAAc,SAAA,EAAU,GAAI,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAE9D,IAAA,MAAM,WAAW,MACfA,wBAAAA,CAAO,OAAO,KAAA,CAAM,YAAA,EAAqB,CAAC,MAAA,KAAgB;AACxD,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AAC9C,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,CAAA,EAAG;AACvC,QAAAA,wBAAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,WAAW,CAAA;AAAA,MAC5C;AAGA,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,MAC1C;AAEA,MAAA,MAAM,QAAA,GAAWA,yBAAO,MAAA,CAAO,UAAA,GAAaA,yBAAO,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,GAAI,MAAA;AAC/E,MAAA,KAAA,CAAM,SAAS,GAAA,CAAI,IAAA,CAAK,IAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAGhD,MAAA,IAAI,OAAO,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AACvC,QAAA,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA,MACzB;AAAA,IACF,CAAC,CAAA;AAEH,IAAA,IAAI,MAAA,EAAQ;AACV,MAAAA,wBAAAA,CAAO,KAAA,EAAM,CAAE,QAAA,CAAS,QAAQ,QAAQ,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF;AACF","file":"index.cjs","sourcesContent":["import type { UsageStats } from '@mastra/core/observability';\nimport type tracer from 'dd-trace';\n\ntype DatadogAnnotationMetrics = tracer.llmobs.AnnotationOptions['metrics'];\n\nexport function formatUsageMetrics(usage?: UsageStats): DatadogAnnotationMetrics | undefined {\n if (!usage) return undefined;\n\n const result: DatadogAnnotationMetrics = {};\n\n const inputTokens = usage.inputTokens;\n if (inputTokens !== undefined) result.inputTokens = inputTokens;\n\n const outputTokens = usage.outputTokens;\n if (outputTokens !== undefined) result.outputTokens = outputTokens;\n\n if (inputTokens !== undefined && outputTokens !== undefined) {\n result.totalTokens = inputTokens + outputTokens;\n }\n\n if (usage?.outputDetails?.reasoning !== undefined) {\n result.reasoningOutputTokens = usage.outputDetails.reasoning;\n }\n\n const cacheReadTokens = usage?.inputDetails?.cacheRead;\n if (cacheReadTokens !== undefined) {\n result.cacheReadTokens = cacheReadTokens;\n }\n\n const cacheWriteTokens = usage?.inputDetails?.cacheWrite;\n if (cacheWriteTokens !== undefined) {\n result.cacheWriteTokens = cacheWriteTokens;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n","/**\n * Utility functions for Datadog LLM Observability Exporter\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport tracer from 'dd-trace';\n\n/**\n * Datadog LLM Observability span kinds.\n */\nexport type DatadogSpanKind = 'llm' | 'agent' | 'workflow' | 'tool' | 'task' | 'retrieval' | 'embedding';\n\n/**\n * Maps Mastra SpanTypes to Datadog LLMObs span kinds.\n * Only non-task mappings are defined; unmapped types fall back to 'task'.\n */\nexport const SPAN_TYPE_TO_KIND: Partial<Record<SpanType, DatadogSpanKind>> = {\n [SpanType.AGENT_RUN]: 'agent',\n // MODEL_GENERATION is the wrapper around 1..N MODEL_STEPs (the actual API calls).\n // It maps to 'workflow' so Datadog doesn't double-count it as an LLM call.\n [SpanType.MODEL_GENERATION]: 'workflow',\n // MODEL_STEP is \"Single model execution step within a generation (one API call)\"\n // per packages/core/src/observability/types/tracing.ts, so it is the real LLM span.\n [SpanType.MODEL_STEP]: 'llm',\n [SpanType.TOOL_CALL]: 'tool',\n [SpanType.MCP_TOOL_CALL]: 'tool',\n [SpanType.WORKFLOW_RUN]: 'workflow',\n};\n\n/**\n * Singleton flag to prevent multiple tracer initializations.\n * dd-trace should only be initialized once per process.\n */\nconst tracerInitFlag = { done: false };\n\n/**\n * Ensures dd-trace is initialized exactly once.\n * Respects any existing tracer initialization by the application.\n */\nexport function ensureTracer(config: {\n mlApp: string;\n site: string;\n apiKey?: string;\n agentless: boolean;\n service?: string;\n env?: string;\n integrationsEnabled?: boolean;\n}): void {\n if (tracerInitFlag.done) return;\n\n // Set environment variables for dd-trace to pick up\n // (LLMObsEnableOptions only accepts mlApp and agentlessEnabled)\n // Always set when config is provided to ensure explicit config takes precedence\n // over any stale env vars that may already be set in the process\n if (config.site) {\n process.env.DD_SITE = config.site;\n }\n if (config.apiKey) {\n process.env.DD_API_KEY = config.apiKey;\n }\n\n // Check if tracer was already started by the application\n const alreadyStarted = (tracer as any)._tracer?.started;\n\n if (!alreadyStarted) {\n tracer.init({\n service: config.service || config.mlApp,\n env: config.env || process.env.DD_ENV,\n // Disable automatic integrations by default to avoid surprise instrumentation\n plugins: config.integrationsEnabled ?? false,\n });\n }\n\n // Enable LLM Observability with the resolved configuration\n tracer.llmobs.enable({\n mlApp: config.mlApp,\n agentlessEnabled: config.agentless,\n });\n\n tracerInitFlag.done = true;\n}\n\n/**\n * Returns the Datadog kind for a Mastra span type.\n */\nexport function kindFor(spanType: SpanType): DatadogSpanKind {\n return SPAN_TYPE_TO_KIND[spanType] || 'task';\n}\n\n/**\n * Converts a value to a Date object.\n */\nexport function toDate(value: Date | string | number): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\n/**\n * Safely stringifies data, handling circular references.\n */\nexport function safeStringify(data: unknown): string {\n try {\n return JSON.stringify(data);\n } catch {\n if (typeof data === 'object' && data !== null) {\n return `[Non-serializable ${data.constructor?.name || 'Object'}]`;\n }\n return String(data);\n }\n}\n\n/**\n * Checks if data is already in message array format ({role, content}[]).\n */\nfunction isMessageArray(data: any): data is Array<{ role: string; content: any }> {\n return Array.isArray(data) && data.every(m => m?.role && m?.content !== undefined);\n}\n\n/**\n * Checks if data is in Gemini content array format ({role, parts}[]).\n */\nfunction isGeminiContentArray(data: any): data is Array<{ role: string; parts: any[] }> {\n return Array.isArray(data) && data.every(m => m?.role && Array.isArray(m?.parts));\n}\n\n/**\n * Converts a Gemini content item to Datadog message format.\n * Extracts text from parts, skips binary data to avoid bloating traces.\n */\nfunction geminiContentToMessage(item: { role: string; parts: any[] }): { role: string; content: string } {\n const text = item.parts\n .map(p => {\n if (typeof p === 'string') return p;\n if (p?.text) return p.text;\n if (p?.inlineData) return `[${p.inlineData.mimeType ?? 'binary'}]`;\n if (p?.functionCall) return `[tool: ${p.functionCall.name ?? 'unknown'}]`;\n return safeStringify(p);\n })\n .join('');\n return { role: item.role, content: text };\n}\n\n/**\n * Formats input data for Datadog annotations.\n * LLM spans use message array format; others use raw or stringified data.\n */\nexport function formatInput(input: any, spanType: SpanType): any {\n // LLM spans expect {role, content}[] format\n if (spanType === SpanType.MODEL_GENERATION || spanType === SpanType.MODEL_STEP) {\n // Already in message format\n if (isMessageArray(input)) {\n return input.map(m => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : safeStringify(m.content),\n }));\n }\n // Gemini format: {role, parts} → normalize to {role, content}\n if (isGeminiContentArray(input)) {\n return input.map(geminiContentToMessage);\n }\n // String input becomes user message\n if (typeof input === 'string') {\n return [{ role: 'user', content: input }];\n }\n // Object input gets stringified as user message\n return [{ role: 'user', content: safeStringify(input) }];\n }\n\n // Non-LLM spans: pass through strings/arrays, stringify objects\n if (typeof input === 'string' || Array.isArray(input)) return input;\n return safeStringify(input);\n}\n\n/**\n * Formats output data for Datadog annotations.\n * LLM spans use message array format; others use raw or stringified data.\n */\nexport function formatOutput(output: any, spanType: SpanType): any {\n // LLM spans expect {role, content}[] format\n if (spanType === SpanType.MODEL_GENERATION || spanType === SpanType.MODEL_STEP) {\n // Already in message format\n if (isMessageArray(output)) {\n return output.map(m => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : safeStringify(m.content),\n }));\n }\n // String output becomes assistant message\n if (typeof output === 'string') {\n return [{ role: 'assistant', content: output }];\n }\n // Object with text property (common AI SDK format)\n if (output?.text) {\n return [{ role: 'assistant', content: output.text }];\n }\n // Other objects get stringified as assistant message\n return [{ role: 'assistant', content: safeStringify(output) }];\n }\n\n // Non-LLM spans: pass through strings, stringify objects\n if (typeof output === 'string') return output;\n return safeStringify(output);\n}\n","/**\n * Datadog LLM Observability Exporter for Mastra\n *\n * Exports Mastra observability data to Datadog's LLM Observability product.\n * Uses a completion-only pattern where spans are emitted on span_ended events.\n *\n * Key features:\n * - Maps Mastra span types to Datadog span kinds\n * - Normalizes AI SDK v4/v5 token usage formats\n * - Formats LLM inputs/outputs as message arrays\n * - Flattens metadata into searchable tags\n * - Supports both agent and agentless modes\n */\n\nimport type {\n TracingEvent,\n AnyExportedSpan,\n ModelGenerationAttributes,\n ModelStepAttributes,\n} from '@mastra/core/observability';\nimport { SpanType } from '@mastra/core/observability';\nimport { omitKeys } from '@mastra/core/utils';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport tracer from 'dd-trace';\nimport { formatUsageMetrics } from './metrics';\nimport { ensureTracer, kindFor, toDate, formatInput, formatOutput } from './utils';\nimport type { DatadogSpanKind } from './utils';\n\n/**\n * LLMObs span options passed to dd-trace's llmobs.trace().\n * Note: endTime is not included because dd-trace does not honor it in trace options.\n * Instead, we call ddSpan.finish(endTimeMs) explicitly inside the trace callback.\n */\ninterface LLMObsSpanOptions {\n kind: DatadogSpanKind;\n name: string;\n sessionId?: string;\n userId?: string;\n mlApp?: string;\n modelName?: string;\n modelProvider?: string;\n startTime?: Date;\n}\n\n/**\n * Minimal per-trace context for user/session tagging.\n */\ninterface TraceContext {\n userId?: string;\n sessionId?: string;\n}\n\ntype TraceState = {\n buffer: Map<string, AnyExportedSpan>;\n contexts: Map<string, { ddSpan: any; exported?: { traceId: string; spanId: string } }>;\n rootEnded: boolean;\n treeEmitted: boolean; // Whether the initial span tree has been emitted\n createdAt: number;\n cleanupTimer?: ReturnType<typeof setTimeout>;\n maxLifetimeTimer?: ReturnType<typeof setTimeout>;\n};\n\n/**\n * Tree node representing a span and its children for recursive emission.\n */\ninterface SpanNode {\n span: AnyExportedSpan;\n children: SpanNode[];\n}\n\n/**\n * Maximum lifetime for a trace state entry (30 minutes).\n * This is a fallback cleanup mechanism for traces that never receive a root span\n * or have all spans marked as non-root, preventing unbounded memory growth.\n */\nconst MAX_TRACE_LIFETIME_MS = 30 * 60 * 1000;\n\n/**\n * Regular cleanup interval for trace state entries (1 minute).\n */\nconst REGULAR_CLEANUP_INTERVAL_MS = 1 * 60 * 1000;\n\n/**\n * Configuration options for the Datadog LLM Observability exporter.\n */\nexport interface DatadogExporterConfig extends BaseExporterConfig {\n /**\n * Datadog API key. Required (agentless mode is the default).\n * Falls back to DD_API_KEY environment variable.\n */\n apiKey?: string;\n\n /**\n * ML application name for grouping traces.\n * Required - falls back to DD_LLMOBS_ML_APP environment variable.\n */\n mlApp?: string;\n\n /**\n * Datadog site (e.g., 'datadoghq.com', 'datadoghq.eu').\n * Falls back to DD_SITE environment variable, defaults to 'datadoghq.com'.\n */\n site?: string;\n\n /**\n * Service name for the application.\n * Falls back to mlApp if not specified.\n */\n service?: string;\n\n /**\n * Environment name (e.g., 'production', 'staging').\n * Falls back to DD_ENV environment variable.\n */\n env?: string;\n\n /**\n * Use agentless mode (direct HTTPS intake without local Datadog Agent).\n * Defaults to true for consistency with other Mastra exporters.\n * Set to false to use a local Datadog Agent instead.\n * Falls back to DD_LLMOBS_AGENTLESS_ENABLED environment variable.\n */\n agentless?: boolean;\n\n /**\n * Enable dd-trace automatic integrations.\n * Defaults to false to avoid unexpected instrumentation.\n */\n integrationsEnabled?: boolean;\n\n /**\n * Keys from the request context (set via `requestContextKeys` in the Mastra\n * Observability config) that should be promoted to flat Datadog LLM Observability\n * tags instead of being nested inside `annotations.metadata`.\n *\n * Flat tags are indexable and filterable in the Datadog LLM Observability UI,\n * which makes them suitable for multi-tenant filtering (e.g. tenantId, agentId).\n *\n * @example\n * ```typescript\n * new DatadogExporter({\n * mlApp: 'my-app',\n * requestContextKeys: ['tenantId', 'agentId'],\n * })\n * ```\n */\n requestContextKeys?: string[];\n}\n\n/**\n * Datadog LLM Observability Exporter for Mastra.\n *\n * Exports observability data to Datadog's LLM Observability product using\n * a completion-only pattern where spans are emitted on span_ended events.\n */\nexport class DatadogExporter extends BaseExporter {\n name = 'datadog';\n\n private config: Required<Pick<DatadogExporterConfig, 'mlApp' | 'site'>> & DatadogExporterConfig;\n private traceContext = new Map<string, TraceContext>();\n private traceState = new Map<string, TraceState>();\n\n constructor(config: DatadogExporterConfig = {}) {\n super(config);\n\n // Resolve configuration from config object and environment variables\n const mlApp = config.mlApp ?? process.env.DD_LLMOBS_ML_APP;\n const apiKey = config.apiKey ?? process.env.DD_API_KEY;\n const site = config.site ?? process.env.DD_SITE ?? 'datadoghq.com';\n const env = config.env ?? process.env.DD_ENV;\n\n // Default to agentless mode (true) for consistency with other Mastra exporters\n // Only disable if explicitly set to false via config or env var\n const envAgentless = process.env.DD_LLMOBS_AGENTLESS_ENABLED?.toLowerCase();\n const agentless = config.agentless ?? (envAgentless === 'false' || envAgentless === '0' ? false : true);\n\n // Validate required configuration\n if (!mlApp) {\n this.setDisabled(`Missing required mlApp. Set DD_LLMOBS_ML_APP environment variable or pass mlApp in config.`);\n this.config = config as any;\n return;\n }\n\n if (agentless && !apiKey) {\n this.setDisabled(\n `Missing required apiKey for agentless mode. Set DD_API_KEY environment variable or pass apiKey in config.`,\n );\n this.config = config as any;\n return;\n }\n\n this.config = { ...config, mlApp, site, apiKey, agentless, env };\n\n // Initialize tracer and enable LLM Observability\n ensureTracer({\n mlApp,\n site,\n apiKey,\n agentless,\n service: config.service,\n env,\n integrationsEnabled: config.integrationsEnabled,\n });\n\n this.logger.info('Datadog exporter initialized', { mlApp, site, agentless });\n }\n\n /**\n * Main entry point for tracing events from Mastra.\n */\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (this.isDisabled || !(tracer as any).llmobs) return;\n\n try {\n const span = event.exportedSpan;\n\n // Handle event spans (zero-duration spans) - buffer like regular spans for parent-first emission\n if (span.isEvent) {\n if (event.type === 'span_started') {\n this.captureTraceContext(span);\n this.enqueueSpan(span); // Route through buffer for proper parent context\n }\n return; // Skip span_updated and span_ended for events\n }\n\n // Handle regular spans based on event type\n switch (event.type) {\n case 'span_started':\n this.captureTraceContext(span);\n return;\n\n case 'span_updated':\n // No-op: completion-only pattern ignores mid-span updates\n return;\n\n case 'span_ended':\n this.enqueueSpan(span);\n return;\n }\n } catch (error) {\n this.logger.error('Datadog exporter error', {\n error,\n eventType: event.type,\n spanId: event.exportedSpan?.id,\n spanName: event.exportedSpan?.name,\n });\n }\n }\n\n /**\n * Captures user/session context from root spans for tagging all spans in the trace.\n */\n private captureTraceContext(span: AnyExportedSpan): void {\n if (span.isRootSpan && !this.traceContext.has(span.traceId)) {\n this.traceContext.set(span.traceId, {\n userId: span.metadata?.userId,\n sessionId: span.metadata?.sessionId,\n });\n }\n }\n\n /**\n * Queue span until its parent context is available, then emit spans parent-first.\n */\n private enqueueSpan(span: AnyExportedSpan): void {\n const state = this.getOrCreateTraceState(span.traceId);\n if (span.isRootSpan) {\n state.rootEnded = true;\n }\n\n state.buffer.set(span.id, span);\n this.tryEmitReadySpans(span.traceId);\n }\n\n /**\n * Sets native dd-trace error tags required by Datadog's Error Tracking UI.\n */\n private setErrorTags(ddSpan: any, errorInfo: NonNullable<AnyExportedSpan['errorInfo']>): void {\n ddSpan.setTag('error', true);\n ddSpan.setTag('error.message', errorInfo.message);\n ddSpan.setTag('error.type', errorInfo.name ?? errorInfo.category ?? 'Error');\n if (errorInfo.stack) {\n ddSpan.setTag('error.stack', errorInfo.stack);\n }\n }\n\n /**\n * Builds annotations object for llmobs.annotate().\n * Uses dd-trace's expected property names: inputData, outputData, metadata, tags, metrics.\n */\n private buildAnnotations(span: AnyExportedSpan): Record<string, any> {\n const annotations: Record<string, any> = {};\n\n // Format and add input (dd-trace expects 'inputData')\n if (span.input !== undefined) {\n annotations.inputData = formatInput(span.input, span.type);\n }\n\n // Format and add output (dd-trace expects 'outputData')\n if (span.output !== undefined) {\n annotations.outputData = formatOutput(span.output, span.type);\n }\n\n // Add token usage metrics on MODEL_STEP spans only.\n // MODEL_STEP is the actual LLM API call; MODEL_GENERATION is its parent wrapper.\n // Reporting on both would double-count cost in Datadog.\n if (span.type === SpanType.MODEL_STEP) {\n const usage = (span.attributes as ModelStepAttributes)?.usage;\n const metrics = formatUsageMetrics(usage);\n if (metrics) {\n annotations.metrics = metrics;\n }\n }\n\n // Forward span.attributes to metadata (minus known fields handled separately)\n // This ensures tool/workflow spans preserve custom attributes like other exporters\n const knownFields = ['usage', 'model', 'provider', 'parameters'];\n const otherAttributes = omitKeys((span.attributes ?? {}) as Record<string, any>, knownFields);\n\n // Separate requestContextKeys from span.metadata AND span.attributes:\n // - Keys listed in this.config.requestContextKeys are promoted to flat LLM Obs tags,\n // making them indexable and filterable in the Datadog UI (e.g. tenantId, agentId).\n // - All remaining keys stay nested in annotations.metadata as before.\n const contextKeySet = new Set(this.config.requestContextKeys ?? []);\n const flatContextTags: Record<string, any> = {};\n const remainingMetadata: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(span.metadata ?? {})) {\n if (contextKeySet.has(key)) {\n flatContextTags[key] = value;\n } else {\n remainingMetadata[key] = value;\n }\n }\n\n // Also promote matching keys from span.attributes so requestContextKeys\n // are consistently elevated regardless of where the caller stored them.\n const remainingAttributes: Record<string, any> = {};\n for (const [key, value] of Object.entries(otherAttributes)) {\n if (contextKeySet.has(key)) {\n // Only promote if not already set from span.metadata (metadata wins)\n if (!(key in flatContextTags)) {\n flatContextTags[key] = value;\n }\n } else {\n remainingAttributes[key] = value;\n }\n }\n\n // Merge remaining span.metadata + span attributes into metadata\n // Error message goes into metadata (not tags) because tags get normalized/truncated\n // which mangles free-form error text (e.g. colons split into key/value, spaces become underscores)\n const combinedMetadata: Record<string, any> = {\n ...remainingMetadata,\n ...remainingAttributes,\n };\n if (span.errorInfo) {\n combinedMetadata['error.message'] = span.errorInfo.message;\n }\n if (Object.keys(combinedMetadata).length > 0) {\n annotations.metadata = combinedMetadata;\n }\n\n // Build tags from span.tags (user-provided string[] converted to object),\n // promoted requestContextKeys values (flat, indexable in Datadog), and error info.\n // Datadog annotation tags accept Record<string, any>, so we use proper types.\n // The native span error status is also set via ddSpan.setTag('error', true) in emitSpan()\n const tags: Record<string, any> = {\n // Promote requestContextKeys values to flat, searchable LLM Observability tags\n ...flatContextTags,\n };\n\n // Convert span.tags (string[]) to object format\n // Tags in \"key:value\" format (e.g. \"instance_name:career-scout-api\") are split into { key: \"value\" }\n // Tags without a colon (e.g. \"production\") are set as { tag: true } (preserving existing behavior)\n if (span.tags?.length) {\n for (const tag of span.tags) {\n const colonIndex = tag.indexOf(':');\n if (colonIndex > 0) {\n tags[tag.substring(0, colonIndex)] = tag.substring(colonIndex + 1);\n } else {\n tags[tag] = true;\n }\n }\n }\n\n // Add error status and structured error fields as tags (short, structured values that survive normalization)\n // The error message itself is in metadata above to avoid tag normalization/truncation\n if (span.errorInfo) {\n tags.error = true;\n if (span.errorInfo.id) {\n tags['error.id'] = span.errorInfo.id;\n }\n if (span.errorInfo.domain) {\n tags['error.domain'] = span.errorInfo.domain;\n }\n if (span.errorInfo.category) {\n tags['error.category'] = span.errorInfo.category;\n }\n }\n\n if (Object.keys(tags).length > 0) {\n annotations.tags = tags;\n }\n\n return annotations;\n }\n\n /**\n * Force flush any buffered spans without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise<void> {\n if (this.isDisabled || !(tracer as any).llmobs) return;\n\n // Flush any pending data to Datadog\n if (tracer.llmobs?.flush) {\n try {\n await tracer.llmobs.flush();\n this.logger.debug('Datadog llmobs flushed');\n } catch (e) {\n this.logger.error('Error flushing llmobs', { error: e });\n }\n } else if ((tracer as any).flush) {\n try {\n await (tracer as any).flush();\n this.logger.debug('Datadog tracer flushed');\n } catch (e) {\n this.logger.error('Error flushing tracer', { error: e });\n }\n }\n }\n\n /**\n * Gracefully shuts down the exporter.\n */\n async shutdown(): Promise<void> {\n // Cancel all pending cleanup timers and clear state FIRST\n for (const [traceId, state] of this.traceState) {\n if (state.cleanupTimer) {\n clearTimeout(state.cleanupTimer);\n }\n if (state.maxLifetimeTimer) {\n clearTimeout(state.maxLifetimeTimer);\n }\n if (state.buffer.size > 0) {\n this.logger.warn('Shutdown with pending spans', {\n traceId,\n pendingCount: state.buffer.size,\n spanIds: Array.from(state.buffer.keys()),\n });\n }\n }\n this.traceState.clear();\n\n // Flush any pending data\n await this.flush();\n\n // Disable LLM Observability\n if (tracer.llmobs?.disable) {\n try {\n tracer.llmobs.disable();\n } catch (e) {\n this.logger.error('Error disabling llmobs', { error: e });\n }\n }\n\n // Clear local state\n this.traceContext.clear();\n\n await super.shutdown();\n }\n\n /**\n * Retrieve or initialize trace state for buffering and parent tracking.\n */\n private getOrCreateTraceState(traceId: string): TraceState {\n const existing = this.traceState.get(traceId);\n if (existing) {\n if (existing.cleanupTimer) {\n clearTimeout(existing.cleanupTimer);\n existing.cleanupTimer = undefined;\n }\n return existing;\n }\n\n const created: TraceState = {\n buffer: new Map<string, AnyExportedSpan>(),\n contexts: new Map<string, { ddSpan: any; exported?: { traceId: string; spanId: string } }>(),\n rootEnded: false,\n treeEmitted: false,\n createdAt: Date.now(),\n cleanupTimer: undefined,\n maxLifetimeTimer: undefined,\n };\n\n // Schedule fallback cleanup after max lifetime to prevent memory leaks\n // when traces never receive a root span or all spans are non-root\n const maxLifetimeTimer = setTimeout(() => {\n const state = this.traceState.get(traceId);\n if (state) {\n if (state.buffer.size > 0 || state.contexts.size > 0) {\n this.logger.warn('Discarding trace due to max lifetime exceeded', {\n traceId,\n bufferedSpans: state.buffer.size,\n emittedSpans: state.contexts.size,\n lifetimeMs: Date.now() - state.createdAt,\n });\n }\n if (state.cleanupTimer) {\n clearTimeout(state.cleanupTimer);\n }\n this.traceState.delete(traceId);\n this.traceContext.delete(traceId);\n }\n }, MAX_TRACE_LIFETIME_MS);\n // Prevent the timer from keeping the process alive\n (maxLifetimeTimer as any).unref?.();\n created.maxLifetimeTimer = maxLifetimeTimer;\n\n this.traceState.set(traceId, created);\n return created;\n }\n\n /**\n * Attempt to emit spans from the buffer.\n *\n * Two modes of operation:\n * 1. Initial tree emission: When root span ends and tree hasn't been emitted yet,\n * build a tree from all buffered spans and emit recursively using nested\n * llmobs.trace() calls. This ensures proper parent-child relationships in Datadog.\n * 2. Late-arriving spans: After the tree has been emitted, emit individual spans\n * with their parent context for proper linking.\n */\n private tryEmitReadySpans(traceId: string): void {\n const state = this.traceState.get(traceId);\n if (!state) return;\n\n // If tree hasn't been emitted yet, wait for root and emit as tree\n if (!state.treeEmitted) {\n // Wait until the root span has ended before emitting any spans\n if (!state.rootEnded) return;\n\n // Build tree and emit recursively\n const tree = this.buildSpanTree(state.buffer);\n if (tree) {\n this.emitSpanTree(tree, state);\n }\n\n // Clear the buffer and mark tree as emitted\n state.buffer.clear();\n state.treeEmitted = true;\n } else {\n // Tree already emitted - handle late-arriving spans individually\n // Use the old parent-first emission pattern for these\n let emitted = false;\n do {\n emitted = false;\n for (const [spanId, span] of state.buffer) {\n const parentCtx = span.parentSpanId ? state.contexts.get(span.parentSpanId) : undefined;\n if (span.parentSpanId && !parentCtx) {\n continue;\n }\n\n this.emitSingleSpan(span, state, parentCtx?.ddSpan);\n state.buffer.delete(spanId);\n emitted = true;\n }\n } while (emitted);\n }\n\n // Schedule cleanup if root has ended and buffer is empty\n if (state.rootEnded && state.buffer.size === 0 && !state.cleanupTimer) {\n const timer = setTimeout(() => {\n const currentState = this.traceState.get(traceId);\n if (currentState) {\n if (currentState.buffer.size > 0) {\n this.logger.warn('Discarding orphaned spans during cleanup', {\n traceId,\n orphanedCount: currentState.buffer.size,\n spanIds: Array.from(currentState.buffer.keys()),\n });\n }\n // Clear the max lifetime timer since normal cleanup is handling this\n if (currentState.maxLifetimeTimer) {\n clearTimeout(currentState.maxLifetimeTimer);\n }\n }\n this.traceState.delete(traceId);\n this.traceContext.delete(traceId);\n }, REGULAR_CLEANUP_INTERVAL_MS);\n // Prevent the timer from keeping the process alive\n (timer as any).unref?.();\n state.cleanupTimer = timer;\n }\n }\n\n /**\n * Builds a tree structure from buffered spans based on parentSpanId relationships.\n * Returns the root node of the tree, or undefined if no root span is found.\n */\n private buildSpanTree(buffer: Map<string, AnyExportedSpan>): SpanNode | undefined {\n // Create nodes for all spans\n const nodes = new Map<string, SpanNode>();\n let rootNode: SpanNode | undefined;\n\n for (const span of buffer.values()) {\n nodes.set(span.id, { span, children: [] });\n }\n\n // Build parent-child relationships\n for (const node of nodes.values()) {\n if (node.span.isRootSpan) {\n rootNode = node;\n } else if (node.span.parentSpanId) {\n const parentNode = nodes.get(node.span.parentSpanId);\n if (parentNode) {\n parentNode.children.push(node);\n } else {\n // Orphaned span - parent not in buffer, treat as root-level\n // This shouldn't happen normally but handles edge cases\n this.logger.warn('Orphaned span detected during tree build', {\n spanId: node.span.id,\n parentSpanId: node.span.parentSpanId,\n traceId: node.span.traceId,\n });\n }\n }\n }\n\n // Sort children by start time for consistent ordering\n for (const node of nodes.values()) {\n node.children.sort((a, b) => {\n const aTime =\n a.span.startTime instanceof Date ? a.span.startTime.getTime() : new Date(a.span.startTime).getTime();\n const bTime =\n b.span.startTime instanceof Date ? b.span.startTime.getTime() : new Date(b.span.startTime).getTime();\n return aTime - bTime;\n });\n }\n\n return rootNode;\n }\n\n /**\n * Builds LLMObs span options from a Mastra span.\n * Handles trace context, timestamps, and conditional model information for LLM spans.\n */\n private buildSpanOptions(\n span: AnyExportedSpan,\n inheritedModelAttrs?: { model?: string; provider?: string },\n ): { traceOptions: LLMObsSpanOptions; endTimeMs: number } {\n const traceCtx = this.traceContext.get(span.traceId) || {\n userId: span.metadata?.userId,\n sessionId: span.metadata?.sessionId,\n };\n\n const kind = kindFor(span.type);\n // MODEL_GENERATION carries model/provider; MODEL_STEP children inherit it from their parent.\n const ownAttrs = span.attributes as ModelGenerationAttributes | undefined;\n const attrs = {\n model: ownAttrs?.model ?? inheritedModelAttrs?.model,\n provider: ownAttrs?.provider ?? inheritedModelAttrs?.provider,\n };\n\n const startTime = toDate(span.startTime);\n // Event spans are point-in-time markers; use startTime for endTime if not set (zero duration)\n // Regular spans fall back to current time if endTime is not set\n const endTime = span.endTime ? toDate(span.endTime) : span.isEvent ? startTime : new Date();\n\n return {\n traceOptions: {\n kind,\n name: span.name,\n sessionId: traceCtx.sessionId,\n userId: traceCtx.userId,\n startTime,\n ...(kind === 'llm' && attrs?.model ? { modelName: attrs.model } : {}),\n ...(kind === 'llm' && attrs?.provider ? { modelProvider: attrs.provider } : {}),\n },\n // endTime as milliseconds for ddSpan.finish() — dd-trace's llmobs.trace() does not\n // honor endTime in options, so we must call finish(ms) explicitly on the span.\n endTimeMs: endTime.getTime(),\n };\n }\n\n /**\n * Recursively emits a span tree using nested llmobs.trace() calls.\n * This ensures parent-child relationships are properly established in Datadog\n * because child spans are created while their parent span is active in scope.\n */\n private emitSpanTree(\n node: SpanNode,\n state: TraceState,\n inheritedModelAttrs?: { model?: string; provider?: string },\n ): void {\n const span = node.span;\n const { traceOptions, endTimeMs } = this.buildSpanOptions(span, inheritedModelAttrs);\n\n // If this is a MODEL_GENERATION, propagate its model/provider to MODEL_STEP descendants\n // so the LLM-kind step spans in Datadog have a model name attached.\n const childInheritedModelAttrs =\n span.type === SpanType.MODEL_GENERATION\n ? {\n model: (span.attributes as ModelGenerationAttributes | undefined)?.model,\n provider: (span.attributes as ModelGenerationAttributes | undefined)?.provider,\n }\n : inheritedModelAttrs;\n\n // Use nested llmobs.trace() calls - children are emitted INSIDE the parent's callback\n // This ensures the Datadog SDK automatically establishes parent-child relationships\n tracer.llmobs.trace(traceOptions as any, (ddSpan: any) => {\n // Annotate this span (must happen before finish — annotate throws on finished spans)\n const annotations = this.buildAnnotations(span);\n if (Object.keys(annotations).length > 0) {\n tracer.llmobs.annotate(ddSpan, annotations);\n }\n\n // Set native Datadog error tags for proper Error Tracking UI\n if (span.errorInfo) {\n this.setErrorTags(ddSpan, span.errorInfo);\n }\n\n // Store context for potential evaluation submissions\n const exported = tracer.llmobs.exportSpan ? tracer.llmobs.exportSpan(ddSpan) : undefined;\n state.contexts.set(span.id, { ddSpan, exported });\n\n // Recursively emit children INSIDE this span's callback\n // This is the key to establishing proper parent-child relationships\n for (const child of node.children) {\n this.emitSpanTree(child, state, childInheritedModelAttrs);\n }\n\n // Explicitly finish with the correct end time. dd-trace's llmobs.trace() does not\n // honor endTime in span options — it auto-finishes with Date.now() when the callback\n // returns. By calling finish() here first, the auto-finish becomes a no-op (dd-trace\n // skips finish if _duration is already set).\n if (typeof ddSpan.finish === 'function') {\n ddSpan.finish(endTimeMs);\n }\n });\n }\n\n /**\n * Emit a single span with the proper Datadog parent context.\n * Used for late-arriving spans after the main tree has been emitted.\n */\n private emitSingleSpan(span: AnyExportedSpan, state: TraceState, parent?: any) {\n const { traceOptions, endTimeMs } = this.buildSpanOptions(span);\n\n const runTrace = () =>\n tracer.llmobs.trace(traceOptions as any, (ddSpan: any) => {\n const annotations = this.buildAnnotations(span);\n if (Object.keys(annotations).length > 0) {\n tracer.llmobs.annotate(ddSpan, annotations);\n }\n\n // Set native Datadog error tags for proper Error Tracking UI\n if (span.errorInfo) {\n this.setErrorTags(ddSpan, span.errorInfo);\n }\n\n const exported = tracer.llmobs.exportSpan ? tracer.llmobs.exportSpan(ddSpan) : undefined;\n state.contexts.set(span.id, { ddSpan, exported });\n\n // Explicitly finish with the correct end time (see emitSpanTree for details)\n if (typeof ddSpan.finish === 'function') {\n ddSpan.finish(endTimeMs);\n }\n });\n\n if (parent) {\n tracer.scope().activate(parent, runTrace);\n } else {\n runTrace();\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/metrics.ts","../src/utils.ts","../src/bridge.ts","../src/tracing.ts"],"names":["SpanType","tracer","BaseExporter","getExternalParentId","SpanTypeEnum","omitKeys"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { UsageStats } from '@mastra/core/observability';\nimport type tracer from 'dd-trace';\n\ntype DatadogAnnotationMetrics = tracer.llmobs.AnnotationOptions['metrics'];\n\nexport function formatUsageMetrics(usage?: UsageStats): DatadogAnnotationMetrics | undefined {\n if (!usage) return undefined;\n\n const result: DatadogAnnotationMetrics = {};\n\n const inputTokens = usage.inputTokens;\n if (inputTokens !== undefined) result.inputTokens = inputTokens;\n\n const outputTokens = usage.outputTokens;\n if (outputTokens !== undefined) result.outputTokens = outputTokens;\n\n if (inputTokens !== undefined && outputTokens !== undefined) {\n result.totalTokens = inputTokens + outputTokens;\n }\n\n if (usage?.outputDetails?.reasoning !== undefined) {\n result.reasoningOutputTokens = usage.outputDetails.reasoning;\n }\n\n const cacheReadTokens = usage?.inputDetails?.cacheRead;\n if (cacheReadTokens !== undefined) {\n result.cacheReadTokens = cacheReadTokens;\n }\n\n const cacheWriteTokens = usage?.inputDetails?.cacheWrite;\n if (cacheWriteTokens !== undefined) {\n result.cacheWriteTokens = cacheWriteTokens;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n","/**\n * Utility functions for Datadog LLM Observability Exporter\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport tracer from 'dd-trace';\n\n/**\n * Datadog LLM Observability span kinds.\n */\nexport type DatadogSpanKind = 'llm' | 'agent' | 'workflow' | 'tool' | 'task' | 'retrieval' | 'embedding';\n\n/**\n * Maps Mastra SpanTypes to Datadog LLMObs span kinds.\n * Only non-task mappings are defined; unmapped types fall back to 'task'.\n */\nexport const SPAN_TYPE_TO_KIND: Partial<Record<SpanType, DatadogSpanKind>> = {\n [SpanType.AGENT_RUN]: 'agent',\n // MODEL_GENERATION is the wrapper around 1..N MODEL_STEPs (the actual API calls).\n // It maps to 'workflow' so Datadog doesn't double-count it as an LLM call.\n [SpanType.MODEL_GENERATION]: 'workflow',\n // MODEL_STEP is \"Single model execution step within a generation (one API call)\"\n // per packages/core/src/observability/types/tracing.ts, so it is the real LLM span.\n [SpanType.MODEL_STEP]: 'llm',\n [SpanType.TOOL_CALL]: 'tool',\n [SpanType.MCP_TOOL_CALL]: 'tool',\n [SpanType.WORKFLOW_RUN]: 'workflow',\n};\n\n/**\n * Singleton flag to prevent multiple tracer initializations.\n * dd-trace should only be initialized once per process.\n */\nconst tracerInitFlag = { done: false };\n\n/**\n * Ensures dd-trace is initialized exactly once.\n * Respects any existing tracer initialization by the application.\n */\nexport function ensureTracer(config: {\n mlApp: string;\n site: string;\n apiKey?: string;\n agentless: boolean;\n service?: string;\n env?: string;\n integrationsEnabled?: boolean;\n}): void {\n if (tracerInitFlag.done) return;\n\n // Set environment variables for dd-trace to pick up\n // (LLMObsEnableOptions only accepts mlApp and agentlessEnabled)\n // Always set when config is provided to ensure explicit config takes precedence\n // over any stale env vars that may already be set in the process\n if (config.site) {\n process.env.DD_SITE = config.site;\n }\n if (config.apiKey) {\n process.env.DD_API_KEY = config.apiKey;\n }\n\n // Check if tracer was already started by the application\n const alreadyStarted = (tracer as any)._tracer?.started;\n\n if (!alreadyStarted) {\n tracer.init({\n service: config.service || config.mlApp,\n env: config.env || process.env.DD_ENV,\n // Disable automatic integrations by default to avoid surprise instrumentation\n plugins: config.integrationsEnabled ?? false,\n });\n }\n\n // Enable LLM Observability with the resolved configuration\n tracer.llmobs.enable({\n mlApp: config.mlApp,\n agentlessEnabled: config.agentless,\n });\n\n tracerInitFlag.done = true;\n}\n\n/**\n * Returns the Datadog kind for a Mastra span type.\n */\nexport function kindFor(spanType: SpanType): DatadogSpanKind {\n return SPAN_TYPE_TO_KIND[spanType] || 'task';\n}\n\n/**\n * Converts a value to a Date object.\n */\nexport function toDate(value: Date | string | number): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\n/**\n * Safely stringifies data, handling circular references.\n */\nexport function safeStringify(data: unknown): string {\n try {\n return JSON.stringify(data);\n } catch {\n if (typeof data === 'object' && data !== null) {\n return `[Non-serializable ${data.constructor?.name || 'Object'}]`;\n }\n return String(data);\n }\n}\n\n/**\n * Checks if data is already in message array format ({role, content}[]).\n */\nfunction isMessageArray(data: any): data is Array<{ role: string; content: any }> {\n return Array.isArray(data) && data.every(m => m?.role && m?.content !== undefined);\n}\n\n/**\n * Checks if data is in Gemini content array format ({role, parts}[]).\n */\nfunction isGeminiContentArray(data: any): data is Array<{ role: string; parts: any[] }> {\n return Array.isArray(data) && data.every(m => m?.role && Array.isArray(m?.parts));\n}\n\n/**\n * Converts a Gemini content item to Datadog message format.\n * Extracts text from parts, skips binary data to avoid bloating traces.\n */\nfunction geminiContentToMessage(item: { role: string; parts: any[] }): { role: string; content: string } {\n const text = item.parts\n .map(p => {\n if (typeof p === 'string') return p;\n if (p?.text) return p.text;\n if (p?.inlineData) return `[${p.inlineData.mimeType ?? 'binary'}]`;\n if (p?.functionCall) return `[tool: ${p.functionCall.name ?? 'unknown'}]`;\n return safeStringify(p);\n })\n .join('');\n return { role: item.role, content: text };\n}\n\n/**\n * Formats input data for Datadog annotations.\n * LLM spans use message array format; others use raw or stringified data.\n */\nexport function formatInput(input: any, spanType: SpanType): any {\n // LLM spans expect {role, content}[] format\n if (spanType === SpanType.MODEL_GENERATION || spanType === SpanType.MODEL_STEP) {\n // Already in message format\n if (isMessageArray(input)) {\n return input.map(m => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : safeStringify(m.content),\n }));\n }\n // Gemini format: {role, parts} → normalize to {role, content}\n if (isGeminiContentArray(input)) {\n return input.map(geminiContentToMessage);\n }\n // String input becomes user message\n if (typeof input === 'string') {\n return [{ role: 'user', content: input }];\n }\n // Object input gets stringified as user message\n return [{ role: 'user', content: safeStringify(input) }];\n }\n\n // Non-LLM spans: pass through strings/arrays, stringify objects\n if (typeof input === 'string' || Array.isArray(input)) return input;\n return safeStringify(input);\n}\n\n/**\n * Formats output data for Datadog annotations.\n * LLM spans use message array format; others use raw or stringified data.\n */\nexport function formatOutput(output: any, spanType: SpanType): any {\n // LLM spans expect {role, content}[] format\n if (spanType === SpanType.MODEL_GENERATION || spanType === SpanType.MODEL_STEP) {\n // Already in message format\n if (isMessageArray(output)) {\n return output.map(m => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : safeStringify(m.content),\n }));\n }\n // String output becomes assistant message\n if (typeof output === 'string') {\n return [{ role: 'assistant', content: output }];\n }\n // Object with text property (common AI SDK format)\n if (output?.text) {\n return [{ role: 'assistant', content: output.text }];\n }\n // Other objects get stringified as assistant message\n return [{ role: 'assistant', content: safeStringify(output) }];\n }\n\n // Non-LLM spans: pass through strings, stringify objects\n if (typeof output === 'string') return output;\n return safeStringify(output);\n}\n","/**\n * Datadog Bridge for Mastra Observability\n *\n * This bridge enables bidirectional integration with dd-trace:\n * 1. Creates real dd-trace APM spans eagerly when Mastra spans are created\n * 2. Activates spans in dd-trace's scope so auto-instrumented operations\n * (HTTP requests, database queries, etc.) have correct parent spans\n * 3. Registers those same spans with Datadog LLMObs and annotates them\n * before finish, avoiding a second synthetic APM span tree\n *\n * This fixes the core problem with the DatadogExporter: because the exporter\n * creates LLMObs spans retroactively (after execution completes), there is no\n * active dd-trace span in scope when tools and processors make outbound calls.\n * dd-trace's auto-instrumentation can't find the correct parent, so APM spans\n * fall back to the nearest active span (typically the request handler).\n */\n\nimport type {\n TracingEvent,\n AnyExportedSpan,\n ModelGenerationAttributes,\n ModelStepAttributes,\n ObservabilityBridge,\n CreateSpanOptions,\n SpanType,\n SpanIds,\n} from '@mastra/core/observability';\nimport { SpanType as SpanTypeEnum } from '@mastra/core/observability';\nimport { omitKeys } from '@mastra/core/utils';\nimport { BaseExporter, getExternalParentId } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport tracer from 'dd-trace';\nimport { formatUsageMetrics } from './metrics';\nimport { ensureTracer, formatInput, formatOutput, kindFor, toDate } from './utils';\nimport type { DatadogSpanKind } from './utils';\n\n// These types model dd-trace internals, not its public API surface.\n// The bridge uses them intentionally for experimental LLM Observability support\n// and they should be reviewed when upgrading dd-trace.\ntype LLMObsTagger = {\n registerLLMObsSpan: (\n span: any,\n options: {\n parent?: any;\n kind: DatadogSpanKind;\n name: string;\n userId?: string;\n sessionId?: string;\n modelName?: string;\n modelProvider?: string;\n },\n ) => void;\n};\n\ntype LLMObsInternalApi = {\n _activate?: <T>(span: any, options: Record<string, never> | undefined, fn: () => T) => T;\n};\n\ninterface TraceContext {\n userId?: string;\n sessionId?: string;\n}\n\nfunction flushApmExporter(): Promise<void> {\n const exporterFlush = (tracer as any)?._tracer?._exporter?.flush;\n if (typeof exporterFlush !== 'function') {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const done = (error?: unknown) => {\n if (settled) return;\n settled = true;\n\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n };\n\n try {\n exporterFlush.call((tracer as any)._tracer._exporter, done);\n } catch (error) {\n reject(error);\n }\n });\n}\n\n/**\n * Configuration options for the Datadog Bridge.\n */\nexport interface DatadogBridgeConfig extends BaseExporterConfig {\n /**\n * Datadog API key. Required in agentless mode.\n * Falls back to DD_API_KEY environment variable.\n */\n apiKey?: string;\n\n /**\n * ML application name for grouping traces.\n * Required - falls back to DD_LLMOBS_ML_APP environment variable.\n */\n mlApp?: string;\n\n /**\n * Datadog site (e.g., 'datadoghq.com', 'datadoghq.eu').\n * Falls back to DD_SITE environment variable, defaults to 'datadoghq.com'.\n */\n site?: string;\n\n /**\n * Service name for the application.\n * Falls back to mlApp if not specified.\n */\n service?: string;\n\n /**\n * Environment name (e.g., 'production', 'staging').\n * Falls back to DD_ENV environment variable.\n */\n env?: string;\n\n /**\n * Use agentless mode (direct HTTPS intake without a local Datadog Agent).\n *\n * Defaults to `false` for the bridge — most users running dd-trace\n * auto-instrumentation already have a local Datadog Agent (required for\n * APM data). Agentless mode only routes LLMObs data directly to Datadog\n * intake, which would split your APM and LLMObs telemetry across two\n * paths.\n *\n * Set to `true` if you only want LLMObs data (no APM auto-instrumentation)\n * and don't have a local Datadog Agent. Falls back to the\n * `DD_LLMOBS_AGENTLESS_ENABLED` environment variable.\n */\n agentless?: boolean;\n\n /**\n * Enable dd-trace automatic integrations (HTTP, database, etc.).\n * Defaults to true since the bridge is designed for APM integration.\n */\n integrationsEnabled?: boolean;\n\n /**\n * Keys from the request context that should be promoted to flat Datadog\n * LLM Observability tags instead of being nested in annotations.metadata.\n */\n requestContextKeys?: string[];\n}\n\n/**\n * Datadog Bridge for Mastra Observability.\n *\n * Creates native dd-trace spans in real time during execution for proper APM\n * context propagation, and uses the same live dd span for Datadog LLMObs\n * tagging and annotations.\n */\nexport class DatadogBridge extends BaseExporter implements ObservabilityBridge {\n name = 'datadog-bridge';\n\n private config: Required<Pick<DatadogBridgeConfig, 'mlApp' | 'site'>> & DatadogBridgeConfig;\n private ddSpanMap = new Map<string, any>();\n private traceContext = new Map<string, TraceContext>();\n private openSpanCounts = new Map<string, number>();\n\n constructor(config: DatadogBridgeConfig = {}) {\n super(config);\n\n const mlApp = config.mlApp ?? process.env.DD_LLMOBS_ML_APP;\n const apiKey = config.apiKey ?? process.env.DD_API_KEY;\n const site = config.site ?? process.env.DD_SITE ?? 'datadoghq.com';\n const env = config.env ?? process.env.DD_ENV;\n\n // Default to false for the bridge — assume a local Datadog Agent is\n // present (required for the APM auto-instrumentation the bridge enables)\n const envAgentless = process.env.DD_LLMOBS_AGENTLESS_ENABLED?.toLowerCase();\n const agentless = config.agentless ?? (envAgentless === 'true' || envAgentless === '1' ? true : false);\n if (!mlApp) {\n this.setDisabled(`Missing required mlApp. Set DD_LLMOBS_ML_APP environment variable or pass mlApp in config.`);\n this.config = config as any;\n return;\n }\n\n if (agentless && !apiKey) {\n this.setDisabled(\n `Missing required apiKey for agentless mode. Set DD_API_KEY environment variable or pass apiKey in config.`,\n );\n this.config = config as any;\n return;\n }\n\n this.config = { ...config, mlApp, site, apiKey, agentless, env };\n\n ensureTracer({\n mlApp,\n site,\n apiKey,\n agentless,\n service: config.service,\n env,\n integrationsEnabled: config.integrationsEnabled ?? true,\n });\n\n this.logger.info('Datadog bridge initialized', { mlApp, site, agentless });\n }\n\n /**\n * Create a dd-trace span eagerly when a Mastra span is constructed.\n */\n createSpan(options: CreateSpanOptions<SpanType>): SpanIds | undefined {\n if (this.isDisabled) return undefined;\n\n try {\n let apmParentDdSpan: any = undefined;\n let llmobsParentDdSpan: any = undefined;\n let parentSource: 'external-parent' | 'active-scope' | 'none' = 'none';\n\n const externalParentId = getExternalParentId(options);\n if (externalParentId) {\n apmParentDdSpan = this.ddSpanMap.get(externalParentId);\n llmobsParentDdSpan = apmParentDdSpan;\n if (apmParentDdSpan) {\n parentSource = 'external-parent';\n }\n }\n\n if (!apmParentDdSpan) {\n apmParentDdSpan = tracer.scope().active() ?? undefined;\n if (apmParentDdSpan) {\n parentSource = 'active-scope';\n }\n }\n\n if (!llmobsParentDdSpan && externalParentId) {\n llmobsParentDdSpan = apmParentDdSpan;\n }\n\n const ddSpan = tracer.startSpan(options.name, {\n ...(apmParentDdSpan ? { childOf: apmParentDdSpan } : {}),\n ...(options.startTime ? { startTime: toDate(options.startTime).getTime() } : {}),\n });\n\n const ddContext = ddSpan.context?.() as\n | {\n toSpanId?: (hex?: boolean) => string;\n toTraceId?: (hex?: boolean) => string;\n }\n | undefined;\n const spanId = ddContext?.toSpanId?.(true) ?? generateSpanId();\n const traceId =\n ddContext?.toTraceId?.(true) ??\n (externalParentId ? (options.parent?.traceId ?? generateTraceId()) : generateTraceId());\n const parentContext = apmParentDdSpan?.context?.() as { toSpanId?: (hex?: boolean) => string } | undefined;\n const parentSpanId = parentContext?.toSpanId?.(true) ?? externalParentId;\n\n this.captureTraceContext(traceId, options);\n this.openSpanCounts.set(traceId, (this.openSpanCounts.get(traceId) ?? 0) + 1);\n this.ddSpanMap.set(spanId, ddSpan);\n this.registerLlmObsSpan(ddSpan, traceId, options, llmobsParentDdSpan);\n\n this.logger.debug(\n `[DatadogBridge.createSpan] Created APM span [spanId=${spanId}] [traceId=${traceId}] ` +\n `[parentSpanId=${parentSpanId}] [type=${options.type}] [mapSize=${this.ddSpanMap.size}] ` +\n `[parentSource=${parentSource}] [externalParentId=${externalParentId ?? 'none'}]`,\n );\n\n return { spanId, traceId, parentSpanId };\n } catch (error) {\n this.logger.error('[DatadogBridge] Failed to create span:', error);\n return undefined;\n }\n }\n\n /**\n * Execute an async function within the dd-trace context of a Mastra span.\n */\n executeInContext<T>(spanId: string, fn: () => Promise<T>): Promise<T> {\n return this.executeWithSpanContext(spanId, fn);\n }\n\n /**\n * Execute a synchronous function within the dd-trace context of a Mastra span.\n */\n executeInContextSync<T>(spanId: string, fn: () => T): T {\n return this.executeWithSpanContext(spanId, fn);\n }\n\n private executeWithSpanContext<T>(spanId: string, fn: () => T): T {\n const ddSpan = this.ddSpanMap.get(spanId);\n\n if (ddSpan) {\n return tracer.scope().activate(ddSpan, () => {\n const llmobs = (tracer as any).llmobs as LLMObsInternalApi | undefined;\n // `_activate` is an internal dd-trace hook. Keep this usage aligned\n // with supported dd-trace versions when the dependency is upgraded.\n if (typeof llmobs?._activate === 'function') {\n return llmobs._activate(ddSpan, undefined, fn);\n }\n\n return fn();\n });\n }\n\n return fn();\n }\n\n /**\n * Handle tracing events from the observability bus.\n */\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (this.isDisabled) return;\n\n try {\n const span = event.exportedSpan;\n\n if (span.isEvent) {\n if (event.type === 'span_started' || event.type === 'span_ended') {\n this.annotateAndFinishSpan(span);\n }\n return;\n }\n\n switch (event.type) {\n case 'span_started':\n case 'span_updated':\n return;\n case 'span_ended':\n this.annotateAndFinishSpan(span);\n return;\n }\n } catch (error) {\n this.logger.error('Datadog bridge error', {\n error,\n eventType: event.type,\n spanId: event.exportedSpan?.id,\n spanName: event.exportedSpan?.name,\n });\n }\n }\n\n private registerLlmObsSpan(\n ddSpan: any,\n traceId: string,\n options: CreateSpanOptions<SpanType>,\n parentDdSpan?: any,\n ): void {\n const tagger = this.getLlmObsTagger();\n if (!tagger) return;\n\n try {\n const kind = kindFor(options.type);\n const ownAttrs = options.attributes as ModelGenerationAttributes | undefined;\n const inheritedModelAttrs =\n options.parent?.type === SpanTypeEnum.MODEL_GENERATION\n ? (options.parent.attributes as ModelGenerationAttributes | undefined)\n : undefined;\n const traceCtx = this.resolveTraceContext(traceId, options);\n\n // `registerLLMObsSpan` comes from dd-trace internals. Keep it under\n // review because the bridge depends on experimental behavior here.\n tagger.registerLLMObsSpan(ddSpan, {\n parent: parentDdSpan,\n kind,\n name: options.name,\n userId: traceCtx.userId,\n sessionId: traceCtx.sessionId,\n ...(kind === 'llm' && (ownAttrs?.model ?? inheritedModelAttrs?.model)\n ? { modelName: ownAttrs?.model ?? inheritedModelAttrs?.model }\n : {}),\n ...(kind === 'llm' && (ownAttrs?.provider ?? inheritedModelAttrs?.provider)\n ? { modelProvider: ownAttrs?.provider ?? inheritedModelAttrs?.provider }\n : {}),\n });\n } catch (error) {\n this.logger.warn('[DatadogBridge] Failed to register LLMObs span', {\n error,\n spanName: options.name,\n spanType: options.type,\n });\n }\n }\n\n private getLlmObsTagger(): LLMObsTagger | undefined {\n const tagger = (tracer as any).llmobs?._tagger;\n // `_tagger` is also internal dd-trace state and may change between releases.\n if (tagger && typeof tagger.registerLLMObsSpan === 'function') {\n return tagger as LLMObsTagger;\n }\n return undefined;\n }\n\n /**\n * Annotate the eagerly-created dd span and finish it using the final Mastra\n * span state.\n */\n private annotateAndFinishSpan(span: AnyExportedSpan): void {\n const ddSpan = this.ddSpanMap.get(span.id);\n if (!ddSpan) {\n this.logger.warn('[DatadogBridge] No dd span found when finalizing Mastra span', {\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n mapSize: this.ddSpanMap.size,\n });\n return;\n }\n\n const endTime = span.endTime ? toDate(span.endTime) : span.isEvent ? toDate(span.startTime) : new Date();\n\n const annotations = this.buildAnnotations(span);\n\n try {\n if (Object.keys(annotations).length > 0 && tracer.llmobs?.annotate) {\n tracer.llmobs.annotate(ddSpan, annotations);\n }\n } catch (error) {\n this.logger.error('[DatadogBridge] Failed to annotate span before finish', {\n error,\n spanId: span.id,\n spanName: span.name,\n });\n }\n\n try {\n if (span.errorInfo) {\n this.setErrorTags(ddSpan, span.errorInfo);\n }\n } catch (error) {\n this.logger.error('[DatadogBridge] Failed to set error tags on dd span', {\n error,\n spanId: span.id,\n spanName: span.name,\n });\n }\n\n try {\n if (typeof ddSpan.finish === 'function') {\n ddSpan.finish(endTime.getTime());\n }\n } catch (error) {\n this.logger.error('[DatadogBridge] Failed to finish dd span', {\n error,\n spanId: span.id,\n spanName: span.name,\n });\n } finally {\n this.ddSpanMap.delete(span.id);\n this.releaseTraceContext(span.traceId);\n }\n }\n\n private captureTraceContext(traceId: string, options: CreateSpanOptions<SpanType>): void {\n const existing = this.traceContext.get(traceId);\n const next: TraceContext = {\n userId: firstString(options.metadata?.userId, options.parent?.metadata?.userId, existing?.userId),\n sessionId: firstString(options.metadata?.sessionId, options.parent?.metadata?.sessionId, existing?.sessionId),\n };\n\n if (next.userId || next.sessionId) {\n this.traceContext.set(traceId, next);\n }\n }\n\n private resolveTraceContext(traceId: string, options: CreateSpanOptions<SpanType>): TraceContext {\n const stored = this.traceContext.get(traceId);\n return {\n userId: firstString(options.metadata?.userId, options.parent?.metadata?.userId, stored?.userId),\n sessionId: firstString(options.metadata?.sessionId, options.parent?.metadata?.sessionId, stored?.sessionId),\n };\n }\n\n private releaseTraceContext(traceId: string): void {\n const nextCount = (this.openSpanCounts.get(traceId) ?? 1) - 1;\n if (nextCount > 0) {\n this.openSpanCounts.set(traceId, nextCount);\n return;\n }\n\n this.openSpanCounts.delete(traceId);\n this.traceContext.delete(traceId);\n }\n\n private buildAnnotations(span: AnyExportedSpan): Record<string, any> {\n const annotations: Record<string, any> = {};\n\n if (span.input !== undefined) {\n annotations.inputData = formatInput(span.input, span.type);\n }\n\n if (span.output !== undefined) {\n annotations.outputData = formatOutput(span.output, span.type);\n }\n\n if (span.type === SpanTypeEnum.MODEL_STEP) {\n const usage = (span.attributes as ModelStepAttributes)?.usage;\n const metrics = formatUsageMetrics(usage);\n if (metrics) {\n annotations.metrics = metrics;\n }\n }\n\n const knownFields = ['usage', 'model', 'provider', 'parameters'];\n const otherAttributes = omitKeys((span.attributes ?? {}) as Record<string, any>, knownFields);\n\n const contextKeySet = new Set(this.config.requestContextKeys ?? []);\n const flatContextTags: Record<string, any> = {};\n const remainingMetadata: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(span.metadata ?? {})) {\n if (contextKeySet.has(key)) {\n flatContextTags[key] = value;\n } else {\n remainingMetadata[key] = value;\n }\n }\n\n const remainingAttributes: Record<string, any> = {};\n for (const [key, value] of Object.entries(otherAttributes)) {\n if (contextKeySet.has(key)) {\n if (!(key in flatContextTags)) {\n flatContextTags[key] = value;\n }\n } else {\n remainingAttributes[key] = value;\n }\n }\n\n const combinedMetadata: Record<string, any> = {\n ...remainingMetadata,\n ...remainingAttributes,\n };\n if (span.errorInfo) {\n combinedMetadata['error.message'] = span.errorInfo.message;\n }\n if (Object.keys(combinedMetadata).length > 0) {\n annotations.metadata = combinedMetadata;\n }\n\n const tags: Record<string, any> = {\n ...flatContextTags,\n };\n\n if (span.tags?.length) {\n for (const tag of span.tags) {\n const colonIndex = tag.indexOf(':');\n if (colonIndex > 0) {\n tags[tag.substring(0, colonIndex)] = tag.substring(colonIndex + 1);\n } else {\n tags[tag] = true;\n }\n }\n }\n\n if (span.errorInfo) {\n tags.error = true;\n if (span.errorInfo.id) {\n tags['error.id'] = span.errorInfo.id;\n }\n if (span.errorInfo.domain) {\n tags['error.domain'] = span.errorInfo.domain;\n }\n if (span.errorInfo.category) {\n tags['error.category'] = span.errorInfo.category;\n }\n }\n\n if (Object.keys(tags).length > 0) {\n annotations.tags = tags;\n }\n\n return annotations;\n }\n\n private setErrorTags(ddSpan: any, errorInfo: NonNullable<AnyExportedSpan['errorInfo']>): void {\n ddSpan.setTag('error', true);\n ddSpan.setTag('error.message', errorInfo.message);\n ddSpan.setTag('error.type', errorInfo.name ?? errorInfo.category ?? 'Error');\n if (errorInfo.stack) {\n ddSpan.setTag('error.stack', errorInfo.stack);\n }\n }\n\n async flush(): Promise<void> {\n if (this.isDisabled) return;\n\n if (tracer.llmobs?.flush) {\n try {\n await tracer.llmobs.flush();\n this.logger.debug('Datadog llmobs flushed');\n } catch (e) {\n this.logger.error('Error flushing llmobs', { error: e });\n }\n }\n\n try {\n await flushApmExporter();\n this.logger.debug('Datadog APM exporter flushed');\n } catch (e) {\n this.logger.error('Error flushing Datadog APM exporter', { error: e });\n }\n }\n\n async shutdown(): Promise<void> {\n for (const [spanId, ddSpan] of this.ddSpanMap) {\n this.logger.warn(`[DatadogBridge] Force-finishing APM span that was not properly closed [id=${spanId}]`);\n try {\n if (typeof ddSpan.finish === 'function') {\n ddSpan.finish();\n }\n } catch {\n // Best-effort cleanup\n }\n }\n this.ddSpanMap.clear();\n this.openSpanCounts.clear();\n this.traceContext.clear();\n\n await this.flush();\n\n if (tracer.llmobs?.disable) {\n try {\n tracer.llmobs.disable();\n } catch (e) {\n this.logger.error('Error disabling llmobs', { error: e });\n }\n }\n\n await super.shutdown();\n }\n}\n\nfunction firstString(...values: Array<unknown>): string | undefined {\n for (const value of values) {\n if (typeof value === 'string') {\n return value;\n }\n }\n return undefined;\n}\n\nfunction fillRandomBytes(bytes: Uint8Array): void {\n try {\n const webCrypto = globalThis.crypto;\n if (webCrypto?.getRandomValues) {\n webCrypto.getRandomValues.call(webCrypto, bytes);\n return;\n }\n } catch {\n // Fall through to fallback\n }\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n}\n\nfunction generateSpanId(): string {\n const bytes = new Uint8Array(8);\n fillRandomBytes(bytes);\n return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\nfunction generateTraceId(): string {\n const bytes = new Uint8Array(16);\n fillRandomBytes(bytes);\n return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n","/**\n * Datadog LLM Observability Exporter for Mastra\n *\n * Exports Mastra observability data to Datadog's LLM Observability product.\n * Uses a completion-only pattern where spans are emitted on span_ended events.\n *\n * Key features:\n * - Maps Mastra span types to Datadog span kinds\n * - Normalizes AI SDK v4/v5 token usage formats\n * - Formats LLM inputs/outputs as message arrays\n * - Flattens metadata into searchable tags\n * - Supports both agent and agentless modes\n */\n\nimport type {\n TracingEvent,\n AnyExportedSpan,\n ModelGenerationAttributes,\n ModelStepAttributes,\n} from '@mastra/core/observability';\nimport { SpanType } from '@mastra/core/observability';\nimport { omitKeys } from '@mastra/core/utils';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport tracer from 'dd-trace';\nimport { formatUsageMetrics } from './metrics';\nimport { ensureTracer, kindFor, toDate, formatInput, formatOutput } from './utils';\nimport type { DatadogSpanKind } from './utils';\n\n/**\n * LLMObs span options passed to dd-trace's llmobs.trace().\n * Note: endTime is not included because dd-trace does not honor it in trace options.\n * Instead, we call ddSpan.finish(endTimeMs) explicitly inside the trace callback.\n */\ninterface LLMObsSpanOptions {\n kind: DatadogSpanKind;\n name: string;\n sessionId?: string;\n userId?: string;\n mlApp?: string;\n modelName?: string;\n modelProvider?: string;\n startTime?: Date;\n}\n\n/**\n * Minimal per-trace context for user/session tagging.\n */\ninterface TraceContext {\n userId?: string;\n sessionId?: string;\n}\n\ntype TraceState = {\n buffer: Map<string, AnyExportedSpan>;\n contexts: Map<string, { ddSpan: any; exported?: { traceId: string; spanId: string } }>;\n rootEnded: boolean;\n treeEmitted: boolean; // Whether the initial span tree has been emitted\n createdAt: number;\n cleanupTimer?: ReturnType<typeof setTimeout>;\n maxLifetimeTimer?: ReturnType<typeof setTimeout>;\n};\n\n/**\n * Tree node representing a span and its children for recursive emission.\n */\ninterface SpanNode {\n span: AnyExportedSpan;\n children: SpanNode[];\n}\n\n/**\n * Maximum lifetime for a trace state entry (30 minutes).\n * This is a fallback cleanup mechanism for traces that never receive a root span\n * or have all spans marked as non-root, preventing unbounded memory growth.\n */\nconst MAX_TRACE_LIFETIME_MS = 30 * 60 * 1000;\n\n/**\n * Regular cleanup interval for trace state entries (1 minute).\n */\nconst REGULAR_CLEANUP_INTERVAL_MS = 1 * 60 * 1000;\n\n/**\n * Configuration options for the Datadog LLM Observability exporter.\n */\nexport interface DatadogExporterConfig extends BaseExporterConfig {\n /**\n * Datadog API key. Required (agentless mode is the default).\n * Falls back to DD_API_KEY environment variable.\n */\n apiKey?: string;\n\n /**\n * ML application name for grouping traces.\n * Required - falls back to DD_LLMOBS_ML_APP environment variable.\n */\n mlApp?: string;\n\n /**\n * Datadog site (e.g., 'datadoghq.com', 'datadoghq.eu').\n * Falls back to DD_SITE environment variable, defaults to 'datadoghq.com'.\n */\n site?: string;\n\n /**\n * Service name for the application.\n * Falls back to mlApp if not specified.\n */\n service?: string;\n\n /**\n * Environment name (e.g., 'production', 'staging').\n * Falls back to DD_ENV environment variable.\n */\n env?: string;\n\n /**\n * Use agentless mode (direct HTTPS intake without local Datadog Agent).\n * Defaults to true for consistency with other Mastra exporters.\n * Set to false to use a local Datadog Agent instead.\n * Falls back to DD_LLMOBS_AGENTLESS_ENABLED environment variable.\n */\n agentless?: boolean;\n\n /**\n * Enable dd-trace automatic integrations.\n * Defaults to false to avoid unexpected instrumentation.\n */\n integrationsEnabled?: boolean;\n\n /**\n * Keys from the request context (set via `requestContextKeys` in the Mastra\n * Observability config) that should be promoted to flat Datadog LLM Observability\n * tags instead of being nested inside `annotations.metadata`.\n *\n * Flat tags are indexable and filterable in the Datadog LLM Observability UI,\n * which makes them suitable for multi-tenant filtering (e.g. tenantId, agentId).\n *\n * @example\n * ```typescript\n * new DatadogExporter({\n * mlApp: 'my-app',\n * requestContextKeys: ['tenantId', 'agentId'],\n * })\n * ```\n */\n requestContextKeys?: string[];\n}\n\n/**\n * Datadog LLM Observability Exporter for Mastra.\n *\n * Exports observability data to Datadog's LLM Observability product using\n * a completion-only pattern where spans are emitted on span_ended events.\n */\nexport class DatadogExporter extends BaseExporter {\n name = 'datadog';\n\n private config: Required<Pick<DatadogExporterConfig, 'mlApp' | 'site'>> & DatadogExporterConfig;\n private traceContext = new Map<string, TraceContext>();\n private traceState = new Map<string, TraceState>();\n\n constructor(config: DatadogExporterConfig = {}) {\n super(config);\n\n // Resolve configuration from config object and environment variables\n const mlApp = config.mlApp ?? process.env.DD_LLMOBS_ML_APP;\n const apiKey = config.apiKey ?? process.env.DD_API_KEY;\n const site = config.site ?? process.env.DD_SITE ?? 'datadoghq.com';\n const env = config.env ?? process.env.DD_ENV;\n\n // Default to agentless mode (true) for consistency with other Mastra exporters\n // Only disable if explicitly set to false via config or env var\n const envAgentless = process.env.DD_LLMOBS_AGENTLESS_ENABLED?.toLowerCase();\n const agentless = config.agentless ?? (envAgentless === 'false' || envAgentless === '0' ? false : true);\n\n // Validate required configuration\n if (!mlApp) {\n this.setDisabled(`Missing required mlApp. Set DD_LLMOBS_ML_APP environment variable or pass mlApp in config.`);\n this.config = config as any;\n return;\n }\n\n if (agentless && !apiKey) {\n this.setDisabled(\n `Missing required apiKey for agentless mode. Set DD_API_KEY environment variable or pass apiKey in config.`,\n );\n this.config = config as any;\n return;\n }\n\n this.config = { ...config, mlApp, site, apiKey, agentless, env };\n\n // Initialize tracer and enable LLM Observability\n ensureTracer({\n mlApp,\n site,\n apiKey,\n agentless,\n service: config.service,\n env,\n integrationsEnabled: config.integrationsEnabled,\n });\n\n this.logger.info('Datadog exporter initialized', { mlApp, site, agentless });\n }\n\n /**\n * Main entry point for tracing events from Mastra.\n */\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (this.isDisabled || !(tracer as any).llmobs) return;\n\n try {\n const span = event.exportedSpan;\n\n // Handle event spans (zero-duration spans) - buffer like regular spans for parent-first emission\n if (span.isEvent) {\n if (event.type === 'span_started') {\n this.captureTraceContext(span);\n this.enqueueSpan(span); // Route through buffer for proper parent context\n }\n return; // Skip span_updated and span_ended for events\n }\n\n // Handle regular spans based on event type\n switch (event.type) {\n case 'span_started':\n this.captureTraceContext(span);\n return;\n\n case 'span_updated':\n // No-op: completion-only pattern ignores mid-span updates\n return;\n\n case 'span_ended':\n this.enqueueSpan(span);\n return;\n }\n } catch (error) {\n this.logger.error('Datadog exporter error', {\n error,\n eventType: event.type,\n spanId: event.exportedSpan?.id,\n spanName: event.exportedSpan?.name,\n });\n }\n }\n\n /**\n * Captures user/session context from root spans for tagging all spans in the trace.\n */\n private captureTraceContext(span: AnyExportedSpan): void {\n if (span.isRootSpan && !this.traceContext.has(span.traceId)) {\n this.traceContext.set(span.traceId, {\n userId: span.metadata?.userId,\n sessionId: span.metadata?.sessionId,\n });\n }\n }\n\n /**\n * Queue span until its parent context is available, then emit spans parent-first.\n */\n private enqueueSpan(span: AnyExportedSpan): void {\n const state = this.getOrCreateTraceState(span.traceId);\n if (span.isRootSpan) {\n state.rootEnded = true;\n }\n\n state.buffer.set(span.id, span);\n this.tryEmitReadySpans(span.traceId);\n }\n\n /**\n * Sets native dd-trace error tags required by Datadog's Error Tracking UI.\n */\n private setErrorTags(ddSpan: any, errorInfo: NonNullable<AnyExportedSpan['errorInfo']>): void {\n ddSpan.setTag('error', true);\n ddSpan.setTag('error.message', errorInfo.message);\n ddSpan.setTag('error.type', errorInfo.name ?? errorInfo.category ?? 'Error');\n if (errorInfo.stack) {\n ddSpan.setTag('error.stack', errorInfo.stack);\n }\n }\n\n /**\n * Builds annotations object for llmobs.annotate().\n * Uses dd-trace's expected property names: inputData, outputData, metadata, tags, metrics.\n */\n private buildAnnotations(span: AnyExportedSpan): Record<string, any> {\n const annotations: Record<string, any> = {};\n\n // Format and add input (dd-trace expects 'inputData')\n if (span.input !== undefined) {\n annotations.inputData = formatInput(span.input, span.type);\n }\n\n // Format and add output (dd-trace expects 'outputData')\n if (span.output !== undefined) {\n annotations.outputData = formatOutput(span.output, span.type);\n }\n\n // Add token usage metrics on MODEL_STEP spans only.\n // MODEL_STEP is the actual LLM API call; MODEL_GENERATION is its parent wrapper.\n // Reporting on both would double-count cost in Datadog.\n if (span.type === SpanType.MODEL_STEP) {\n const usage = (span.attributes as ModelStepAttributes)?.usage;\n const metrics = formatUsageMetrics(usage);\n if (metrics) {\n annotations.metrics = metrics;\n }\n }\n\n // Forward span.attributes to metadata (minus known fields handled separately)\n // This ensures tool/workflow spans preserve custom attributes like other exporters\n const knownFields = ['usage', 'model', 'provider', 'parameters'];\n const otherAttributes = omitKeys((span.attributes ?? {}) as Record<string, any>, knownFields);\n\n // Separate requestContextKeys from span.metadata AND span.attributes:\n // - Keys listed in this.config.requestContextKeys are promoted to flat LLM Obs tags,\n // making them indexable and filterable in the Datadog UI (e.g. tenantId, agentId).\n // - All remaining keys stay nested in annotations.metadata as before.\n const contextKeySet = new Set(this.config.requestContextKeys ?? []);\n const flatContextTags: Record<string, any> = {};\n const remainingMetadata: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(span.metadata ?? {})) {\n if (contextKeySet.has(key)) {\n flatContextTags[key] = value;\n } else {\n remainingMetadata[key] = value;\n }\n }\n\n // Also promote matching keys from span.attributes so requestContextKeys\n // are consistently elevated regardless of where the caller stored them.\n const remainingAttributes: Record<string, any> = {};\n for (const [key, value] of Object.entries(otherAttributes)) {\n if (contextKeySet.has(key)) {\n // Only promote if not already set from span.metadata (metadata wins)\n if (!(key in flatContextTags)) {\n flatContextTags[key] = value;\n }\n } else {\n remainingAttributes[key] = value;\n }\n }\n\n // Merge remaining span.metadata + span attributes into metadata\n // Error message goes into metadata (not tags) because tags get normalized/truncated\n // which mangles free-form error text (e.g. colons split into key/value, spaces become underscores)\n const combinedMetadata: Record<string, any> = {\n ...remainingMetadata,\n ...remainingAttributes,\n };\n if (span.errorInfo) {\n combinedMetadata['error.message'] = span.errorInfo.message;\n }\n if (Object.keys(combinedMetadata).length > 0) {\n annotations.metadata = combinedMetadata;\n }\n\n // Build tags from span.tags (user-provided string[] converted to object),\n // promoted requestContextKeys values (flat, indexable in Datadog), and error info.\n // Datadog annotation tags accept Record<string, any>, so we use proper types.\n // The native span error status is also set via ddSpan.setTag('error', true) in emitSpan()\n const tags: Record<string, any> = {\n // Promote requestContextKeys values to flat, searchable LLM Observability tags\n ...flatContextTags,\n };\n\n // Convert span.tags (string[]) to object format\n // Tags in \"key:value\" format (e.g. \"instance_name:career-scout-api\") are split into { key: \"value\" }\n // Tags without a colon (e.g. \"production\") are set as { tag: true } (preserving existing behavior)\n if (span.tags?.length) {\n for (const tag of span.tags) {\n const colonIndex = tag.indexOf(':');\n if (colonIndex > 0) {\n tags[tag.substring(0, colonIndex)] = tag.substring(colonIndex + 1);\n } else {\n tags[tag] = true;\n }\n }\n }\n\n // Add error status and structured error fields as tags (short, structured values that survive normalization)\n // The error message itself is in metadata above to avoid tag normalization/truncation\n if (span.errorInfo) {\n tags.error = true;\n if (span.errorInfo.id) {\n tags['error.id'] = span.errorInfo.id;\n }\n if (span.errorInfo.domain) {\n tags['error.domain'] = span.errorInfo.domain;\n }\n if (span.errorInfo.category) {\n tags['error.category'] = span.errorInfo.category;\n }\n }\n\n if (Object.keys(tags).length > 0) {\n annotations.tags = tags;\n }\n\n return annotations;\n }\n\n /**\n * Force flush any buffered spans without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise<void> {\n if (this.isDisabled || !(tracer as any).llmobs) return;\n\n // Flush any pending data to Datadog\n if (tracer.llmobs?.flush) {\n try {\n await tracer.llmobs.flush();\n this.logger.debug('Datadog llmobs flushed');\n } catch (e) {\n this.logger.error('Error flushing llmobs', { error: e });\n }\n }\n }\n\n /**\n * Gracefully shuts down the exporter.\n */\n async shutdown(): Promise<void> {\n // Cancel all pending cleanup timers and clear state FIRST\n for (const [traceId, state] of this.traceState) {\n if (state.cleanupTimer) {\n clearTimeout(state.cleanupTimer);\n }\n if (state.maxLifetimeTimer) {\n clearTimeout(state.maxLifetimeTimer);\n }\n if (state.buffer.size > 0) {\n this.logger.warn('Shutdown with pending spans', {\n traceId,\n pendingCount: state.buffer.size,\n spanIds: Array.from(state.buffer.keys()),\n });\n }\n }\n this.traceState.clear();\n\n // Flush any pending data\n await this.flush();\n\n // Disable LLM Observability\n if (tracer.llmobs?.disable) {\n try {\n tracer.llmobs.disable();\n } catch (e) {\n this.logger.error('Error disabling llmobs', { error: e });\n }\n }\n\n // Clear local state\n this.traceContext.clear();\n\n await super.shutdown();\n }\n\n /**\n * Retrieve or initialize trace state for buffering and parent tracking.\n */\n private getOrCreateTraceState(traceId: string): TraceState {\n const existing = this.traceState.get(traceId);\n if (existing) {\n if (existing.cleanupTimer) {\n clearTimeout(existing.cleanupTimer);\n existing.cleanupTimer = undefined;\n }\n return existing;\n }\n\n const created: TraceState = {\n buffer: new Map<string, AnyExportedSpan>(),\n contexts: new Map<string, { ddSpan: any; exported?: { traceId: string; spanId: string } }>(),\n rootEnded: false,\n treeEmitted: false,\n createdAt: Date.now(),\n cleanupTimer: undefined,\n maxLifetimeTimer: undefined,\n };\n\n // Schedule fallback cleanup after max lifetime to prevent memory leaks\n // when traces never receive a root span or all spans are non-root\n const maxLifetimeTimer = setTimeout(() => {\n const state = this.traceState.get(traceId);\n if (state) {\n if (state.buffer.size > 0 || state.contexts.size > 0) {\n this.logger.warn('Discarding trace due to max lifetime exceeded', {\n traceId,\n bufferedSpans: state.buffer.size,\n emittedSpans: state.contexts.size,\n lifetimeMs: Date.now() - state.createdAt,\n });\n }\n if (state.cleanupTimer) {\n clearTimeout(state.cleanupTimer);\n }\n this.traceState.delete(traceId);\n this.traceContext.delete(traceId);\n }\n }, MAX_TRACE_LIFETIME_MS);\n // Prevent the timer from keeping the process alive\n (maxLifetimeTimer as any).unref?.();\n created.maxLifetimeTimer = maxLifetimeTimer;\n\n this.traceState.set(traceId, created);\n return created;\n }\n\n /**\n * Attempt to emit spans from the buffer.\n *\n * Two modes of operation:\n * 1. Initial tree emission: When root span ends and tree hasn't been emitted yet,\n * build a tree from all buffered spans and emit recursively using nested\n * llmobs.trace() calls. This ensures proper parent-child relationships in Datadog.\n * 2. Late-arriving spans: After the tree has been emitted, emit individual spans\n * with their parent context for proper linking.\n */\n private tryEmitReadySpans(traceId: string): void {\n const state = this.traceState.get(traceId);\n if (!state) return;\n\n // If tree hasn't been emitted yet, wait for root and emit as tree\n if (!state.treeEmitted) {\n // Wait until the root span has ended before emitting any spans\n if (!state.rootEnded) return;\n\n // Build tree and emit recursively\n const tree = this.buildSpanTree(state.buffer);\n if (tree) {\n this.emitSpanTree(tree, state);\n }\n\n // Clear the buffer and mark tree as emitted\n state.buffer.clear();\n state.treeEmitted = true;\n } else {\n // Tree already emitted - handle late-arriving spans individually\n // Use the old parent-first emission pattern for these\n let emitted = false;\n do {\n emitted = false;\n for (const [spanId, span] of state.buffer) {\n const parentCtx = span.parentSpanId ? state.contexts.get(span.parentSpanId) : undefined;\n if (span.parentSpanId && !parentCtx) {\n continue;\n }\n\n this.emitSingleSpan(span, state, parentCtx?.ddSpan);\n state.buffer.delete(spanId);\n emitted = true;\n }\n } while (emitted);\n }\n\n // Schedule cleanup if root has ended and buffer is empty\n if (state.rootEnded && state.buffer.size === 0 && !state.cleanupTimer) {\n const timer = setTimeout(() => {\n const currentState = this.traceState.get(traceId);\n if (currentState) {\n if (currentState.buffer.size > 0) {\n this.logger.warn('Discarding orphaned spans during cleanup', {\n traceId,\n orphanedCount: currentState.buffer.size,\n spanIds: Array.from(currentState.buffer.keys()),\n });\n }\n // Clear the max lifetime timer since normal cleanup is handling this\n if (currentState.maxLifetimeTimer) {\n clearTimeout(currentState.maxLifetimeTimer);\n }\n }\n this.traceState.delete(traceId);\n this.traceContext.delete(traceId);\n }, REGULAR_CLEANUP_INTERVAL_MS);\n // Prevent the timer from keeping the process alive\n (timer as any).unref?.();\n state.cleanupTimer = timer;\n }\n }\n\n /**\n * Builds a tree structure from buffered spans based on parentSpanId relationships.\n * Returns the root node of the tree, or undefined if no root span is found.\n */\n private buildSpanTree(buffer: Map<string, AnyExportedSpan>): SpanNode | undefined {\n // Create nodes for all spans\n const nodes = new Map<string, SpanNode>();\n let rootNode: SpanNode | undefined;\n\n for (const span of buffer.values()) {\n nodes.set(span.id, { span, children: [] });\n }\n\n // Build parent-child relationships\n for (const node of nodes.values()) {\n if (node.span.isRootSpan) {\n rootNode = node;\n } else if (node.span.parentSpanId) {\n const parentNode = nodes.get(node.span.parentSpanId);\n if (parentNode) {\n parentNode.children.push(node);\n } else {\n // Orphaned span - parent not in buffer, treat as root-level\n // This shouldn't happen normally but handles edge cases\n this.logger.warn('Orphaned span detected during tree build', {\n spanId: node.span.id,\n parentSpanId: node.span.parentSpanId,\n traceId: node.span.traceId,\n });\n }\n }\n }\n\n // Sort children by start time for consistent ordering\n for (const node of nodes.values()) {\n node.children.sort((a, b) => {\n const aTime =\n a.span.startTime instanceof Date ? a.span.startTime.getTime() : new Date(a.span.startTime).getTime();\n const bTime =\n b.span.startTime instanceof Date ? b.span.startTime.getTime() : new Date(b.span.startTime).getTime();\n return aTime - bTime;\n });\n }\n\n return rootNode;\n }\n\n /**\n * Builds LLMObs span options from a Mastra span.\n * Handles trace context, timestamps, and conditional model information for LLM spans.\n */\n private buildSpanOptions(\n span: AnyExportedSpan,\n inheritedModelAttrs?: { model?: string; provider?: string },\n ): { traceOptions: LLMObsSpanOptions; endTimeMs: number } {\n const traceCtx = this.traceContext.get(span.traceId) || {\n userId: span.metadata?.userId,\n sessionId: span.metadata?.sessionId,\n };\n\n const kind = kindFor(span.type);\n // MODEL_GENERATION carries model/provider; MODEL_STEP children inherit it from their parent.\n const ownAttrs = span.attributes as ModelGenerationAttributes | undefined;\n const attrs = {\n model: ownAttrs?.model ?? inheritedModelAttrs?.model,\n provider: ownAttrs?.provider ?? inheritedModelAttrs?.provider,\n };\n\n const startTime = toDate(span.startTime);\n // Event spans are point-in-time markers; use startTime for endTime if not set (zero duration)\n // Regular spans fall back to current time if endTime is not set\n const endTime = span.endTime ? toDate(span.endTime) : span.isEvent ? startTime : new Date();\n\n return {\n traceOptions: {\n kind,\n name: span.name,\n sessionId: traceCtx.sessionId,\n userId: traceCtx.userId,\n startTime,\n ...(kind === 'llm' && attrs?.model ? { modelName: attrs.model } : {}),\n ...(kind === 'llm' && attrs?.provider ? { modelProvider: attrs.provider } : {}),\n },\n // endTime as milliseconds for ddSpan.finish() — dd-trace's llmobs.trace() does not\n // honor endTime in options, so we must call finish(ms) explicitly on the span.\n endTimeMs: endTime.getTime(),\n };\n }\n\n /**\n * Recursively emits a span tree using nested llmobs.trace() calls.\n * This ensures parent-child relationships are properly established in Datadog\n * because child spans are created while their parent span is active in scope.\n */\n private emitSpanTree(\n node: SpanNode,\n state: TraceState,\n inheritedModelAttrs?: { model?: string; provider?: string },\n ): void {\n const span = node.span;\n const { traceOptions, endTimeMs } = this.buildSpanOptions(span, inheritedModelAttrs);\n\n // If this is a MODEL_GENERATION, propagate its model/provider to MODEL_STEP descendants\n // so the LLM-kind step spans in Datadog have a model name attached.\n const childInheritedModelAttrs =\n span.type === SpanType.MODEL_GENERATION\n ? {\n model: (span.attributes as ModelGenerationAttributes | undefined)?.model,\n provider: (span.attributes as ModelGenerationAttributes | undefined)?.provider,\n }\n : inheritedModelAttrs;\n\n // Use nested llmobs.trace() calls - children are emitted INSIDE the parent's callback\n // This ensures the Datadog SDK automatically establishes parent-child relationships\n tracer.llmobs.trace(traceOptions as any, (ddSpan: any) => {\n // Annotate this span (must happen before finish — annotate throws on finished spans)\n const annotations = this.buildAnnotations(span);\n if (Object.keys(annotations).length > 0) {\n tracer.llmobs.annotate(ddSpan, annotations);\n }\n\n // Set native Datadog error tags for proper Error Tracking UI\n if (span.errorInfo) {\n this.setErrorTags(ddSpan, span.errorInfo);\n }\n\n // Store context for potential evaluation submissions\n const exported = tracer.llmobs.exportSpan ? tracer.llmobs.exportSpan(ddSpan) : undefined;\n state.contexts.set(span.id, { ddSpan, exported });\n\n // Recursively emit children INSIDE this span's callback\n // This is the key to establishing proper parent-child relationships\n for (const child of node.children) {\n this.emitSpanTree(child, state, childInheritedModelAttrs);\n }\n\n // Explicitly finish with the correct end time. dd-trace's llmobs.trace() does not\n // honor endTime in span options — it auto-finishes with Date.now() when the callback\n // returns. By calling finish() here first, the auto-finish becomes a no-op (dd-trace\n // skips finish if _duration is already set).\n if (typeof ddSpan.finish === 'function') {\n ddSpan.finish(endTimeMs);\n }\n });\n }\n\n /**\n * Emit a single span with the proper Datadog parent context.\n * Used for late-arriving spans after the main tree has been emitted.\n */\n private emitSingleSpan(span: AnyExportedSpan, state: TraceState, parent?: any) {\n const { traceOptions, endTimeMs } = this.buildSpanOptions(span);\n\n const runTrace = () =>\n tracer.llmobs.trace(traceOptions as any, (ddSpan: any) => {\n const annotations = this.buildAnnotations(span);\n if (Object.keys(annotations).length > 0) {\n tracer.llmobs.annotate(ddSpan, annotations);\n }\n\n // Set native Datadog error tags for proper Error Tracking UI\n if (span.errorInfo) {\n this.setErrorTags(ddSpan, span.errorInfo);\n }\n\n const exported = tracer.llmobs.exportSpan ? tracer.llmobs.exportSpan(ddSpan) : undefined;\n state.contexts.set(span.id, { ddSpan, exported });\n\n // Explicitly finish with the correct end time (see emitSpanTree for details)\n if (typeof ddSpan.finish === 'function') {\n ddSpan.finish(endTimeMs);\n }\n });\n\n if (parent) {\n tracer.scope().activate(parent, runTrace);\n } else {\n runTrace();\n }\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Datadog
|
|
2
|
+
* Datadog integration for Mastra Observability
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Provides two integration modes:
|
|
5
|
+
*
|
|
6
|
+
* - DatadogBridge: Recommended for most users. Creates native dd-trace spans
|
|
7
|
+
* in real-time for proper APM context propagation, and emits LLMObs data
|
|
8
|
+
* through dd-trace's own pipeline. Use as an observability bridge.
|
|
9
|
+
*
|
|
10
|
+
* - DatadogExporter: Legacy exporter-only mode. Emits LLMObs spans
|
|
11
|
+
* retroactively after execution completes. Does not participate in
|
|
12
|
+
* dd-trace's live scope, so auto-instrumented APM spans (HTTP, DB)
|
|
13
|
+
* will not be parented under Mastra spans.
|
|
6
14
|
*/
|
|
15
|
+
export { DatadogBridge } from './bridge.js';
|
|
16
|
+
export type { DatadogBridgeConfig } from './bridge.js';
|
|
7
17
|
export { DatadogExporter } from './tracing.js';
|
|
8
18
|
export type { DatadogExporterConfig } from './tracing.js';
|
|
9
19
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC"}
|