ES /docs

ChildProcessManager::setupEventHandlers | Child process stderr: (node:48) NOTE: The AWS SDK for Java

RCA: ChildProcessManager stderr — AWS SDK v2 maintenance mode notice

Overview#

What Happened#

cupixworks-any-mesh-agent가 mesh 추출 child process를 fork할 때마다 Node.js가 aws-sdk v2 패키지에 대한 maintenance-mode 경고를 stderr로 출력한다. ChildProcessManager.setupEventHandlersstderr.on('data') 핸들러가 이 출력을 logger.error()로 기록하기 때문에, 단순 deprecation 경고가 Datadog에서 status:error로 집계되어 error cluster로 분류되었다. 실제 작업 실패는 아니다.

Quick Facts#

Field Value
exception.class (none — stderr forwarding, not a thrown exception)
exception.message (node:48) NOTE: The AWS SDK for JavaScript (v2) will enter maintenance mode
top_frame packages/base/src/manager/child-process.manager.ts:138-141
runtime Node.js 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 logs; 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가 v2 SDK deprecation 경고를 stderr로 발행. ChildProcessManager가 line별로 logger.error() 호출 → Datadog에 status:error 5건 기록 (cluster 묶음).
  2. 2026-06-24 11:17, 11:41, 12:28, 12:44, 13:50 KST — 동일 패턴 반복. child process fork할 때마다 동일 stderr 메시지가 error로 기록됨 (24시간 동안 최소 5회 관측).

Error Log#

Datadog Logs

text
ChildProcessManager::setupEventHandlers | Child process stderr: (node:48) NOTE: The AWS SDK for JavaScript (v2) will enter maintenance mode

Impact#

  • Service: cupixworks-any-mesh-agent
  • Team: demokr
  • 발생 횟수: 1 (대표 로그); 실제로는 child process fork 시마다 5줄씩 발생 (24h 동안 5회 fork 관측됨)
  • 최초 발생: 2026-06-24 13:50 KST
  • 최근 발생: 2026-06-24 13:50 KST

Root Cause Summary#

@agents/basecupix-tesla-mesh-agent가 의존하는 aws-sdk@2.1599.0(v2)이 Node.js 런타임에서 maintenance-mode deprecation 경고를 stderr에 출력한다. ChildProcessManager는 mesh-extractor child process를 stdio: 'pipe'로 fork한 뒤 child의 stderr 출력을 모두 logger.error()로 전달하도록 구현되어 있다(packages/base/src/manager/child-process.manager.ts:138-141). 결과적으로 single deprecation banner 한 번이 5줄로 분할되어 모두 status:error 로그로 기록되고, error-sweeper가 이를 cluster로 식별했다. 실제 mesh extraction은 정상 완료된다 — false-positive error 로그다.

Technical Analysis#

