resilience4j 공식 레퍼런스를 한글로 번역한 문서입니다.
전체 목차는 여기에 있습니다.
목차
Resilience4j는 InfluxDB나 프로메테우스같이 가장 많이 사용하는 모니터링 시스템을 지원하기 위한 Micrometer 전용 모듈을 제공한다.
이 모듈은 런타임에 micrometer-core
를 제공해준다고 가정한다. 스프링 리액터는 전이 의존성이 아니다.
repositories {
jCenter()
}
dependencies {
compile "io.github.resilience4j:resilience4j-micrometer:${resilience4jVersion}"
}
CircuitBreaker Metrics
다음은 CircuitBreaker 메트릭을 MeterRegistry
에 바인딩하는 방법을 보여주는 코드다. 여기선 모든 CircuitBreaker 인스턴스를 한 번에 바인딩하고, 새로 만들어진 인스턴스를 동적으로 바인딩하기 위해 이벤트 컨슈머를 등록한다.
MeterRegistry meterRegistry = new SimpleMeterRegistry();
CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.ofDefaults();
CircuitBreaker foo = circuitBreakerRegistry
.circuitBreaker("backendA");
CircuitBreaker boo = circuitBreakerRegistry
.circuitBreaker("backendB");
TaggedCircuitBreakerMetrics
.ofCircuitBreakerRegistry(circuitBreakerRegistry)
.bindTo(meterRegistry)
다음과 같은 메트릭을 내보낸다:
Metric name | Type | Tags | Description |
---|---|---|---|
resilience4j .circuitbreaker .calls |
Timer | 다음 중 하나: kind=”failed” kind=”successful” kind=”ignored” name=”backendA” |
성공, 실패, 또는 무시한 전체 호출 횟수 |
resilience4j .circuitbreaker .max.buffered.calls |
Gauge | name=”backendA” | 현재 원형 버퍼에 저장할 수 있는 최대 호출 수 |
resilience4j .circuitbreaker .state |
Gauge 0 - Not active 1 - Active |
다음 중 하나: state=”closed” state=”open” state=”half_open” state=”forced_open” state=”disabled” name=”backendA” |
서킷 브레이커의 상태 |
resilience4j .circuitbreaker .failure.rate |
Gauge | name=”backendA” | 서킷 브레이커의 실패 비율 |
resilience4j .circuitbreaker .buffered.calls |
Gauge | 다음 중 하나: kind=”failed” kind=”successful” name=”backendA” |
원형 버퍼에 저장된 성공, 실패한 호출 횟수 |
resilience4 .circuitbreaker .not.permitted.calls |
Counter | kind=”not_permitted” name=”backendA” |
허가받지 못한 총 호출 횟수 |
resilience4j .circuitbreaker .slow.call.rate |
Gauge | name=”backendA” | 서킷 브레이커의 느린 호출(slow call) |
Retry Metrics
다음은 Retry 메트릭을 MeterRegistry
에 바인딩하는 방법을 보여주는 코드다. 여기선 모든 Retry 인스턴스를 한 번에 바인딩하고, 새로 만들어진 인스턴스를 동적으로 바인딩하기 위해 이벤트 컨슈머를 등록한다.
MeterRegistry meterRegistry = new SimpleMeterRegistry();
RetryRegistry retryRegistry = RetryRegistry.ofDefaults();
Retry retry = retryRegistry.retry("backendA");
// Register all retries at once
TaggedRetryMetrics
.ofRetryRegistry(retryRegistry)
.bindTo(meterRegistry);
다음과 같은 메트릭을 내보낸다:
Metric name | Type | Tags | Description |
---|---|---|---|
resilience4j .retry .calls |
Gauge | 다음 중 하나: kind=”successful.without.retry” kind=”successful.with.retry” kind=”failed.with.retry” kind=”failed.without.retry” name=”backendA” |
종류별 호출 횟수 |
Bulkhead Metrics
다음은 Bulkhead 메트릭을 MeterRegistry
에 바인딩하는 방법을 보여주는 코드다. 여기선 모든 Bulkhead 인스턴스를 한 번에 바인딩하고, 새로 만들어진 인스턴스를 동적으로 바인딩하기 위해 이벤트 컨슈머를 등록한다.
MeterRegistry meterRegistry = new SimpleMeterRegistry();
BulkheadRegistry bulkheadRegistry = BulkheadRegistry.ofDefaults();
Bulkhead bulkhead = bulkheadRegistry.bulkhead("backendA");
// Register all retries at once
TaggedBulkheadMetrics
.ofBulkheadRegistry(bulkheadRegistry)
.bindTo(meterRegistry);
다음과 같은 메트릭을 내보낸다:
Metric name | Type | Tags | Description |
---|---|---|---|
resilience4j .bulkhead .available .concurrent.calls |
Gauge | name=”backendA” | 사용 가능한 권한 수 |
resilience4j .bulkhead .max.allowed .concurrent.calls |
Gauge | name=”backendA” | 사용 가능한 최대 권한 수 |
RateLimiter Metrics
다음은 RateLimiter 메트릭을 MeterRegistry
에 바인딩하는 방법을 보여주는 코드다. 여기선 모든 RateLimiter 인스턴스를 한 번에 바인딩하고, 새로 만들어진 인스턴스를 동적으로 바인딩하기 위해 이벤트 컨슈머를 등록한다.
MeterRegistry meterRegistry = new SimpleMeterRegistry();
RateLimiterRegistry rateLimiterRegistry = RateLimiterRegistry.ofDefaults();
RateLimiter rateLimiter = rateLimiterRegistry
.rateLimiter("backendA");
// Register rate limiters at once
TaggedRateLimiterMetrics
.ofRateLimiterRegistry(rateLimiterRegistry)
.bindTo(meterRegistry);
다음과 같은 메트릭을 내보낸다:
Metric name | Type | Tags | Description |
---|---|---|---|
resilience4j.ratelimiter .available.permissions |
Gauge | name=”backendA” | 사용 가능한 권한 수 |
resilience4j.ratelimiter .waiting.threads |
Gauge | name=”backendA” | 대기 중인 스레드 수 |
TimeLimiter
다음은 TimeLimiter 메트릭을 MeterRegistry
에 바인딩하는 방법을 보여주는 코드다. 여기선 모든 TimeLimiter 인스턴스를 한 번에 바인딩하고, 새로 만들어진 인스턴스를 동적으로 바인딩하기 위해 이벤트 컨슈머를 등록한다.
MeterRegistry meterRegistry = new SimpleMeterRegistry();
TimeLimiterRegistry timeLimiterRegistry = TimeLimiterRegistry.ofDefaults();
TimeLimiter timeLimiter = timeLimiterRegistry
.timeLimiter("backendA");
// Register time limiters at once
TaggedTimeLimiterMetrics
.ofTimeLimiterRegistry(timeLimiterRegistry)
.bindTo(meterRegistry);
다음과 같은 메트릭을 내보낸다:
Metric name | Type | Tags | Description |
---|---|---|---|
resilience4j.timelimiter.calls |
Counter | name=”backendA” kind=”successful” | 성공한 총 호출 횟수 |
resilience4j.timelimiter.calls |
Counter | name=”backendA” kind=”failed” | 실패한 총 호출 횟수 |
resilience4j.timelimiter.calls |
Counter | name=”backendA” kind=”timeout” | 타임 아웃이 발생한 총 호출 횟수 |
Prometheus
메트릭을 프로메테우스에 게시하려면 다음 의존성을 추가해야 한다:
dependencies {
compile "io.micrometer:micrometer-registry-prometheus"
}
CircuitBreaker마다 다음과 같은 메트릭을 내보낸다:
# HELP resilience4j_circuitbreaker_buffered_calls The number of buffered failed calls stored in the ring buffer
# TYPE resilience4j_circuitbreaker_buffered_calls gauge
resilience4j_circuitbreaker_buffered_calls{kind="failed",name="backendA",} 0.0
resilience4j_circuitbreaker_buffered_calls{kind="successful",name="backendA",} 0.0
# HELP resilience4j_circuitbreaker_calls_total Total number of not permitted calls
# TYPE resilience4j_circuitbreaker_calls_total counter
resilience4j_circuitbreaker_calls_total{kind="not_permitted",name="backendA",} 0.0
# HELP resilience4j_circuitbreaker_state The states of the circuit breaker
# TYPE resilience4j_circuitbreaker_state gauge
resilience4j_circuitbreaker_state{name="backendA",state="half_open",} 0.0
resilience4j_circuitbreaker_state{name="backendA",state="forced_open",} 0.0
resilience4j_circuitbreaker_state{name="backendA",state="disabled",} 0.0
resilience4j_circuitbreaker_state{name="backendA",state="closed",} 1.0
resilience4j_circuitbreaker_state{name="backendA",state="open",} 0.0
resilience4j_circuitbreaker_state{name="backendA",} 0.0
# HELP resilience4j_circuitbreaker_failure_rate The failure rate of the circuit breaker
# TYPE resilience4j_circuitbreaker_failure_rate gauge
resilience4j_circuitbreaker_failure_rate{name="backendA",} 20.0
# HELP resilience4j_circuitbreaker_max_buffered_calls The maximum number of buffered calls which can be stored in the ring buffer
# TYPE resilience4j_circuitbreaker_max_buffered_calls gauge
resilience4j_circuitbreaker_max_buffered_calls{name="backendA",} 5.0
# HELP resilience4j_circuitbreaker_calls_seconds_max Total duration of calls
# TYPE resilience4j_circuitbreaker_calls_seconds_max gauge
resilience4j_circuitbreaker_calls_seconds_max{kind="successful",name="backendA",} 0.0
resilience4j_circuitbreaker_calls_seconds_max{kind="failed",name="backendA",} 0.0
resilience4j_circuitbreaker_calls_seconds_max{kind="ignored",name="backendA",} 0.0
resilience4j_circuitbreaker_calls_seconds_sum{kind="ignored",name="backendA",} 0.0
# HELP resilience4j_circuitbreaker_calls_seconds Total number of successful calls
# TYPE resilience4j_circuitbreaker_calls_seconds histogram
resilience4j_circuitbreaker_calls_seconds_count{kind="successful",name="backendA",} 0.0
resilience4j_circuitbreaker_calls_seconds_sum{kind="successful",name="backendA",} 0.0
# HELP resilience4j_circuitbreaker_calls_seconds Total number of failed calls
# TYPE resilience4j_circuitbreaker_calls_seconds histogram
resilience4j_circuitbreaker_calls_seconds_count{kind="failed",name="backendA",} 0.0
resilience4j_circuitbreaker_calls_seconds_sum{kind="failed",name="backendA",} 0.0
Bulkhead마다 다음과 같은 메트릭을 내보낸다:
# HELP resilience4j_bulkhead_available_concurrent_calls The number of available permissions
# TYPE resilience4j_bulkhead_available_concurrent_calls gauge
resilience4j_bulkhead_available_concurrent_calls{name="backendA",} 10.0
# HELP resilience4j_bulkhead_max_allowed_concurrent_calls The maximum number available permissions
# TYPE resilience4j_bulkhead_max_allowed_concurrent_calls gauge
resilience4j_bulkhead_max_allowed_concurrent_calls{name="backendA",} 10.0
Retry마다 다음과 같은 메트릭을 내보낸다:
# HELP resilience4j_retry_calls The number of successful calls without a retry attempt
# TYPE resilience4j_retry_calls gauge
resilience4j_retry_calls{kind="failed_with_retry",name="backendA",} 0.0
resilience4j_retry_calls{kind="failed_without_retry",name="backendA",} 0.0
resilience4j_retry_calls{kind="successful_without_retry",name="backendA",} 0.0
resilience4j_retry_calls{kind="successful_with_retry",name="backendA",} 0.0
RateLimiter마다 다음과 같은 메트릭을 내보낸다:
# HELP resilience4j_ratelimiter_waiting_threads The number of waiting threads
# TYPE resilience4j_ratelimiter_waiting_threads gauge
resilience4j_ratelimiter_waiting_threads{name="backendA",} 0.0
# HELP resilience4j_ratelimiter_available_permissions The number of available permissions
# TYPE resilience4j_ratelimiter_available_permissions gauge
resilience4j_ratelimiter_available_permissions{name="backendA",} 50.0
Next :Grafana
quick start를 위한 그라파나 대시보드 소개
전체 목차는 여기에 있습니다.