fix(codex): gate profiler timing and startup setup · openclaw/openclaw@21c25bb
keshavbotage
·
2026-05-27
·
via Recent Commits to openclaw:main
File tree
extensions/codex/src/app-server
| Original file line number | Diff line number | Diff line change |
|---|
@@ -50,6 +50,50 @@ Disable all flags:
|
50 | 50 | OPENCLAW_DIAGNOSTICS=0 |
51 | 51 | ``` |
52 | 52 | |
| 53 | +`OPENCLAW_DIAGNOSTICS=0` is a process-level disable override: it disables |
| 54 | +flags from both env and config for that process. |
| 55 | + |
| 56 | +## Profiling flags |
| 57 | + |
| 58 | +Profiler flags enable targeted timing spans without raising global logging |
| 59 | +levels. They are disabled by default. |
| 60 | + |
| 61 | +Enable all profiler-gated spans for one gateway run: |
| 62 | + |
| 63 | +```bash |
| 64 | +OPENCLAW_DIAGNOSTICS=profiler openclaw gateway run |
| 65 | +``` |
| 66 | + |
| 67 | +Enable only reply-dispatch profiler spans: |
| 68 | + |
| 69 | +```bash |
| 70 | +OPENCLAW_DIAGNOSTICS=reply.profiler openclaw gateway run |
| 71 | +``` |
| 72 | + |
| 73 | +Enable only Codex app-server startup/tool/thread profiler spans: |
| 74 | + |
| 75 | +```bash |
| 76 | +OPENCLAW_DIAGNOSTICS=codex.profiler openclaw gateway run |
| 77 | +``` |
| 78 | + |
| 79 | +Enable profiler flags from config: |
| 80 | + |
| 81 | +```json |
| 82 | +{ |
| 83 | +"diagnostics": { |
| 84 | +"flags": ["reply.profiler", "codex.profiler"] |
| 85 | + } |
| 86 | +} |
| 87 | +``` |
| 88 | + |
| 89 | +Restart the gateway after changing config flags. To disable a profiler flag, |
| 90 | +remove it from `diagnostics.flags` and restart. To temporarily disable every |
| 91 | +diagnostics flag even when config enables profiler flags, start the process with: |
| 92 | + |
| 93 | +```bash |
| 94 | +OPENCLAW_DIAGNOSTICS=0 openclaw gateway run |
| 95 | +``` |
| 96 | + |
53 | 97 | ## Timeline artifacts |
54 | 98 | |
55 | 99 | The `timeline` flag writes structured startup and runtime timing events for |
|
| Original file line number | Diff line number | Diff line change |
|---|
|
| 1 | +import { describe, expect, it } from "vitest"; |
| 2 | +import { isCodexAppServerProfilerEnabled } from "./profiler-flag.js"; |
| 3 | + |
| 4 | +describe("isCodexAppServerProfilerEnabled", () => { |
| 5 | +it("is disabled by default", () => { |
| 6 | +expect(isCodexAppServerProfilerEnabled(undefined, {} as NodeJS.ProcessEnv)).toBe(false); |
| 7 | +}); |
| 8 | + |
| 9 | +it("matches global and Codex profiler flags", () => { |
| 10 | +expect( |
| 11 | +isCodexAppServerProfilerEnabled( |
| 12 | +{ diagnostics: { flags: ["codex.profiler"] } }, |
| 13 | +{} as NodeJS.ProcessEnv, |
| 14 | +), |
| 15 | +).toBe(true); |
| 16 | +expect( |
| 17 | +isCodexAppServerProfilerEnabled(undefined, { |
| 18 | +OPENCLAW_DIAGNOSTICS: "profiler", |
| 19 | +} as NodeJS.ProcessEnv), |
| 20 | +).toBe(true); |
| 21 | +}); |
| 22 | + |
| 23 | +it("uses the documented diagnostics env disable override", () => { |
| 24 | +expect( |
| 25 | +isCodexAppServerProfilerEnabled({ diagnostics: { flags: ["codex.profiler"] } }, { |
| 26 | +OPENCLAW_DIAGNOSTICS: "0", |
| 27 | +} as NodeJS.ProcessEnv), |
| 28 | +).toBe(false); |
| 29 | +}); |
| 30 | +}); |
| Original file line number | Diff line number | Diff line change |
|---|
|
| 1 | +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts"; |
| 2 | +import { isDiagnosticFlagEnabled } from "openclaw/plugin-sdk/diagnostic-runtime"; |
| 3 | + |
| 4 | +const PROFILER_FLAGS = ["profiler", "codex.profiler"] as const; |
| 5 | + |
| 6 | +export function isCodexAppServerProfilerEnabled( |
| 7 | +config?: OpenClawConfig, |
| 8 | +env: NodeJS.ProcessEnv = process.env, |
| 9 | +): boolean { |
| 10 | +return PROFILER_FLAGS.some((flag) => isDiagnosticFlagEnabled(flag, config, env)); |
| 11 | +} |
| Original file line number | Diff line number | Diff line change |
|---|
@@ -887,6 +887,7 @@ describe("runCodexAppServerAttempt", () => {
|
887 | 887 | await closeCodexSandboxExecServersForTests(); |
888 | 888 | resetCodexAppServerClientFactoryForTest(); |
889 | 889 | testing.resetOpenClawCodingToolsFactoryForTests(); |
| 890 | +testing.resetEnsuredCodexWorkspaceDirsForTests(); |
890 | 891 | testing.clearPendingCodexNativeHookRelayUnregistersForTests(); |
891 | 892 | resetCodexRateLimitCacheForTests(); |
892 | 893 | nativeHookRelayTesting.clearNativeHookRelaysForTests(); |
@@ -903,6 +904,16 @@ describe("runCodexAppServerAttempt", () => {
|
903 | 904 | await fs.rm(tempDir, { recursive: true, force: true }); |
904 | 905 | }); |
905 | 906 | |
| 907 | +it("recreates cached Codex workspace directories after cleanup removes them", async () => { |
| 908 | +const workspaceDir = path.join(tempDir, "cached-workspace"); |
| 909 | + |
| 910 | +await testing.ensureCodexWorkspaceDirOnceForTests(workspaceDir); |
| 911 | +await fs.rm(workspaceDir, { recursive: true, force: true }); |
| 912 | +await testing.ensureCodexWorkspaceDirOnceForTests(workspaceDir); |
| 913 | + |
| 914 | +expect((await fs.stat(workspaceDir)).isDirectory()).toBe(true); |
| 915 | +}); |
| 916 | + |
906 | 917 | it("filters Codex-native dynamic tools from app-server tool exposure", () => { |
907 | 918 | const tools = [ |
908 | 919 | "read", |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。