/* * Copyright 2013-2015 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.cloud.netflix.metrics.spectator; import java.util.List; import java.util.stream.Collectors; import org.springframework.boot.actuate.metrics.Metric; import org.springframework.boot.actuate.metrics.reader.MetricReader; import com.netflix.spectator.api.Id; import com.netflix.spectator.api.Registry; import static java.util.stream.StreamSupport.stream; /** * Reads metrics from Spectator, placing Spectator tags in the form * <code>name(k1=v1,k2=v2)</code> where <code>name</code> is the metric name and the * contents of the parentheses are tag key-value pairs. * * @author Jon Schneider */ public class SpectatorMetricReader implements MetricReader { private Registry registry; public SpectatorMetricReader(Registry registry) { this.registry = registry; } protected static String asHierarchicalName(Id id) { List<String> tags = stream(id.tags().spliterator(), false).map( t -> t.key() + "=" + t.value()).collect(Collectors.toList()); return id.name() + "(" + String.join(",", tags) + ")"; } @Override public Metric<?> findOne(String name) { throw new UnsupportedOperationException( "cannot construct a tag-based Spectator id from a hierarchical name"); } @Override public Iterable<Metric<?>> findAll() { return stream(registry.spliterator(), false) .flatMap( metric -> stream(metric.measure().spliterator(), false).map( measure -> new Metric<>(asHierarchicalName(measure.id()), measure.value()))) .sorted((m1, m2) -> m1.getName().compareTo(m2.getName())) .collect(Collectors.toList()); } @Override public long count() { return stream(registry.spliterator(), false).flatMap( m -> stream(m.measure().spliterator(), false)).count(); } }