| /* |
| * Copyright 2018, OpenCensus 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 io.opencensus.implcore.metrics; |
| |
| import static com.google.common.base.Preconditions.checkNotNull; |
| |
| import io.opencensus.common.Clock; |
| import io.opencensus.common.ToDoubleFunction; |
| import io.opencensus.common.ToLongFunction; |
| import io.opencensus.implcore.metrics.Gauge.DoubleGauge; |
| import io.opencensus.implcore.metrics.Gauge.LongGauge; |
| import io.opencensus.metrics.LabelKey; |
| import io.opencensus.metrics.LabelValue; |
| import io.opencensus.metrics.MetricRegistry; |
| import io.opencensus.metrics.export.Metric; |
| import io.opencensus.metrics.export.MetricProducer; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.LinkedHashMap; |
| import java.util.LinkedHashSet; |
| import java.util.Set; |
| |
| /** Implementation of {@link MetricRegistry}. */ |
| public final class MetricRegistryImpl extends MetricRegistry { |
| private final RegisteredMeters registeredMeters; |
| private final MetricProducer metricProducer; |
| |
| MetricRegistryImpl(Clock clock) { |
| registeredMeters = new RegisteredMeters(); |
| metricProducer = new MetricProducerForRegistry(registeredMeters, clock); |
| } |
| |
| @Override |
| public <T> void addLongGauge( |
| String name, |
| String description, |
| String unit, |
| LinkedHashMap<LabelKey, LabelValue> labels, |
| T obj, |
| ToLongFunction<T> function) { |
| checkNotNull(labels, "labels"); |
| registeredMeters.registerMeter( |
| new LongGauge<T>( |
| checkNotNull(name, "name"), |
| checkNotNull(description, "description"), |
| checkNotNull(unit, "unit"), |
| Collections.unmodifiableList(new ArrayList<LabelKey>(labels.keySet())), |
| Collections.unmodifiableList(new ArrayList<LabelValue>(labels.values())), |
| obj, |
| checkNotNull(function, "function"))); |
| } |
| |
| @Override |
| public <T> void addDoubleGauge( |
| String name, |
| String description, |
| String unit, |
| LinkedHashMap<LabelKey, LabelValue> labels, |
| T obj, |
| ToDoubleFunction<T> function) { |
| checkNotNull(labels, "labels"); |
| registeredMeters.registerMeter( |
| new DoubleGauge<T>( |
| checkNotNull(name, "name"), |
| checkNotNull(description, "description"), |
| checkNotNull(unit, "unit"), |
| Collections.unmodifiableList(new ArrayList<LabelKey>(labels.keySet())), |
| Collections.unmodifiableList(new ArrayList<LabelValue>(labels.values())), |
| obj, |
| checkNotNull(function, "function"))); |
| } |
| |
| private static final class RegisteredMeters { |
| private volatile Set<Gauge> registeredGauges = Collections.emptySet(); |
| |
| private Set<Gauge> getRegisteredMeters() { |
| return registeredGauges; |
| } |
| |
| private synchronized void registerMeter(Gauge gauge) { |
| Set<Gauge> newGaguesList = new LinkedHashSet<Gauge>(registeredGauges); |
| newGaguesList.add(gauge); |
| registeredGauges = Collections.unmodifiableSet(newGaguesList); |
| } |
| } |
| |
| private static final class MetricProducerForRegistry extends MetricProducer { |
| private final RegisteredMeters registeredMeters; |
| private final Clock clock; |
| |
| private MetricProducerForRegistry(RegisteredMeters registeredMeters, Clock clock) { |
| this.registeredMeters = registeredMeters; |
| this.clock = clock; |
| } |
| |
| @Override |
| public Collection<Metric> getMetrics() { |
| // Get a snapshot of the current registered gauges. |
| Set<Gauge> gaguges = registeredMeters.getRegisteredMeters(); |
| if (gaguges.isEmpty()) { |
| return Collections.emptyList(); |
| } |
| ArrayList<Metric> metrics = new ArrayList<Metric>(); |
| for (Gauge gauge : gaguges) { |
| metrics.add(gauge.getMetric(clock)); |
| } |
| return metrics; |
| } |
| } |
| |
| MetricProducer getMetricProducer() { |
| return metricProducer; |
| } |
| } |