“트랜잭션 응답 시간이 늘었는지”를 확인하려면 계측 → 수집 → 시각화/알림 → 단서 추적의 4단계를 체계적으로 깔면 됩니다. 바로 적용 가능한 체크리스트와 예시를 드리겠습니다. (Java/Spring 기준)

1) 계측: 서비스·쿼리·외부호출 시간을 숫자로 만든다

애플리케이션 레벨

Micrometer Timer로 컨트롤러/서비스/리포지토리 레이어를 감싼다. p50/p95/p99을 꼭 기록.

Trace/Span(OpenTelemetry)로 트랜잭션을 단계별(웹→서비스→DB/외부 API)로 쪼갠다.

Correlation ID(MDC)로 단일 요청의 모든 로그를 묶는다.


DB 레벨

MySQL: slow_query_log=ON, long_query_time=0.3(예)로 느린 쿼리 수집.

Postgres: pg_stat_statements, log_min_duration_statement=300ms.


인프라 레벨

Nginx/ALB: upstream_response_time/target_response_time 로그.

JVM: GC 로그(JDK 11+ -Xlog:gc*), 힙/스레드 풀(HikariCP) 메트릭.



간단 AOP 계측 예시 (Spring)

@Aspect
@Component
@RequiredArgsConstructor
public class TxTimerAspect {
  private final MeterRegistry registry;

  @Around("@within(org.springframework.stereotype.Service)")
  public Object timeTx(ProceedingJoinPoint pjp) throws Throwable {
    String name = pjp.getSignature().toShortString();
    Timer.Sample s = Timer.start(registry);
    try { return pjp.proceed(); }
    finally { s.stop(Timer.builder("app.tx.duration")
        .description("Service transaction duration")
        .tag("service", name)
        .publishPercentiles(0.5, 0.95, 0.99)
        .publishPercentileHistogram()
        .register(registry));
    }
  }
}

로그 상관값(MDC) 설정 예시

// 필터에서 트레이스ID 생성
String traceId = UUID.randomUUID().toString().substring(0,8);
MDC.put("traceId", traceId);
// logback pattern: [%X{traceId}] %msg

2) 수집·시각화: “늘었는지”를 수치로 비교한다

Prometheus + Grafana(Micrometer 기본):

지표: app_tx_duration_seconds_bucket (히스토그램), _count, _sum.

PromQL 예시

최근 5분 p95:
histogram_quantile(0.95, sum(rate(app_tx_duration_seconds_bucket[5m])) by (le, service))

에러율(HTTP 5xx):
sum(rate(http_server_requests_seconds_count{status=~"5.."}[5m])) / sum(rate(http_server_requests_seconds_count[5m]))

DB 대기시간(Hikari):
hikaricp_connections_acquire_seconds_bucket로 p95 추적.



대시보드 구성 (RED + USE)

RED(Rate/Errors/Duration): 요청수, 에러율, p95/99 응답시간.

USE(Utilization/Saturation/Errors): CPU, 힙 사용률, 스레드풀 큐

LIST

+ Recent posts