@mastra/observability 1.16.0 → 1.16.1-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/dist/index.js CHANGED
@@ -998,6 +998,7 @@ var PricingModel = class {
998
998
 
999
999
  // src/metrics/pricing-registry.ts
1000
1000
  var DATA_FILE_NAME = "pricing-data.jsonl";
1001
+ var BEDROCK_GEOGRAPHY_PREFIXES = /* @__PURE__ */ new Set(["global", "us", "eu", "apac", "jp", "au"]);
1001
1002
  var MINIFIED_METER_TO_CANONICAL = {
1002
1003
  it: "input_tokens",
1003
1004
  ot: "output_tokens",
@@ -1032,7 +1033,7 @@ var PricingRegistry = class _PricingRegistry {
1032
1033
  return _PricingRegistry.globalRegistry;
1033
1034
  }
1034
1035
  get(args) {
1035
- const variants = getModelVariants(args.model);
1036
+ const variants = getModelVariants(args.model, normalizeProvider(args.provider));
1036
1037
  for (const variant of variants) {
1037
1038
  const key = makePricingKey({ provider: args.provider, model: variant });
1038
1039
  const match = this.pricingModels.get(key);
@@ -1126,7 +1127,7 @@ function normalizeProvider(provider) {
1126
1127
  const dotIndex = normalized.indexOf(".");
1127
1128
  return dotIndex !== -1 ? normalized.substring(0, dotIndex) : normalized;
1128
1129
  }
1129
- function getModelVariants(model) {
1130
+ function getModelVariants(model, provider) {
1130
1131
  const variants = /* @__PURE__ */ new Set();
1131
1132
  const add = (v) => {
1132
1133
  variants.add(v);
@@ -1141,6 +1142,22 @@ function getModelVariants(model) {
1141
1142
  add(withoutVendor);
1142
1143
  add(withoutVendor.replace(/\./g, "-"));
1143
1144
  }
1145
+ if (provider === "amazon-bedrock") {
1146
+ const addBedrockVariant = (v) => {
1147
+ add(v);
1148
+ add(v.replace(/-(?:v)?\d+(?::\d+)?$/, ""));
1149
+ };
1150
+ const segments = model.split(".");
1151
+ const withoutGeography = BEDROCK_GEOGRAPHY_PREFIXES.has(segments[0] ?? "") ? segments.slice(1).join(".") : model;
1152
+ addBedrockVariant(withoutGeography);
1153
+ addBedrockVariant(withoutGeography.replace(/\./g, "-"));
1154
+ const vendorSeparator = withoutGeography.indexOf(".");
1155
+ if (vendorSeparator !== -1) {
1156
+ const withoutVendor = withoutGeography.substring(vendorSeparator + 1);
1157
+ addBedrockVariant(withoutVendor);
1158
+ addBedrockVariant(withoutVendor.replace(/\./g, "-"));
1159
+ }
1160
+ }
1144
1161
  return [...variants];
1145
1162
  }
1146
1163
  function stripDateSuffix(model) {
@@ -1505,6 +1522,7 @@ function getDurationMetricName(span) {
1505
1522
  return "mastra_agent_duration_ms";
1506
1523
  case SpanType.TOOL_CALL:
1507
1524
  case SpanType.MCP_TOOL_CALL:
1525
+ case SpanType.PROVIDER_TOOL_CALL:
1508
1526
  return "mastra_tool_duration_ms";
1509
1527
  case SpanType.CLIENT_TOOL_CALL:
1510
1528
  return null;
@@ -2464,6 +2482,7 @@ function isSpanInternal(spanType, flags) {
2464
2482
  // Tool-related spans
2465
2483
  case SpanType.TOOL_CALL:
2466
2484
  case SpanType.MCP_TOOL_CALL:
2485
+ case SpanType.PROVIDER_TOOL_CALL:
2467
2486
  return (flags & InternalSpans.TOOL) !== 0;
2468
2487
  // Model-related spans
2469
2488
  case SpanType.MODEL_GENERATION:
@@ -5946,6 +5965,7 @@ function resolveTracingStorageStrategy(config, observabilityStorage, storageName
5946
5965
  }
5947
5966
  return observabilityStrategy.preferred;
5948
5967
  }
5968
+ var FLUSH_SUCCEEDED = { failed: false };
5949
5969
  var DefaultExporter = class extends BaseExporter {
5950
5970
  name = "mastra-default-observability-exporter";
5951
5971
  #config;
@@ -6040,17 +6060,37 @@ var DefaultExporter = class extends BaseExporter {
6040
6060
  /**
6041
6061
  * Schedules a flush using setTimeout
6042
6062
  */
6043
- scheduleFlush() {
6063
+ scheduleFlush(delayMs = this.#config.maxBatchWaitMs) {
6044
6064
  if (this.#flushTimer) {
6045
6065
  clearTimeout(this.#flushTimer);
6046
6066
  }
6047
6067
  this.#flushTimer = setTimeout(() => {
6068
+ this.#flushTimer = void 0;
6048
6069
  this.flushBuffer().catch((error) => {
6049
6070
  this.logger.error("Scheduled flush failed", {
6050
6071
  error: error instanceof Error ? error.message : String(error)
6051
6072
  });
6052
6073
  });
6053
- }, this.#config.maxBatchWaitMs);
6074
+ }, delayMs);
6075
+ }
6076
+ retryDelay(retryAttempt) {
6077
+ return this.#config.retryDelayMs * 2 ** (retryAttempt - 1);
6078
+ }
6079
+ retryAttempt(events) {
6080
+ return events.reduce((earliestAttempt, event) => {
6081
+ if (event.retryCount > this.#config.maxRetries) return earliestAttempt;
6082
+ return earliestAttempt === void 0 ? event.retryCount : Math.min(earliestAttempt, event.retryCount);
6083
+ }, void 0);
6084
+ }
6085
+ logStorageFailure(signal, events, retryAttempt, error) {
6086
+ this.logger.warn("Failed to persist observability events", {
6087
+ signal,
6088
+ eventCount: events.length,
6089
+ retryAttempt: retryAttempt ?? events.reduce((latestAttempt, event) => Math.max(latestAttempt, event.retryCount), 0),
6090
+ maxRetries: this.#config.maxRetries,
6091
+ ...retryAttempt === void 0 ? {} : { nextRetryDelayMs: this.retryDelay(retryAttempt) },
6092
+ error: error instanceof Error ? error.message : String(error)
6093
+ });
6054
6094
  }
6055
6095
  /**
6056
6096
  * Checks flush triggers and schedules/triggers flush as needed.
@@ -6097,22 +6137,26 @@ var DefaultExporter = class extends BaseExporter {
6097
6137
  * On other errors, re-adds events to the buffer for retry.
6098
6138
  */
6099
6139
  async flushCreates(signal, events, storageCall) {
6100
- if (events.length === 0) return;
6140
+ if (events.length === 0) return FLUSH_SUCCEEDED;
6101
6141
  if (this.#unsupportedSignals.has(signal)) {
6102
6142
  this.emitDrop(signal, "unsupported-storage", events.length);
6103
- return;
6143
+ return { failed: true };
6104
6144
  }
6105
6145
  try {
6106
6146
  await storageCall(events);
6147
+ return FLUSH_SUCCEEDED;
6107
6148
  } catch (error) {
6108
6149
  if (error instanceof MastraError && error.domain === ErrorDomain.MASTRA_OBSERVABILITY && error.id.endsWith("_NOT_IMPLEMENTED")) {
6109
6150
  this.logger.warn(error.message);
6110
6151
  this.#unsupportedSignals.add(signal);
6111
6152
  this.emitDrop(signal, "unsupported-storage", events.length, error);
6112
- } else {
6113
- const dropped = this.#eventBuffer.reAddCreates(events);
6114
- this.emitDrop(signal, "retry-exhausted", dropped.length, error);
6153
+ return { failed: true };
6115
6154
  }
6155
+ const dropped = this.#eventBuffer.reAddCreates(events);
6156
+ const retryAttempt = this.retryAttempt(events);
6157
+ this.logStorageFailure(signal, events, retryAttempt, error);
6158
+ this.emitDrop(signal, "retry-exhausted", dropped.length, error);
6159
+ return { failed: true, retryAttempt };
6116
6160
  }
6117
6161
  }
6118
6162
  /**
@@ -6121,10 +6165,10 @@ var DefaultExporter = class extends BaseExporter {
6121
6165
  */
6122
6166
  async flushSpanUpdates(events, deferredUpdates, isEnd) {
6123
6167
  const deferredCountAtEntry = deferredUpdates.length;
6124
- if (events.length === 0) return;
6168
+ if (events.length === 0) return FLUSH_SUCCEEDED;
6125
6169
  if (this.#unsupportedSignals.has("tracing")) {
6126
6170
  this.emitDrop("tracing", "unsupported-storage", events.length);
6127
- return;
6171
+ return { failed: true };
6128
6172
  }
6129
6173
  const partials = [];
6130
6174
  for (const event of events) {
@@ -6139,26 +6183,30 @@ var DefaultExporter = class extends BaseExporter {
6139
6183
  deferredUpdates.push(event);
6140
6184
  }
6141
6185
  }
6142
- if (partials.length === 0) return;
6186
+ if (partials.length === 0) return FLUSH_SUCCEEDED;
6143
6187
  try {
6144
6188
  await this.#observabilityStorage.batchUpdateSpans({ records: partials });
6145
6189
  if (isEnd) {
6146
6190
  this.#eventBuffer.endFinishedSpans({ records: partials });
6147
6191
  }
6192
+ return FLUSH_SUCCEEDED;
6148
6193
  } catch (error) {
6149
6194
  if (error instanceof MastraError && error.domain === ErrorDomain.MASTRA_OBSERVABILITY && error.id.endsWith("_NOT_IMPLEMENTED")) {
6150
6195
  this.logger.warn(error.message);
6151
6196
  this.#unsupportedSignals.add("tracing");
6152
6197
  deferredUpdates.length = 0;
6153
6198
  this.emitDrop("tracing", "unsupported-storage", events.length + deferredCountAtEntry, error);
6154
- } else {
6155
- const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;
6156
- if (newlyDeferred > 0) {
6157
- deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);
6158
- }
6159
- const dropped = this.#eventBuffer.reAddUpdates(events);
6160
- this.emitDrop("tracing", "retry-exhausted", dropped.length, error);
6199
+ return { failed: true };
6200
+ }
6201
+ const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;
6202
+ if (newlyDeferred > 0) {
6203
+ deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);
6161
6204
  }
6205
+ const dropped = this.#eventBuffer.reAddUpdates(events);
6206
+ const retryAttempt = this.retryAttempt(events);
6207
+ this.logStorageFailure("tracing", events, retryAttempt, error);
6208
+ this.emitDrop("tracing", "retry-exhausted", dropped.length, error);
6209
+ return { failed: true, retryAttempt };
6162
6210
  }
6163
6211
  }
6164
6212
  /**
@@ -6226,7 +6274,7 @@ var DefaultExporter = class extends BaseExporter {
6226
6274
  break;
6227
6275
  }
6228
6276
  }
6229
- await Promise.all([
6277
+ const flushResults = await Promise.all([
6230
6278
  this.flushCreates(
6231
6279
  "feedback",
6232
6280
  createFeedbackEvents,
@@ -6254,25 +6302,36 @@ var DefaultExporter = class extends BaseExporter {
6254
6302
  })
6255
6303
  ]);
6256
6304
  const deferredUpdates = [];
6257
- await this.flushSpanUpdates(updateSpanEvents, deferredUpdates, false);
6258
- await this.flushSpanUpdates(endSpanEvents, deferredUpdates, true);
6305
+ flushResults.push(await this.flushSpanUpdates(updateSpanEvents, deferredUpdates, false));
6306
+ flushResults.push(await this.flushSpanUpdates(endSpanEvents, deferredUpdates, true));
6307
+ let deferredDropCount = 0;
6259
6308
  if (deferredUpdates.length > 0) {
6260
6309
  if (this.#unsupportedSignals.has("tracing")) {
6261
- this.emitDrop("tracing", "unsupported-storage", deferredUpdates.length);
6310
+ deferredDropCount = deferredUpdates.length;
6311
+ this.emitDrop("tracing", "unsupported-storage", deferredDropCount);
6262
6312
  deferredUpdates.length = 0;
6263
6313
  } else {
6264
6314
  const dropped = this.#eventBuffer.reAddUpdates(deferredUpdates);
6265
- this.emitDrop("tracing", "retry-exhausted", dropped.length);
6315
+ deferredDropCount = dropped.length;
6316
+ this.emitDrop("tracing", "retry-exhausted", deferredDropCount);
6266
6317
  }
6267
6318
  }
6268
- const elapsed = Date.now() - startTime;
6269
- this.logger.debug("Batch flushed", {
6270
- strategy: this.#resolvedStrategy,
6271
- batchSize,
6272
- durationMs: elapsed,
6273
- deferredUpdates: deferredUpdates.length > 0 ? deferredUpdates.length : void 0
6274
- });
6275
- return;
6319
+ const retryAttempt = flushResults.reduce((earliestAttempt, result) => {
6320
+ if (result.retryAttempt === void 0) return earliestAttempt;
6321
+ return earliestAttempt === void 0 ? result.retryAttempt : Math.min(earliestAttempt, result.retryAttempt);
6322
+ }, void 0);
6323
+ if (retryAttempt !== void 0) {
6324
+ this.scheduleFlush(this.retryDelay(retryAttempt));
6325
+ }
6326
+ if (!flushResults.some((result) => result.failed) && deferredDropCount === 0) {
6327
+ const elapsed = Date.now() - startTime;
6328
+ this.logger.debug("Batch flushed", {
6329
+ strategy: this.#resolvedStrategy,
6330
+ batchSize,
6331
+ durationMs: elapsed,
6332
+ deferredUpdates: deferredUpdates.length > 0 ? deferredUpdates.length : void 0
6333
+ });
6334
+ }
6276
6335
  }
6277
6336
  async _exportTracingEvent(event) {
6278
6337
  await this.waitForInit();
@@ -6349,6 +6408,10 @@ var DefaultExporter = class extends BaseExporter {
6349
6408
  this.#flushTimer = void 0;
6350
6409
  }
6351
6410
  await this.flush();
6411
+ if (this.#flushTimer) {
6412
+ clearTimeout(this.#flushTimer);
6413
+ this.#flushTimer = void 0;
6414
+ }
6352
6415
  this.logger.info("DefaultExporter shutdown complete");
6353
6416
  }
6354
6417
  };
@@ -6881,6 +6944,7 @@ function resolveTracingStorageStrategy2(config, observabilityStorage, storageNam
6881
6944
  }
6882
6945
  return observabilityStrategy.preferred;
6883
6946
  }
6947
+ var FLUSH_SUCCEEDED2 = { failed: false };
6884
6948
  var MastraStorageExporter = class extends BaseExporter {
6885
6949
  name = "mastra-storage-exporter";
6886
6950
  #config;
@@ -6975,17 +7039,37 @@ var MastraStorageExporter = class extends BaseExporter {
6975
7039
  /**
6976
7040
  * Schedules a flush using setTimeout
6977
7041
  */
6978
- scheduleFlush() {
7042
+ scheduleFlush(delayMs = this.#config.maxBatchWaitMs) {
6979
7043
  if (this.#flushTimer) {
6980
7044
  clearTimeout(this.#flushTimer);
6981
7045
  }
6982
7046
  this.#flushTimer = setTimeout(() => {
7047
+ this.#flushTimer = void 0;
6983
7048
  this.flushBuffer().catch((error) => {
6984
7049
  this.logger.error("Scheduled flush failed", {
6985
7050
  error: error instanceof Error ? error.message : String(error)
6986
7051
  });
6987
7052
  });
6988
- }, this.#config.maxBatchWaitMs);
7053
+ }, delayMs);
7054
+ }
7055
+ retryDelay(retryAttempt) {
7056
+ return this.#config.retryDelayMs * 2 ** (retryAttempt - 1);
7057
+ }
7058
+ retryAttempt(events) {
7059
+ return events.reduce((earliestAttempt, event) => {
7060
+ if (event.retryCount > this.#config.maxRetries) return earliestAttempt;
7061
+ return earliestAttempt === void 0 ? event.retryCount : Math.min(earliestAttempt, event.retryCount);
7062
+ }, void 0);
7063
+ }
7064
+ logStorageFailure(signal, events, retryAttempt, error) {
7065
+ this.logger.warn("Failed to persist observability events", {
7066
+ signal,
7067
+ eventCount: events.length,
7068
+ retryAttempt: retryAttempt ?? events.reduce((latestAttempt, event) => Math.max(latestAttempt, event.retryCount), 0),
7069
+ maxRetries: this.#config.maxRetries,
7070
+ ...retryAttempt === void 0 ? {} : { nextRetryDelayMs: this.retryDelay(retryAttempt) },
7071
+ error: error instanceof Error ? error.message : String(error)
7072
+ });
6989
7073
  }
6990
7074
  /**
6991
7075
  * Checks flush triggers and schedules/triggers flush as needed.
@@ -7032,22 +7116,26 @@ var MastraStorageExporter = class extends BaseExporter {
7032
7116
  * On other errors, re-adds events to the buffer for retry.
7033
7117
  */
7034
7118
  async flushCreates(signal, events, storageCall) {
7035
- if (events.length === 0) return;
7119
+ if (events.length === 0) return FLUSH_SUCCEEDED2;
7036
7120
  if (this.#unsupportedSignals.has(signal)) {
7037
7121
  this.emitDrop(signal, "unsupported-storage", events.length);
7038
- return;
7122
+ return { failed: true };
7039
7123
  }
7040
7124
  try {
7041
7125
  await storageCall(events);
7126
+ return FLUSH_SUCCEEDED2;
7042
7127
  } catch (error) {
7043
7128
  if (error instanceof MastraError && error.domain === ErrorDomain.MASTRA_OBSERVABILITY && error.id.endsWith("_NOT_IMPLEMENTED")) {
7044
7129
  this.logger.warn(error.message);
7045
7130
  this.#unsupportedSignals.add(signal);
7046
7131
  this.emitDrop(signal, "unsupported-storage", events.length, error);
7047
- } else {
7048
- const dropped = this.#eventBuffer.reAddCreates(events);
7049
- this.emitDrop(signal, "retry-exhausted", dropped.length, error);
7132
+ return { failed: true };
7050
7133
  }
7134
+ const dropped = this.#eventBuffer.reAddCreates(events);
7135
+ const retryAttempt = this.retryAttempt(events);
7136
+ this.logStorageFailure(signal, events, retryAttempt, error);
7137
+ this.emitDrop(signal, "retry-exhausted", dropped.length, error);
7138
+ return { failed: true, retryAttempt };
7051
7139
  }
7052
7140
  }
7053
7141
  /**
@@ -7056,10 +7144,10 @@ var MastraStorageExporter = class extends BaseExporter {
7056
7144
  */
7057
7145
  async flushSpanUpdates(events, deferredUpdates, isEnd) {
7058
7146
  const deferredCountAtEntry = deferredUpdates.length;
7059
- if (events.length === 0) return;
7147
+ if (events.length === 0) return FLUSH_SUCCEEDED2;
7060
7148
  if (this.#unsupportedSignals.has("tracing")) {
7061
7149
  this.emitDrop("tracing", "unsupported-storage", events.length);
7062
- return;
7150
+ return { failed: true };
7063
7151
  }
7064
7152
  const partials = [];
7065
7153
  for (const event of events) {
@@ -7074,26 +7162,30 @@ var MastraStorageExporter = class extends BaseExporter {
7074
7162
  deferredUpdates.push(event);
7075
7163
  }
7076
7164
  }
7077
- if (partials.length === 0) return;
7165
+ if (partials.length === 0) return FLUSH_SUCCEEDED2;
7078
7166
  try {
7079
7167
  await this.#observabilityStorage.batchUpdateSpans({ records: partials });
7080
7168
  if (isEnd) {
7081
7169
  this.#eventBuffer.endFinishedSpans({ records: partials });
7082
7170
  }
7171
+ return FLUSH_SUCCEEDED2;
7083
7172
  } catch (error) {
7084
7173
  if (error instanceof MastraError && error.domain === ErrorDomain.MASTRA_OBSERVABILITY && error.id.endsWith("_NOT_IMPLEMENTED")) {
7085
7174
  this.logger.warn(error.message);
7086
7175
  this.#unsupportedSignals.add("tracing");
7087
7176
  deferredUpdates.length = 0;
7088
7177
  this.emitDrop("tracing", "unsupported-storage", events.length + deferredCountAtEntry, error);
7089
- } else {
7090
- const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;
7091
- if (newlyDeferred > 0) {
7092
- deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);
7093
- }
7094
- const dropped = this.#eventBuffer.reAddUpdates(events);
7095
- this.emitDrop("tracing", "retry-exhausted", dropped.length, error);
7178
+ return { failed: true };
7179
+ }
7180
+ const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;
7181
+ if (newlyDeferred > 0) {
7182
+ deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);
7096
7183
  }
7184
+ const dropped = this.#eventBuffer.reAddUpdates(events);
7185
+ const retryAttempt = this.retryAttempt(events);
7186
+ this.logStorageFailure("tracing", events, retryAttempt, error);
7187
+ this.emitDrop("tracing", "retry-exhausted", dropped.length, error);
7188
+ return { failed: true, retryAttempt };
7097
7189
  }
7098
7190
  }
7099
7191
  /**
@@ -7161,7 +7253,7 @@ var MastraStorageExporter = class extends BaseExporter {
7161
7253
  break;
7162
7254
  }
7163
7255
  }
7164
- await Promise.all([
7256
+ const flushResults = await Promise.all([
7165
7257
  this.flushCreates(
7166
7258
  "feedback",
7167
7259
  createFeedbackEvents,
@@ -7189,25 +7281,36 @@ var MastraStorageExporter = class extends BaseExporter {
7189
7281
  })
7190
7282
  ]);
7191
7283
  const deferredUpdates = [];
7192
- await this.flushSpanUpdates(updateSpanEvents, deferredUpdates, false);
7193
- await this.flushSpanUpdates(endSpanEvents, deferredUpdates, true);
7284
+ flushResults.push(await this.flushSpanUpdates(updateSpanEvents, deferredUpdates, false));
7285
+ flushResults.push(await this.flushSpanUpdates(endSpanEvents, deferredUpdates, true));
7286
+ let deferredDropCount = 0;
7194
7287
  if (deferredUpdates.length > 0) {
7195
7288
  if (this.#unsupportedSignals.has("tracing")) {
7196
- this.emitDrop("tracing", "unsupported-storage", deferredUpdates.length);
7289
+ deferredDropCount = deferredUpdates.length;
7290
+ this.emitDrop("tracing", "unsupported-storage", deferredDropCount);
7197
7291
  deferredUpdates.length = 0;
7198
7292
  } else {
7199
7293
  const dropped = this.#eventBuffer.reAddUpdates(deferredUpdates);
7200
- this.emitDrop("tracing", "retry-exhausted", dropped.length);
7294
+ deferredDropCount = dropped.length;
7295
+ this.emitDrop("tracing", "retry-exhausted", deferredDropCount);
7201
7296
  }
7202
7297
  }
7203
- const elapsed = Date.now() - startTime;
7204
- this.logger.debug("Batch flushed", {
7205
- strategy: this.#resolvedStrategy,
7206
- batchSize,
7207
- durationMs: elapsed,
7208
- deferredUpdates: deferredUpdates.length > 0 ? deferredUpdates.length : void 0
7209
- });
7210
- return;
7298
+ const retryAttempt = flushResults.reduce((earliestAttempt, result) => {
7299
+ if (result.retryAttempt === void 0) return earliestAttempt;
7300
+ return earliestAttempt === void 0 ? result.retryAttempt : Math.min(earliestAttempt, result.retryAttempt);
7301
+ }, void 0);
7302
+ if (retryAttempt !== void 0) {
7303
+ this.scheduleFlush(this.retryDelay(retryAttempt));
7304
+ }
7305
+ if (!flushResults.some((result) => result.failed) && deferredDropCount === 0) {
7306
+ const elapsed = Date.now() - startTime;
7307
+ this.logger.debug("Batch flushed", {
7308
+ strategy: this.#resolvedStrategy,
7309
+ batchSize,
7310
+ durationMs: elapsed,
7311
+ deferredUpdates: deferredUpdates.length > 0 ? deferredUpdates.length : void 0
7312
+ });
7313
+ }
7211
7314
  }
7212
7315
  async _exportTracingEvent(event) {
7213
7316
  await this.waitForInit();
@@ -7284,6 +7387,10 @@ var MastraStorageExporter = class extends BaseExporter {
7284
7387
  this.#flushTimer = void 0;
7285
7388
  }
7286
7389
  await this.flush();
7390
+ if (this.#flushTimer) {
7391
+ clearTimeout(this.#flushTimer);
7392
+ this.#flushTimer = void 0;
7393
+ }
7287
7394
  this.logger.info("MastraStorageExporter shutdown complete");
7288
7395
  }
7289
7396
  };