@mastra/observability 1.17.1 → 1.17.2-alpha.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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @mastra/observability
2
2
 
3
+ ## 1.17.2-alpha.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Fixed `MastraStorageExporter` staying disabled when a configured observability store is temporarily unavailable during startup. The exporter now recovers on a later event, so traces resume without restarting the process. (#21943) ([#21957](https://github.com/mastra-ai/mastra/pull/21957))
8
+
9
+ - Updated dependencies [[`f95f468`](https://github.com/mastra-ai/mastra/commit/f95f468cf1e7c2b924a13826494f98b8f2ccd581)]:
10
+ - @mastra/core@1.61.1-alpha.1
11
+
3
12
  ## 1.17.1
4
13
 
5
14
  ### Patch Changes
@@ -23,6 +23,9 @@ export declare class MastraStorageExporter extends BaseExporter {
23
23
  * Initialize the exporter (called after all dependencies are ready)
24
24
  */
25
25
  init(options: InitExporterOptions): Promise<void>;
26
+ private warnUnavailable;
27
+ private initializeStorage;
28
+ private ensureInitialized;
26
29
  /**
27
30
  * Checks if buffer should be flushed based on size or time triggers
28
31
  */
@@ -63,12 +66,6 @@ export declare class MastraStorageExporter extends BaseExporter {
63
66
  */
64
67
  private flushBuffer;
65
68
  _exportTracingEvent(event: TracingEvent): Promise<void>;
66
- /**
67
- * Resolves when an ongoing init call is finished
68
- * Doesn't wait for the caller to call init
69
- * @returns
70
- */
71
- private waitForInit;
72
69
  /**
73
70
  * Handle metric events — buffer for batch flush.
74
71
  */
@@ -1 +1 @@
1
- {"version":3,"file":"mastra-storage.d.ts","sourceRoot":"","sources":["../../src/exporters/mastra-storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACR,UAAU,EACV,aAAa,EAId,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAwB,sBAAsB,EAAwB,MAAM,sBAAsB,CAAC;AAS/G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,4FAA4F;AAC5F,MAAM,WAAW,2BAA4B,SAAQ,kBAAkB;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,QAAQ,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC;CAC5C;AAoCD;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;;IACrD,IAAI,SAA6B;gBAgBrB,MAAM,GAAE,2BAAgC;IAiBpD;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDvD;;OAEG;IACH,OAAO,CAAC,WAAW;IAyBnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,iBAAiB;IAiBzB;;;;OAIG;YACW,kBAAkB;IAQhC,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,QAAQ;IAsBhB;;;;OAIG;YACW,YAAY;IAkC1B;;;OAGG;YACW,gBAAgB;IA+D9B;;;;;;;OAOG;YACW,WAAW;IA+HnB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7D;;;;OAIG;YACW,WAAW;IAOzB;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhD;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpD;;OAEG;IACG,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1D;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBhC"}
1
+ {"version":3,"file":"mastra-storage.d.ts","sourceRoot":"","sources":["../../src/exporters/mastra-storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACR,UAAU,EACV,aAAa,EAId,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAwB,sBAAsB,EAAwB,MAAM,sBAAsB,CAAC;AAS/G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,4FAA4F;AAC5F,MAAM,WAAW,2BAA4B,SAAQ,kBAAkB;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,QAAQ,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC;CAC5C;AAkCD;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;;IACrD,IAAI,SAA6B;gBAgBrB,MAAM,GAAE,2BAAgC;IAiBpD;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvD,OAAO,CAAC,eAAe;YAUT,iBAAiB;YA6CjB,iBAAiB;IAS/B;;OAEG;IACH,OAAO,CAAC,WAAW;IAyBnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,iBAAiB;IAiBzB;;;;OAIG;YACW,kBAAkB;IAQhC,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,QAAQ;IAsBhB;;;;OAIG;YACW,YAAY;IAkC1B;;;OAGG;YACW,gBAAgB;IA+D9B;;;;;;;OAOG;YACW,WAAW;IA+HnB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7D;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhD;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpD;;OAEG;IACG,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1D;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBhC"}
package/dist/index.cjs CHANGED
@@ -7123,8 +7123,8 @@ const FLUSH_SUCCEEDED = { failed: false };
7123
7123
  var MastraStorageExporter = class extends BaseExporter {
7124
7124
  name = "mastra-storage-exporter";
7125
7125
  #config;
7126
- #isInitializing = false;
7127
- #initPromises = /* @__PURE__ */ new Set();
7126
+ #initializationPromise;
7127
+ #wasUnavailable = false;
7128
7128
  #eventBuffer;
7129
7129
  #storage;
7130
7130
  #observabilityStorage;
@@ -7149,41 +7149,56 @@ var MastraStorageExporter = class extends BaseExporter {
7149
7149
  * Initialize the exporter (called after all dependencies are ready)
7150
7150
  */
7151
7151
  async init(options) {
7152
+ this.#emitDropEvent = options.emitDropEvent;
7153
+ this.#storage = options.mastra?.getStorage();
7154
+ if (!this.#storage) {
7155
+ this.logger.warn("MastraStorageExporter disabled: Storage not available. Traces will not be persisted.");
7156
+ return;
7157
+ }
7158
+ await this.ensureInitialized();
7159
+ }
7160
+ warnUnavailable(message, error) {
7161
+ if (this.#wasUnavailable) return;
7162
+ this.#wasUnavailable = true;
7163
+ if (error === void 0) {
7164
+ this.logger.warn(message);
7165
+ return;
7166
+ }
7167
+ this.logger.warn(message, { error: error instanceof Error ? error.message : String(error) });
7168
+ }
7169
+ async initializeStorage() {
7170
+ const storage = this.#storage;
7171
+ if (!storage) return;
7152
7172
  try {
7153
- this.#isInitializing = true;
7154
- this.#emitDropEvent = options.emitDropEvent;
7155
- this.#storage = options.mastra?.getStorage();
7156
- if (!this.#storage) {
7157
- this.logger.warn("MastraStorageExporter disabled: Storage not available. Traces will not be persisted.");
7158
- return;
7159
- }
7160
- this.#observabilityStorage = await this.#storage.getStore("observability");
7161
- if (!this.#observabilityStorage) {
7162
- this.logger.warn("MastraStorageExporter disabled: Observability storage not available. Traces will not be persisted.");
7163
- return;
7164
- }
7165
- if (!this.#resolvedStrategy) {
7166
- this.#resolvedStrategy = resolveTracingStorageStrategy(this.#config, this.#observabilityStorage, this.#storage.constructor.name, this.logger);
7167
- this.logger.debug("tracing storage exporter initialized", {
7168
- strategy: this.#resolvedStrategy,
7169
- source: this.#config.strategy !== "auto" ? "user" : "auto",
7170
- storageAdapter: this.#storage.constructor.name,
7171
- maxBatchSize: this.#config.maxBatchSize,
7172
- maxBatchWaitMs: this.#config.maxBatchWaitMs
7173
- });
7174
- }
7175
- if (this.#resolvedStrategy) this.#eventBuffer.init({ strategy: this.#resolvedStrategy });
7176
- } finally {
7177
- this.#isInitializing = false;
7178
- /**
7179
- * Assumes caller waits until export of a parent span is completed before calling
7180
- * export for child spans , order is not relevant for resolve
7181
- */
7182
- this.#initPromises.forEach((resolve) => {
7183
- resolve();
7184
- });
7185
- this.#initPromises.clear();
7173
+ this.#observabilityStorage = await storage.getStore("observability");
7174
+ } catch (error) {
7175
+ this.warnUnavailable("MastraStorageExporter unavailable: Failed to initialize observability storage. Traces will not be persisted until storage becomes available.", error);
7176
+ return;
7186
7177
  }
7178
+ if (!this.#observabilityStorage) {
7179
+ this.warnUnavailable("MastraStorageExporter unavailable: Observability storage not available. Traces will not be persisted until storage becomes available.");
7180
+ return;
7181
+ }
7182
+ this.#resolvedStrategy = resolveTracingStorageStrategy(this.#config, this.#observabilityStorage, storage.constructor.name, this.logger);
7183
+ this.#eventBuffer.init({ strategy: this.#resolvedStrategy });
7184
+ this.logger.debug("tracing storage exporter initialized", {
7185
+ strategy: this.#resolvedStrategy,
7186
+ source: this.#config.strategy !== "auto" ? "user" : "auto",
7187
+ storageAdapter: storage.constructor.name,
7188
+ maxBatchSize: this.#config.maxBatchSize,
7189
+ maxBatchWaitMs: this.#config.maxBatchWaitMs
7190
+ });
7191
+ if (this.#wasUnavailable) {
7192
+ this.#wasUnavailable = false;
7193
+ this.logger.info("MastraStorageExporter recovered: Observability storage is available. Traces will be persisted.");
7194
+ }
7195
+ }
7196
+ async ensureInitialized() {
7197
+ if (this.#observabilityStorage || !this.#storage) return;
7198
+ this.#initializationPromise ??= this.initializeStorage().finally(() => {
7199
+ this.#initializationPromise = void 0;
7200
+ });
7201
+ await this.#initializationPromise;
7187
7202
  }
7188
7203
  /**
7189
7204
  * Checks if buffer should be flushed based on size or time triggers
@@ -7435,7 +7450,7 @@ var MastraStorageExporter = class extends BaseExporter {
7435
7450
  }
7436
7451
  }
7437
7452
  async _exportTracingEvent(event) {
7438
- await this.waitForInit();
7453
+ await this.ensureInitialized();
7439
7454
  if (!this.#observabilityStorage) {
7440
7455
  this.logger.debug("Cannot store traces. Observability storage is not initialized");
7441
7456
  return;
@@ -7444,21 +7459,10 @@ var MastraStorageExporter = class extends BaseExporter {
7444
7459
  await this.handleBatchedFlush();
7445
7460
  }
7446
7461
  /**
7447
- * Resolves when an ongoing init call is finished
7448
- * Doesn't wait for the caller to call init
7449
- * @returns
7450
- */
7451
- async waitForInit() {
7452
- if (!this.#isInitializing) return;
7453
- return new Promise((resolve) => {
7454
- this.#initPromises.add(resolve);
7455
- });
7456
- }
7457
- /**
7458
7462
  * Handle metric events — buffer for batch flush.
7459
7463
  */
7460
7464
  async onMetricEvent(event) {
7461
- await this.waitForInit();
7465
+ await this.ensureInitialized();
7462
7466
  if (!this.#observabilityStorage) return;
7463
7467
  this.#eventBuffer.addEvent(event);
7464
7468
  await this.handleBatchedFlush();
@@ -7467,7 +7471,7 @@ var MastraStorageExporter = class extends BaseExporter {
7467
7471
  * Handle log events — buffer for batch flush.
7468
7472
  */
7469
7473
  async onLogEvent(event) {
7470
- await this.waitForInit();
7474
+ await this.ensureInitialized();
7471
7475
  if (!this.#observabilityStorage) return;
7472
7476
  this.#eventBuffer.addEvent(event);
7473
7477
  await this.handleBatchedFlush();
@@ -7476,7 +7480,7 @@ var MastraStorageExporter = class extends BaseExporter {
7476
7480
  * Handle score events — buffer for batch flush.
7477
7481
  */
7478
7482
  async onScoreEvent(event) {
7479
- await this.waitForInit();
7483
+ await this.ensureInitialized();
7480
7484
  if (!this.#observabilityStorage) return;
7481
7485
  this.#eventBuffer.addEvent(event);
7482
7486
  await this.handleBatchedFlush();
@@ -7485,7 +7489,7 @@ var MastraStorageExporter = class extends BaseExporter {
7485
7489
  * Handle feedback events — buffer for batch flush.
7486
7490
  */
7487
7491
  async onFeedbackEvent(event) {
7488
- await this.waitForInit();
7492
+ await this.ensureInitialized();
7489
7493
  if (!this.#observabilityStorage) return;
7490
7494
  this.#eventBuffer.addEvent(event);
7491
7495
  await this.handleBatchedFlush();