Skip to content

PaymentMetrics Gauge 관련 이슈 #108

@rabitis99

Description

@rabitis99

1️⃣ 문제 요약

현재 PaymentMetrics.recordPaymentAmount / recordPaymentRefund에서

meterRegistry.gauge("payment.amount", Arrays.asList(Tag.of("payment_method", paymentMethod)), amount);

를 사용하고 있음.

문제점: 동일한 name + tag 조합으로 gauge를 재호출하면 기존 Gauge 객체만 유지, 이후 값 변경은 반영되지 않음.

결과: Prometheus/Grafana에서 금액 지표가 최초 등록 값으로 고정됨.

2️⃣ 현재 영향 범위

메트릭 정확성: 결제 금액 지표가 실시간 반영되지 않음.

결제 처리량 통계: Counter/Timer 기반은 정상 동작 → 영향 없음.

알림/포인트/캐시백 로직: 메트릭과 무관 → 영향 없음.

3️⃣ 기존 해결 방안

AtomicReference + Map 분리 구조 적용

paymentMethod별 AtomicReference를 저장

Gauge 등록 시 AtomicReference 바인딩

값 변경 시 ref.set(newAmount) 호출

장점

실시간 금액 반영 가능

멀티스레드 안전

등록 중복 문제 해결

단점

코드 복잡도 증가 → 과도한 설계 가능성

결제 건수가 많지 않다면 오버스펙

4️⃣ 선택적 대안

분리 구조 유지

장점: 실시간 금액 추적 가능, Prometheus 반영 정확

단점: 코드 복잡, 오버스펙 가능

기존 Gauge 구조 유지

장점: 코드 단순, 유지보수 용이

단점: 최초값만 기록 → 실시간 금액 지표 정확도 낮음

대응: 결제 건수/성공/실패만 모니터링해도 충분하면 OK

DistributionSummary 도입

결제 금액 통계를 누적/분포 형태로 수집

장점: 실시간 값 갱신 필요 없음, 통계/평균/퍼센타일 분석 가능

단점: 단일 최신 금액 지표는 불가

5️⃣ 검토 포인트

Prometheus에서 금액 지표 실시간 반영이 필수인가?

결제Method 종류 및 트래픽 수준

메트릭 활용 목적: 단순 통계 vs 실시간 모니터링

코드 단순화 vs 정확한 값 반영

6️⃣ 결론 (초안)

현재 구조로도 Counter/Timer 기반 통계는 충분히 운영 가능

실시간 금액 반영이 필요하면 AtomicReference 구조 적용

필요성 검토 후 결정

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions