Project · 02 / 04
자동매매 자체 호스팅 모니터링
애드알파에서 1인 개발·운영한 암호화폐 자동매매 서비스의 관측 스택입니다. 프로세스는 살아있지만 주문이 멈추는 '조용한 hang'은 예외 기반 SaaS(Sentry 등)의 사각지대였습니다. 인프라 열화는 Prometheus 메트릭으로, 매매 로직 실패는 Loki 로그로 분리 감지하고, Discord 자동 알림과 CI/CD 헬스 게이트(실패 시 자동 롤백)까지 연결했습니다.
- 기간
- 2026년 (재직 중 구축)
- 역할
- 애드알파 · Product Engineer (1인 설계·구축·운영) · 기여도 100% · 관측 스택 설계/구축 전담
- 스택
- Grafana · Prometheus · Loki · Alloy · Docker Compose · Redis Exporter
- —알림 규칙 10종(critical 7 / warning 3) Discord 자동 알림
- —heartbeat를 Redis 값 그대로 메트릭 승격 — 추가 코드 0
- —money-path 제외, 무상태 서비스만 autoheal 자동 재시작
- —/health/deep을 CI/CD 배포 게이트로 — 실패 시 자동 롤백
- —알림·대시보드를 provisioning YAML로 코드 관리
문제 상황
1인이 개발·운영하는 자동매매 서비스의 가장 큰 취약점은, 자동매매가 조용히 죽는다는 점이었다.
API가 200을 돌려줘도 Celery 워커나 시그널 수집 스트리머가 hang이면 주문이 나가지 않는다. 그런데 기존 수단은 이 상황을 잡지 못했다.
- 프로세스는 살아 있으니
restart: always가 발동하지 않는다 - Sentry 같은 예외 기반 SaaS는 에러가 발생해야 잡는다 — 예외 없이 멈추는 hang은 사각지대다
- 로그에 주문·거래소 응답이 섞여 있어 외부 전송 자체가 부담이다
- 진단 수단은 SSH 접속 후
docker logsgrep이 전부였다
목표는 사용자보다 먼저, 자동으로 아는 것. 그래서 감시 대상을 '요청'이 아니라 돈이 흐르는 경로로 정의했다.
해결
성격이 다른 두 감시를 끝까지 섞지 않는 구조로 만들었다.
인프라 열화는 메트릭, 매매 실패는 로그로
- infra-health — 서비스 다운, 5xx>5%, p95>2s, 디스크·메모리, 큐 적체, beat/streamer heartbeat stale을 Prometheus 메트릭으로 감지
- money-path — 고아 주문·주문 실행 실패를 Loki 로그에서 발생 즉시 알림
두 그룹은 감지 근거도, 대응 긴급도도 다르다. 한 저장소에 몰아넣지 않고 끝까지 분리했다.
커스텀 exporter를 만들지 않고 Redis 값을 메트릭으로 승격
heartbeat은 이미 Redis에 있는 값이다. REDIS_EXPORTER_CHECK_KEYS로 노출해 Prometheus 메트릭으로 승격했다 — 별도 코드·배포·유지보수가 0이다. "값이 낡았다"는 사실 자체가 장애 신호가 된다.
money-path는 autoheal 대상에서 제외
autoheal을 붙이되 money-path(api·celery·db·redis·streamer)는 제외했다. 진행 중 주문이 절단될 위험이 자동 재시작의 이득보다 크다고 판단해 무상태 서비스만 대상으로 했다.
에이전트는 Alloy 하나로 통일하고 자체 호스팅
Alloy가 Docker 소켓으로 컨테이너를 자동 발견해 로그는 Loki로, /metrics는 Prometheus로 보낸다. 운영 포인트를 하나로 줄였다.
외부 SaaS 대신 자체 호스팅을 택한 이유는 주문·거래소 응답이 섞인 로그의 데이터 통제권이다. 대신 단일 서버라 Loki는 파일시스템 단일 노드에 보관 14일 — 클러스터 HA를 포기한 트레이드오프다.
/health/deep을 CI/CD에 연결해 실패 시 자동 롤백
엔드포인트 하나로 DB·Redis·Celery·스트리머 heartbeat까지 한 번에 점검하고, 이를 배포 게이트로 연결했다. 알림·대시보드는 provisioning YAML로 코드 관리해 배포 시 무중단 리로드된다.
결과
- 0 → 10종
- Discord 자동 알림 규칙 · critical 7 / warning 3
- 코드 0줄
- heartbeat 메트릭 승격에 든 추가 코드
- SSH grep → 자동
- 장애를 인지하는 방식
백그라운드 프로세스 정지·큐 적체·주문 실패를 Discord로 자동 알림받고, /health/deep 실패 시 배포가 자동 롤백된다.