Search
📌

Istio resiliency 기반 장애 대응: 모니터링

Category
as S/W 엔지니어
Tags
Istio
Envoy
resiliency
timeout
retry
circuit breaker
rate limit
metric
Prometheus
Created time
2025/07/20
Envoy의 resiliency metrics으로 Grafana에서 Resilency 모니터링을 구성한 대시보드. Timeout, Retry, Circuit Breaker(Outlier Detection), Rate Limiting이외에도 Request Queue의 상황을 Inbound, Outbound 모두에 대해 나타내고 있다.

Introduction

앞선 Istio resiliency 기반 장애 대응: feature 별 상세의 적정 설정 값을 얻기 위해서는 결국 반복적 테스트가 최선이다. 또한 설정 이후 운영 시점에서도 설정 값 조정은 다반사가 될 것이기에, 모니터링 도구가 필수이다. 본 모니터링을 위해 Istio, Envoy에서 제공하는 metric을 논한다.

Istio 기반 resiliency 관련 metric

Istio의 metric은 (까보지는 않았지만) 사실 상 Envoy metric을 사용하기 좋도록 wrapping한 것으로 추정된다. 특히나 resiliency 영역이 그러한데, Istio는 별도 resiliency metric을 위한 별도 metric을 제공하는 대신 istio_requests_totalresponse_flags label을 통해, Envoy가 생성한 해당 request에 대한 resiliency 현황을 요약하기 때문이다.
Istio 공식 문서에서 언급하듯이 response_flags 는 Envoy Access Log의 response 상세 코드로서, HTTP status code보다 훨씬 더 상세한 response 원인을 제공한다. Resiliency 관련 flags는 별도로 highlight 처리 했다.
Res. flags
Message
부연 설명
UH
No Healthy Upstream
Upstream 클러스터에 정상적인 호스트가 없어 503 응답 코드와 함께 반환됨
UF
Upstream Connection Failure
Upstream 연결 실패로 인해 503 응답 코드와 함께 반환됨
UO
Upstream Overflow
Upstream overflow (회로 차단 - Circuit Breaking) 발생으로 503 응답 코드와 함께 반환됨.
NR
No Route Found
주어진 요청에 대해 설정된 라우트가 없거나 downstream 연결에 대해 필터 체인을 찾을 수 없어 404 응답 코드와 함께 반환됨
URX
Upstream Retry Limit Exceeded
Upstream retry 제한(HTTP) 또는 최대 연결 시도 수(TCP)를 초과해 요청이 거부됨
NC
No Cluster Found
Upstream 클러스터를 찾을 수 없음
DT
Duration Timeout
요청 또는 연결이 max_connection_duration 또는 max_downstream_connection_duration을 초과함
DC
Downstream Connection Termination
downstream(클라이언트)가 연결을 닫음. 클라이언트 조기 종료
LH
Failed Local Health Check
로컬 health check 실패. upstream 자체 문제. 503 응답 코드와 함께 반환됨
UT
Upstream Timeout
• Upstream 요청이 타임아웃되어 504 응답 코드와 함께 반환됨 • upstream에서의 응답 지연으로 timeout 발생. timeout 관련
LR
Local Reset
• 연결이 로컬에서 리셋되어 503 응답 코드와 함께 반환됨 • Envoy가 로컬에서 연결을 리셋. 내부 정책이나 오류로 인해 중단
UR
Upstream Remote Reset
• Upstream이 연결을 리셋함. application 또는 proxy 측에서 종료 • Upstream 원격에서 리셋되어 503 응답 코드와 함께 반환됨
UC
Upstream Connection Termination
• Upstream에서 TCP 연결이 비정상 종료됨. 서버 측 문제 가능성 • Upstream 연결 종료로 인해 503 응답 코드와 함께 반환됨 • 회로 차단 - Circuit Breaking으로 발생하기도
DI
Delay Injected
Fault injection으로 지정된 기간만큼 요청 처리가 지연
FI
Fault Injected
Fault Injection - 강제 실패. 설정된 비율로 강제 오류 주입
RL
Rate Limited
• HTTP rate limit 필터에 의해 로컬에서 rate limit되어 429 응답 코드와 함께 반환됨 • Rate limit 정책에 의해 거부됨. Envoy 혹은 외부 Rate Limit Service 사용 시
UAEX
Unauthorized External Service
외부 인증 서비스에 의해 요청이 거부됨
RLSE
Rate Limit Service Error
rate limit 서비스 오류로 인해 요청이 거부됨
IH
Invalid Envoy Request Headers
엄격히 검사되는 헤더에 잘못된 값이 설정되어 400 응답 코드와 함께 요청이 거부됨
SI
Stream Idle Timeout
스트림 유휴 시간이 초과되어 408 또는 504 응답 코드와 함께 종료됨.
DPE
Downstream Protocol Error
Downstream 요청에 HTTP 프로토콜 오류가 있음
UPE
Upstream Protocol Error
Upstream 응답에 HTTP 프로토콜 오류가 있음
UMSDR
Upstream Max Stream Duration Reached
Upstream 요청이 최대 스트림 지속 시간을 초과함
RCFF
Response From Cache Filter
캐시 필터에서 응답 반환. 오류는 아니며 캐싱된 결과 사용됨.
NCFF
No Filter Config Found
OM
Overload Manager Terminated
Envoy의 Overload Manager가 연결 종료. 과부하 상태에서 발생.
DF
DNS Resolution Failed
DNS 조회 실패로 요청이 종료됨
DO
Drop Overload
Overload 상태로 인해 503 응답 코드와 함께 요청이 종료됨
DR
Downstream Remote Reset
• 응답 세부 사항은 http2.remote_reset 또는 http2.remote_refuse 임 • 클라이언트가 연결을 강제로 종료함. 클라이언트 측 오류 또는 중단
UDO
Unconditional Drop Overload
• drop_overloads 값이 100%로 설정되어, Overload 상태에서 요청이 무조건 종료됨. • Overload 상태에서 무조건 요청을 드롭함. Overload Manager에 의해 강제로 차단됨. 일반적인 Circuit Breaker보다 강한 정책.

