[BE-05] TelemetryQueryGatewayImpl (Prometheus/Loki/Tempo 조회)

작업 내용 (설계 의도)

변경 사항

TelemetryQueryGateway(BE-01 interface)를 구현해 10분 lookback 텔레메트리 스냅샷을 구성한다(FR-4). 근거 TDD: ../TDD.md §Detail Design·§실패경로. ⑤ 데이터소스(Prometheus :9090·Loki :3100·Tempo :3200) 재사용.

  • infrastructure/alerting/gateway/TelemetryQueryGatewayImpl.ktqueryContext(signal, lookback)에서 PromQL(P95·에러율 요약)·LogQL(에러 로그 샘플)·TraceQL(느린 trace 샘플)을 각각 RestClient로 조회해 TelemetrySnapshot 병합.
  • 부분 실패 허용: 소스별 try/catch, 실패 섹션은 빈 값(전체 예외 미전파).
  • 각 base-url은 TelemetryProperties(@ConfigurationProperties) 신규로 주입. RestClient는 ExternalRestClientFactory 사용.

의존

  • BE-01 (TelemetryQueryGateway interface, TelemetrySnapshot, AlertSignal)

다이어그램

처리 흐름

sequenceDiagram
    participant G as TelemetryQueryGatewayImpl
    participant P as Prometheus
    participant L as Loki
    participant T as Tempo
    G->>P: PromQL P95/에러율 (10m)
    G->>L: LogQL 에러 로그 샘플
    G->>T: TraceQL 느린 trace 샘플
    G-->>G: TelemetrySnapshot 병합(부분실패 허용)

테스트 케이스

  • 3종 소스가 정상 응답하면 metricsSummary·logSamples·traceSamples가 채워진다(mock 서버).
  • Loki 조회가 5xx여도 예외 없이 logSamples만 빈 값이고 나머지는 채워진다(부분 실패).
  • lookback 10분이 각 쿼리의 시간 범위 파라미터에 반영된다.
  • 모든 소스 실패 시에도 빈 TelemetrySnapshot을 반환하고 예외를 던지지 않는다.