/* * * Copyright 2017: Robert Winkler * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * */ package io.github.resilience4j.metrics; import static com.codahale.metrics.MetricRegistry.name; import static java.util.Objects.requireNonNull; import com.codahale.metrics.Gauge; import com.codahale.metrics.Metric; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.MetricSet; import io.github.resilience4j.circuitbreaker.CircuitBreaker; import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry; import io.vavr.collection.Array; import java.util.Map; /** * An adapter which exports {@link CircuitBreaker.Metrics} as Dropwizard Metrics Gauges. */ public class CircuitBreakerMetrics implements MetricSet { private static final String DEFAULT_PREFIX = "resilience4j.circuitbreaker"; private final MetricRegistry metricRegistry = new MetricRegistry(); private CircuitBreakerMetrics(Iterable<CircuitBreaker> circuitBreakers) { this(DEFAULT_PREFIX, circuitBreakers); } private CircuitBreakerMetrics(String prefix, Iterable<CircuitBreaker> circuitBreakers) { requireNonNull(prefix); requireNonNull(circuitBreakers); circuitBreakers.forEach(circuitBreaker -> { String name = circuitBreaker.getName(); CircuitBreaker.Metrics metrics = circuitBreaker.getMetrics(); metricRegistry.register(name(prefix, name, "successful"), (Gauge<Integer>) metrics::getNumberOfSuccessfulCalls); metricRegistry.register(name(prefix, name, "failed"), (Gauge<Integer>) metrics::getNumberOfFailedCalls); metricRegistry.register(name(prefix, name, "not_permitted"), (Gauge<Long>) metrics::getNumberOfNotPermittedCalls); metricRegistry.register(name(prefix, name, "buffered"), (Gauge<Integer>) metrics::getNumberOfBufferedCalls); metricRegistry.register(name(prefix, name, "buffered_max"), (Gauge<Integer>) metrics::getMaxNumberOfBufferedCalls); } ); } /** * Creates a new instance CircuitBreakerMetrics {@link CircuitBreakerMetrics} with specified metrics names prefix and * a {@link CircuitBreakerRegistry} as a source. * * @param prefix the prefix of metrics names * @param circuitBreakerRegistry the registry of circuit breakers */ public static CircuitBreakerMetrics ofCircuitBreakerRegistry(String prefix, CircuitBreakerRegistry circuitBreakerRegistry) { return new CircuitBreakerMetrics(prefix, circuitBreakerRegistry.getAllCircuitBreakers()); } /** * Creates a new instance CircuitBreakerMetrics {@link CircuitBreakerMetrics} with * a {@link CircuitBreakerRegistry} as a source. * * @param circuitBreakerRegistry the registry of circuit breakers */ public static CircuitBreakerMetrics ofCircuitBreakerRegistry(CircuitBreakerRegistry circuitBreakerRegistry) { return new CircuitBreakerMetrics(circuitBreakerRegistry.getAllCircuitBreakers()); } /** * Creates a new instance CircuitBreakerMetrics {@link CircuitBreakerMetrics} with * an {@link Iterable} of circuit breakers as a source. * * @param circuitBreakers the circuit breakers */ public static CircuitBreakerMetrics ofIterable(Iterable<CircuitBreaker> circuitBreakers) { return new CircuitBreakerMetrics(circuitBreakers); } /** * Creates a new instance CircuitBreakerMetrics {@link CircuitBreakerMetrics} with * an {@link Iterable} of circuit breakers as a source. * * @param circuitBreakers the circuit breakers */ public static CircuitBreakerMetrics ofIterable(String prefix, Iterable<CircuitBreaker> circuitBreakers) { return new CircuitBreakerMetrics(prefix, circuitBreakers); } /** * Creates a new instance of CircuitBreakerMetrics {@link CircuitBreakerMetrics} with a circuit breaker as a source. * * @param circuitBreaker the circuit breaker */ public static CircuitBreakerMetrics ofCircuitBreaker(CircuitBreaker circuitBreaker) { return new CircuitBreakerMetrics(Array.of(circuitBreaker)); } @Override public Map<String, Metric> getMetrics() { return metricRegistry.getMetrics(); } }