ES /docs

BIM 모델에 level 매핑 element 없음 — 할당 누락

RCA: No Elements found

Overview#

What Happened#

2026-04-20 17:58:46 UTC에 cupixworks-sitetrack-preprocessor-agent 서비스의 sitetrack 2406 (job 179175) 전처리 과정에서 BIM 2652의 모든 카테고리(30개)에 대해 level 5043의 element를 조회했으나 결과가 0건이어서 No Elements found 에러(AGT1808)가 발생했다. ap-southeast-2 리전의 Built 팀 고객(user 7354) 작업이 영향을 받았다.

Quick Facts#

Field Value
exception.class Error
exception.message No Elements found
top_frame SiteTrackPreprocessorRunner.createCPElements (app.cjs:9397)
runtime Node.js (bundled as app.cjs)
env production, ap-southeast-2

Affected Teams#

Team / Domain Error Count Impact
built (team 16) 1 sitetrack 2406 전처리 실패, job 179175가 error 상태로 종료됨

Timeline#

  1. 17:58:42Z — job 179175 메시지 수신, PreprocessorService::run 시작
  2. 17:58:43Z — sitetrack 2406 로드 완료, BIM 1개(ID 2652) 로드 성공, capture 69044 로드
  3. 17:58:45ZcreateCPElements 시작, BIM 2652에 대해 30개 카테고리 × level [5043] 조합으로 element API 호출
  4. 17:58:46Z — 모든 카테고리에서 elements_count: 0 → No Elements found (AGT1808) 에러 발생
  5. 17:58:46ZupdateErrorActionJob 호출, job error 상태로 전환, SQS 메시지 삭제

Error Log#

Datadog Logs

text
Error: No Elements found
    at SiteTrackPreprocessorRunner.createCPElements (/tmp/agent/dist/app.cjs:9397:13)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async /tmp/agent/dist/app.cjs:818:24
    at async descriptor.value (/tmp/agent/dist/app.cjs:817:30)
    at async SiteTrackPreprocessorRunner.createTargetModels (/tmp/agent/dist/app.cjs:9289:24)
    at async /tmp/agent/dist/app.cjs:818:24
    at async descriptor.value (/tmp/agent/dist/app.cjs:817:30)
    at async PreprocessorService.run (/tmp/agent/dist/app.cjs:9643:13)
    at async /tmp/agent/dist/app.cjs:6016:17
    at async BaseService2.runByMessage (/tmp/agent/dist/app.cjs:6012:15)

Impact#

  • Service: cupixworks-sitetrack-preprocessor-agent
  • Team: built
  • 발생 횟수: 1
  • 최초 발생: 2026-04-20T17:58:46.036Z
  • 최근 발생: 2026-04-20T17:58:46.036Z

Root Cause Summary#

BIM 모델 2652가 level 5043에 매핑된 element를 하나도 갖고 있지 않아 발생한 데이터 상태 문제이다. createCPElements 메서드는 BIM × 카테고리 × level 조합으로 Tesla API의 element.getAll을 호출하여 element를 로드하는데, 30개 카테고리 모두에서 해당 level의 element가 0건이었다. 이는 BIM의 element가 아직 해당 level에 할당(assign)되지 않았거나, BIM 모델 자체에 element가 없는 상태에서 sitetrack 전처리가 트리거된 것이 원인이다. 코드는 이 상황을 의도적으로 AGT1808 에러 코드와 함께 실패 처리하도록 설계되어 있다.

Technical Analysis#

Code Path#

  1. Entry point: preprocessor-service.ts:49PreprocessorService.run() 이 job ID 179175로 호출됨
  2. sitetrack 2406 로드 후 SiteTrackPreprocessorRunner.createTargetModels() 호출
  3. BIM 로드: base-preprocessor-runner.ts:35 — BIM 1개(ID 2652) 로드 성공
