

























@@ -169,12 +169,23 @@ const canvasRuntime = runtimeForLogger(logCanvas);
169169170170function createGatewayStartupTrace() {
171171const logEnabled = isTruthyEnvValue(process.env.OPENCLAW_GATEWAY_STARTUP_TRACE);
172-const timelineEnabled = isDiagnosticsTimelineEnabled();
173-const eventLoopTimelineEnabled =
174-timelineEnabled && isTruthyEnvValue(process.env.OPENCLAW_DIAGNOSTICS_EVENT_LOOP);
175-const eventLoopDelay =
176-logEnabled || eventLoopTimelineEnabled ? monitorEventLoopDelay({ resolution: 10 }) : undefined;
177-eventLoopDelay?.enable();
172+let timelineConfig: OpenClawConfig | undefined;
173+let eventLoopDelay: ReturnType<typeof monitorEventLoopDelay> | undefined;
174+const timelineOptions = () => ({
175+ ...(timelineConfig ? { config: timelineConfig } : {}),
176+env: process.env,
177+});
178+const eventLoopTimelineEnabled = () =>
179+isDiagnosticsTimelineEnabled(timelineOptions()) &&
180+isTruthyEnvValue(process.env.OPENCLAW_DIAGNOSTICS_EVENT_LOOP);
181+const ensureEventLoopDelay = () => {
182+if (eventLoopDelay || (!logEnabled && !eventLoopTimelineEnabled())) {
183+return;
184+}
185+eventLoopDelay = monitorEventLoopDelay({ resolution: 10 });
186+eventLoopDelay.enable();
187+};
188+ensureEventLoopDelay();
178189const started = performance.now();
179190let last = started;
180191let spanSequence = 0;
@@ -214,23 +225,26 @@ function createGatewayStartupTrace() {
214225activeSpanName: string,
215226sample: ReturnType<typeof takeEventLoopSample>,
216227) => {
217-if (!eventLoopTimelineEnabled) {
228+if (!eventLoopTimelineEnabled()) {
218229return;
219230}
220231if (!sample) {
221232return;
222233}
223-emitDiagnosticsTimelineEvent({
224-type: "eventLoop.sample",
225-name: "eventLoop",
226-phase: "startup",
227-activeSpanName: mapTimelineName(activeSpanName),
228-attributes:
229-activeSpanName === mapTimelineName(activeSpanName)
230- ? undefined
231- : { traceName: activeSpanName },
232- ...sample,
233-});
234+emitDiagnosticsTimelineEvent(
235+{
236+type: "eventLoop.sample",
237+name: "eventLoop",
238+phase: "startup",
239+activeSpanName: mapTimelineName(activeSpanName),
240+attributes:
241+activeSpanName === mapTimelineName(activeSpanName)
242+ ? undefined
243+ : { traceName: activeSpanName },
244+ ...sample,
245+},
246+timelineOptions(),
247+);
234248};
235249const emit = (
236250name: string,
@@ -250,17 +264,24 @@ function createGatewayStartupTrace() {
250264}
251265};
252266return {
267+setConfig(config: OpenClawConfig) {
268+timelineConfig = config;
269+ensureEventLoopDelay();
270+},
253271mark(name: string) {
254272const now = performance.now();
255273const eventLoopSample = takeEventLoopSample();
256274emit(name, now - last, now - started, eventLoopSample);
257-emitDiagnosticsTimelineEvent({
258-type: "mark",
259-name: mapTimelineName(name),
260-phase: "startup",
261-durationMs: now - started,
262-attributes: name === mapTimelineName(name) ? undefined : { traceName: name },
263-});
275+emitDiagnosticsTimelineEvent(
276+{
277+type: "mark",
278+name: mapTimelineName(name),
279+phase: "startup",
280+durationMs: now - started,
281+attributes: name === mapTimelineName(name) ? undefined : { traceName: name },
282+},
283+timelineOptions(),
284+);
264285emitEventLoopTimelineSample(name, eventLoopSample);
265286last = now;
266287if (name === "ready") {
@@ -274,50 +295,62 @@ function createGatewayStartupTrace() {
274295`startup trace: ${name} ${metrics.map(([key, value]) => formatMetric(key, value)).join(" ")}`,
275296);
276297}
277-emitDiagnosticsTimelineEvent({
278-type: "mark",
279-name: mapTimelineName(name),
280-phase: "startup",
281-attributes: {
282-traceName: name,
283- ...attributes,
298+emitDiagnosticsTimelineEvent(
299+{
300+type: "mark",
301+name: mapTimelineName(name),
302+phase: "startup",
303+attributes: {
304+traceName: name,
305+ ...attributes,
306+},
284307},
285-});
308+timelineOptions(),
309+);
286310},
287311async measure<T>(name: string, run: () => Promise<T> | T): Promise<T> {
288312const before = performance.now();
289313const spanId = `gateway-startup-${++spanSequence}`;
290-emitDiagnosticsTimelineEvent({
291-type: "span.start",
292-name: mapTimelineName(name),
293-phase: "startup",
294- spanId,
295-attributes: name === mapTimelineName(name) ? undefined : { traceName: name },
296-});
297-try {
298-const result = await run();
299-const now = performance.now();
300-emitDiagnosticsTimelineEvent({
301-type: "span.end",
314+emitDiagnosticsTimelineEvent(
315+{
316+type: "span.start",
302317name: mapTimelineName(name),
303318phase: "startup",
304319 spanId,
305-durationMs: now - before,
306320attributes: name === mapTimelineName(name) ? undefined : { traceName: name },
307-});
321+},
322+timelineOptions(),
323+);
324+try {
325+const result = await run();
326+const now = performance.now();
327+emitDiagnosticsTimelineEvent(
328+{
329+type: "span.end",
330+name: mapTimelineName(name),
331+phase: "startup",
332+ spanId,
333+durationMs: now - before,
334+attributes: name === mapTimelineName(name) ? undefined : { traceName: name },
335+},
336+timelineOptions(),
337+);
308338return result;
309339} catch (error) {
310340const now = performance.now();
311-emitDiagnosticsTimelineEvent({
312-type: "span.error",
313-name: mapTimelineName(name),
314-phase: "startup",
315- spanId,
316-durationMs: now - before,
317-attributes: name === mapTimelineName(name) ? undefined : { traceName: name },
318-errorName: error instanceof Error ? error.name : typeof error,
319-errorMessage: error instanceof Error ? error.message : String(error),
320-});
341+emitDiagnosticsTimelineEvent(
342+{
343+type: "span.error",
344+name: mapTimelineName(name),
345+phase: "startup",
346+ spanId,
347+durationMs: now - before,
348+attributes: name === mapTimelineName(name) ? undefined : { traceName: name },
349+errorName: error instanceof Error ? error.name : typeof error,
350+errorMessage: error instanceof Error ? error.message : String(error),
351+},
352+timelineOptions(),
353+);
321354throw error;
322355} finally {
323356const now = performance.now();
@@ -466,6 +499,7 @@ export async function startGatewayServer(
466499let startupLastGoodSnapshot = configSnapshot;
467500const startupActivationSourceConfig = configSnapshot.sourceConfig;
468501const startupRuntimeConfig = applyConfigOverrides(configSnapshot.config);
502+startupTrace.setConfig(startupRuntimeConfig);
469503const authBootstrap = await startupTrace.measure("config.auth", () =>
470504prepareGatewayStartupConfig({
471505 configSnapshot,
@@ -476,6 +510,7 @@ export async function startGatewayServer(
476510}),
477511);
478512cfgAtStart = authBootstrap.cfg;
513+startupTrace.setConfig(cfgAtStart);
479514if (authBootstrap.generatedToken) {
480515if (authBootstrap.persistedGeneratedToken) {
481516log.info(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。