

























@@ -867,12 +867,38 @@ async function stopDockerContainer(name: string): Promise<void> {
867867});
868868}
869869870-async function startDockerOtelCollector(receiverPort: number) {
871-const collectorPort = await reserveLocalPort();
872-const tempDir = await mkdtemp(path.join(tmpdir(), "openclaw-otel-collector-"));
870+type StartDockerOtelCollectorDeps = {
871+mkdtemp?: typeof mkdtemp;
872+platform?: NodeJS.Platform;
873+randomUUID?: typeof randomUUID;
874+reserveLocalPort?: typeof reserveLocalPort;
875+rm?: typeof rm;
876+spawn?: typeof spawn;
877+stopDockerContainer?: typeof stopDockerContainer;
878+tmpdir?: typeof tmpdir;
879+waitForLocalPort?: typeof waitForLocalPort;
880+writeFile?: typeof writeFile;
881+};
882+883+async function startDockerOtelCollector(
884+ receiverPort: number,
885+ deps: StartDockerOtelCollectorDeps = {},
886+) {
887+const reservePort = deps.reserveLocalPort ?? reserveLocalPort;
888+const makeTempDir = deps.mkdtemp ?? mkdtemp;
889+const writeConfigFile = deps.writeFile ?? writeFile;
890+const spawnProcess = deps.spawn ?? spawn;
891+const waitForPort = deps.waitForLocalPort ?? waitForLocalPort;
892+const stopContainer = deps.stopDockerContainer ?? stopDockerContainer;
893+const removePath = deps.rm ?? rm;
894+const makeUuid = deps.randomUUID ?? randomUUID;
895+const osTmpdir = deps.tmpdir ?? tmpdir;
896+897+const collectorPort = await reservePort();
898+const tempDir = await makeTempDir(path.join(osTmpdir(), "openclaw-otel-collector-"));
873899const configPath = path.join(tempDir, "collector.yaml");
874-const containerName = `openclaw-otel-smoke-${randomUUID()}`;
875-const useHostNetwork = process.platform === "linux";
900+const containerName = `openclaw-otel-smoke-${makeUuid()}`;
901+const useHostNetwork = (deps.platform ?? process.platform) === "linux";
876902const collectorEndpoint = useHostNetwork ? `127.0.0.1:${collectorPort}` : "0.0.0.0:4318";
877903const receiverEndpoint = useHostNetwork
878904 ? `http://127.0.0.1:${receiverPort}`
@@ -897,7 +923,7 @@ service:
897923 receivers: [otlp]
898924 exporters: [otlphttp/openclaw]
899925`;
900-await writeFile(configPath, config, "utf8");
926+await writeConfigFile(configPath, config, "utf8");
901927902928const stdout: string[] = [];
903929const stderr: string[] = [];
@@ -916,7 +942,7 @@ service:
916942DEFAULT_DOCKER_COLLECTOR_IMAGE,
917943"--config=/etc/otelcol/config.yaml",
918944];
919-const child = spawn("docker", dockerArgs, { stdio: ["ignore", "pipe", "pipe"] });
945+const child = spawnProcess("docker", dockerArgs, { stdio: ["ignore", "pipe", "pipe"] });
920946child.stdout?.on("data", (chunk) => stdout.push(String(chunk)));
921947child.stderr?.on("data", (chunk) => stderr.push(String(chunk)));
922948child.on("error", (err) => {
@@ -927,13 +953,22 @@ service:
927953exitCode = code ?? 1;
928954});
929955930-await waitForLocalPort(collectorPort, 60_000, () => {
931-if (exitCode === null) {
932-return "";
956+try {
957+await waitForPort(collectorPort, 60_000, () => {
958+if (exitCode === null) {
959+return "";
960+}
961+const output = [...stdout, ...stderr].join("").trim();
962+return `OpenTelemetry Collector exited before readiness (code=${exitCode})${output ? `:\n${output}` : ""}`;
963+});
964+} catch (error) {
965+try {
966+await stopContainer(containerName);
967+} finally {
968+await removePath(tempDir, { force: true, recursive: true });
933969}
934-const output = [...stdout, ...stderr].join("").trim();
935-return `OpenTelemetry Collector exited before readiness (code=${exitCode})${output ? `:\n${output}` : ""}`;
936-});
970+ throw error;
971+}
937972938973return {
939974port: collectorPort,
@@ -943,8 +978,8 @@ service:
943978return tailText([...stdout, ...stderr].join("").trim(), COLLECTOR_OUTPUT_TAIL_BYTES);
944979},
945980async close(): Promise<void> {
946-await stopDockerContainer(containerName);
947-await rm(tempDir, { force: true, recursive: true });
981+await stopContainer(containerName);
982+await removePath(tempDir, { force: true, recursive: true });
948983},
949984};
950985}
@@ -1524,6 +1559,7 @@ export const testing = {
15241559 parseArgs,
15251560 readPositiveIntegerEnv,
15261561 readRequestBody,
1562+ startDockerOtelCollector,
15271563 terminateChildTree,
15281564 waitForChild,
15291565};
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。