packages/siteinsights/src/runner/base-preprocessor-runner.ts:35-51typescript
async createCPBims(cpParent: SiteinsightParentModel): Promise<CPBim[]> {
    logger.debug('BasePreprocessorRunner::createCPBims | begin');

    const facilityKey = cpParent.facilityKey;
    const useSiteinsights = true;
    // ...
    const candidateBims = this.cupixApi.bim.getAll(facilityKey, useSiteinsights)
        .then(bims => bims.filter(bim => bim.mesh_state === 'extracted'))
        .then(bims => bims.filter(bim => bim.published_at));
    const cpBims = await createModels(CPBim, cpParent, candidateBims);
    // ...
    return cpBims;
}
  1. Level ID 결정: base-siteinsights-preprocessor-runner.ts:59-72 — capture 69044의 level ID 5043이 uniqueLevelIds로 결정됨
  2. Element 로드 (failure point): sitetrack-preprocessor-runner.ts:130-156 — BIM 2652 × 30개 카테고리 × level [5043] 조합으로 element API 호출, 모든 조합에서 0건 반환
packages/cupix-sitetrack-preprocessor-agent/src/runner/sitetrack-preprocessor-runner.ts:138-155typescript
for (const cpBim of cpBims) {
    for (const cpCategory of cpCategories) {
        const cpElements = await createModels(CPElement, cpBim, this.cupixApi.element.getAll(cpSitetrack.facilityKey, cpBim.id, cpCategory.id, levelIds));
        cpElements.forEach(cpElement => cpElement.cpCategory = cpCategory);
        logger.debug('SiteTrackPreprocessorRunner::loadCPElements | Bim ID: %d, Category ID: %d, elements_count: %d', cpBim.id, cpCategory.id, cpElements.length);
    }
}

const cpElements = cpBims.flatMap(cpBim => cpBim.cpElements);
if (cpElements.length === 0) {
    this.jobManager.setErrorCode(ErrorCode.Agent.DeviationElementsNotFound);
    throw new Error('No Elements found');
}
  1. 에러 처리: preprocessor-service.ts:94-97 — catch 블록에서 updateErrorActionJob 호출하여 job을 error 상태로 전환
packages/cupix-sitetrack-preprocessor-agent/src/preprocessor-service.ts:94-97typescript
} catch (error) {
    logger.error('PreprocessorService::run | end', error);
    await this.jobManager.updateErrorActionJob(this.ActionName);
}

기대 동작: BIM 2652에 level 5043에 할당된 element가 존재하여 전처리가 정상 진행되어야 함. 실제 동작: level 5043에 해당하는 element가 0건이어서 AGT1808 에러로 실패.

Log Evidence#

Datadog에서 사용한 쿼리:

text
service:cupixworks-sitetrack-preprocessor-agent @job.id:179175

info 레벨 로그 타임라인 (전체 실행 흐름):

text
02:58:42 KST | info  | BaseService::runByMessage | id: 179175
02:58:42 KST | info  | PreprocessorService::run | begin
02:58:43 KST | info  | PreprocessorService::createCPSitetrack | begin - sitetrackId: 2406
02:58:43 KST | info  | PreprocessorService::createCPSitetrack | end
02:58:43 KST | warn  | JobManager::updateJobProgress | skipped - progress: 7, status: load_target_models
02:58:46 KST | error | No Elements found
02:58:46 KST | info  | PreprocessorService::run | end

Kibana debug 로그 (핵심 — BIM과 element 조회 결과):

