[찐빵] 옵저버빌리티 설계

2025. 11. 16. 23:17·Project

찐빵 서비스의 경우 MySQL, MongoDB, Redis, S3, Google Sheets 등 다양한 외부 리소스와 상호작용하고, 건물·리뷰 조회/관리, 지도 검색, 사용자 인증·설정 등의 다양한 API들도 존재하기에 메트릭과 구조적인 로그 체계가 필수적이므로 옵저빌리티를 설계해보았습니다..!

 

1. 수집할 핵심 메트릭 정의(API latency, error rate, RPS 등)

범주 메트릭 태그/분류 설명 및 수집 이유

HTTP 요청 지연 http.server.requests (Timer) uri, method, status, outcome, exception 모든 REST 엔드포인트(건물 상세, 리뷰 CRUD, 지도 검색, 인증/사용자 API)의 응답 시간을 계층별로 가시화하여 병목 식별 (p50/p95/p99 추출)
HTTP 오류율 http.server.requests (Counter) 동일 + status 그룹 (2xx/4xx/5xx) status >= 400 비율을 계산해 API 안정성 모니터링. ControllerAdvice가 공통 예외를 처리하므로 특정 예외 유형을 태그로 전파하면 오류 유형별 추적이 가능할듯
요청 처리량(RPS) http.server.requests.count uri, method 주요 API(지도 검색/리뷰/건물)의 초당 요청 수를 측정해 갑작스런 트래픽 급증을 감지
DB 커넥션 풀 상태 hikaricp.connections.* pool MySQL 기반 리뷰/지도 조회가 집중되므로 Hikari 커넥션 사용량·대기시간을 관찰해 풀 사이즈를 조정
Mongo/Redis 연산률 mongodb.command.*, redis.commands collection, command, result 리뷰 상세·키워드(Mongo), 메일/토큰 캐시(Redis)의 호출량·실패율 추적
외부 연동 지연 사용자 정의 Timer (S3, Google Sheets, 메일, OAuth) service, operation, status S3 업로드/삭제, Google Sheets append, 메일 전송, OAuth 토큰 재발급 등 외부 I/O의 평균 지연과 실패율을 별도 측정
스케줄러 성과 Timer/Counter(user.scheduler.finalizeDeletionBatch) result 탈퇴 유예 만료 사용자 정리 배치의 실행 주기·성공/실패 횟수를 수집

2. 커스텀 메트릭 대상(중요 비즈니스 로직) 식별

  • 리뷰 작성/수정/삭제 성공·실패 카운터 및 처리 시간
    • 리뷰 CRUD는 저장소(JPA, Mongo, S3)를 갱신하므로 타입(일반/기숙사/공인중개사)별로 Counter와 Timer를 두어 실패 원인을 분류
  • 지도 검색/마커 조회 성공률 및 결과 개수 히스토그램
    • 지도는 필터와 연산을 수행하므로 응답 시간과 반환 개수를 측정해 필터 조합에 따른 부하를 분석
  • 건물 상세 요청 수와 기숙사 분기 비율
    • 기획용. 사용자들의 관심은 원룸과 같은 건물일지 기숙사인지 파악하기 위함
    • 상세 응답은 건물 타입별로 키워드 집계를 사용하므로 사용자 관심 분포를 파악 ⇒ 차후 캐싱에도 도움될 듯..?
  • OAuth 로그인/회원가입/토큰 재발급 성공·예외 카운터
    • 소셜 로그인 흐름에서 예외(탈퇴 사용자, 토큰 만료)를 세분화해 인증 이슈를 추적
  • 메일 인증 코드 발송·검증 시도 및 실패 사유별 Counter
    • 허용 도메인 검증, 코드 미존재, 만료 등의 실패 유형을 분리해 사용자 경험을 개선
  • 북마크/최근 본 리뷰 API 호출 수와 예외율
    • A/B 테스트. 향후 탭 삭제를 해도 될까에 대해 여부 판단
    • 사용자 개인화 기능의 사용량을 측정해 UI 개선 우선순위를 판단
  • Google Sheets 전송 성공률
    • 사용자 탈퇴 사유·문의 전송 시 Sheets API 오류를 추적
  • S3 presigned URL 발급/삭제 오류 카운터
    • 파일 업로드용 URL 발급과 삭제 오류를 추적해 CDN 연계 이상을 조기에 발견
  • 탈퇴 배치 처리 건수
    • UserScheduler에서 삭제된 계정 수를 Counter로 기록해 데이터 정리 현황을 모니터링

3. JSON 구조화 로그 필드 목록 정의(TraceID, URI, Status 등)

traceId의 경우 MDC가 필요해서 향후 도입할 수도 있습니다. 감안해서 봐주셔욥

필드 내용 이유

timestamp, level, logger, thread 기본 메타데이터 시계열 정렬 및 로거 식별을 위해 필요
traceId, spanId, requestId 요청 상관관계 분산 추적·멀티 서비스 연동 시 연관 로그 추적
service, environment, version 배포 메타 다중 환경/버전 운영 시 필터링
httpMethod, uri, query, status, latencyMs HTTP 컨텍스트 주요 API 호출 정보를 구조화하여 SLA 위반 원인 파악
remoteIp, userAgent, referer 클라이언트 정보 비정상 패턴(봇/공격) 탐지
userId, oauthProvider 인증 컨텍스트 @AuthenticationPrincipal Users를 통해 확보한 식별자 기록
responseCode, errorCode, exception, stacktrace 오류 정보 ControllerAdvice에서 예외 유형과 메시지를 JSON 필드로 출력하여 분석 자동화
businessEvent, entityId, resultCount 도메인 키 예: review.create, map.search 등 비즈니스 이벤트 구분 및 결과 크기 기록

