/**
* Copyright 2017 Pivotal Software, Inc.
*
* 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.metrics.instrument.spectator;
import com.netflix.spectator.api.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import java.util.function.ToDoubleFunction;
import java.util.stream.Stream;
/**
* Allows for overriding the clock on a Spectator Registry.
*/
public class ExternalClockSpectatorRegistry implements Registry {
private final Registry composite;
private final Clock clock;
ExternalClockSpectatorRegistry(Registry registry, Clock clock) {
this.composite = registry;
this.clock = clock;
}
@Override
public Clock clock() {
return clock;
}
@Override
public RegistryConfig config() {
return composite.config();
}
@Override
public Id createId(String name) {
return composite.createId(name);
}
@Override
public Id createId(String name, Iterable<Tag> tags) {
return composite.createId(name, tags);
}
@Override
public void register(Meter meter) {
composite.register(meter);
}
@Override
public ConcurrentMap<Id, Object> state() {
return composite.state();
}
@Override
public Counter counter(Id id) {
return composite.counter(id);
}
@Override
public DistributionSummary distributionSummary(Id id) {
return composite.distributionSummary(id);
}
@Override
public Timer timer(Id id) {
return composite.timer(id);
}
@Override
public Gauge gauge(Id id) {
return composite.gauge(id);
}
@Override
public Meter get(Id id) {
return composite.get(id);
}
@Override
public Iterator<Meter> iterator() {
return composite.iterator();
}
@Override
public <T extends Registry> T underlying(Class<T> c) {
return composite.underlying(c);
}
@Override
public Id createId(String name, String... tags) {
return composite.createId(name, tags);
}
@Override
public Id createId(String name, Map<String, String> tags) {
return composite.createId(name, tags);
}
@Override
public Counter counter(String name) {
return composite.counter(name);
}
@Override
public Counter counter(String name, Iterable<Tag> tags) {
return composite.counter(name, tags);
}
@Override
public Counter counter(String name, String... tags) {
return composite.counter(name, tags);
}
@Override
public DistributionSummary distributionSummary(String name) {
return composite.distributionSummary(name);
}
@Override
public DistributionSummary distributionSummary(String name, Iterable<Tag> tags) {
return composite.distributionSummary(name, tags);
}
@Override
public DistributionSummary distributionSummary(String name, String... tags) {
return composite.distributionSummary(name, tags);
}
@Override
public Timer timer(String name) {
return composite.timer(name);
}
@Override
public Timer timer(String name, Iterable<Tag> tags) {
return composite.timer(name, tags);
}
@Override
public Timer timer(String name, String... tags) {
return composite.timer(name, tags);
}
@Override
public LongTaskTimer longTaskTimer(Id id) {
return com.netflix.spectator.api.patterns.LongTaskTimer.get(this, id);
}
@Override
public LongTaskTimer longTaskTimer(String name) {
return longTaskTimer(createId(name));
}
@Override
public LongTaskTimer longTaskTimer(String name, Iterable<Tag> tags) {
return longTaskTimer(createId(name, tags));
}
@Override
public LongTaskTimer longTaskTimer(String name, String... tags) {
return longTaskTimer(createId(name, toIterable(tags)));
}
@Override
public <T extends Number> T gauge(Id id, T number) {
return composite.gauge(id, number);
}
@Override
public <T extends Number> T gauge(String name, T number) {
return composite.gauge(name, number);
}
@Override
public <T extends Number> T gauge(String name, Iterable<Tag> tags, T number) {
return composite.gauge(name, tags, number);
}
@Override
public <T> T gauge(Id id, T obj, ToDoubleFunction<T> f) {
return composite.gauge(id, obj, f);
}
@Override
public <T> T gauge(String name, T obj, ToDoubleFunction<T> f) {
return composite.gauge(name, obj, f);
}
@Override
public <T extends Collection<?>> T collectionSize(Id id, T collection) {
return composite.collectionSize(id, collection);
}
@Override
public <T extends Collection<?>> T collectionSize(String name, T collection) {
return composite.collectionSize(name, collection);
}
@Override
public <T extends Map<?, ?>> T mapSize(Id id, T collection) {
return composite.mapSize(id, collection);
}
@Override
public <T extends Map<?, ?>> T mapSize(String name, T collection) {
return composite.mapSize(name, collection);
}
@Override
public void methodValue(Id id, Object obj, String method) {
composite.methodValue(id, obj, method);
}
@Override
public void methodValue(String name, Object obj, String method) {
composite.methodValue(name, obj, method);
}
@Override
public Stream<Meter> stream() {
return composite.stream();
}
@Override
public Stream<Counter> counters() {
return composite.counters();
}
@Override
public Stream<DistributionSummary> distributionSummaries() {
return composite.distributionSummaries();
}
@Override
public Stream<Timer> timers() {
return composite.timers();
}
@Override
public Stream<Gauge> gauges() {
return composite.gauges();
}
@Override
public void propagate(String msg, Throwable t) {
composite.propagate(msg, t);
}
@Override
public void propagate(Throwable t) {
composite.propagate(t);
}
private static Iterable<Tag> toIterable(String[] tags) {
if (tags.length % 2 == 1) {
throw new IllegalArgumentException("size must be even, it is a set of key=value pairs");
}
ArrayList<Tag> ts = new ArrayList<>(tags.length);
for (int i = 0; i < tags.length; i += 2) {
ts.add(new BasicTag(tags[i], tags[i + 1]));
}
return ts;
}
}