로그로 원인 찾기 · 빠진 줄과 두 번 온 줄 · 실습
수집기에 도착한 줄이 보낸 줄보다 적었다
목표
수집기가 받은 줄과 보낸 쪽의 카운터를 견주어 유실을 세고, 중복을 접고, 도착 지연 분포를 구하고, 마감 시각 집계의 과소집계와 재시작이 만든 착시를 숫자로 밝힙니다.
왜 중요한가
로그가 비어 있을 때 "안 왔다" 와 "일이 없었다" 는 결론이 정반대인데, 파일만 봐서는 구별되지 않습니다. 둘을 가르는 것은 발신 쪽이 붙인 단조 증가 번호뿐입니다. 그런데 그 번호도 프로세스가 재시작하면 1부터 다시 시작하므로, 부팅 식별자와 함께 묶지 않으면 재시작 전후가 중복으로 보이고 재시작 뒤의 유실은 가려집니다. 받은 순서가 일어난 순서가 아니라는 것도 같은 무게로 중요합니다 — 마감 시각에 집계하면 아직 안 온 줄이 빠지고, 며칠 뒤 같은 질의가 다른 숫자를 냅니다.
단계
1. /root/gap/gen_gap.py 를 만들어 실행해 /root/gap/raw/ 아래 collector.ndjson 과 sender_state.json 을 만드세요.
2. /root/gap/tally.json 에 받은 줄과 보낸 줄을 견주어 센 결과를 적으세요.
3. /root/gap/missing.json 에 빠진 번호를 구간으로 묶어 적으세요.
4. /root/gap/dedup.ndjson 에 중복을 접은 결과를 적으세요.
5. /root/gap/delay.json 에 도착 지연 분포를 적으세요.
6. /root/gap/cutoff.json 에 마감 시각 집계의 과소집계를 적으세요.
7. /root/gap/reboot.json 에 재시작이 집계에 미친 영향을 적으세요.
8. /root/gap/gap_report.md 에 네 절로 보고서를 남기세요.
참고
- 산출물의 키 이름과 계산 규칙입니다.
- false_duplicates 는 (host, boot_id, seq) 로 센 고유 건수에서 (host, seq) 로만 센 고유 건수를 뺀 값입니다. missing_without_boot 는 호스트마다 1부터 그 호스트의 가장 큰 번호까지 중 부팅을 무시하고 받지 못한 번호의 개수입니다.
- 4·5·6·7단계는 중복을 접은 레코드를 기준으로 셉니다.
- 흔한 실수: 중복을 접지 않고 세기, 늦게 온 줄을 유실로 세기, boot_id 없이 seq 만으로 같은 줄을 판정하기, 지연을 반올림하기.
- 산출물은 전부
/root/gap/아래에 모읍니다. 세션이 끝나면 사라집니다.
tally.json — lines_in_file · unique_records · duplicate_lines · sent_total · missing_total · loss_rate(유실 나누기 보낸 줄, 소수 넷째 자리 반올림).missing.json — 배열, 항목마다 host · boot_id · first · last · count(양끝 포함), (host, boot_id, first) 오름차순.dedup.ndjson — host · boot_id · seq · event_ts · observed_ts · msg, (host, boot_id, seq) 오름차순. 같은 줄이 여러 번 왔으면 가장 먼저 도착한 것(observed_ts 가 가장 이른 것)을 남깁니다.delay.json — count · p50_sec · p95_sec · max_sec · over_60s · worst(host · boot_id · seq · delay_sec). 지연은 observed_ts 빼기 event_ts 를 초 단위 정수로 버림한 값이고, 백분위수는 정렬한 뒤 ceil(p/100 × n) 번째 값(1부터 셈)입니다. over_60s 는 60초를 넘는 건수입니다.cutoff.json — cutoff_ts · event_before_cutoff · observed_before_cutoff · late_arrivals · undercount_rate(늦은 도착 나누기 event_before_cutoff, 소수 넷째 자리 반올림). 마감 시각은 2026-05-20T03:20:00Z 이고 비교는 미만입니다.reboot.json — hosts_with_multiple_boots(오름차순 배열) · boots_by_host(호스트를 키로, 값은 오름차순 배열) · false_duplicates · missing_with_boot · missing_without_boot.
단계 8개
- 받은 것과 보낸 것을 함께 손에 쥐기
- 받은 줄과 보낸 줄을 견주기
- 빠진 번호를 구간으로 묶기
- 재전송이 만든 중복 접기
- 도착 지연의 분포 구하기
- 마감 시각에 집계했다면 얼마를 놓쳤나
- 재시작이 유실과 중복을 뒤바꾼다
- 무엇을 요청할지 글로 남기기