4. Actuator 노출 endpoint 범위 확정

현재는 health, info만 외부 노출되어 있음

  • Production [Release 브랜치]
    • health, info, metrics, prometheus endPoint
    • /prometheus는 VPC 내부 혹은 Sidecar 프록시를 통해서만 접근; Spring Security 또는 API Gateway로 보호 (민감 정보가 많아 그라파나 클라우드로만 나갈 수 있도록)
    • health는 liveness/readiness 분리(management.endpoint.health.probes.enabled=true) 후 외부 로드밸런서에는 간략 응답만 전달
  • Dev/Staging [Test 브랜치]
    • 디버깅 목적의 /loggers, /env, /configprops 등을 추가 노출하되, Basic Auth 또는 IP ACL로 제한
    • show-details=always로 health 세부 정보를 개발자에게 제공

5. Micrometer 바인더 리스트 확정(JVM/Thread/GC/DB/Redis 등)

바인더 적용 이유

JvmMemoryMetrics, JvmGcMetrics, JvmThreadMetrics, ClassLoaderMetrics, ProcessorMetrics, UptimeMetrics Spring Boot JVM 애플리케이션 기본 리소스 감시
LogbackMetrics SLF4J/Logback 로거를 사용하므로 로그 이벤트를 카운트하여 경고/오류 폭주 감지
TomcatMetrics 내장 컨테이너 스레드/커넥션 상태 파악
HikariDataSourceMetrics, HibernateMetrics JPA & Hikari 기반 DB 접근의 커넥션 풀, 쿼리 캐시 상태 추적
MongoMetricsCommandListener 리뷰 상세·키워드 컬렉션 MongoDB 사용에 대한 지표 수집
LettuceMetrics (또는 RedisConnectionMetrics) RedisTemplate/StringRedisTemplate 기반 인증 코드/토큰 저장소 성능 모니터링
ExecutorServiceMetrics / SchedulerMetrics @Scheduled 삭제 배치 등 스케줄러 스레드풀 상태 추적
사용자 정의 MeterBinder (S3, Mail, Google API) 외부 API 클라이언트(S3, Google Sheets, MailSendService) 호출의 지연/오류를 묶어 보고

6. 메트릭·로그 정책 문서화(dev/prod)

공통 정책

  • 메트릭/로그 Naming 규칙, 태그 사용 가이드, PII(개인정보) 마스킹 규칙 문서화
  • 배포 시점마다 버전 태그(buildVersion)를 메트릭과 로그에 포함

Development

  • 샘플링 비율을 높여(예: 100%) 상세 로그 및 디버깅용 메트릭 수집
  • Actuator에서 추가 엔드포인트(loggers, env) 허용, 콘솔 Pretty JSON 로그 사용
  • 메트릭 저장은 경량 Prometheus/InfluxDB 등 로컬 인스턴스를 사용하고, 7일 보관

Production

  • 로그 샘플링/레벨 정책: INFO 기본, ERROR는 전량 수집, DEBUG는 비활성
  • JSON 로그를 중앙 수집(ELK, Cloud Logging) 후 30일/90일 보관 정책
  • 메트릭은 Prometheus→Grafana 대시보드, 혹은 Cloud Monitoring에 연동; 30~90일 유지
  • PII가 포함될 수 있는 필드는 해시 처리 후 저장, 요청/응답 Body는 비활성(필요 시 화이트리스트만)
  • 비상 상황을 대비해 Rate Limit·Circuit Breaker 메트릭을 추가 문서화

⇒ 문서화에 대해서는 AI한테 맡겨봤는데 위에 적힌 내용은 30, 90일이지만, 그라파나 클라우드 Free Tier의 경우에는 14일 밖에 저장이 안된다는 슬픈 사실…

'Project' 카테고리의 다른 글

단일 Repository에서 세 개의 서비스를 어떻게 관리할 것인가  (1) 2026.01.18
[KOSPI FGI] 코스피 공포 탐욕 지수 (KOSPI Fear & Greed Index) 개발기  (0) 2025.11.23
[찐빵] Observability 구축기  (0) 2025.11.16
[ SWEA Extended #2] SWEA 확장프로그램 제작기 인트로  (0) 2025.11.15
'Project' 카테고리의 다른 글
  • 단일 Repository에서 세 개의 서비스를 어떻게 관리할 것인가
  • [KOSPI FGI] 코스피 공포 탐욕 지수 (KOSPI Fear & Greed Index) 개발기
  • [찐빵] Observability 구축기
  • [ SWEA Extended #2] SWEA 확장프로그램 제작기 인트로
ryuwon
ryuwon
여러 개발 정보 끄적이고 있습니닷..
  • ryuwon
    이름 없는 블로그
    ryuwon
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (34)
      • Series (0)
      • Programming (1)
        • Java (1)
        • C (0)
        • Swift (0)
      • Framework & Library (8)
        • Spring (6)
        • Spring Boot (2)
      • Data & ORM (0)
        • RDBMS (0)
        • NoSQL (0)
        • ORM (0)
      • Infra & DevOps (1)
        • Cloud (0)
        • DevOps (1)
        • Infra (0)
      • Knowledge (4)
        • 자료구조 (1)
        • 알고리즘 (3)
        • 운영체제 (2)
        • 네트워크 (1)
        • 아키텍쳐 및 디자인 패턴 (0)
        • 개발지식 (3)
      • Testing (0)
      • Security & System (0)
      • Project (5)
      • Writing (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로젝트
    OCI
    네트워크
    K3S
    찐빵
    Spring Profile
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.5
ryuwon
[찐빵] 옵저버빌리티 설계
상단으로

티스토리툴바