헬스체크는 싸게, 뜨는 동안만 촘촘히, 접근 로그에서는 뺀다
검사 한 번의 비용을 간격으로 나눈 값이 상시 CPU다. 가벼운 도구로 검사하고, start_interval로 뜨는 동안만 촘촘히 보고, 헬스 요청은 접근 로그에서 거른다.
아무 요청도 없는데 백엔드 컨테이너마다 CPU가 조금씩 꾸준히 쓰이고, 접근 로그는 헬스체크 요청으로 가득 차 정작 봐야 할 요청이 묻힌다.
헬스체크는 공짜가 아니다. 검사 한 번의 비용을 간격으로 나눈 만큼이 상시 CPU가 된다. 검사마다 python -c "..."처럼 인터프리터를 새로 띄우면 한 번의 비용이 크다. 간격을 짧게 잡으면 그 비용이 그대로 곱해진다. 게다가 헬스 요청도 일반 요청처럼 접근 로그에 한 줄씩 남는다.
세 가지를 한다.
- 가벼운 도구:
curl·wget같은 작은 도구로 검사한다. - 뜨는 동안만 촘촘히: 평소 간격은 넉넉히(예: 30초) 두고,
start_period동안만start_interval로 촘촘히 본다. 무중단 배포에서 새 컨테이너가 준비됐다고 판정되는 시간이 짧아진다. - 로그에서 빼기: 접근 로거에 필터를 달아 헬스 경로를 거른다.
services:
api:
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:8000/api/health"]
interval: 30s
start_period: 120s
start_interval: 2s
import logging
class SkipHealth(logging.Filter):
def filter(self, record: logging.LogRecord) -> bool:
return "/api/health" not in record.getMessage()
logging.getLogger("uvicorn.access").addFilter(SkipHealth())
start_interval은 비교적 최근 Docker Engine(25 이상)에서 동작한다. 오래된 엔진에서는 무시되니 버전을 확인한다.