Envoy 기반 resiliency 관련 metrics

Envoy metrics는 Istio와는 비교 불가할 정도로 많은 metric을 제공함과 동시에 제공되는 정보 역시 깊다. 문제는 Istio metrics 대비 사용하기가 어렵다는 점으로, 이를테면 request 갯수를 얻기 위해 Istio는 istio_requests_total 단일 metric만 사용하여 upstream 또는 downstream용인지는 여러 label(e.g. source_app, destination_service)을 통해 구분이 가능한 반면, Envoy는 upstream용과 downstream용 metric이 나뉘어 있음과 동시에 counter part를 쉽게 식별할 label이 없다.
나아가 downstream용에는 upstream용과는 달리 resiliency 관련 metrics가 없기에 오직 upstream용 metrics 만을 사용해야 한다. 이는 달리 표현하자면 resiliency metric이 오직 client side에서만 만들어진다는 뜻인데, Timeout, Retry, Circuit Breaker가 client side에서 동작함을 떠올려보면 당연한 일이기도 하다(Istio Resiliency features 동작 위치 참조).
Statistics — envoy 1.35.0-dev-c12fef documentation
Every connection manager has a statistics tree rooted at http.<stat_prefix>. with the following statistics:
Downstream 관련 Envoy metrics. Istio와는 달리 Upstream / Downstream 용 metrics가 나뉘어있는 한편 내용은 달라 본 metric에서는 resiliency 관련 metrics가 없다.

Client, Server 관점 식별하기

