ChildProcessManager::setupEventHandlers | Child process stderr: Please migrate your code to use AWS
RCA: ChildProcessManager stderr — AWS SDK v3 migration notice
Overview#
What Happened#
cupixworks-any-mesh-agent가 mesh 추출용 child process를 fork할 때마다 Node.js가 aws-sdk v2 패키지에 대한 maintenance-mode 경고를 stderr로 출력한다. 경고 본문 중 "Please migrate your code to use AWS SDK for JavaScript (v3)." 한 줄이 ChildProcessManager.setupEventHandlers의 stderr.on('data') 핸들러를 통해 logger.error()로 기록되어, Datadog에서 status:error로 집계되었다. 동일 시각(2026-06-24 13:50:34 KST)에 같은 경고 본문의 다른 줄들도 별도 cluster로 발생했고(54db804c…, 9441b8e0…, 등), 본 cluster는 그 중 v3 migration 안내 문장에 해당한다. 실제 mesh 추출 작업의 실패는 아니다.
Quick Facts#
| Field | Value |
|---|---|
| exception.class | (none — stderr forwarding, not a thrown exception) |
| exception.message | Please migrate your code to use AWS SDK for JavaScript (v3). |
| top_frame | packages/base/src/manager/child-process.manager.ts:138-141 |
| runtime | Node.js 20, child process (fork) |
| env | production, us-west-2 |
Affected Teams#
| Team / Domain | Error Count | Impact |
|---|---|---|
| demokr / mesh-agent | 1 (per child process spawn, recurring) | False-positive error log; no functional impact on mesh extraction |
Timeline#
- 2026-06-24 13:50:34 KST —
cupixworks-any-mesh-agent가 mesh-extractor child process를 fork. Node.js가aws-sdkv2 deprecation 경고를 stderr 다중 라인으로 발행.ChildProcessManager가 라인별로logger.error()호출 → Datadogstatus:error5건이 같은 millisecond에 기록됨. 본 cluster는 그 중 v3 migration 권고 라인. - 2026-06-24 15:39:54 KST — 형제 cluster
54db804c-604f-47ea-8e4e-691d867ee5d2에 대한 RCA가 완료되어 동일 root cause(logging_issue/ChildProcessManager#stderr_to_logger)로 분류됨. status-board는 동일 incident(2026-06-24-svc-cupixworks-any-mesh-agent--unknown-1)로 그룹화.
Error Log#
ChildProcessManager::setupEventHandlers | Child process stderr: Please migrate your code to use AWS SDK for JavaScript (v3).
같은 시점(2026-06-24 13:50:34 KST)에 stderr에서 같이 흘러나온 라인들 — 모두 status:error로 기록됨:
(node:48) NOTE: The AWS SDK for JavaScript (v2) will enter maintenance mode
on September 8, 2024 and reach end-of-support on September 8, 2025.
Please migrate your code to use AWS SDK for JavaScript (v3).
For more information, check blog post at https://a.co/cUPnyil
(Use `node --trace-warnings ...` to show where the warning was created)
Impact#
- Service:
cupixworks-any-mesh-agent - Team: demokr
- 발생 횟수: 1 (child process fork마다 반복 발생)
- 최초 발생: 2026-06-24 13:50:34 KST
- 최근 발생: 2026-06-24 13:50:34 KST
기능 영향 없음. mesh 추출 작업 자체는 정상 수행됨. 영향은 ① false-positive error 메트릭/알림 노이즈, ② AWS SDK v2 EOL(2025-09-08) 도래 시 실제 호환성 리스크 두 가지.
Root Cause Summary#
ChildProcessManager는 fork한 child process의 stderr 출력을 항상 logger.error()로 전달한다(packages/base/src/manager/child-process.manager.ts:138-141). Node.js는 deprecation/maintenance 경고를 throw가 아닌 stderr write로 emit하므로, child process가 정상 동작하더라도 aws-sdk v2(2.1599.0, mesh-agent의 transitive 의존성)를 require하는 순간 process.emitWarning이 stderr로 다중 라인 메시지를 쓰고, 매 라인이 별개의 error 로그로 기록된다. 본 cluster의 representative message는 그 다중 라인 중 v3 migration 권고 라인이다. 즉 "stderr = error"라는 단순 매핑이 informational warning을 error로 승격시킨 logging issue가 root cause다.
Technical Analysis#
Code Path#
- Entry point:
packages/cupix-tesla-mesh-agent/src/manager/mesh-extract.manager.ts:38—new ChildProcessManager(__dirname, 'process/mesh-extractor.process', options)생성. - Fork point:
packages/base/src/manager/child-process.manager.ts:74-77—fork(actualScriptPath, { stdio: ['inherit', stdOut, stdErr, 'ipc'] }). mesh-agent는stdioMode: 'pipe'로 호출하여 stdout/stderr를 캡처. - stderr 핸들링(failure point):
packages/base/src/manager/child-process.manager.ts:138-141.
this.process.stderr?.on('data', (data: Buffer) => {
const text = data.toString();
logger.error(`ChildProcessManager::setupEventHandlers | Child process stderr: ${text}`);
});
- Child process initialization:
packages/cupix-tesla-mesh-agent/src/process/mesh-extractor.process.ts:14,18—import * as MeshExtractor from '@cupix/app-mesh-extractor-v2',require('@cupix-compute/forge_bimmodel_extractor'). 이들이 transitive하게aws-sdkv2(2.1599.0)를 require. - v2 SDK lockfile evidence:
"aws-sdk": "2.1599.0",
- Node.js v20는
aws-sdkv2 모듈이 로드되는 시점에process.emitWarning(...)을 호출하여 stderr로 다중 라인 경고를 쓴다.stderr.on('data')는 OS의 pipe write buffering에 따라 한 번 또는 여러 번 fire되며, 각 fire는 별도logger.error호출이 된다 → 동일 시각에 5건의 error 로그.
기대 동작 vs 실제 동작
- 기대: Node.js의 informational warning은
warn또는info레벨로 기록되거나, 적어도 noise 억제(NODE_NO_WARNINGS=1등)되어야 한다. - 실제: stderr 모든 chunk가 무조건
error레벨로 기록되어, Datadogstatus:error메트릭/알림을 trigger.
Log Evidence#
검색 쿼리(클러스터 파일의 Datadog URL 그대로):
service:cupixworks-any-mesh-agent status:error @environment:production "ChildProcessManager::setupEventHandlers"
시간 범위: 2026-06-24T03:50:00.000Z ~ 2026-06-24T05:51:00.000Z (UTC)
5건의 error 로그가 동일 millisecond(2026-06-24 04:50:34.532Z = 13:50:34 KST)에 기록됨. 이는 같은 stderr write가 chunk 단위로 흘러나왔거나, Node.js가 multi-line warning을 한 번에 stderr에 쓴 결과를 'data' 이벤트가 라인별로 deliver한 것:
(node:48) NOTE: The AWS SDK for JavaScript (v2) will enter maintenance mode
on September 8, 2024 and reach end-of-support on September 8, 2025.
Please migrate your code to use AWS SDK for JavaScript (v3).
For more information, check blog post at https://a.co/cUPnyil
(Use `node --trace-warnings ...` to show where the warning was created)
본 cluster fingerprint(f0c83d580a1e3d84de142ae503a3aca6)는 Please migrate your code to use AWS SDK for JavaScript (v3). 라인에 해당. 형제 cluster들:
| Cluster ID | Representative line |
|---|---|
54db804c-604f-47ea-8e4e-691d867ee5d2 |
(node:48) NOTE: The AWS SDK for JavaScript (v2) will enter maintenance mode (already RCA-completed, root_cause_type: logging_issue) |
9441b8e0-9888-4f6a-8abb-7168eb795bca |
For more information, check blog post at https://a.co/cUPnyil |
3c1f61df-7736-4ce4-adc3-84927201b4d1, 260397a2-… |
나머지 라인 |
Status board 결과(동일 incident 그룹화 확인):
{
"scope": "svc:cupixworks-any-mesh-agent::unknown",
"active": null,
"recent": [{
"id": "2026-06-24-svc-cupixworks-any-mesh-agent--unknown-1",
"cluster_ids": [
"54db804c-604f-47ea-8e4e-691d867ee5d2",
"3c1f61df-7736-4ce4-adc3-84927201b4d1",
"924b7442-7fe7-4562-a4a3-ac9839f85bdd",
"9441b8e0-9888-4f6a-8abb-7168eb795bca",
"260397a2-4a67-4c22-a3ab-27995c61b8a0"
]
}]
}
Hypotheses Considered#
| # | Hypothesis | Evidence for | Evidence against | Verdict |
|---|---|---|---|---|
| H1 | ChildProcessManager가 child stderr 출력을 무조건 logger.error로 기록하기 때문에, Node.js의 deprecation warning(informational)이 error로 잘못 분류된다. |
packages/base/src/manager/child-process.manager.ts:138-141의 무조건 logger.error. Datadog에 동일 ms에 5건의 multi-line warning 본문이 error로 적재. mesh-agent와 base가 aws-sdk@2.1599.0을 의존성으로 가지고 있음. 형제 cluster 54db804c의 완료된 RCA가 동일 결론(root_cause_type: logging_issue). |
— | Confirmed |
| H2 | mesh 추출 child process가 실제로 crash/throw하여 stderr에 에러를 출력했다. | 메시지에 Error:, stack trace, exit code 흔적이 없음. (node:48) NOTE: prefix는 Node.js 표준 deprecation warning 포맷. ChildProcessManager는 process exit/close 시에도 별도 error 로그를 남기지만(l.107-127), 해당 시점에 그런 로그 없음. |
본문은 deprecation warning 텍스트, 작업 실패 흔적 없음 | Rejected |
| H3 | AWS SDK 호출이 실패해서 stderr로 메시지를 뱉었다(예: 자격증명 누락). | Please migrate your code to use AWS SDK for JavaScript (v3).는 Node.js가 SDK 로드 시점에 emit하는 표준 maintenance-mode notice로, AWS 호출 실패 메시지가 아님. |
메시지 본문이 일반 deprecation 안내문 | Rejected |
| H4 | mesh-agent의 stdioMode: 'pipe' 설정 때문에 발생하는 것이 아니라, child process side에서 console.error를 호출했다. |
mesh-extractor.process.ts 내부에서 console.error 호출은 없음. 메시지는 Node.js runtime의 process.emitWarning 출력이며 별도 user 코드와 무관. |
— | Rejected |
Fix Recommendation#
즉시 조치 (Critical)#
- 파일:
packages/base/src/manager/child-process.manager.ts:138-141 - 방향: stderr chunk를 무조건
logger.error로 기록하는 정책을 변경. 다음 중 한 가지를 권장:- 레벨 분리 — 권장: Node.js deprecation/warning 패턴(
/^\(node:\d+\)\s+(NOTE|DeprecationWarning|Warning)/)에 매칭되는 라인 또는 후속 라인은logger.warn으로 강등. 그 외는 기존대로error. 단, 멀티라인 경고는 첫 라인 매칭 후 일정 시간 내 후속 라인을 같은 레벨로 묶어야 한다. - child 환경에서 노이즈 억제: fork 옵션에
env: { ...process.env, NODE_NO_WARNINGS: '1' }을 추가하여 child process가 deprecation warning 자체를 stderr에 쓰지 않도록 함. 단점: 실제 의미 있는 deprecation도 함께 숨겨짐. - stderr 누적 후 분류: chunk를 즉시 로그하지 말고 짧은 시간 buffer로 누적, 라인 단위로 split하여 패턴별로 레벨을 결정.
- 레벨 분리 — 권장: Node.js deprecation/warning 패턴(
- 메모리 노트 (
MEMORY.md)의 "Assess error severity during RCA" 가이드라인과 일치: deprecation warning은warn레벨이 적절하며 즉시error로 알림을 띄울 사안 아님.
단기 개선 (1주 이내)#
- AWS SDK v2(
2.1599.0)를 사용하는 패키지 식별:packages/base/package.json:8packages/cupix-pano-postprocessor/package.json:18packages/cupix-tesla-compute-agent/package.json:21
- AWS SDK v2 EOL은 2025-09-08(메시지 본문). 본 RCA 시점(2026-06-24) 기준으로 이미 EOL 도래. 보안 패치 미수신 상태. AWS SDK v3(
@aws-sdk/client-*) modular 패키지로 마이그레이션 계획 수립 권장. v3로 전환 시 본 cluster의 noise 자체가 사라진다. - Datadog monitor:
service:cupixworks-any-mesh-agent status:error알림이 본 noise로 인해 발화하지 않도록, 메시지 패턴"AWS SDK for JavaScript (v2)"또는"NOTE: The AWS SDK"를 alert exclusion 으로 추가(임시).
장기 개선 (재발 방지)#
- 모든
ChildProcessManager류 wrapper에서 stderr→error 무차별 매핑을 금지하는 베이스 정책 수립. 라이브러리/런타임 표준 warning 패턴은 자동으로warn으로 강등. - agent 패키지의 외부 SDK 의존성을 정기적으로 audit(예: dependabot/renovate)하여 maintenance-mode/EOL 진입 전에 마이그레이션 트리거.
Monitoring#
- 본 noise가 다시 spike하는지 추적하기 위한 Datadog 쿼리(release dashboard widget용 —
writing-datadog-monitoring-queries가이드 준수: pipe/stats/count by 사용하지 않음):
service:cupixworks-any-mesh-agent status:error "ChildProcessManager::setupEventHandlers" "AWS SDK"
- 실제 mesh 추출 실패 추적(분리 후 noise와 구분):
service:cupixworks-any-mesh-agent status:error -"ChildProcessManager::setupEventHandlers"
- 형제 cluster들이 같이 사라지는지 추적:
service:cupixworks-any-mesh-agent status:error "ChildProcessManager::setupEventHandlers"
배포 후 검증: 위 첫 번째 쿼리의 timeseries가 fix 배포 시각 이후 0에 수렴해야 한다.
Risk Assessment#
- Risk level: low — 기능 영향 없음. 단, error 메트릭/알림 신뢰도를 떨어뜨려 실제 에러를 묻히게 할 수 있어 운영상 ‘medium-low’의 운영 리스크는 존재.
- 예상 복잡도: trivial —
child-process.manager.ts의 stderr 핸들러 한 곳 수정. 단위 테스트(packages/base/src/manager/child-process.manager.spec.ts)에 deprecation warning 패턴 케이스 추가 정도.