APM Monitoring · Python + FastAPI + React

Java 서버 12대를
한눈에 모니터링

Python 에이전트가 메트릭과 로그를 수집하고, FastAPI 중앙서버로 모으고, React 대시보드로 시각화합니다. SSH 기반 헬스체크부터 AI 에러 분석, 위협 탐지 + 자동 차단까지. 처음 설계부터 Claude Code와 함께 만들었습니다.

Python 3 FastAPI aiomysql React 18 Recharts react-flow paramiko watchdog Gemini AI JWT
아키텍처
3계층 구조

에이전트 → 중앙서버 → 대시보드, 각 계층이 독립적으로 교체 가능합니다.

데이터 흐름 → 수집 → 처리 → 시각화
에이전트 (각 서버)
🐍
agent.py
psutil 메트릭 수집
5초 간격
👁️
watchdog
로그 파일 감시
실시간 전송
🔑
ssh_poller.py
SSH 헬스체크
원격 서버
중앙 서버 (FastAPI)
routes.py
120+ API 엔드포인트
🗄️
MySQL DB
metrics / logs
health_checks
🤖
Gemini AI
에러 요약
쿼리 최적화
대시보드 (React)
📊
Overview
서버 목록
요약 카드
🗺️
Topology
네트워크 토폴로지
드래그 가능
🛡️
ThreatMonitor
위협 탐지
IP 차단
# ssh_poller.py — SSH 기반 헬스체크 핵심 로직 async def check_server(server: dict) -> dict: # Windows PowerShell / Linux curl 자동 분기 if server["os"] == "windows": cmd = f"powershell -Command \"Invoke-WebRequest {url} -SkipCertificateCheck\"" else: cmd = f"curl -s -o /dev/null -w '%{{http_code}}' {url} --max-time 5" # Bastion 경유 (EMRO 내부망) if server.get("bastion"): transport = connect_via_bastion(server) else: transport = paramiko.Transport((server["ip"], 22)) elapsed = (datetime.now() - start).total_seconds() * 1000 return {"status": "online", "response_ms": elapsed}
모니터링 대상
12대 서버 구성

S2C, Sales Portal, EMRO SCM, AutoLabeler WMS, Changgo WMS 등 5개 시스템. 직접 SSH 또는 Bastion 경유.

S2C 시스템 (Vendor Portal)
DEV
S2C_DEV
xxx.xxx.xxx.xxx
Ubuntu · Tomcat 9
PRD
S2C_PRD
xxx.xxx.xxx.xxx
Ubuntu · Tomcat 9
Sales Portal
DEV
SpigenLM
xxx.xxx.xxx.xxx
Ubuntu · Spring Boot JAR
PRD
SpigenAPM
xxx.xxx.xxx.xxx
Ubuntu · Spring Boot JAR
EMRO SCM 내부망 (Bastion 경유)
PRD
EMRO_WAS
xxx.xxx.xxx.xxx
Linux · Bastion 경유
PRD
EMRO_DB_PRD
xxx.xxx.xxx.xxx
Linux · DB 서버 · 내부망
DEV
EMRO_DB_DEV
xxx.xxx.xxx.xxx
Linux · 비활성 (active: false)
AutoLabeler WMS
DEV
AutoLabeler_DEV
xxx.xxx.xxx.xxx
Windows · Spring Boot WAR
PRD
AutoLabeler_PRD
xxx.xxx.xxx.xxx
Windows · Spring Boot WAR
Changgo WMS / APM 중앙서버
DEV
Changgo_DEV
xxx.xxx.xxx.xxx
Linux · Tomcat 9
PRD
Changgo_PRD
xxx.xxx.xxx.xxx
Linux · Bastion 경유
PRD
SPIGEN_WEB
xxx.xxx.xxx.xxx
Amazon Linux · APM 중앙서버
주요 기능
Phase별 완성된 기능들

기본 스펙 3개 Phase에서 시작해 6개 Phase + G시리즈로 확장됐습니다.