다행히도, counter part를 식별할 방법 자체가 없지는 않아 cluster_name label을 사용하면 service level에서 식별이 가능하여, upstream용 metric 만으로도 특정 workload를 기준으로 client와 server 관점으로 나눠 resiliency 현황을 모니터링 가능하다. 아래는 timeout에 대해 client, server 관점을 나눠 counter part 별로 분류한 예로서, timeout뿐 아니라 Retry, Circuit Breaker 등 envoy cluster-upstrea_rq prefix를 가진 모든 metric에 적용 가능하다.
sum by (service_istio_io_canonical_name) ( rate( envoy_cluster_upstream_rq_timeout_total{cluster_name=~"outbound.*${service:value}.*"}[5m] ) ) > 0
JavaScript
복사
Server 관점에서의 timeout 발생률을 산출하는 promQL. Client 별(service_istio_io_canonical_name)로 분류함으로서 어느 client에서 얼마나 timeout이 발생했는지를 나타낸다. Client에서 측정된 metric 사용해야 하기에 cluster_name 에 현재 선택된 workload의 service name을 넣을 수 있도록 한다(코드에는 Grafana variable이 사용되었다).
sum by (cluster_name) ( rate( envoy_cluster_upstream_rq_timeout_total{pod=~"${workload}.*", cluster_name=~"outbound.*"}[$__rate_interval] ) ) > 0
JavaScript
복사
Client 관점에서의 timeout 발생률을 산출하는 promQL. Client 관점에서는 측정 위치가 일치하기 때문에 upstream 의미 그대로 사용 가능하다. pod label을 통해 선택된 workload를 식별하고, client_name 에는 outbound traffic의 service 모두를 선택하도록 한다. 이를 통해 cluster_name 으로 server 별로 분류 가능하다.

(Local) Rate Limit의 경우

타 resiliency metrics와는 달리 rate limiting은 측정 위치가 server side임과 동시에 client side에서의 식별을 위한 cluster_name label이 없다. 따라서, client 관점에서의 식별은 불가능함과 동시에 client로 분류할 방법 역시 없다. 따라서 query는 아래와 같이 단순해진다.
sum( rate( envoy_actual_http_local_rate_limit_rate_limited_total{pod=~"$workload.*"}[5m] ) ) > 0
JavaScript
복사

Envoy resiliency metric 목록

아래는 전체 Envoy resiliency metric 목록 중 (개인적으로) 의미있게 사용할만한 metrics를 추린 목록이다. 이 말은 아래 목록 내 metrics 외에도 더 많이 있다는 뜻으로, 이외에 필요한 metrics는 앞서 논한 공식 문서에서 찾도록 한다. 참고로, 본 문서 맨 앞의 그림은 아래 metrics를 사용하여 구성한 Grafana dashboard의 모습이다.
metric
설명
Timeout
envoy_cluster_upstream_rq_timeout_total
(HTTP) 응답 대기 중 시간 초과된 총 요청 수
Pending
envoy_cluster_upstream_rq_pending_total
업스트림으로 보내기 위해 연결(Connection)을 기다리고 있는 요청 수
envoy_cluster_upstream_rq_pending_failure_eject_total
연결 풀에서 커넥션 할당 실패 또는 원격 연결 종료 때문에 요청이 실패한 경우의 총 수
envoy_cluster_upstream_rq_pending_overflow_total
연결 풀 용량 초과 또는 HTTP/2 이상에서 서킷 브레이커(circuit breaker)가 동작해 요청이 거부된(overflow된) 횟수
envoy_cluster_upstream_rq_cancelled_total
연결 풀에서 커넥션을 얻기 전 요청이 취소된 횟수
Retry
envoy_cluster_upstream_rq_retry_total
총 요청 재시도 횟수
envoy_cluster_upstream_rq_per_try_timeout_total
시도당 시간 초과에 도달한 총 요청 수
envoy_cluster_upstream_rq_retry_limit_exceeded_total
최대 재시도 횟수를 초과하여 재시도가 동작하지 않은 총 요청 수
Circuit Breaker
envoy_cluster_outlier_detection_ejections_enforced_total
ejection이 발생한 횟수
envoy_cluster_outlier_detection_ejections_overflow_total
max ejection로 인해 ejection이 거부(abort)된 횟수
envoy_cluster_outlier_detection_ejections_enforced_consecutive_5xx_total
consecutive 5xx로 인해 ejection이 발생한 횟수
envoy_cluster_outlier_detection_ejections_enforced_consecutive_gateway_failure_total
gateway failure로 인해 ejection이 발생한 횟수
Rate Limiting
envoy_actual_http_local_rate_limit_enabled_total
차단 여부와 무관하게 Rate Limit 체크가 수행된 횟수
envoy_actual_http_local_rate_limit_rate_limited_total
rate limit이 실제로 적용되어 요청이 차단된(예:429 응답) 총 횟수
envoy_actual_http_local_rate_limit_ok_total
Rate Limit 검사 결과 “허용됨(under limit)“으로 응답된 요청 수