Code Path#

  • Entry point: packages/cupix-tesla-mesh-agent/src/manager/mesh-extract.manager.ts:38MeshExtractManager constructor가 ChildProcessManager를 생성.
  • Fork: packages/base/src/manager/child-process.manager.ts:74-77fork(actualScriptPath, { stdio: ['inherit', stdOut, stdErr, 'ipc'] }).
  • stderr handler 설정: packages/base/src/manager/child-process.manager.ts:138-141.
  • Failure point (logging-only, not functional): packages/base/src/manager/child-process.manager.ts:140 — child의 모든 stderr 라인을 logger.error()로 기록.
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}`);
});
packages/cupix-tesla-mesh-agent/src/manager/mesh-extract.manager.ts:37-39typescript
constructor(options?: ChildProcessOptions) {
    this.childProcessManager = new ChildProcessManager(__dirname, 'process/mesh-extractor.process', options);
}
packages/base/package.json:6-9 (deps)json
"dependencies": {
    "aws-sdk": "2.1599.0",
    ...
}

기대 동작 vs 실제 동작:

  • 기대: child process의 stderr는 진짜 에러(uncaught exception, native crash 등)만 error 레벨로 기록되어야 한다. Node.js process warning((node:NN) NOTE: ...)은 정보성 메시지이므로 warn 또는 info 수준이 적절하다.
  • 실제: stderr로 들어오는 모든 텍스트가 무조건 logger.error()로 전달된다. Node.js는 deprecation banner를 5줄에 걸쳐 stderr에 한 번에 쓰고, 핸들러가 chunk 단위로 호출되어 각 라인이 개별 error log entry가 된다.

Log Evidence#

Datadog query:

text
service:cupixworks-any-mesh-agent status:error "ChildProcessManager::setupEventHandlers"

24시간 동안 동일 child process fork 이벤트가 최소 5회 발생했으며, 각 fork마다 동일한 5줄 banner가 error로 기록됨:

text
2026-06-24 13:50:34  error  ChildProcessManager::setupEventHandlers | Child process stderr: (node:48) NOTE: The AWS SDK for JavaScript (v2) will enter maintenance mode
2026-06-24 13:50:34  error  ChildProcessManager::setupEventHandlers | Child process stderr: on September 8, 2024 and reach end-of-support on September 8, 2025.
2026-06-24 13:50:34  error  ChildProcessManager::setupEventHandlers | Child process stderr: Please migrate your code to use AWS SDK for JavaScript (v3).
2026-06-24 13:50:34  error  ChildProcessManager::setupEventHandlers | Child process stderr: For more information, check blog post at https://a.co/cUPnyil
2026-06-24 13:50:34  error  ChildProcessManager::setupEventHandlers | Child process stderr: (Use `node --trace-warnings ...` to show where the warning was created)

동일 fork 패턴이 11:17, 11:41, 12:28, 12:44, 13:50 KST에 반복됨. 메시지 텍스트는 Node.js가 AWS SDK v2 로딩 시 출력하는 공식 deprecation banner와 정확히 일치 (AWS 공식 blog: a.co/cUPnyil).

Hypotheses Considered#

# Hypothesis Evidence for Evidence against Verdict
H1 child process stderr가 Node.js의 AWS SDK v2 maintenance-mode 경고를 출력하고, ChildProcessManager가 stderr 전체를 logger.error()로 기록해 false-positive error로 집계됨 child-process.manager.ts:138-141에서 모든 stderr를 logger.error로 매핑; Datadog 로그가 Node.js 공식 deprecation banner 5줄과 완전 일치; packages/base/package.jsonaws-sdk: 2.1599.0 명시 Confirmed
H2 mesh extraction 자체가 실패해서 child가 에러로 죽었다 로그에 Child process closed (code/signal 포함), uncaught exception, MeshExtractManager::execute | error 등 실제 실패 신호 없음. stderr 라인만 5줄 출력 후 정상 진행 Rejected
H3 child process가 부팅 시 fatal error로 종료되어 banner가 마지막 출력으로 남았다 child-process.manager.ts:107-127의 close/exit 핸들러도 logger.error로 로깅하는데, Datadog에 해당 시각에 close/exit 로그 없음. 즉 child는 살아남아 작업을 계속 수행함 Rejected
H4 Agent 코드가 직접 aws-sdk v2를 import하여 main process에서 banner 발행 packages/cupix-tesla-mesh-agent에는 aws-sdk 직접 import 없음 (Grep 결과 0건). @agents/base@cupix/app-mesh-extractor-v2 의 transitive 의존성으로 child process에서만 로드됨 main process 로그에는 동일 banner 없음 — child process 컨텍스트에서만 stderr로 출력 Rejected

Fix Recommendation#

즉시 조치 (Critical)#

운영상 즉시 위험은 없음 (false-positive). 단, 진짜 에러를 가리는 노이즈가 되므로 다음을 권장:

  • 파일: packages/base/src/manager/child-process.manager.ts:138-141.
  • 방향: child stderr에서 Node.js process warning 패턴((node:\d+) NOTE:, (node:\d+) Warning:, DeprecationWarning, (Use node --trace-warnings ...), 후속 banner 라인)을 인식하여 logger.warn() 또는 logger.info()로 다운그레이드한다. 그 외 일반 stderr는 기존대로 logger.error() 유지. 멀티라인 banner를 한 entry로 buffer하는 것도 고려.
  • 근거: 실제 process crash나 native error는 SIGNAL/exit code(close/exit 핸들러)로도 잡히므로 stderr-only 경고를 error로 올릴 필요가 없다.

단기 개선 (1주 이내)#

  • aws-sdk v2 → v3 마이그레이션 계획 수립. v2는 2024-09-08부터 maintenance mode, 2025-09-08 end-of-support였으므로 이미 EOL이 지난 상태.
  • 영향 패키지: packages/base/package.json (aws-sdk: 2.1599.0), packages/cupix-pano-postprocessor/package.json (aws-sdk: 2.1599.0), packages/cupix-tesla-compute-agent/package.json (aws-sdk: ^2.1407.0), 그리고 transitive 의존인 @cupix/app-mesh-extractor-v2.
  • 임시 우회로 child process 진입점에서 process.removeAllListeners('warning') 또는 환경변수 AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE=1을 설정해 banner 자체를 억제할 수 있다 (AWS 공식 제공 옵션). 단, 이는 근본 해결이 아닌 잡음 차단 목적의 임시 조치이며, v3 마이그레이션 완료 시 제거한다.

장기 개선 (재발 방지)#

  • 의존성 EOL 모니터링: 모든 agent 패키지의 aws-sdk, node, tsx 등 핵심 라이브러리에 대해 dependabot/renovate 같은 자동 알림 도입.
  • Child process stderr 로깅 정책: 모든 ChildProcessManager 사용처에서 동일한 패턴이 발생하므로(MeshExtractManager 외 다른 *Manager에서도 reuse), base 패키지에서 한 번 수정하면 모든 agent에 전파됨. ChildProcessManager에 "warn-pattern matcher" 옵션을 노출하여 agent별로 추가 패턴을 등록할 수 있게 한다.

Monitoring#

추가/유지할 Datadog 쿼리:

  • AWS SDK v2 banner 발생률 추적 (수정 후 0으로 떨어져야 함):
text
service:cupixworks-any-mesh-agent "AWS SDK for JavaScript (v2)"
  • 진짜 child process 실패만 분리해서 모니터:
text
service:cupixworks-any-mesh-agent status:error "ChildProcessManager::setupEventHandlers | Child process closed"
  • mesh-agent 전체 에러율 (banner 노이즈 제거 후의 baseline 확인용):
text
service:cupixworks-any-mesh-agent status:error -"AWS SDK for JavaScript" -"Use `node --trace-warnings"

Risk Assessment#

  • Risk level: low — 기능적 영향 없음. 다만 error 로그 노이즈가 누적되어 진짜 에러 탐지를 방해하고, on-call alerting의 SNR을 낮춤.
  • 예상 복잡도: trivial (즉시 조치: stderr → warn 다운그레이드 1곳). 장기 v3 마이그레이션은 standard.