/*
* 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.repository;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import org.springframework.boot.actuate.metrics.Metric;
import org.springframework.boot.actuate.metrics.writer.Delta;
import org.springframework.util.Assert;
/**
* {@link MultiMetricRepository} implementation backed by a
* {@link InMemoryMetricRepository}.
*
* @author Stephane Nicoll
* @since 1.5.0
*/
public class InMemoryMultiMetricRepository implements MultiMetricRepository {
private final InMemoryMetricRepository repository;
private final Collection<String> groups = new HashSet<>();
/**
* Create a new {@link InMemoryMetricRepository} backed by a new
* {@link InMemoryMetricRepository}.
*/
public InMemoryMultiMetricRepository() {
this(new InMemoryMetricRepository());
}
/**
* Create a new {@link InMemoryMetricRepository} backed by the specified
* {@link InMemoryMetricRepository}.
* @param repository the backing repository
*/
public InMemoryMultiMetricRepository(InMemoryMetricRepository repository) {
Assert.notNull(repository, "Repository must not be null");
this.repository = repository;
}
@Override
public void set(String group, Collection<Metric<?>> values) {
String prefix = group;
if (!prefix.endsWith(".")) {
prefix = prefix + ".";
}
for (Metric<?> metric : values) {
if (!metric.getName().startsWith(prefix)) {
metric = new Metric<Number>(prefix + metric.getName(), metric.getValue(),
metric.getTimestamp());
}
this.repository.set(metric);
}
this.groups.add(group);
}
@Override
public void increment(String group, Delta<?> delta) {
String prefix = group;
if (!prefix.endsWith(".")) {
prefix = prefix + ".";
}
if (!delta.getName().startsWith(prefix)) {
delta = new Delta<Number>(prefix + delta.getName(), delta.getValue(),
delta.getTimestamp());
}
this.repository.increment(delta);
this.groups.add(group);
}
@Override
public Iterable<String> groups() {
return Collections.unmodifiableCollection(this.groups);
}
@Override
public long countGroups() {
return this.groups.size();
}
@Override
public void reset(String group) {
for (Metric<?> metric : findAll(group)) {
this.repository.reset(metric.getName());
}
this.groups.remove(group);
}
@Override
public Iterable<Metric<?>> findAll(String metricNamePrefix) {
return this.repository.findAllWithPrefix(metricNamePrefix);
}
}