피드로 돌아가기
I Had No Idea Which Endpoint Was Slowest. So I Built My Own Metrics.
Dev.toDev.to
Backend

Custom Metrics 시스템 구축을 통한 엔드포인트별 가시성 확보 및 Latency 분석

I Had No Idea Which Endpoint Was Slowest. So I Built My Own Metrics.

Abhishek Sharma2026년 4월 28일8intermediate

Context

개별 요청을 추적하는 Structured Logging만으로는 전체 시스템의 상태 파악 및 추세 분석에 한계 존재. 특히 엔드포인트별 평균 응답 시간과 에러율 등 집계 데이터의 부재로 인한 병목 지점 식별 불가 상황을 해결하고자 함.

Technical Solution

  • Counters, Gauges, Latency stats의 세 가지 메트릭 타입을 정의한 전용 Metrics 구조체 설계
  • Concurrent Request 환경에서 Race Condition 방지를 위해 sync.RWMutex를 도입하여 Read 성능 최적화 및 Write 정합성 보장
  • Go의 http.ResponseWriter가 상태 코드를 저장하지 않는 제약을 해결하기 위해 Embedding 기반의 Wrapper 패턴을 통한 Status Code 인터셉트 구현
  • Middleware 구조를 채택하여 요청 시작 시점의 In-flight 증가와 종료 시점의 Latency 계산 및 메트릭 업데이트 로직을 캡슐화
  • JSON 직렬화 시 Lock 유지 시간을 최소화하여 메트릭 조회 API의 응답성 확보

Key Takeaway

추적(Tracing)과 집계(Metrics)의 역할 분리를 통해 개별 장애 분석과 전체 시스템 트렌드 파악을 동시에 달성하는 가시성 전략의 중요성 확인.


- http.ResponseWriter 확장 시 Embedding 패턴을 활용한 상태 코드 및 응답 크기 캡처 검토 - 빈번한 읽기가 발생하는 공유 자원 접근 시 Mutex 대신 RWMutex 적용으로 경합 감소 - 외부 라이브러리 도입 전 핵심 Primitive를 직접 구현하여 내부 동작 원리에 대한 이해도 확보

원문 읽기