P020 · Factory Sight 테스트 하네스

시나리오

EP02 문서의 edge-processor-test.html 시나리오를 실행 가능한 형태로 옮긴 것입니다. 여기서 페이로드와 기대결과를 직접 고칠 수 있습니다.

SC-01정상 — 숫자 태그 1개 수집·저장normal내장

가장 기본 경로. 주입 → Cleaner가 field 삭제(수집 증거) → InfluxDB에 double로 저장되는지 확인한다.

SC-02정상 — 문자열 태그 저장normal내장

JsonV1Collector.parseValueFromJson은 텍스트를 String으로 그대로 넘기고, InfluxSaver가 string field로 저장한다.

SC-03정상 — 다중 태그 그룹 동시 수집normal내장

data 배열에 그룹이 여러 개일 때 전부 Tag로 펼쳐져 한 번의 writePoints로 저장되는지 확인한다.

SC-04경계 — 임계 직전(-1500ms)은 실시간 수집된다boundary내장

RedisService.getLatestTimestampKey는 |ts - now| <= time-threshold-ms 인 키만 실시간 대상으로 본다. 기본 2000ms 기준 안쪽.

SC-05경계 — 임계 초과(-5000ms)는 실시간 경로에서 빠진다boundary내장

임계 밖 키는 getMissedTimestampKey로 분류되어 실시간 파이프라인이 건너뛴다. ⚠️ 다만 MissedDataRecoveryService가 10분 주기로 결국 수거하므로, 이 시나리오는 "대기 시간 안에 실시간 수집되지 않음"만 검증한다.

SC-06예외 — 미지원 타입(boolean)만 있으면 수집 자체가 실패한다exception내장

⚠️ 위험지점 재현. parseValueFromJson이 boolean을 null로 스킵 → tags가 비어 collect()가 실패 반환 → DataPipelineService가 조기 return → **Cleaner가 호출되지 않아 Redis에 데이터가 그대로 남는다.** missed 복구도 tags가 비면 cleanup 없이 skip하므로 이 키는 계속 쌓인다.

SC-07예외 — 숫자와 미지원 타입이 섞이면 숫자만 저장된다exception내장

한 field 안에 지원/미지원 타입이 섞이면 지원 타입만 Tag가 되어 저장되고, 미지원 값은 WARN 로그만 남기고 조용히 사라진다.

SC-08예외 — 미지원 타입 필드는 InfluxDB에 저장되지 않는다exception내장

SC-07과 같은 페이로드로, 이번엔 미지원 필드가 실제로 저장되지 않았는지를 반대편에서 확인한다.

SC-09예외 — null 값은 스킵된다exception내장

parseValueFromJson은 JSON null을 명시적으로 허용하되 값 없음(null)으로 반환해 태그를 만들지 않는다. 함께 넣은 숫자만 저장되어야 한다.

SC-10정상 — 정수 값도 double로 저장된다normal내장

valueNode.isNumber()면 asDouble()로 변환하므로 정수를 넣어도 InfluxDB에는 실수로 들어간다. 타입 기대가 어긋나지 않는지 확인한다.

새 시나리오 추가

새 시나리오

JsonV1Collector.parseJsonData가 읽는 구조 그대로입니다. tag는 InfluxDB 태그가 되고(PROC는 별도 처리), field의 키가 태그ID, 값이 측정값입니다. 숫자는 double, 문자열은 string으로 저장되고 그 외 타입(boolean·객체·배열)은 조용히 스킵됩니다.

0이면 지금 시각 → 실시간 수집. 음수로 크게 주면(예: -5000) 임계를 넘겨 지연복구 경로로 유도합니다.

이 시간 안에 소비·저장이 확인되지 않으면 실패로 봅니다.

mode
stored — 지정 필드가 InfluxDB에 저장되어야 함 (values로 값까지 대조 가능)
not_stored — 저장되면 안 됨 (미지원 타입 스킵 확인 등)
consumed_only — 수집은 되되 저장은 없어야 함
not_consumed — 아예 집어가면 안 됨 (임계 밖 데이터의 실시간 경로 배제 확인)