@mastra/observability 1.13.0-alpha.0 → 1.13.0

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/dist/index.js CHANGED
@@ -16012,7 +16012,10 @@ var DefaultExporter = class extends BaseExporter {
16012
16012
  deferredUpdates.length = 0;
16013
16013
  this.emitDrop("tracing", "unsupported-storage", events.length + deferredCountAtEntry, error48);
16014
16014
  } else {
16015
- deferredUpdates.length = 0;
16015
+ const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;
16016
+ if (newlyDeferred > 0) {
16017
+ deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);
16018
+ }
16016
16019
  const dropped = this.#eventBuffer.reAddUpdates(events);
16017
16020
  this.emitDrop("tracing", "retry-exhausted", dropped.length, error48);
16018
16021
  }
@@ -16711,6 +16714,7 @@ var MastraStorageExporter = class extends BaseExporter {
16711
16714
  #observabilityStorage;
16712
16715
  #resolvedStrategy;
16713
16716
  #flushTimer;
16717
+ #emitDropEvent;
16714
16718
  // Signals whose storage methods threw "not implemented" — skip on future flushes
16715
16719
  #unsupportedSignals = /* @__PURE__ */ new Set();
16716
16720
  constructor(config2 = {}) {
@@ -16732,6 +16736,7 @@ var MastraStorageExporter = class extends BaseExporter {
16732
16736
  async init(options) {
16733
16737
  try {
16734
16738
  this.#isInitializing = true;
16739
+ this.#emitDropEvent = options.emitDropEvent;
16735
16740
  this.#storage = options.mastra?.getStorage();
16736
16741
  if (!this.#storage) {
16737
16742
  this.logger.warn("MastraStorageExporter disabled: Storage not available. Traces will not be persisted.");
@@ -16817,21 +16822,54 @@ var MastraStorageExporter = class extends BaseExporter {
16817
16822
  this.scheduleFlush();
16818
16823
  }
16819
16824
  }
16825
+ sanitizeDropError(error48) {
16826
+ if (error48 instanceof MastraError) {
16827
+ return {
16828
+ id: error48.id,
16829
+ domain: String(error48.domain),
16830
+ message: error48.message
16831
+ };
16832
+ }
16833
+ if (error48 instanceof Error) {
16834
+ return { message: error48.message };
16835
+ }
16836
+ return { message: String(error48) };
16837
+ }
16838
+ emitDrop(signal, reason, count, error48) {
16839
+ if (count === 0) return;
16840
+ const dropEvent = {
16841
+ type: "drop",
16842
+ signal,
16843
+ reason,
16844
+ count,
16845
+ timestamp: /* @__PURE__ */ new Date(),
16846
+ exporterName: this.name,
16847
+ ...this.#observabilityStorage ? { storageName: this.#observabilityStorage.constructor.name } : {},
16848
+ ...error48 === void 0 ? {} : { error: this.sanitizeDropError(error48) }
16849
+ };
16850
+ this.#emitDropEvent?.(dropEvent);
16851
+ }
16820
16852
  /**
16821
16853
  * Flush a batch of create events for a single signal type.
16822
16854
  * On "not implemented" errors, disables the signal for future flushes.
16823
16855
  * On other errors, re-adds events to the buffer for retry.
16824
16856
  */
16825
16857
  async flushCreates(signal, events, storageCall) {
16826
- if (this.#unsupportedSignals.has(signal) || events.length === 0) return;
16858
+ if (events.length === 0) return;
16859
+ if (this.#unsupportedSignals.has(signal)) {
16860
+ this.emitDrop(signal, "unsupported-storage", events.length);
16861
+ return;
16862
+ }
16827
16863
  try {
16828
16864
  await storageCall(events);
16829
16865
  } catch (error48) {
16830
16866
  if (error48 instanceof MastraError && error48.domain === ErrorDomain.MASTRA_OBSERVABILITY && error48.id.endsWith("_NOT_IMPLEMENTED")) {
16831
16867
  this.logger.warn(error48.message);
16832
16868
  this.#unsupportedSignals.add(signal);
16869
+ this.emitDrop(signal, "unsupported-storage", events.length, error48);
16833
16870
  } else {
16834
- this.#eventBuffer.reAddCreates(events);
16871
+ const dropped = this.#eventBuffer.reAddCreates(events);
16872
+ this.emitDrop(signal, "retry-exhausted", dropped.length, error48);
16835
16873
  }
16836
16874
  }
16837
16875
  }
@@ -16840,7 +16878,12 @@ var MastraStorageExporter = class extends BaseExporter {
16840
16878
  * When `isEnd` is true, successfully flushed spans are removed from tracking.
16841
16879
  */
16842
16880
  async flushSpanUpdates(events, deferredUpdates, isEnd) {
16843
- if (this.#unsupportedSignals.has("tracing") || events.length === 0) return;
16881
+ const deferredCountAtEntry = deferredUpdates.length;
16882
+ if (events.length === 0) return;
16883
+ if (this.#unsupportedSignals.has("tracing")) {
16884
+ this.emitDrop("tracing", "unsupported-storage", events.length);
16885
+ return;
16886
+ }
16844
16887
  const partials = [];
16845
16888
  for (const event of events) {
16846
16889
  const span = event.exportedSpan;
@@ -16864,9 +16907,15 @@ var MastraStorageExporter = class extends BaseExporter {
16864
16907
  if (error48 instanceof MastraError && error48.domain === ErrorDomain.MASTRA_OBSERVABILITY && error48.id.endsWith("_NOT_IMPLEMENTED")) {
16865
16908
  this.logger.warn(error48.message);
16866
16909
  this.#unsupportedSignals.add("tracing");
16867
- } else {
16868
16910
  deferredUpdates.length = 0;
16869
- this.#eventBuffer.reAddUpdates(events);
16911
+ this.emitDrop("tracing", "unsupported-storage", events.length + deferredCountAtEntry, error48);
16912
+ } else {
16913
+ const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;
16914
+ if (newlyDeferred > 0) {
16915
+ deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);
16916
+ }
16917
+ const dropped = this.#eventBuffer.reAddUpdates(events);
16918
+ this.emitDrop("tracing", "retry-exhausted", dropped.length, error48);
16870
16919
  }
16871
16920
  }
16872
16921
  }
@@ -16942,17 +16991,17 @@ var MastraStorageExporter = class extends BaseExporter {
16942
16991
  (events) => this.#observabilityStorage.batchCreateFeedback({ feedbacks: events.map((f) => buildFeedbackRecord(f)) })
16943
16992
  ),
16944
16993
  this.flushCreates(
16945
- "logs",
16994
+ "log",
16946
16995
  createLogEvents,
16947
16996
  (events) => this.#observabilityStorage.batchCreateLogs({ logs: events.map((l) => buildLogRecord(l)) })
16948
16997
  ),
16949
16998
  this.flushCreates(
16950
- "metrics",
16999
+ "metric",
16951
17000
  createMetricEvents,
16952
17001
  (events) => this.#observabilityStorage.batchCreateMetrics({ metrics: events.map((m) => buildMetricRecord(m)) })
16953
17002
  ),
16954
17003
  this.flushCreates(
16955
- "scores",
17004
+ "score",
16956
17005
  createScoreEvents,
16957
17006
  (events) => this.#observabilityStorage.batchCreateScores({ scores: events.map((s) => buildScoreRecord(s)) })
16958
17007
  ),
@@ -16966,7 +17015,13 @@ var MastraStorageExporter = class extends BaseExporter {
16966
17015
  await this.flushSpanUpdates(updateSpanEvents, deferredUpdates, false);
16967
17016
  await this.flushSpanUpdates(endSpanEvents, deferredUpdates, true);
16968
17017
  if (deferredUpdates.length > 0) {
16969
- this.#eventBuffer.reAddUpdates(deferredUpdates);
17018
+ if (this.#unsupportedSignals.has("tracing")) {
17019
+ this.emitDrop("tracing", "unsupported-storage", deferredUpdates.length);
17020
+ deferredUpdates.length = 0;
17021
+ } else {
17022
+ const dropped = this.#eventBuffer.reAddUpdates(deferredUpdates);
17023
+ this.emitDrop("tracing", "retry-exhausted", dropped.length);
17024
+ }
16970
17025
  }
16971
17026
  const elapsed = Date.now() - startTime;
16972
17027
  this.logger.debug("Batch flushed", {