From 43651556393859b342d6db65b11aa6dca61b3678 Mon Sep 17 00:00:00 2001 From: Yang Song Date: Wed, 8 Aug 2018 11:09:34 -0700 Subject: Allow users to use custom metric name prefix for Stackdriver (#1057) --- CHANGELOG.md | 3 +- .../stats/stackdriver/StackdriverExportUtils.java | 28 +++++---- .../stackdriver/StackdriverExporterWorker.java | 47 +++++++++++++- .../stackdriver/StackdriverStatsConfiguration.java | 22 +++++++ .../stackdriver/StackdriverStatsExporter.java | 36 +++++++---- .../stackdriver/StackdriverExportUtilsTest.java | 72 +++++++++++++++++----- .../stackdriver/StackdriverExporterWorkerTest.java | 59 +++++++++++++++--- .../StackdriverStatsConfigurationTest.java | 4 ++ 8 files changed, 221 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index accf48be..001ed4ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,8 @@ on recording exemplars. - Reduce the default limit on `Link`s per `Span` to 32 (was 128 before). - Add Spring support for `@Traced` annotation and java.sql.PreparedStatements - tracing + tracing +- Allow custom prefix for Stackdriver metrics in `StackdriverStatsConfiguration`. ## 0.15.0 - 2018-06-20 - Expose the factory methods of MonitoredResource. diff --git a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtils.java b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtils.java index 2c571cfe..93f287c6 100644 --- a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtils.java +++ b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtils.java @@ -87,8 +87,6 @@ final class StackdriverExportUtils { private static final String GLOBAL = "global"; private static final Logger logger = Logger.getLogger(StackdriverExportUtils.class.getName()); - private static final String CUSTOM_METRIC_DOMAIN = "custom.googleapis.com"; - private static final String CUSTOM_OPENCENSUS_DOMAIN = CUSTOM_METRIC_DOMAIN + "/opencensus/"; private static final String OPENCENSUS_TASK_VALUE_DEFAULT = generateDefaultTaskValue(); private static final String PROJECT_ID_LABEL_KEY = "project_id"; @@ -204,7 +202,8 @@ final class StackdriverExportUtils { // Construct a MetricDescriptor using a View. @javax.annotation.Nullable - static MetricDescriptor createMetricDescriptor(View view, String projectId) { + static MetricDescriptor createMetricDescriptor( + View view, String projectId, String domain, String displayNamePrefix) { if (!(view.getWindow() instanceof View.AggregationWindow.Cumulative)) { // TODO(songya): Only Cumulative view will be exported to Stackdriver in this version. return null; @@ -212,13 +211,14 @@ final class StackdriverExportUtils { MetricDescriptor.Builder builder = MetricDescriptor.newBuilder(); String viewName = view.getName().asString(); - String type = generateType(viewName); + String type = generateType(viewName, domain); // Name format refers to // cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors/create builder.setName(String.format("projects/%s/metricDescriptors/%s", projectId, type)); builder.setType(type); builder.setDescription(view.getDescription()); - builder.setDisplayName("OpenCensus/" + viewName); + String displayName = createDisplayName(viewName, displayNamePrefix); + builder.setDisplayName(displayName); for (TagKey tagKey : view.getColumns()) { builder.addLabels(createLabelDescriptor(tagKey)); } @@ -234,8 +234,12 @@ final class StackdriverExportUtils { return builder.build(); } - private static String generateType(String viewName) { - return CUSTOM_OPENCENSUS_DOMAIN + viewName; + private static String generateType(String viewName, String domain) { + return domain + viewName; + } + + private static String createDisplayName(String viewName, String displayNamePrefix) { + return displayNamePrefix + viewName; } // Construct a LabelDescriptor from a TagKey @@ -293,7 +297,9 @@ final class StackdriverExportUtils { // Convert ViewData to a list of TimeSeries, so that ViewData can be uploaded to Stackdriver. static List createTimeSeriesList( - @javax.annotation.Nullable ViewData viewData, MonitoredResource monitoredResource) { + @javax.annotation.Nullable ViewData viewData, + MonitoredResource monitoredResource, + String domain) { List timeSeriesList = Lists.newArrayList(); if (viewData == null) { return timeSeriesList; @@ -314,7 +320,7 @@ final class StackdriverExportUtils { for (Entry, AggregationData> entry : viewData.getAggregationMap().entrySet()) { TimeSeries.Builder builder = shared.clone(); - builder.setMetric(createMetric(view, entry.getKey())); + builder.setMetric(createMetric(view, entry.getKey(), domain)); builder.addPoints( createPoint(entry.getValue(), viewData.getWindowData(), view.getAggregation())); timeSeriesList.add(builder.build()); @@ -325,10 +331,10 @@ final class StackdriverExportUtils { // Create a Metric using the TagKeys and TagValues. @VisibleForTesting - static Metric createMetric(View view, List tagValues) { + static Metric createMetric(View view, List tagValues, String domain) { Metric.Builder builder = Metric.newBuilder(); // TODO(songya): use pre-defined metrics for canonical views - builder.setType(generateType(view.getName().asString())); + builder.setType(generateType(view.getName().asString(), domain)); Map stringTagMap = Maps.newHashMap(); List columns = view.getColumns(); checkArgument( diff --git a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExporterWorker.java b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExporterWorker.java index 5025c519..7873e29e 100644 --- a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExporterWorker.java +++ b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExporterWorker.java @@ -21,6 +21,7 @@ import com.google.api.MonitoredResource; import com.google.api.gax.rpc.ApiException; import com.google.cloud.monitoring.v3.MetricServiceClient; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.monitoring.v3.CreateMetricDescriptorRequest; import com.google.monitoring.v3.CreateTimeSeriesRequest; @@ -65,12 +66,21 @@ final class StackdriverExporterWorker implements Runnable { // Stackdriver Monitoring v3 only accepts up to 200 TimeSeries per CreateTimeSeries call. @VisibleForTesting static final int MAX_BATCH_EXPORT_SIZE = 200; + @VisibleForTesting static final String DEFAULT_DISPLAY_NAME_PREFIX = "OpenCensus/"; + @VisibleForTesting static final String CUSTOM_METRIC_DOMAIN = "custom.googleapis.com/"; + @VisibleForTesting static final String EXTERNAL_METRIC_DOMAIN = "external.googleapis.com/"; + + @VisibleForTesting + static final String CUSTOM_OPENCENSUS_DOMAIN = CUSTOM_METRIC_DOMAIN + "opencensus/"; + private final long scheduleDelayMillis; private final String projectId; private final ProjectName projectName; private final MetricServiceClient metricServiceClient; private final ViewManager viewManager; private final MonitoredResource monitoredResource; + private final String domain; + private final String displayNamePrefix; private final Map registeredViews = new HashMap(); private static final Tracer tracer = Tracing.getTracer(); @@ -81,13 +91,16 @@ final class StackdriverExporterWorker implements Runnable { MetricServiceClient metricServiceClient, Duration exportInterval, ViewManager viewManager, - MonitoredResource monitoredResource) { + MonitoredResource monitoredResource, + @javax.annotation.Nullable String metricNamePrefix) { this.scheduleDelayMillis = exportInterval.toMillis(); this.projectId = projectId; projectName = ProjectName.newBuilder().setProject(projectId).build(); this.metricServiceClient = metricServiceClient; this.viewManager = viewManager; this.monitoredResource = monitoredResource; + this.domain = getDomain(metricNamePrefix); + this.displayNamePrefix = getDisplayNamePrefix(metricNamePrefix); Tracing.getExportComponent() .getSampledSpanStore() @@ -122,7 +135,7 @@ final class StackdriverExporterWorker implements Runnable { // canonical metrics. Registration is required only for custom view definitions. Canonical // views should be pre-registered. MetricDescriptor metricDescriptor = - StackdriverExportUtils.createMetricDescriptor(view, projectId); + StackdriverExportUtils.createMetricDescriptor(view, projectId, domain, displayNamePrefix); if (metricDescriptor == null) { // Don't register interval views in this version. return false; @@ -170,7 +183,7 @@ final class StackdriverExporterWorker implements Runnable { List timeSeriesList = Lists.newArrayList(); for (/*@Nullable*/ ViewData viewData : viewDataList) { timeSeriesList.addAll( - StackdriverExportUtils.createTimeSeriesList(viewData, monitoredResource)); + StackdriverExportUtils.createTimeSeriesList(viewData, monitoredResource, domain)); } for (List batchedTimeSeries : Lists.partition(timeSeriesList, MAX_BATCH_EXPORT_SIZE)) { @@ -231,4 +244,32 @@ final class StackdriverExporterWorker implements Runnable { private static String exceptionMessage(Throwable e) { return e.getMessage() != null ? e.getMessage() : e.getClass().getName(); } + + @VisibleForTesting + static String getDomain(@javax.annotation.Nullable String metricNamePrefix) { + String domain; + if (Strings.isNullOrEmpty(metricNamePrefix)) { + domain = CUSTOM_OPENCENSUS_DOMAIN; + } else { + if (metricNamePrefix.startsWith(CUSTOM_METRIC_DOMAIN) + || metricNamePrefix.startsWith(EXTERNAL_METRIC_DOMAIN)) { + domain = metricNamePrefix; + } else { + domain = CUSTOM_METRIC_DOMAIN + metricNamePrefix + '/'; + } + } + return domain; + } + + @VisibleForTesting + static String getDisplayNamePrefix(@javax.annotation.Nullable String metricNamePrefix) { + if (metricNamePrefix == null) { + return DEFAULT_DISPLAY_NAME_PREFIX; + } else { + if (!metricNamePrefix.endsWith("/") && !metricNamePrefix.isEmpty()) { + metricNamePrefix += '/'; + } + return metricNamePrefix; + } + } } diff --git a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsConfiguration.java b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsConfiguration.java index 8a332c46..c4008ca1 100644 --- a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsConfiguration.java +++ b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsConfiguration.java @@ -70,6 +70,15 @@ public abstract class StackdriverStatsConfiguration { @Nullable public abstract MonitoredResource getMonitoredResource(); + /** + * Returns the name prefix for Stackdriver metrics. + * + * @return the metric name prefix. + * @since 0.16 + */ + @Nullable + public abstract String getMetricNamePrefix(); + /** * Returns a new {@link Builder}. * @@ -126,6 +135,19 @@ public abstract class StackdriverStatsConfiguration { */ public abstract Builder setMonitoredResource(MonitoredResource monitoredResource); + /** + * Sets the the name prefix for Stackdriver metrics. + * + *

It is suggested to use prefix with custom or external domain name, for example + * "custom.googleapis.com/myorg/" or "external.googleapis.com/prometheus/". If the given prefix + * doesn't start with a valid domain, we will add "custom.googleapis.com/" before the prefix. + * + * @param prefix the metric name prefix. + * @return this. + * @since 0.16 + */ + public abstract Builder setMetricNamePrefix(String prefix); + /** * Builds a new {@link StackdriverStatsConfiguration} with current settings. * diff --git a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java index 380f4ea9..51c54916 100644 --- a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java +++ b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java @@ -79,11 +79,17 @@ public final class StackdriverStatsExporter { MetricServiceClient metricServiceClient, Duration exportInterval, ViewManager viewManager, - MonitoredResource monitoredResource) { + MonitoredResource monitoredResource, + @Nullable String metricNamePrefix) { checkArgument(exportInterval.compareTo(ZERO) > 0, "Duration must be positive"); StackdriverExporterWorker worker = new StackdriverExporterWorker( - projectId, metricServiceClient, exportInterval, viewManager, monitoredResource); + projectId, + metricServiceClient, + exportInterval, + viewManager, + monitoredResource, + metricNamePrefix); this.workerThread = new DaemonThreadFactory().newThread(worker); } @@ -106,7 +112,7 @@ public final class StackdriverStatsExporter { checkNotNull(credentials, "credentials"); checkNotNull(projectId, "projectId"); checkNotNull(exportInterval, "exportInterval"); - createInternal(credentials, projectId, exportInterval, null); + createInternal(credentials, projectId, exportInterval, null, null); } /** @@ -136,7 +142,7 @@ public final class StackdriverStatsExporter { throws IOException { checkNotNull(projectId, "projectId"); checkNotNull(exportInterval, "exportInterval"); - createInternal(null, projectId, exportInterval, null); + createInternal(null, projectId, exportInterval, null, null); } /** @@ -159,6 +165,9 @@ public final class StackdriverStatsExporter { * cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource for a list of valid * {@code MonitoredResource}s. * + *

If {@code metricNamePrefix} of the configuration is not set, the exporter will use the + * default prefix "OpenCensus". + * * @param configuration the {@code StackdriverStatsConfiguration}. * @throws IllegalStateException if a Stackdriver exporter is already created. * @since 0.11.0 @@ -170,7 +179,8 @@ public final class StackdriverStatsExporter { configuration.getCredentials(), configuration.getProjectId(), configuration.getExportInterval(), - configuration.getMonitoredResource()); + configuration.getMonitoredResource(), + configuration.getMetricNamePrefix()); } /** @@ -194,11 +204,13 @@ public final class StackdriverStatsExporter { * *

This method uses the default resource created from the environment variables. * + *

This method uses the default display name prefix "OpenCensus". + * * @throws IllegalStateException if a Stackdriver exporter is already created. * @since 0.11.0 */ public static void createAndRegister() throws IOException { - createInternal(null, null, null, null); + createInternal(null, null, null, null, null); } /** @@ -225,7 +237,7 @@ public final class StackdriverStatsExporter { @Deprecated public static void createAndRegister(Duration exportInterval) throws IOException { checkNotNull(exportInterval, "exportInterval"); - createInternal(null, null, exportInterval, null); + createInternal(null, null, exportInterval, null, null); } /** @@ -254,7 +266,7 @@ public final class StackdriverStatsExporter { checkNotNull(projectId, "projectId"); checkNotNull(exportInterval, "exportInterval"); checkNotNull(monitoredResource, "monitoredResource"); - createInternal(null, projectId, exportInterval, monitoredResource); + createInternal(null, projectId, exportInterval, monitoredResource, null); } /** @@ -281,7 +293,7 @@ public final class StackdriverStatsExporter { Duration exportInterval, MonitoredResource monitoredResource) throws IOException { checkNotNull(exportInterval, "exportInterval"); checkNotNull(monitoredResource, "monitoredResource"); - createInternal(null, null, exportInterval, monitoredResource); + createInternal(null, null, exportInterval, monitoredResource, null); } // Use createInternal() (instead of constructor) to enforce singleton. @@ -289,7 +301,8 @@ public final class StackdriverStatsExporter { @Nullable Credentials credentials, @Nullable String projectId, @Nullable Duration exportInterval, - @Nullable MonitoredResource monitoredResource) + @Nullable MonitoredResource monitoredResource, + @Nullable String metricNamePrefix) throws IOException { projectId = projectId == null ? ServiceOptions.getDefaultProjectId() : projectId; exportInterval = exportInterval == null ? DEFAULT_INTERVAL : exportInterval; @@ -313,7 +326,8 @@ public final class StackdriverStatsExporter { metricServiceClient, exportInterval, Stats.getViewManager(), - monitoredResource); + monitoredResource, + metricNamePrefix); exporter.workerThread.start(); } } diff --git a/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtilsTest.java b/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtilsTest.java index 1adf652b..cd536e8f 100644 --- a/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtilsTest.java +++ b/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtilsTest.java @@ -17,6 +17,8 @@ package io.opencensus.exporter.stats.stackdriver; import static com.google.common.truth.Truth.assertThat; +import static io.opencensus.exporter.stats.stackdriver.StackdriverExporterWorker.CUSTOM_OPENCENSUS_DOMAIN; +import static io.opencensus.exporter.stats.stackdriver.StackdriverExporterWorker.DEFAULT_DISPLAY_NAME_PREFIX; import com.google.api.Distribution.BucketOptions; import com.google.api.Distribution.BucketOptions.Explicit; @@ -175,7 +177,9 @@ public class StackdriverExportUtilsTest { DISTRIBUTION, Arrays.asList(KEY), CUMULATIVE); - assertThat(StackdriverExportUtils.createMetric(view, Arrays.asList(VALUE_1))) + assertThat( + StackdriverExportUtils.createMetric( + view, Arrays.asList(VALUE_1), CUSTOM_OPENCENSUS_DOMAIN)) .isEqualTo( Metric.newBuilder() .setType("custom.googleapis.com/opencensus/" + VIEW_NAME) @@ -184,6 +188,26 @@ public class StackdriverExportUtilsTest { .build()); } + @Test + public void createMetric_WithExternalMetricDomain() { + View view = + View.create( + Name.create(VIEW_NAME), + VIEW_DESCRIPTION, + MEASURE_DOUBLE, + DISTRIBUTION, + Arrays.asList(KEY), + CUMULATIVE); + String prometheusDomain = "external.googleapis.com/prometheus/"; + assertThat(StackdriverExportUtils.createMetric(view, Arrays.asList(VALUE_1), prometheusDomain)) + .isEqualTo( + Metric.newBuilder() + .setType(prometheusDomain + VIEW_NAME) + .putLabels("KEY", "VALUE1") + .putLabels(StackdriverExportUtils.OPENCENSUS_TASK, DEFAULT_TASK_VALUE) + .build()); + } + @Test public void createMetric_skipNullTagValue() { View view = @@ -194,7 +218,9 @@ public class StackdriverExportUtilsTest { DISTRIBUTION, Arrays.asList(KEY, KEY_2, KEY_3), CUMULATIVE); - assertThat(StackdriverExportUtils.createMetric(view, Arrays.asList(VALUE_1, null, VALUE_2))) + assertThat( + StackdriverExportUtils.createMetric( + view, Arrays.asList(VALUE_1, null, VALUE_2), CUSTOM_OPENCENSUS_DOMAIN)) .isEqualTo( Metric.newBuilder() .setType("custom.googleapis.com/opencensus/" + VIEW_NAME) @@ -217,7 +243,7 @@ public class StackdriverExportUtilsTest { List tagValues = Arrays.asList(VALUE_1, null); thrown.expect(IllegalArgumentException.class); thrown.expectMessage("TagKeys and TagValues don't have same size."); - StackdriverExportUtils.createMetric(view, tagValues); + StackdriverExportUtils.createMetric(view, tagValues, CUSTOM_OPENCENSUS_DOMAIN); } @Test @@ -350,17 +376,17 @@ public class StackdriverExportUtilsTest { Arrays.asList(KEY), CUMULATIVE); MetricDescriptor metricDescriptor = - StackdriverExportUtils.createMetricDescriptor(view, PROJECT_ID); + StackdriverExportUtils.createMetricDescriptor( + view, PROJECT_ID, "custom.googleapis.com/myorg/", "myorg/"); assertThat(metricDescriptor.getName()) .isEqualTo( "projects/" + PROJECT_ID - + "/metricDescriptors/custom.googleapis.com/opencensus/" + + "/metricDescriptors/custom.googleapis.com/myorg/" + VIEW_NAME); assertThat(metricDescriptor.getDescription()).isEqualTo(VIEW_DESCRIPTION); - assertThat(metricDescriptor.getDisplayName()).isEqualTo("OpenCensus/" + VIEW_NAME); - assertThat(metricDescriptor.getType()) - .isEqualTo("custom.googleapis.com/opencensus/" + VIEW_NAME); + assertThat(metricDescriptor.getDisplayName()).isEqualTo("myorg/" + VIEW_NAME); + assertThat(metricDescriptor.getType()).isEqualTo("custom.googleapis.com/myorg/" + VIEW_NAME); assertThat(metricDescriptor.getUnit()).isEqualTo(MEASURE_UNIT); assertThat(metricDescriptor.getMetricKind()).isEqualTo(MetricKind.CUMULATIVE); assertThat(metricDescriptor.getValueType()).isEqualTo(MetricDescriptor.ValueType.DISTRIBUTION); @@ -389,7 +415,8 @@ public class StackdriverExportUtilsTest { Arrays.asList(KEY), CUMULATIVE); MetricDescriptor metricDescriptor = - StackdriverExportUtils.createMetricDescriptor(view, PROJECT_ID); + StackdriverExportUtils.createMetricDescriptor( + view, PROJECT_ID, CUSTOM_OPENCENSUS_DOMAIN, DEFAULT_DISPLAY_NAME_PREFIX); assertThat(metricDescriptor.getName()) .isEqualTo( "projects/" @@ -427,7 +454,10 @@ public class StackdriverExportUtilsTest { DISTRIBUTION, Arrays.asList(KEY), INTERVAL); - assertThat(StackdriverExportUtils.createMetricDescriptor(view, PROJECT_ID)).isNull(); + assertThat( + StackdriverExportUtils.createMetricDescriptor( + view, PROJECT_ID, CUSTOM_OPENCENSUS_DOMAIN, DEFAULT_DISPLAY_NAME_PREFIX)) + .isNull(); } @Test @@ -451,13 +481,16 @@ public class StackdriverExportUtilsTest { CumulativeData.create(Timestamp.fromMillis(1000), Timestamp.fromMillis(2000)); ViewData viewData = ViewData.create(view, aggregationMap, cumulativeData); List timeSeriesList = - StackdriverExportUtils.createTimeSeriesList(viewData, DEFAULT_RESOURCE); + StackdriverExportUtils.createTimeSeriesList( + viewData, DEFAULT_RESOURCE, CUSTOM_OPENCENSUS_DOMAIN); assertThat(timeSeriesList).hasSize(2); TimeSeries expected1 = TimeSeries.newBuilder() .setMetricKind(MetricKind.CUMULATIVE) .setValueType(MetricDescriptor.ValueType.DISTRIBUTION) - .setMetric(StackdriverExportUtils.createMetric(view, Arrays.asList(VALUE_1))) + .setMetric( + StackdriverExportUtils.createMetric( + view, Arrays.asList(VALUE_1), CUSTOM_OPENCENSUS_DOMAIN)) .setResource(MonitoredResource.newBuilder().setType("global")) .addPoints( StackdriverExportUtils.createPoint(distributionData1, cumulativeData, DISTRIBUTION)) @@ -466,7 +499,9 @@ public class StackdriverExportUtilsTest { TimeSeries.newBuilder() .setMetricKind(MetricKind.CUMULATIVE) .setValueType(MetricDescriptor.ValueType.DISTRIBUTION) - .setMetric(StackdriverExportUtils.createMetric(view, Arrays.asList(VALUE_2))) + .setMetric( + StackdriverExportUtils.createMetric( + view, Arrays.asList(VALUE_2), CUSTOM_OPENCENSUS_DOMAIN)) .setResource(MonitoredResource.newBuilder().setType("global")) .addPoints( StackdriverExportUtils.createPoint(distributionData2, cumulativeData, DISTRIBUTION)) @@ -492,7 +527,10 @@ public class StackdriverExportUtilsTest { DistributionData.create(-1, 1, -1, -1, 0, Arrays.asList(1L, 0L, 0L, 0L, 0L))); ViewData viewData = ViewData.create(view, aggregationMap, IntervalData.create(Timestamp.fromMillis(2000))); - assertThat(StackdriverExportUtils.createTimeSeriesList(viewData, DEFAULT_RESOURCE)).isEmpty(); + assertThat( + StackdriverExportUtils.createTimeSeriesList( + viewData, DEFAULT_RESOURCE, CUSTOM_OPENCENSUS_DOMAIN)) + .isEmpty(); } @Test @@ -514,13 +552,15 @@ public class StackdriverExportUtilsTest { CumulativeData.create(Timestamp.fromMillis(1000), Timestamp.fromMillis(2000)); ViewData viewData = ViewData.create(view, aggregationMap, cumulativeData); List timeSeriesList = - StackdriverExportUtils.createTimeSeriesList(viewData, resource); + StackdriverExportUtils.createTimeSeriesList(viewData, resource, CUSTOM_OPENCENSUS_DOMAIN); assertThat(timeSeriesList) .containsExactly( TimeSeries.newBuilder() .setMetricKind(MetricKind.CUMULATIVE) .setValueType(MetricDescriptor.ValueType.DOUBLE) - .setMetric(StackdriverExportUtils.createMetric(view, Arrays.asList(VALUE_1))) + .setMetric( + StackdriverExportUtils.createMetric( + view, Arrays.asList(VALUE_1), CUSTOM_OPENCENSUS_DOMAIN)) .setResource(resource) .addPoints(StackdriverExportUtils.createPoint(sumData, cumulativeData, SUM)) .build()); diff --git a/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverExporterWorkerTest.java b/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverExporterWorkerTest.java index 9aa91a80..17ef0a5d 100644 --- a/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverExporterWorkerTest.java +++ b/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverExporterWorkerTest.java @@ -17,6 +17,8 @@ package io.opencensus.exporter.stats.stackdriver; import static com.google.common.truth.Truth.assertThat; +import static io.opencensus.exporter.stats.stackdriver.StackdriverExporterWorker.CUSTOM_OPENCENSUS_DOMAIN; +import static io.opencensus.exporter.stats.stackdriver.StackdriverExporterWorker.DEFAULT_DISPLAY_NAME_PREFIX; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; @@ -107,6 +109,12 @@ public class StackdriverExporterWorkerTest { @Test public void testConstants() { assertThat(StackdriverExporterWorker.MAX_BATCH_EXPORT_SIZE).isEqualTo(200); + assertThat(StackdriverExporterWorker.CUSTOM_METRIC_DOMAIN).isEqualTo("custom.googleapis.com/"); + assertThat(StackdriverExporterWorker.EXTERNAL_METRIC_DOMAIN) + .isEqualTo("external.googleapis.com/"); + assertThat(StackdriverExporterWorker.CUSTOM_OPENCENSUS_DOMAIN) + .isEqualTo("custom.googleapis.com/opencensus/"); + assertThat(StackdriverExporterWorker.DEFAULT_DISPLAY_NAME_PREFIX).isEqualTo("OpenCensus/"); } @Test @@ -127,15 +135,19 @@ public class StackdriverExporterWorkerTest { new FakeMetricServiceClient(mockStub), ONE_SECOND, mockViewManager, - DEFAULT_RESOURCE); + DEFAULT_RESOURCE, + null); worker.export(); verify(mockStub, times(1)).createMetricDescriptorCallable(); verify(mockStub, times(1)).createTimeSeriesCallable(); - MetricDescriptor descriptor = StackdriverExportUtils.createMetricDescriptor(view, PROJECT_ID); + MetricDescriptor descriptor = + StackdriverExportUtils.createMetricDescriptor( + view, PROJECT_ID, CUSTOM_OPENCENSUS_DOMAIN, DEFAULT_DISPLAY_NAME_PREFIX); List timeSeries = - StackdriverExportUtils.createTimeSeriesList(viewData, DEFAULT_RESOURCE); + StackdriverExportUtils.createTimeSeriesList( + viewData, DEFAULT_RESOURCE, CUSTOM_OPENCENSUS_DOMAIN); verify(mockCreateMetricDescriptorCallable, times(1)) .call( eq( @@ -170,7 +182,8 @@ public class StackdriverExporterWorkerTest { new FakeMetricServiceClient(mockStub), ONE_SECOND, mockViewManager, - DEFAULT_RESOURCE); + DEFAULT_RESOURCE, + null); worker.export(); verify(mockStub, times(1)).createMetricDescriptorCallable(); @@ -189,7 +202,8 @@ public class StackdriverExporterWorkerTest { new FakeMetricServiceClient(mockStub), ONE_SECOND, mockViewManager, - DEFAULT_RESOURCE); + DEFAULT_RESOURCE, + null); assertThat(worker.registerView(view)).isFalse(); worker.export(); @@ -205,7 +219,8 @@ public class StackdriverExporterWorkerTest { new FakeMetricServiceClient(mockStub), ONE_SECOND, mockViewManager, - DEFAULT_RESOURCE); + DEFAULT_RESOURCE, + null); View view1 = View.create(VIEW_NAME, VIEW_DESCRIPTION, MEASURE, SUM, Arrays.asList(KEY), CUMULATIVE); assertThat(worker.registerView(view1)).isTrue(); @@ -231,7 +246,8 @@ public class StackdriverExporterWorkerTest { new FakeMetricServiceClient(mockStub), ONE_SECOND, mockViewManager, - DEFAULT_RESOURCE); + DEFAULT_RESOURCE, + null); View view = View.create(VIEW_NAME, VIEW_DESCRIPTION, MEASURE, SUM, Arrays.asList(KEY), CUMULATIVE); assertThat(worker.registerView(view)).isTrue(); @@ -249,13 +265,40 @@ public class StackdriverExporterWorkerTest { new FakeMetricServiceClient(mockStub), ONE_SECOND, mockViewManager, - DEFAULT_RESOURCE); + DEFAULT_RESOURCE, + null); View view = View.create(VIEW_NAME, VIEW_DESCRIPTION, MEASURE, SUM, Arrays.asList(KEY), INTERVAL); assertThat(worker.registerView(view)).isFalse(); verify(mockStub, times(0)).createMetricDescriptorCallable(); } + @Test + public void getDomain() { + assertThat(StackdriverExporterWorker.getDomain(null)) + .isEqualTo("custom.googleapis.com/opencensus/"); + assertThat(StackdriverExporterWorker.getDomain("")) + .isEqualTo("custom.googleapis.com/opencensus/"); + assertThat(StackdriverExporterWorker.getDomain("custom.googleapis.com/myorg/")) + .isEqualTo("custom.googleapis.com/myorg/"); + assertThat(StackdriverExporterWorker.getDomain("external.googleapis.com/prometheus/")) + .isEqualTo("external.googleapis.com/prometheus/"); + assertThat(StackdriverExporterWorker.getDomain("myorg")) + .isEqualTo("custom.googleapis.com/myorg/"); + } + + @Test + public void getDisplayNamePrefix() { + assertThat(StackdriverExporterWorker.getDisplayNamePrefix(null)).isEqualTo("OpenCensus/"); + assertThat(StackdriverExporterWorker.getDisplayNamePrefix("")).isEqualTo(""); + assertThat(StackdriverExporterWorker.getDisplayNamePrefix("custom.googleapis.com/myorg/")) + .isEqualTo("custom.googleapis.com/myorg/"); + assertThat( + StackdriverExporterWorker.getDisplayNamePrefix("external.googleapis.com/prometheus/")) + .isEqualTo("external.googleapis.com/prometheus/"); + assertThat(StackdriverExporterWorker.getDisplayNamePrefix("myorg")).isEqualTo("myorg/"); + } + /* * MetricServiceClient.createMetricDescriptor() and MetricServiceClient.createTimeSeries() are * final methods and cannot be mocked. We have to use a mock MetricServiceStub in order to verify diff --git a/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsConfigurationTest.java b/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsConfigurationTest.java index cff8ce3b..2d5eba1b 100644 --- a/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsConfigurationTest.java +++ b/exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsConfigurationTest.java @@ -41,6 +41,7 @@ public class StackdriverStatsConfigurationTest { .setType("gce-instance") .putLabels("instance-id", "instance") .build(); + private static final String CUSTOM_PREFIX = "myorg"; @Test public void testBuild() { @@ -50,11 +51,13 @@ public class StackdriverStatsConfigurationTest { .setProjectId(PROJECT_ID) .setExportInterval(DURATION) .setMonitoredResource(RESOURCE) + .setMetricNamePrefix(CUSTOM_PREFIX) .build(); assertThat(configuration.getCredentials()).isEqualTo(FAKE_CREDENTIALS); assertThat(configuration.getProjectId()).isEqualTo(PROJECT_ID); assertThat(configuration.getExportInterval()).isEqualTo(DURATION); assertThat(configuration.getMonitoredResource()).isEqualTo(RESOURCE); + assertThat(configuration.getMetricNamePrefix()).isEqualTo(CUSTOM_PREFIX); } @Test @@ -64,5 +67,6 @@ public class StackdriverStatsConfigurationTest { assertThat(configuration.getProjectId()).isNull(); assertThat(configuration.getExportInterval()).isNull(); assertThat(configuration.getMonitoredResource()).isNull(); + assertThat(configuration.getMetricNamePrefix()).isNull(); } } -- cgit v1.2.3