“트랜잭션 응답 시간이 늘었는지”를 확인하려면 계측 → 수집 → 시각화/알림 → 단서 추적의 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, 힙 사용률, 스레드풀 큐
'Developer > Spring & Backend' 카테고리의 다른 글
| SI 현장에서 객체지향(OOP)과 디자인패턴을 쓴 흔한 사례 5가지 (0) | 2025.11.14 |
|---|---|
| ES6에 대해서 아는 대로 설명해 주세요. (0) | 2025.11.13 |
| Record를 DTO로 사용하는 이유가 뭔가요? (0) | 2025.11.13 |
| HTTPS에 대해서 설명해주세요. (0) | 2025.11.12 |
| 자바스크립트 Promise에 대해서 아는 대로 설명해주세요. (0) | 2025.11.12 |
