From 1c58c313c0b13d9ef781436572645f699a2c286d Mon Sep 17 00:00:00 2001 From: Kristen Kozak Date: Wed, 8 Nov 2017 18:03:44 -0800 Subject: Add ViewManager.getAllExportedViews(). This method currently returns all registered cumulative views. We could add a way to specify which views should be exported later. The API is currently needed for the StackDriver exporter. The NoopViewManager also returns all cumulative views. However, the exporter could choose to not export data when stats collection isn't enabled. --- .../main/java/io/opencensus/stats/NoopStats.java | 16 ++++++ .../main/java/io/opencensus/stats/ViewManager.java | 12 +++++ .../io/opencensus/stats/NoopViewManagerTest.java | 63 ++++++++++++++++++++++ 3 files changed, 91 insertions(+) (limited to 'api') diff --git a/api/src/main/java/io/opencensus/stats/NoopStats.java b/api/src/main/java/io/opencensus/stats/NoopStats.java index 55c424c7..c087a19f 100644 --- a/api/src/main/java/io/opencensus/stats/NoopStats.java +++ b/api/src/main/java/io/opencensus/stats/NoopStats.java @@ -22,10 +22,12 @@ import static com.google.common.base.Preconditions.checkState; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import io.opencensus.common.Functions; import io.opencensus.common.Timestamp; import io.opencensus.stats.Measure.MeasureDouble; import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.View.AggregationWindow; import io.opencensus.stats.ViewData.AggregationWindowData; import io.opencensus.stats.ViewData.AggregationWindowData.CumulativeData; import io.opencensus.stats.ViewData.AggregationWindowData.IntervalData; @@ -34,6 +36,7 @@ import io.opencensus.tags.TagValue; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.Immutable; @@ -187,5 +190,18 @@ final class NoopStats { } } } + + @Override + public Set getAllExportedViews() { + synchronized (views) { + Set exportedViews = Sets.newHashSet(); + for (View view : views.values()) { + if (view.getWindow() instanceof AggregationWindow.Cumulative) { + exportedViews.add(view); + } + } + return Collections.unmodifiableSet(exportedViews); + } + } } } diff --git a/api/src/main/java/io/opencensus/stats/ViewManager.java b/api/src/main/java/io/opencensus/stats/ViewManager.java index f98e8058..a6e18b89 100644 --- a/api/src/main/java/io/opencensus/stats/ViewManager.java +++ b/api/src/main/java/io/opencensus/stats/ViewManager.java @@ -16,6 +16,7 @@ package io.opencensus.stats; +import java.util.Set; import javax.annotation.Nullable; /** @@ -42,4 +43,15 @@ public abstract class ViewManager { */ @Nullable public abstract ViewData getView(View.Name view); + + /** + * Returns all registered views that should be exported. + * + *

This method should be used by any stats exporter that automatically exports data for views + * registered with the {@link ViewManager}. + * + * @return all registered views that should be exported. + * @since 0.9 + */ + public abstract Set getAllExportedViews(); } diff --git a/api/src/test/java/io/opencensus/stats/NoopViewManagerTest.java b/api/src/test/java/io/opencensus/stats/NoopViewManagerTest.java index 24d1b14a..4aaa60dc 100644 --- a/api/src/test/java/io/opencensus/stats/NoopViewManagerTest.java +++ b/api/src/test/java/io/opencensus/stats/NoopViewManagerTest.java @@ -29,6 +29,7 @@ import io.opencensus.stats.ViewData.AggregationWindowData.CumulativeData; import io.opencensus.stats.ViewData.AggregationWindowData.IntervalData; import io.opencensus.tags.TagKey; import java.util.Arrays; +import java.util.Set; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -128,4 +129,66 @@ public final class NoopViewManagerTest { thrown.expect(NullPointerException.class); viewManager.getView(null); } + + @Test + public void getAllExportedViews() { + ViewManager viewManager = NoopStats.newNoopViewManager(); + assertThat(viewManager.getAllExportedViews()).isEmpty(); + View cumulativeView1 = + View.create( + View.Name.create("View 1"), + VIEW_DESCRIPTION, + MEASURE, + AGGREGATION, + Arrays.asList(KEY), + CUMULATIVE); + View cumulativeView2 = + View.create( + View.Name.create("View 2"), + VIEW_DESCRIPTION, + MEASURE, + AGGREGATION, + Arrays.asList(KEY), + CUMULATIVE); + View intervalView = + View.create( + View.Name.create("View 3"), + VIEW_DESCRIPTION, + MEASURE, + AGGREGATION, + Arrays.asList(KEY), + INTERVAL); + viewManager.registerView(cumulativeView1); + viewManager.registerView(cumulativeView2); + viewManager.registerView(intervalView); + + // Only cumulative views should be exported. + assertThat(viewManager.getAllExportedViews()).containsExactly(cumulativeView1, cumulativeView2); + } + + @Test + public void getAllExportedViews_ResultIsUnmodifiable() { + ViewManager viewManager = NoopStats.newNoopViewManager(); + View view1 = + View.create( + View.Name.create("View 1"), + VIEW_DESCRIPTION, + MEASURE, + AGGREGATION, + Arrays.asList(KEY), + CUMULATIVE); + viewManager.registerView(view1); + Set exported = viewManager.getAllExportedViews(); + + View view2 = + View.create( + View.Name.create("View 2"), + VIEW_DESCRIPTION, + MEASURE, + AGGREGATION, + Arrays.asList(KEY), + CUMULATIVE); + thrown.expect(UnsupportedOperationException.class); + exported.add(view2); + } } -- cgit v1.2.3