Phase 1~3
코어 인프라
Python 에이전트, FastAPI 서버, MySQL 연동, React 대시보드 기반 구축.
psutil 메트릭 수집 (CPU / 메모리 / 스레드 / 네트워크)
jstat 자동 JVM 힙 + GC 수집
watchdog 로그 파일 실시간 감시
5단계 로그 분류 (error / warn / query / success / info)
완료
Phase 4~5
대시보드 + 인증
22개 페이지 대시보드, JWT 인증, RBAC 권한 관리.
Overview / ServerDetail / LogViewer / Topology
DBMonitor / QueryViewer / SchemaViewer / ErrorTracking
JWT 토큰 기반 로그인 (admin / viewer)
서버별 접근 권한 제어 (allowed_servers)
완료
Phase 6 + G시리즈
AI 분석 + 운영 관리
Gemini AI 분석, 서버 관리 UI, 사용자 관리 UI, Access Log 분석.
Gemini 에러 자동 요약 + 슬로우쿼리 최적화 제안
4단계 신규 서버 등록 마법사
Nginx / Tomcat Access Log 통합 파싱
9가지 공격 패턴 위협 탐지
완료
v0.5 보안 패키지
취약성 스캔
SSH 기반 원격 취약성 진단 + 위협 탐지 + IP 자동 차단.
ssh_vuln_scanner.py 원격 진단
Critical / High / Medium / Low / Info 5단계 분류
CVE ID 링크 + NVD 검색
iptables 자동 차단 (paramiko SSH)
완료
Phase 7
운영 안정화
EMRO 에이전트 설치, HTTPS/SSL 적용, EC2 마이그레이션.
EMRO 내부망 에이전트 배포
Google Chat webhook 알림 연동
Amazon Linux 2018 → 2023 마이그레이션
진행 예정
관측형 CD
배포 파이프라인
모니터링과 배포를 한 콘솔에서 — 빌드체크·핫싱크·예약·롤백까지.
브랜치 빌드체크 + 원클릭 배포 (deploy.ps1)
무중단 핫싱크 · 예약 배포 · 즉시 롤백
배포 후 observe 자동 롤백 (지표 악화 감지)
운영 안정성 하드닝 8건 반영
완료
고도화 노력
Session별 진화 과정

Claude Code와의 협업을 CHANGELOG로 기록하며 점진적으로 고도화했습니다.

🏗️
Session 1~2
MVP → SQLite → MySQL 전환
기본 스펙인 SQLite로 시작했다가 규모를 고려해 MySQL로 전환. SSH 폴러 추가, 헬스체크 기반 가동률 계산 체계 수립.
📈
Session 3
대시보드 확장 (6 → 12페이지)
Topology / DBMonitor / QueryViewer / SchemaViewer / ErrorTracking 추가. MultiServerChart, NotificationBell 컴포넌트. 에러 그루핑 + SLO 목표 가동률.
🔐
Session 4
인증 + RBAC + AI 분석
JWT 토큰 기반 로그인, admin/viewer 롤, 서버별 접근 권한. Gemini AI 에러 요약 + 슬로우쿼리 최적화 + 배포 영향 분석.
⚙️
Session 5
운영 관리 기능 (G시리즈)
서버 관리 UI (4단계 마법사), 사용자 관리 UI, Spring 계측 가이드 페이지. Access Log 수집 파이프라인 + 위협 탐지 진화.
🛡️
Session 6
취약성 스캔 + 데이터 TTL
ssh_vuln_scanner.py 원격 취약성 진단. 데이터 자동 삭제 (metrics 30일, logs 60일, alerts 90일). CHANGELOG 체계 정비.
🚀
Session 7
관측형 CD — 모니터링에 배포를 얹다
브랜치 빌드체크·원클릭 배포(deploy.ps1)·무중단 핫싱크·예약 배포·즉시 롤백, 배포 후 지표가 나빠지면 observe 자동 롤백까지. 운영 안정성 하드닝 8건 반영.
Session 8
다중 사용자 성능 + 상시 보안 모니터
대시보드 스레딩·경로별 타임아웃·/branches 캐시·리더 게이팅으로 다중 접속 버벅임 해소. PII 상시 스캔(pii_monitor)과 자격증명 만료 사전 경보(cred_monitor · 만료 14/7일 전 경고)를 상시 모니터로 편입.
🔗
Session 9 · 진행 중
SSO 통합 + 사내 호스팅으로 확장
SpigenLM IdP에 위임한 Google SSO 로그인 도입(백엔드 완료, e2e 마무리 중). 나아가 APM의 SSH·위협탐지·모니터링 자산을 재사용해 사내 멀티런타임 호스팅 콘솔로 확장 중.
실제 대화
이 시스템이 어떻게 커졌나