text
02:58:43 KST | debug | BasePreprocessorRunner::createCPBims | end - bim count: 1, bim ids: [2652]
02:58:45 KST | debug | BasePreprocessorRunner::getUniqueLevelIds | end - uniqueLevelIds: 5043
02:58:45 KST | debug | SiteTrackPreprocessorRunner::createCPElements | start - Bim count: 1
02:58:45 KST | debug | SiteTrackPreprocessorRunner::createCPElements | levelIds: 1 [5043]
02:58:45 KST | debug | SiteTrackPreprocessorRunner::loadCPElements | Bim ID: 2652, Category ID: 2129, elements_count: 0
02:58:45 KST | debug | SiteTrackPreprocessorRunner::loadCPElements | Bim ID: 2652, Category ID: 2130, elements_count: 0
...  (30개 카테고리 모두 elements_count: 0)
02:58:46 KST | debug | SiteTrackPreprocessorRunner::loadCPElements | Bim ID: 2652, Category ID: 2286, elements_count: 0
02:58:46 KST | debug | JobManager::updateErrorActionJob | begin - jobId: 179175, errorCode: AGT1808

Kibana 검색 쿼리:

text
service: sitetrack-preprocessor, index: logstash-agents*, level: debug, sitetrack.id: 2406

Hypotheses Considered#

# Hypothesis Evidence for Evidence against Verdict
H1 BIM 2652에 level 5043에 매핑된 element가 없는 데이터 상태 문제 debug 로그에서 30개 카테고리 × level [5043] 조합 모두 elements_count: 0 확인. BIM 자체는 정상 로드됨(mesh_state=extracted, published_at 존재). Confirmed
H2 Tesla Element API 장애로 인한 빈 응답 BIM, category, capture, pointcloud 등 다른 API 호출은 모두 정상. 30개 카테고리 전부 일관되게 0건 반환(장애라면 일부는 500 에러 예상). API 에러 로그 없음. Rejected
H3 level ID가 잘못 결정되어 element 조회 시 잘못된 level로 필터링 capture 69044의 level_id 5043이 정상적으로 추출됨. getUniqueLevelIds 로직이 capture에서 올바르게 level을 추출하는 것 확인 (base-siteinsights-preprocessor-runner.ts:59-72). Rejected

Fix Recommendation#

즉시 조치 (Critical)#

  • 조치 불필요. 이 에러는 코드 버그가 아니라 데이터 상태에 의한 의도된 실패이다. BIM 2652에 level 5043의 element가 존재하지 않는 상황은 BIM 모델의 element가 해당 level에 아직 할당되지 않았거나, BIM 업로드/추출 후 element-level 매핑이 완료되기 전에 sitetrack 전처리가 트리거된 것일 수 있다.
  • Built 팀(user 7354)에게 BIM 2652의 element가 level 5043에 올바르게 할당되어 있는지 확인 요청 필요.

단기 개선 (1주 이내)#

  • createCPElements에서 element가 0건일 때 error 대신 warn 레벨로 로깅하고 job을 error가 아닌 별도 상태(예: skipped)로 처리하는 것을 검토. 현재는 데이터 미준비 상태도 error로 처리되어 불필요한 알림이 발생할 수 있다.
  • sitetrack-preprocessor-runner.ts:147-150 — element가 0건일 때 에러를 throw하기 전, 어떤 level과 BIM에서 조회했는지를 error 메시지에 포함하면 디버깅이 용이해진다. 예: No Elements found for BIM ${bimId} on levels [${levelIds}].

장기 개선 (재발 방지)#

  • Sitetrack 전처리 트리거 시점에 element 존재 여부를 사전 검증하는 pre-validation 단계를 추가하여, element가 없는 상태에서는 전처리를 큐잉하지 않도록 하는 방안 검토.

Monitoring#

  • sitetrack-preprocessor-agent의 AGT1808 에러 발생 빈도 모니터링:
text
service:cupixworks-sitetrack-preprocessor-agent status:error "No Elements found"
  • BIM별 element 조회 실패 패턴 추적 (동일 BIM이 반복 실패하는 경우 데이터 문제 확인 필요):
text
service:cupixworks-sitetrack-preprocessor-agent "elements_count: 0"

Risk Assessment#

  • Risk level: low
  • 예상 복잡도: trivial — 데이터 상태 문제이며 코드 변경 없이 BIM 데이터 확인으로 해결 가능