ES /docs

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.setupEventHandlersstderr.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#

  1. 2026-06-24 13:50:34 KSTcupixworks-any-mesh-agent가 mesh-extractor child process를 fork. Node.js가 aws-sdk v2 deprecation 경고를 stderr 다중 라인으로 발행. ChildProcessManager가 라인별로 logger.error() 호출 → Datadog status:error 5건이 같은 millisecond에 기록됨. 본 cluster는 그 중 v3 migration 권고 라인.
  2. 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#

Datadog Logs

text
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로 기록됨:

text
(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:38new ChildProcessManager(__dirname, 'process/mesh-extractor.process', options) 생성.
  • Fork point: packages/base/src/manager/child-process.manager.ts:74-77fork(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.
packages/base/src/manager/child-process.manager.ts:138-141typescript
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,18import * as MeshExtractor from '@cupix/app-mesh-extractor-v2', require('@cupix-compute/forge_bimmodel_extractor'). 이들이 transitive하게 aws-sdk v2(2.1599.0)를 require.
  • v2 SDK lockfile evidence:
packages/base/package.jsontext
"aws-sdk": "2.1599.0",
  • Node.js v20는 aws-sdk v2 모듈이 로드되는 시점에 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 레벨로 기록되어, Datadog status:error 메트릭/알림을 trigger.

Log Evidence#

검색 쿼리(클러스터 파일의 Datadog URL 그대로):

text
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한 것:

text
(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 그룹화 확인):

json
{
  "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로 기록하는 정책을 변경. 다음 중 한 가지를 권장:
    1. 레벨 분리 — 권장: Node.js deprecation/warning 패턴(/^\(node:\d+\)\s+(NOTE|DeprecationWarning|Warning)/)에 매칭되는 라인 또는 후속 라인은 logger.warn으로 강등. 그 외는 기존대로 error. 단, 멀티라인 경고는 첫 라인 매칭 후 일정 시간 내 후속 라인을 같은 레벨로 묶어야 한다.
    2. child 환경에서 노이즈 억제: fork 옵션에 env: { ...process.env, NODE_NO_WARNINGS: '1' }을 추가하여 child process가 deprecation warning 자체를 stderr에 쓰지 않도록 함. 단점: 실제 의미 있는 deprecation도 함께 숨겨짐.
    3. stderr 누적 후 분류: chunk를 즉시 로그하지 말고 짧은 시간 buffer로 누적, 라인 단위로 split하여 패턴별로 레벨을 결정.
  • 메모리 노트 (MEMORY.md)의 "Assess error severity during RCA" 가이드라인과 일치: deprecation warning은 warn 레벨이 적절하며 즉시 error로 알림을 띄울 사안 아님.

단기 개선 (1주 이내)#

  • AWS SDK v2(2.1599.0)를 사용하는 패키지 식별:
    • packages/base/package.json:8
    • packages/cupix-pano-postprocessor/package.json:18
    • packages/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 사용하지 않음):
text
service:cupixworks-any-mesh-agent status:error "ChildProcessManager::setupEventHandlers" "AWS SDK"
  • 실제 mesh 추출 실패 추적(분리 후 noise와 구분):
text
service:cupixworks-any-mesh-agent status:error -"ChildProcessManager::setupEventHandlers"
  • 형제 cluster들이 같이 사라지는지 추적:
text
service:cupixworks-any-mesh-agent status:error "ChildProcessManager::setupEventHandlers"

배포 후 검증: 위 첫 번째 쿼리의 timeseries가 fix 배포 시각 이후 0에 수렴해야 한다.

Risk Assessment#

  • Risk level: low — 기능 영향 없음. 단, error 메트릭/알림 신뢰도를 떨어뜨려 실제 에러를 묻히게 할 수 있어 운영상 ‘medium-low’의 운영 리스크는 존재.
  • 예상 복잡도: trivialchild-process.manager.ts의 stderr 핸들러 한 곳 수정. 단위 테스트(packages/base/src/manager/child-process.manager.spec.ts)에 deprecation warning 패턴 케이스 추가 정도.