기본 3-Phase 스펙에서 시작해 운영 중 나온 질문들이 방향을 바꿨습니다. 수십 개 세션에서 추린 결정적 순간들입니다.

Session 2 — 알림 임계치 설정 중, 개발/운영 서버 혼재 환경에서
개발자
이 시스템은 항상 최고의 퍼포먼스를 내는 주요 시스템 기준으로 진행해줘.
PRD 서버들은 임계치 엄격하게, 알림도 놓치지 않게 관리해야 해.
Claude
server_overrides로 PRD 5대 CPU warning=70% / critical=85% 별도 임계치 적용하고, 알림 쿨다운도 PRD는 5분, 그 외는 30분으로 분리합니다.
DataDog, New Relic 레퍼런스를 보면서 — 기능 로드맵 설계 시점
개발자
DataDog 같은 상용 APM 참고해서 사용자 체감 관점으로 고도화 우선순위 뽑아줘.
세분화된 페이지는 그대로 두고, 한눈에 조치까지 가능한 통합 뷰가 필요해.
Claude
우선순위: ① Apdex Score (응답 만족도 지수), ② 서비스 토폴로지 맵 (WAS↔DB 의존성), ③ 자동 장애 타임라인 (에러↔배포↔메트릭 상관), ④ 엔드포인트 트레이스 (요청~응답 전 구간). Unified Ops Center 뷰로 통합 구현합니다.
RCA AI 분석 비용 검토 — Gemini Free Tier 가능 여부 확인
개발자
RCA 분석 AI를 Gemini 2.5 Flash 무료 티어로 교체 가능해?
Rate Limit 걸리면 분석 횟수를 대폭 줄여야 할 텐데, 최적화 방안도 같이 설계해줘.
Claude
교체 가능합니다. 무료 티어 분당 15 RPM 제한 대응: ① 동일 에러 그룹 결과 캐싱 (TTL 1시간), ② 슬로우쿼리 EXPLAIN 결과 재사용, ③ 배포 분석은 배포 이벤트당 1회로 제한. 실질 API 호출 80% 이상 절감 가능합니다.
RCA 분석 결과가 맥락 부족으로 부정확하게 나온 이후
개발자
RCA가 에러 로그만 보고 판단하니까 배포나 트래픽 급증 같은 외부 요인을 못 잡아.
에러 단독 분석이 아니라 전후 컨텍스트까지 묶어서 분석하는 방식으로 고도화해줘.
Claude
RCA 컨텍스트 확장: ① 에러 발생 T-5분 CPU/메모리/스레드 스냅샷 자동 첨부, ② 직전 30분 배포 이력 포함, ③ 동일 시각 다른 서버 에러 상관 분석. 단일 에러가 아닌 타임라인 기반 원인 추론으로 전환합니다.
쿼리 분석 페이지 로딩이 느려지기 시작한 시점 — 데이터 규모 증가
개발자
쿼리 분석 페이지 로드가 점점 느려지는데, 근본 원인 파악하고 개선안 제시해줘.
단순 페이지네이션 말고 구조적으로 해결해야 할 것 같아.
Claude
원인: slow_queries 테이블 풀스캔 + 집계 쿼리 미캐싱. 개선안: ① duration_ms + created_at 복합 인덱스 추가, ② 히트맵 집계를 1시간 단위 materialized view로 전환, ③ 상위 100건만 로드 후 무한 스크롤 적용. 예상 응답 시간 8초 → 0.4초.
운영 중 발견
쓰다 보니 생긴 기능들

스펙 문서에 없던 기능들. 실제 서버를 모니터링하면서 생긴 불편함과 필요가 새 기능을 만들었습니다.

