diff options
author | Bogdan Drutu <bdrutu@google.com> | 2018-09-30 19:20:08 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-30 19:20:08 -0700 |
commit | fb41bec0a6618bef81f5dcc1f249a8ce530ebd3b (patch) | |
tree | 0a0ec0480ce39c7af08b40344483af46acbb863e | |
parent | b9facf96de0e2d0c8b87712c26794c61d7c4d97c (diff) | |
download | opencensus-java-fb41bec0a6618bef81f5dcc1f249a8ce530ebd3b.tar.gz |
Split the public metrics API from the data model. (#1477)
* Split the public API from the data model.
* Small comment added about registration of the MetricProducer.
6 files changed, 72 insertions, 42 deletions
diff --git a/api/src/main/java/io/opencensus/metrics/MetricProducer.java b/api/src/main/java/io/opencensus/metrics/MetricProducer.java index 38b5d571..2a78b989 100644 --- a/api/src/main/java/io/opencensus/metrics/MetricProducer.java +++ b/api/src/main/java/io/opencensus/metrics/MetricProducer.java @@ -21,18 +21,20 @@ import io.opencensus.metrics.export.MetricProducerManager; import java.util.Collection; /** - * A {@link io.opencensus.metrics.Metric} producer that can be registered for exporting using {@link + * A {@link Metric} producer that can be registered for exporting using {@link * MetricProducerManager}. * * <p>All implementation MUST be thread-safe. + * + * @since 0.17 */ @ExperimentalApi public abstract class MetricProducer { /** - * Returns a collection of produced {@link io.opencensus.metrics.Metric}s to be exported. + * Returns a collection of produced {@link Metric}s to be exported. * - * @return a collection of produced {@link io.opencensus.metrics.Metric}s to be exported. + * @return a collection of produced {@link Metric}s to be exported. */ public abstract Collection<Metric> getMetrics(); } diff --git a/api/src/main/java/io/opencensus/metrics/MetricRegistry.java b/api/src/main/java/io/opencensus/metrics/MetricRegistry.java index ae4d90b0..c249d47b 100644 --- a/api/src/main/java/io/opencensus/metrics/MetricRegistry.java +++ b/api/src/main/java/io/opencensus/metrics/MetricRegistry.java @@ -20,19 +20,17 @@ import io.opencensus.common.ExperimentalApi; import io.opencensus.common.ToDoubleFunction; import io.opencensus.common.ToLongFunction; import io.opencensus.internal.Utils; -import java.util.Collection; -import java.util.Collections; import java.util.LinkedHashMap; /** - * Creates and manages your application's set of metrics. Exporters use the metric registry to - * iterate over the set of metrics instrumenting your application, and then further export each - * metric to the backend of choice. + * Creates and manages your application's set of metrics. The default implementation of this creates + * a {@link MetricProducer} and registers it to the global {@link + * io.opencensus.metrics.export.MetricProducerManager}. * - * @since 0.16 + * @since 0.17 */ @ExperimentalApi -public abstract class MetricRegistry extends MetricProducer { +public abstract class MetricRegistry { /** * Build a new long gauge to be added to the registry. * @@ -43,7 +41,7 @@ public abstract class MetricRegistry extends MetricProducer { * @param unit the unit of the metric. * @param obj the function argument. * @param function the function to be called. - * @since 0.16 @ExperimentalApi + * @since 0.17 */ public abstract <T> void addLongGauge( String name, @@ -63,7 +61,7 @@ public abstract class MetricRegistry extends MetricProducer { * @param unit the unit of the metric. * @param obj the function argument. * @param function the function to be called. - * @since 0.16 @ExperimentalApi + * @since 0.17 */ public abstract <T> void addDoubleGauge( String name, @@ -108,10 +106,5 @@ public abstract class MetricRegistry extends MetricProducer { Utils.checkNotNull(labels, "labels"); Utils.checkNotNull(function, "function"); } - - @Override - public Collection<Metric> getMetrics() { - return Collections.emptyList(); - } } } diff --git a/impl_core/src/main/java/io/opencensus/implcore/metrics/MetricRegistryImpl.java b/impl_core/src/main/java/io/opencensus/implcore/metrics/MetricRegistryImpl.java index f3daaef7..642a9515 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/metrics/MetricRegistryImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/metrics/MetricRegistryImpl.java @@ -26,6 +26,7 @@ import io.opencensus.implcore.metrics.Gauge.LongGauge; import io.opencensus.metrics.LabelKey; import io.opencensus.metrics.LabelValue; import io.opencensus.metrics.Metric; +import io.opencensus.metrics.MetricProducer; import io.opencensus.metrics.MetricRegistry; import java.util.ArrayList; import java.util.Collection; @@ -36,11 +37,12 @@ import java.util.Set; /** Implementation of {@link MetricRegistry}. */ public final class MetricRegistryImpl extends MetricRegistry { - private final Clock clock; - private volatile Set<Gauge> registeredGauges = Collections.emptySet(); + private final RegisteredMeters registeredMeters; + private final MetricProducer metricProducer; MetricRegistryImpl(Clock clock) { - this.clock = clock; + registeredMeters = new RegisteredMeters(); + metricProducer = new MetricProducerForRegistry(registeredMeters, clock); } @Override @@ -52,7 +54,7 @@ public final class MetricRegistryImpl extends MetricRegistry { T obj, ToLongFunction<T> function) { checkNotNull(labels, "labels"); - registerGauge( + registeredMeters.registerMeter( new LongGauge<T>( checkNotNull(name, "name"), checkNotNull(description, "description"), @@ -72,7 +74,7 @@ public final class MetricRegistryImpl extends MetricRegistry { T obj, ToDoubleFunction<T> function) { checkNotNull(labels, "labels"); - registerGauge( + registeredMeters.registerMeter( new DoubleGauge<T>( checkNotNull(name, "name"), checkNotNull(description, "description"), @@ -83,23 +85,45 @@ public final class MetricRegistryImpl extends MetricRegistry { checkNotNull(function, "function"))); } - @Override - public Collection<Metric> getMetrics() { - // Get a snapshot of the current registered gauges. - Set<Gauge> gaguges = registeredGauges; - if (gaguges.isEmpty()) { - return Collections.emptyList(); + private static final class RegisteredMeters { + private volatile Set<Gauge> registeredGauges = Collections.emptySet(); + + private Set<Gauge> getRegisteredMeters() { + return registeredGauges; } - ArrayList<Metric> metrics = new ArrayList<Metric>(); - for (Gauge gauge : gaguges) { - metrics.add(gauge.getMetric(clock)); + + 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; } - return metrics; } - private synchronized void registerGauge(Gauge gauge) { - Set<Gauge> newGaguesList = new LinkedHashSet<Gauge>(registeredGauges); - newGaguesList.add(gauge); - registeredGauges = Collections.unmodifiableSet(newGaguesList); + MetricProducer getMetricProducer() { + return metricProducer; } } diff --git a/impl_core/src/main/java/io/opencensus/implcore/metrics/MetricsComponentImplBase.java b/impl_core/src/main/java/io/opencensus/implcore/metrics/MetricsComponentImplBase.java index 46ad028c..1aef6727 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/metrics/MetricsComponentImplBase.java +++ b/impl_core/src/main/java/io/opencensus/implcore/metrics/MetricsComponentImplBase.java @@ -18,7 +18,6 @@ package io.opencensus.implcore.metrics; import io.opencensus.common.Clock; import io.opencensus.implcore.metrics.export.ExportComponentImpl; -import io.opencensus.metrics.MetricRegistry; import io.opencensus.metrics.MetricsComponent; /** Implementation of {@link MetricsComponent}. */ @@ -33,12 +32,14 @@ public class MetricsComponentImplBase extends MetricsComponent { } @Override - public MetricRegistry getMetricRegistry() { + public MetricRegistryImpl getMetricRegistry() { return metricRegistry; } protected MetricsComponentImplBase(Clock clock) { exportComponent = new ExportComponentImpl(); metricRegistry = new MetricRegistryImpl(clock); + // Register the MetricRegistry's MetricProducer to the global MetricProducerManager. + exportComponent.getMetricProducerManager().add(metricRegistry.getMetricProducer()); } } diff --git a/impl_core/src/test/java/io/opencensus/implcore/metrics/MetricRegistryImplTest.java b/impl_core/src/test/java/io/opencensus/implcore/metrics/MetricRegistryImplTest.java index 769efab2..0b75a6e0 100644 --- a/impl_core/src/test/java/io/opencensus/implcore/metrics/MetricRegistryImplTest.java +++ b/impl_core/src/test/java/io/opencensus/implcore/metrics/MetricRegistryImplTest.java @@ -149,7 +149,7 @@ public class MetricRegistryImplTest { return 5.0; } }); - assertThat(metricRegistry.getMetrics()) + assertThat(metricRegistry.getMetricProducer().getMetrics()) .containsExactly( Metric.create( MetricDescriptor.create( @@ -253,7 +253,7 @@ public class MetricRegistryImplTest { return 7; } }); - assertThat(metricRegistry.getMetrics()) + assertThat(metricRegistry.getMetricProducer().getMetrics()) .containsExactly( Metric.create( MetricDescriptor.create( @@ -295,7 +295,7 @@ public class MetricRegistryImplTest { return 5.0; } }); - assertThat(metricRegistry.getMetrics()) + assertThat(metricRegistry.getMetricProducer().getMetrics()) .containsExactly( Metric.create( MetricDescriptor.create( @@ -325,6 +325,6 @@ public class MetricRegistryImplTest { @Test public void empty_GetMetrics() { - assertThat(metricRegistry.getMetrics()).isEmpty(); + assertThat(metricRegistry.getMetricProducer().getMetrics()).isEmpty(); } } diff --git a/impl_core/src/test/java/io/opencensus/implcore/metrics/MetricsComponentImplBaseTest.java b/impl_core/src/test/java/io/opencensus/implcore/metrics/MetricsComponentImplBaseTest.java index 5050625b..7f8515d3 100644 --- a/impl_core/src/test/java/io/opencensus/implcore/metrics/MetricsComponentImplBaseTest.java +++ b/impl_core/src/test/java/io/opencensus/implcore/metrics/MetricsComponentImplBaseTest.java @@ -40,4 +40,14 @@ public class MetricsComponentImplBaseTest { public void getMetricRegistry() { assertThat(metricsComponentImplBase.getMetricRegistry()).isInstanceOf(MetricRegistryImpl.class); } + + @Test + public void metricRegistry_InstalledToMetricProducerManger() { + assertThat( + metricsComponentImplBase + .getExportComponent() + .getMetricProducerManager() + .getAllMetricProducer()) + .containsExactly(metricsComponentImplBase.getMetricRegistry().getMetricProducer()); + } } |