/*
* Copyright 2012-2017 the original author or authors.
*
* 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 org.springframework.boot.actuate.metrics.buffer;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import org.springframework.boot.actuate.metrics.Metric;
import org.springframework.boot.actuate.metrics.reader.MetricReader;
import org.springframework.boot.actuate.metrics.reader.PrefixMetricReader;
/**
* {@link MetricReader} implementation using {@link CounterBuffers} and
* {@link GaugeBuffers}.
*
* @author Dave Syer
* @since 1.3.0
*/
public class BufferMetricReader implements MetricReader, PrefixMetricReader {
private static final Predicate<String> ALL = Pattern.compile(".*").asPredicate();
private final CounterBuffers counterBuffers;
private final GaugeBuffers gaugeBuffers;
public BufferMetricReader(CounterBuffers counterBuffers, GaugeBuffers gaugeBuffers) {
this.counterBuffers = counterBuffers;
this.gaugeBuffers = gaugeBuffers;
}
@Override
public Metric<?> findOne(final String name) {
Buffer<?> buffer = this.counterBuffers.find(name);
if (buffer == null) {
buffer = this.gaugeBuffers.find(name);
}
return (buffer == null ? null : asMetric(name, buffer));
}
@Override
public Iterable<Metric<?>> findAll() {
return findAll(BufferMetricReader.ALL);
}
@Override
public Iterable<Metric<?>> findAll(String prefix) {
return findAll(Pattern.compile(prefix + ".*").asPredicate());
}
@Override
public long count() {
return this.counterBuffers.count() + this.gaugeBuffers.count();
}
private Iterable<Metric<?>> findAll(Predicate<String> predicate) {
final List<Metric<?>> metrics = new ArrayList<>();
collectMetrics(this.gaugeBuffers, predicate, metrics);
collectMetrics(this.counterBuffers, predicate, metrics);
return metrics;
}
private <T extends Number, B extends Buffer<T>> void collectMetrics(
Buffers<B> buffers, Predicate<String> predicate,
final List<Metric<?>> metrics) {
buffers.forEach(predicate, new BiConsumer<String, B>() {
@Override
public void accept(String name, B value) {
metrics.add(asMetric(name, value));
}
});
}
private <T extends Number> Metric<T> asMetric(final String name, Buffer<T> buffer) {
return new Metric<>(name, buffer.getValue(), new Date(buffer.getTimestamp()));
}
}