운영 중 발견
통합 Ops 센터 뷰
"그런거 다 합쳐서 한눈에 보고, 거기서 조치를 하든가 하는 통합 화면은 어렵나?"
DataDog 참고 통합 대시보드 — 서버 상태 + 에러 + 쿼리 + 트레이스 한 화면
운영 중 발견
SELECT 직접 실행
"쿼리를 SELECT인 경우에만 해당 DB에 직접 조회해볼 수 있는 기능도 만들 수 있어?"
QueryViewer에서 READ-ONLY 직접 실행 + EXPLAIN 자동 분석
운영 중 발견
엔드포인트 트레이스
"사용자 요청~엔드까지의 흐름을 보고싶어서 추가한 기능이야. DataStream처럼 가능한지 검토해줘."
Spring 계측 가이드 + 서비스별 엔드포인트 응답시간 트레이스
운영 중 발견
Apdex Score
"Apdex Score 이게 정확히 뭔지 설명만 한번 해주고, 서버 다운 표시는 연동 안 되는 거야?"
응답 시간 기반 사용자 만족도 지수 — 0~1.0 실시간 산출
버그에서 발견
알림 음소거 오작동
"dev-s2c 알림 음소거했는데 CPU 임계치 알림 계속 오는 이유 확인해줄래?"
muted_servers 체크 로직 누락 수정 + 서버별 음소거 기능 테스트 추가
실운영 중 발견
취약성 자동 스캔
"최고의 퍼포먼스를 내는 주요 시스템이라고 생각하고 — 보안도 마찬가지야."
ssh_vuln_scanner.py — 원격 서버 9가지 취약점 자동 진단
AI 분석
Gemini가 하는 일

단순 시각화를 넘어, AI가 에러의 원인을 분석하고 쿼리 최적화를 제안합니다.

🔍
에러 자동 요약
Exception 스택트레이스별로 그루핑된 에러를 Gemini가 분석해 "NullPointerException 발생 원인: order.getUser()에서 null 반환 가능성" 같은 자연어 설명을 자동 생성.
슬로우쿼리 최적화
1초 이상 걸린 쿼리에 EXPLAIN 자동 실행 후 Gemini에게 분석을 맡겨. "Full Table Scan 발생 → idx_order_date 인덱스 추가 권장" 같은 최적화 방안 반환.
📦
배포 영향 분석
배포 전후 메트릭 비교: "배포 후 CPU 사용률 +12%, 에러율 -34%" 같은 배포 영향을 자동 계산. 롤백 필요 여부 판단 지원.
🛡️
위협 탐지
Access Log에서 9가지 공격 패턴(SQL Injection, XSS, Path Traversal, RCE 등) 실시간 감시. rate-based 탐지(1시간 내 4xx 20건) 후 iptables 자동 차단.
보안 설계
계층적 보안 적용

네트워크 레이어부터 애플리케이션 레이어까지 다층 보안을 적용했습니다.

🔑
PEM 키 기반 SSH
모든 원격 서버 접속은 PEM/PPK 키 파일 기반. 비밀번호 인증 없음. Bastion 경유 내부망 접속 지원.
🏷️
JWT RBAC
admin / viewer 2단계 롤 체계. allowed_servers 필드로 서버별 접근 권한. 토큰 만료 자동 처리.
👁️
읽기 전용 DB 접근
모니터링 대상 DB에 SELECT 권한만 부여. DB 스키마 조회, 슬로우쿼리 확인 시 DML 불가.
🚫
자동 IP 차단
위협 패턴 감지 후 paramiko SSH로 대상 서버에 접속해 iptables 차단 규칙 자동 추가.
🔕
알림 음소거
서버별 알림 음소거(muted_servers). 알림 폭풍 방지 정책 쿨다운. severity별 채널 분리.
🗑️
데이터 TTL
metrics 30일 / logs 60일 / alerts 90일 자동 삭제. DB 용량 자동 관리. 개인정보 보호.
앞으로
다음 단계
Phase 7
EMRO 내부망 연동
보안그룹 오픈 후 emro-was, emro-db 에이전트 배포. Bastion 경유 에이전트 설치 자동화 스크립트.
운영 안정화
HTTPS + 마이그레이션
Let's Encrypt SSL 적용, Amazon Linux 2018 → 2023 업그레이드. Google Chat webhook 알림 연동.
SSO
SSO 통합 완성
SpigenLM IdP에 위임한 Google SSO 로그인 e2e 마무리. 모니터링 화이트리스트 / 그 외 배포 콘솔로 접근 분리.
확장
사내 호스팅 플랫폼
APM의 SSH·위협탐지·모니터링 자산을 재사용해, 부서 앱을 static·container·job으로 올리는 사내 호스팅 콘솔로 확장.