

























@@ -676,6 +676,33 @@ export function createDiagnosticsOtelService(): OpenClawPluginService {
676676unit: "ms",
677677description: "Exec process duration",
678678});
679+const memoryRssHistogram = meter.createHistogram("openclaw.memory.rss_bytes", {
680+unit: "By",
681+description: "Resident set size reported by diagnostic memory samples",
682+});
683+const memoryHeapUsedHistogram = meter.createHistogram("openclaw.memory.heap_used_bytes", {
684+unit: "By",
685+description: "Heap used bytes reported by diagnostic memory samples",
686+});
687+const memoryHeapTotalHistogram = meter.createHistogram("openclaw.memory.heap_total_bytes", {
688+unit: "By",
689+description: "Heap total bytes reported by diagnostic memory samples",
690+});
691+const memoryExternalHistogram = meter.createHistogram("openclaw.memory.external_bytes", {
692+unit: "By",
693+description: "External memory bytes reported by diagnostic memory samples",
694+});
695+const memoryArrayBuffersHistogram = meter.createHistogram(
696+"openclaw.memory.array_buffers_bytes",
697+{
698+unit: "By",
699+description: "ArrayBuffer bytes reported by diagnostic memory samples",
700+},
701+);
702+const memoryPressureCounter = meter.createCounter("openclaw.memory.pressure", {
703+unit: "1",
704+description: "Diagnostic memory pressure events",
705+});
679706680707let recordLogRecord:
681708| ((
@@ -1126,6 +1153,65 @@ export function createDiagnosticsOtelService(): OpenClawPluginService {
11261153span.end(evt.ts);
11271154};
112811551156+const recordMemoryUsageMetrics = (
1157+evt: Extract<
1158+DiagnosticEventPayload,
1159+{ type: "diagnostic.memory.sample" | "diagnostic.memory.pressure" }
1160+>,
1161+attrs: Record<string, string> = {},
1162+) => {
1163+memoryRssHistogram.record(evt.memory.rssBytes, attrs);
1164+memoryHeapUsedHistogram.record(evt.memory.heapUsedBytes, attrs);
1165+memoryHeapTotalHistogram.record(evt.memory.heapTotalBytes, attrs);
1166+memoryExternalHistogram.record(evt.memory.externalBytes, attrs);
1167+memoryArrayBuffersHistogram.record(evt.memory.arrayBuffersBytes, attrs);
1168+};
1169+1170+const recordMemorySample = (
1171+evt: Extract<DiagnosticEventPayload, { type: "diagnostic.memory.sample" }>,
1172+) => {
1173+recordMemoryUsageMetrics(evt);
1174+};
1175+1176+const recordMemoryPressure = (
1177+evt: Extract<DiagnosticEventPayload, { type: "diagnostic.memory.pressure" }>,
1178+) => {
1179+const attrs = {
1180+"openclaw.memory.level": evt.level,
1181+"openclaw.memory.reason": evt.reason,
1182+};
1183+memoryPressureCounter.add(1, attrs);
1184+recordMemoryUsageMetrics(evt, attrs);
1185+if (!tracesEnabled) {
1186+return;
1187+}
1188+const spanAttrs: Record<string, string | number | boolean> = {
1189+ ...attrs,
1190+"openclaw.memory.rss_bytes": evt.memory.rssBytes,
1191+"openclaw.memory.heap_used_bytes": evt.memory.heapUsedBytes,
1192+"openclaw.memory.heap_total_bytes": evt.memory.heapTotalBytes,
1193+"openclaw.memory.external_bytes": evt.memory.externalBytes,
1194+"openclaw.memory.array_buffers_bytes": evt.memory.arrayBuffersBytes,
1195+ ...(evt.thresholdBytes !== undefined
1196+ ? { "openclaw.memory.threshold_bytes": evt.thresholdBytes }
1197+ : {}),
1198+ ...(evt.rssGrowthBytes !== undefined
1199+ ? { "openclaw.memory.rss_growth_bytes": evt.rssGrowthBytes }
1200+ : {}),
1201+ ...(evt.windowMs !== undefined ? { "openclaw.memory.window_ms": evt.windowMs } : {}),
1202+};
1203+const span = spanWithDuration("openclaw.memory.pressure", spanAttrs, 0, {
1204+endTimeMs: evt.ts,
1205+});
1206+if (evt.level === "critical") {
1207+span.setStatus({
1208+code: SpanStatusCode.ERROR,
1209+message: evt.reason,
1210+});
1211+}
1212+span.end(evt.ts);
1213+};
1214+11291215const recordRunCompleted = (
11301216evt: Extract<DiagnosticEventPayload, { type: "run.completed" }>,
11311217metadata: DiagnosticEventMetadata,
@@ -1470,11 +1556,15 @@ export function createDiagnosticsOtelService(): OpenClawPluginService {
14701556case "tool.loop":
14711557recordToolLoop(evt);
14721558return;
1559+case "diagnostic.memory.sample":
1560+recordMemorySample(evt);
1561+return;
1562+case "diagnostic.memory.pressure":
1563+recordMemoryPressure(evt);
1564+return;
14731565case "tool.execution.started":
14741566case "run.started":
14751567case "model.call.started":
1476-case "diagnostic.memory.sample":
1477-case "diagnostic.memory.pressure":
14781568case "payload.large":
14791569return;
14801570}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。