Istio에서의 Envoy metric 추가 방법

앞서 논한 Envoy metrics는 Istio 환경에서 별도 설정을 해야만 나타난다(metric 용량, 부하 문제로 default에서 제외된 듯 하다). 이들 metric을 사용하기 위해서는 아래 Istiod 설정을 추가해야 한다(Helm chart values.yaml 또는 IstioOperator). 이에 참고한 자료는 Istio Configure metrics collection, Istio Local rate limit 이다.
... meshConfig: defaultConfig: proxyStatsMatcher: inclusionRegexps: - ".*outlier_detection.*" - "upstream_rq_timeout" - ".*http_local_rate_limit.*" ...
YAML
복사

Appendix: 복합 지표

다음은 2개 이상의 metric을 복합적으로 구성해본 지표이나, 직관적 이해가 쉽지 않아보여 실사용에서는 배제한 것들이다. 추후 참고를 위해 남겨둔다.
지표
유형
설명
시각화 용도
upstream_cx_connect_timeout / upstream_cx_total
비율
TCP 연결 타임아웃 비율
TCP 연결 실패율을 시각화하여 네트워크 문제나 업스트림 서버의 연결 문제를 모니터링. 선 그래프(line)로 시간에 따른 추이를 확인.
upstream_cx_idle_timeout / upstream_cx_total
비율
TCP 연결 유휴 타임아웃 비율
유휴 연결의 비율을 시각화하여 연결 관리 정책의 효율성을 평가. 막대 그래프(bar)로 클러스터별 비교 가능.
upstream_rq_timeout / upstream_rq_total
비율
HTTP 요청 타임아웃 비율
HTTP 요청의 타임아웃 비율을 시각화하여 서버 응답 지연 문제를 추적. 선 그래프(line)로 시간대별 변화 확인.
upstream_cx_connect_ms
Histogram
TCP 연결 완료 시간(밀리초)
연결 지연 시간 분포를 히스토그램이나 히트맵으로 시각화하여 타임아웃 원인을 분석.
ejections_enforced_total / upstream_cx_total
비율
이상치로 인해 제거된 pod 비율
이상치 탐지로 제거된 호스트의 비율을 시각화하여 클러스터 안정성 평가. 선 그래프(line)로 시간 추이 확인.
ejections_active
Gauge
현재 제거된 호스트 수
현재 제거된 호스트 수를 실시간으로 시각화하여 클러스터 상태 모니터링. 게이지(gauge) 또는 숫자 패널로 표시.
ejections_enforced_consecutive_5xx / upstream_rq_5xx
비율
5xx 오류로 인한 제거 비율
5xx 오류로 인한 제거 비율을 시각화하여 오류와 이상치 탐지의 상관관계 분석. 막대 그래프(bar)로 클러스터별 비교.
ejections_enforced_success_rate / upstream_rq_total
비율
성공률 이상치로 인한 제거 비율
성공률 기반 제거 비율을 시각화하여 호스트 성능 문제를 분석. 선 그래프(line)로 추이 확인.
ejections_enforced_consecutive_5xx / ejections_detected_consecutive_5xx
비율
제거 감지가 제거까지로 이루어진 비율
1에 가까울 수록 좋음. 1보다 낮을 수록 detection이 너무 민감하거나오탐 안전 장치 값이 너무 높다는 의미
ratelimit.enforced / ratelimit.total
비율
속도 제한 적용 비율
속도 제한으로 거부된 요청 비율(예: 429 응답)을 시각화하여 정책 엄격성 평가. 선 그래프(line)로 추이 확인.
ratelimit.rate_limited / ratelimit.total
비율
속도 제한 초과 비율
토큰 부족으로 제한된 요청 비율을 시각화하여 속도 제한 부하 분석. 파이 차트(pie)로 제한/비제한 비율 표시.
ratelimit.ok / ratelimit.total
비율
속도 제한 내 처리된 요청 비율
정상 처리된 요청 비율을 시각화하여 정책 여유도 확인. 선 그래프(line)로 추이 분석.
ratelimit.error
Counter
속도 제한 필터 오류 수
속도 제한 시스템(예: Redis 연결) 오류를 시각화하여 안정성 모니터링. 막대 그래프(bar)로 오류 빈도 확인.