All Elements are S trust_level (completed in the range)
RCA: All Elements are S trust_level (completed in the range)
Overview#
What Happened#
2026-04-21 18:52:13 UTC에 cupixworks-sitetrack-postprocessor-agent에서 sitetrack ID 16072 (job ID 1027218)에 대한 후처리 과정 중 validation 단계에서 에러가 발생했다. 모든 element trace의 trust_level이 S (completed)이거나 미설정 상태여서, 후처리할 대상이 없다고 판단하여 intentional throw로 작업을 중단했다. 지난 8일간 동일 에러가 16회 발생하여 반복적인 패턴이다.
Quick Facts#
| Field | Value |
|---|---|
| exception.class | Error |
| exception.message | All Elements are S trust_level (completed in the range) |
| top_frame | base-postprocessor-runner.ts:66 |
| env | production, us-west-2 |
Affected Teams#
| Team / Domain | Error Count | Impact |
|---|---|---|
| gilbaneco (team ID 780) | 16 (8일간) | postprocessor job이 에러로 종료되어 sitetrack 결과가 갱신되지 않음 |
Timeline#
- 2026-04-21T18:51:56Z -- PostprocessorService가 SQS 메시지를 수신하고 job 1027218 처리 시작
- 2026-04-21T18:52:10Z -- FileSystem 로드 완료, 1340 cpElementRecordsMeta 로드, 여러 task에 element record 배분 완료
- 2026-04-21T18:52:13Z --
applyBimValidatorResultsV3실행 후validateModel호출 시 모든 in-range element가Strust_level이어서 에러 throw - 2026-04-21T18:52:13Z -- catch 블록에서
updateErrorActionJob호출하여 job을 에러 상태로 마킹, SQS 메시지 삭제
Error Log#
All Elements are S trust_level (completed in the range)
Impact#
- Service:
cupixworks-sitetrack-postprocessor-agent - Team: gilbaneco
- 발생 횟수: 1 (이 클러스터), 16 (최근 8일간 동일 서비스 전체)
- 최초 발생: 2026-04-21T18:52:13.186Z
- 최근 발생: 2026-04-21T18:52:13.186Z
Root Cause Summary#
BasePostprocessorRunner.validateModel() 메서드는 후처리 결과를 적용한 뒤, 처리 대상이 되는 element trace가 실제로 존재하는지 검증한다. 이때 모든 in-range element의 trust_level이 S (completed)이거나 undefined(미설정)이면, 후처리할 대상이 없다고 판단하여 의도적으로 Error를 throw하고 error code AGT1812를 설정한다. 이것은 데이터 상태에 대한 validation 실패이며, 코드 버그가 아니라 기대하지 않은 데이터 조건에 대한 설계된 동작이다. 문제는 이 상황이 error 레벨로 로깅되어 Datadog에서 실제 장애와 구분이 어렵다는 점이다. 실제로는 이미 완료된 sitetrack에 대해 중복 처리 요청이 들어온 것이므로, warn 레벨이 더 적절하다.
Technical Analysis#
Code Path#
- Entry point:
postprocessor-service.ts:48--PostprocessorService.run()메서드 - SQS 메시지로부터 job ID 1027218을 받아 처리 시작
postprocessor-service.ts:74-76--loadFileSystem,uploadDataFiles,loadAllSiteinsightsModel순차 실행postprocessor-service.ts:86--applyResultsToModel(cpSitetrack)호출하여 BIM validator 결과를 모델에 적용postprocessor-service.ts:87--validateModel(cpSitetrack)호출- Failure point:
base-postprocessor-runner.ts:63-66-- 모든 in-range element의 trust_level이S이므로nonCompletedETs.length == 0조건 충족, 에러 throw
validateModel(cpParent: SiteinsightParentModel): void {
if (cpParent.deviationType === TESLA.DeviationType.Report) {
logger.debug('BasePostprocessorRunner::validateModel | skipped - report type');
return;
}
const [outOfRangeETs, inRangeETs] = partition(cpParent.cpElementTraces, et => et.processingResult?.points_validator?.trust_level == 'E');
if (inRangeETs.length == 0) {
this.jobManager.setErrorCode(ErrorCode.Agent.DeviationAllElementsOutOfRange);
throw new Error('All Elements are E trust_level (out of range)');
}
const [completedETs, nonCompletedETs] = partition(inRangeETs, et => {
const trustLevel = et.processingResult?.points_validator?.trust_level;
return trustLevel === 'S' || !trustLevel;
});
if (nonCompletedETs.length == 0) {
this.jobManager.setErrorCode(ErrorCode.Agent.DeviationAllElementsCompletedWithinRange);
logger.warn('BasePostprocessorRunner::validateModel | All Elements are S trust_level (completed in the range)');
throw new Error('All Elements are S trust_level (completed in the range)');
}
}
validateModel 내부에서는 logger.warn으로 기록하지만, throw된 에러가 PostprocessorService.run()의 catch 블록에서 logger.error로 다시 로깅된다:
} catch (error) {
logger.error('PostprocessorService::run | end', error);
await this.jobManager.updateErrorActionJob(this.ActionName);
}
이 catch 블록은 모든 예외를 동일하게 error 레벨로 로깅하므로, 의도적 validation 실패(예: all elements completed)와 실제 시스템 장애를 구분하지 못한다.
Log Evidence#
검색에 사용한 Datadog 쿼리:
service:cupixworks-sitetrack-postprocessor-agent status:error "All Elements are S trust_level"
Time range: 2026-04-14T00:00:00Z to 2026-04-22T23:59:00Z
이 쿼리로 최근 8일간 동일 에러 16건 확인:
2026-04-22 03:52:13 KST - All Elements are S trust_level (completed in the range)
2026-04-21 10:16:54 KST - All Elements are S trust_level (completed in the range)
2026-04-18 14:02:29 KST - All Elements are S trust_level (completed in the range)
2026-04-17 15:37:17 KST - All Elements are S trust_level (completed in the range)
2026-04-17 11:56:04 KST - All Elements are S trust_level (completed in the range)
2026-04-17 11:20:07 KST - All Elements are S trust_level (completed in the range)
2026-04-17 06:12:29 KST - All Elements are S trust_level (completed in the range)
2026-04-17 00:15:34 KST - All Elements are S trust_level (completed in the range)
2026-04-16 17:01:33 KST - All Elements are S trust_level (completed in the range)
2026-04-15 15:54:12 KST - All Elements are S trust_level (completed in the range)
2026-04-15 13:49:32 KST - All Elements are S trust_level (completed in the range)
2026-04-14 18:16:29 KST - All Elements are S trust_level (completed in the range)
(+ 4건 추가)
에러 발생 직전 실행 흐름 (job 1027218):
03:51:56 KST [info] AwsS3Manager::constructor | region: us-west-2
03:51:57 KST [info] BaseService::runByMessage | id: 1027218
03:51:57 KST [info] PostprocessorService::run | begin
03:51:57 KST [info] JobManager::loadJob | begin - job id: 1027218
03:52:10 KST [info] FileSystemManager::loadCPSiteinsightsModel | loaded 1340 cpElementRecordsMeta
03:52:10 KST [info] BasePostprocessorRunner::loadFileSystem | end
03:52:11 KST [info] BasePostprocessorRunner::uploadDataFiles | end
03:52:12 KST [info] SitetrackPostprocessorRunner::createCPElementTraces | fallback map built with 0 entries
03:52:13 KST [info] CPSitetrack::applyBimValidatorResultsV3 | bimValidationScoped: true
03:52:13 KST [warn] BasePostprocessorRunner::validateModel | All Elements are S trust_level (completed in the range)
03:52:13 KST [error] All Elements are S trust_level (completed in the range)
03:52:13 KST [info] PostprocessorService::run | end
에러 로그의 full stack trace:
Error: All Elements are S trust_level (completed in the range)
at SitetrackPostprocessorRunner.validateModel (/tmp/agent/dist/app.cjs:9186:13)
at PostprocessorService.run (/tmp/agent/dist/app.cjs:9715:18)
at async /tmp/agent/dist/app.cjs:6016:17
at async BaseService2.runByMessage (/tmp/agent/dist/app.cjs:6012:15)
at async BaseService2.runByMessages (/tmp/agent/dist/app.cjs:6000:13)
at async BaseService2.checkingQueue (/tmp/agent/dist/app.cjs:5964:15)
at async PostprocessorService.init (/tmp/agent/dist/app.cjs:6185:9)
에러 로그의 주요 메타데이터:
{
"sitetrack": { "id": 16072 },
"job": { "id": 1027218 },
"team": { "domain": "gilbaneco", "id": 780 },
"user": { "id": 38390, "email": "wabukhader@gilbaneco.com" },
"session": { "id": "9a24c6e0e913619602649541f01432b9716ff9ec" },
"region": "us-west-2",
"environment": "production"
}
Hypotheses Considered#
| # | Hypothesis | Evidence for | Evidence against | Verdict |
|---|---|---|---|---|
| H1 | 이미 완료된 sitetrack에 대해 중복 처리 요청이 SQS에 들어와서, 모든 element가 이미 S (completed) 상태임 | 로그에서 1340개 elementRecordsMeta가 정상 로드됨, applyBimValidatorResultsV3도 정상 실행됨, 에러 메시지가 "모든 element가 completed"라는 데이터 상태를 명시 |
-- | Confirmed |
| H2 | BIM validator 결과 적용 로직(applyBimValidatorResultsV3)에 버그가 있어 trust_level이 잘못 설정됨 |
applyBimValidatorResultsV3가 bimValidationScoped: true로 정상 실행됨 |
동일 에러가 다양한 시간대에 16회 반복 발생하여 특정 데이터 corruption보다 반복적 패턴에 해당, 에러 코드 AGT1812가 이 시나리오를 위해 명시적으로 정의됨 |
Rejected |
| H3 | processingResult가 null/undefined여서 !trustLevel 조건에 의해 잘못 "completed"로 분류됨 |
base-postprocessor-runner.ts:61에서 !trustLevel 조건이 undefined를 completed로 간주 |
로그에서 loadCPSiteinsightsModel이 1340개 레코드를 정상 로드, applyBimValidatorResultsV3가 결과를 적용했으므로 processingResult가 존재할 가능성 높음. 그러나 일부 element에 processingResult가 없을 수 있어 부분적으로 기여 가능 |
Inconclusive |
Fix Recommendation#
즉시 조치 (Critical)#
postprocessor-service.ts:98-101의 catch 블록에서AGT1812(DeviationAllElementsCompletedWithinRange) error code가 설정된 경우logger.warn으로 로깅하도록 변경. 이미 완료된 sitetrack의 중복 처리는 시스템 장애가 아니므로error레벨이 부적절하다.- 또는
base-postprocessor-runner.ts:63-67에서 throw 대신logger.warn만 하고 early return하여 작업을 정상 종료 처리하는 방안도 검토. 단, 현재 throw 후updateErrorActionJob으로 job 상태를 에러로 마킹하는 흐름이 의도적 설계일 수 있으므로 팀과 확인 필요.
단기 개선 (1주 이내)#
- SQS 메시지 발행 측(upstream)에서 이미 완료된 sitetrack에 대한 중복 처리 요청이 왜 발생하는지 조사. gilbaneco 팀의 sitetrack 16072가 반복적으로 처리 요청을 받는 패턴 확인 필요.
PostprocessorService.run()의 catch 블록을 개선하여 known error code (AGT1810,AGT1811,AGT1812)에 대해서는warn레벨로, 예상치 못한 에러만error레벨로 로깅하도록 분리.
장기 개선 (재발 방지)#
- Agent 전체의 에러 핸들링 패턴 표준화: validation 실패(데이터 상태 문제)와 시스템 장애(인프라/코드 버그)를 명확히 분리하는 custom exception 계층 도입 (예:
ValidationErrorvsSystemError). - Job 중복 실행 방지를 위한 idempotency 체크 강화 -- job 시작 시 sitetrack의 현재 상태를 확인하여 이미 완료된 경우 조기 종료.
Monitoring#
- 로그 레벨 변경 후 아래 쿼리로
warn레벨에서 모니터링:
service:cupixworks-sitetrack-postprocessor-agent "All Elements are S trust_level" status:warn
- error 레벨에서 이 메시지가 더 이상 발생하지 않는지 확인:
service:cupixworks-sitetrack-postprocessor-agent status:error "All Elements are S trust_level"
- 동일 sitetrack ID에 대한 반복 처리 요청 패턴을 추적하는 메트릭 추가 고려.
Risk Assessment#
- Risk level: low
- 예상 복잡도: trivial -- 로그 레벨 변경만으로 즉시 해결 가능. 데이터 손실이나 기능 장애 없음. 이미 완료된 sitetrack에 대한 중복 처리 시도일 뿐 사용자에게 실질적 영향 없음.