@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/CHANGELOG.md +20 -0
- package/dist/exporters/default.d.ts +3 -0
- package/dist/exporters/default.d.ts.map +1 -1
- package/dist/exporters/mastra-storage.d.ts +3 -0
- package/dist/exporters/mastra-storage.d.ts.map +1 -1
- package/dist/index.cjs +169 -62
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +169 -62
- package/dist/index.js.map +1 -1
- package/dist/metrics/pricing-registry.d.ts.map +1 -1
- package/dist/spans/base.d.ts.map +1 -1
- package/package.json +9 -9
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
|
-
},
|
|
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
|
-
|
|
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
|
-
|
|
6155
|
-
|
|
6156
|
-
|
|
6157
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6315
|
+
deferredDropCount = dropped.length;
|
|
6316
|
+
this.emitDrop("tracing", "retry-exhausted", deferredDropCount);
|
|
6266
6317
|
}
|
|
6267
6318
|
}
|
|
6268
|
-
const
|
|
6269
|
-
|
|
6270
|
-
|
|
6271
|
-
|
|
6272
|
-
|
|
6273
|
-
|
|
6274
|
-
}
|
|
6275
|
-
|
|
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
|
-
},
|
|
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
|
-
|
|
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
|
-
|
|
7090
|
-
|
|
7091
|
-
|
|
7092
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7294
|
+
deferredDropCount = dropped.length;
|
|
7295
|
+
this.emitDrop("tracing", "retry-exhausted", deferredDropCount);
|
|
7201
7296
|
}
|
|
7202
7297
|
}
|
|
7203
|
-
const
|
|
7204
|
-
|
|
7205
|
-
|
|
7206
|
-
|
|
7207
|
-
|
|
7208
|
-
|
|
7209
|
-
}
|
|
7210
|
-
|
|
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
|
};
|