aboutsummaryrefslogtreecommitdiff
path: root/impl_core/src/main
diff options
context:
space:
mode:
authorsebright <sebright@google.com>2018-09-12 12:13:14 -0700
committerGitHub <noreply@github.com>2018-09-12 12:13:14 -0700
commitd3fa0e5c60903f95c184d7c7bafae8fdd12156ad (patch)
treef88e8fb0ebd0fa60c603285363acfcb6b7cee33e /impl_core/src/main
parentc0e0b225a5230036b3dc09134f94eece81d3f96d (diff)
downloadopencensus-java-d3fa0e5c60903f95c184d7c7bafae8fdd12156ad.tar.gz
Temporarily move "metrics" package into impl_core/ for release. (#1426)
The "metrics" package isn't ready to be released yet, so this commit moves it out of the API artifact. The package can still be accessed by the stats implementation in impl_core/. This commit can be reverted once the package is ready to be exposed. The moved package names also contain "temporary" so that there is no possibility of class name conflicts between different versions of opencensus-api and opencensus-impl-core. For example, io.opencensus.metrics.export is renamed to io.opencensus.implcore.temporary.metrics.export.
Diffstat (limited to 'impl_core/src/main')
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/metrics/Gauge.java16
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/metrics/MetricRegistryImpl.java8
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/metrics/MetricsComponentImplBase.java4
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/metrics/export/ExportComponentImpl.java4
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/metrics/export/MetricProducerManagerImpl.java4
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/stats/MeasureToViewMap.java2
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/stats/MetricProducerImpl.java4
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/stats/MetricUtils.java8
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/stats/MutableAggregation.java6
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java12
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/stats/StatsComponentImplBase.java4
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/stats/StatsManager.java2
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Distribution.java280
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/LabelKey.java62
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/LabelValue.java57
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Metric.java98
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricDescriptor.java150
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricProducer.java40
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricRegistry.java117
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Metrics.java96
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricsComponent.java71
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Point.java63
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/TimeSeries.java94
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Value.java196
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/export/ExportComponent.java60
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/export/MetricProducerManager.java89
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/package-info.java32
27 files changed, 1542 insertions, 37 deletions
diff --git a/impl_core/src/main/java/io/opencensus/implcore/metrics/Gauge.java b/impl_core/src/main/java/io/opencensus/implcore/metrics/Gauge.java
index e6498066..371c762d 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/metrics/Gauge.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/metrics/Gauge.java
@@ -21,14 +21,14 @@ 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.metrics.LabelKey;
-import io.opencensus.metrics.LabelValue;
-import io.opencensus.metrics.Metric;
-import io.opencensus.metrics.MetricDescriptor;
-import io.opencensus.metrics.MetricDescriptor.Type;
-import io.opencensus.metrics.Point;
-import io.opencensus.metrics.TimeSeries;
-import io.opencensus.metrics.Value;
+import io.opencensus.implcore.temporary.metrics.LabelKey;
+import io.opencensus.implcore.temporary.metrics.LabelValue;
+import io.opencensus.implcore.temporary.metrics.Metric;
+import io.opencensus.implcore.temporary.metrics.MetricDescriptor;
+import io.opencensus.implcore.temporary.metrics.MetricDescriptor.Type;
+import io.opencensus.implcore.temporary.metrics.Point;
+import io.opencensus.implcore.temporary.metrics.TimeSeries;
+import io.opencensus.implcore.temporary.metrics.Value;
import java.util.Collections;
import java.util.List;
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..294c9207 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
@@ -23,10 +23,10 @@ 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.Metric;
-import io.opencensus.metrics.MetricRegistry;
+import io.opencensus.implcore.temporary.metrics.LabelKey;
+import io.opencensus.implcore.temporary.metrics.LabelValue;
+import io.opencensus.implcore.temporary.metrics.Metric;
+import io.opencensus.implcore.temporary.metrics.MetricRegistry;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
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..40f8fbe5 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,8 +18,8 @@ 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;
+import io.opencensus.implcore.temporary.metrics.MetricRegistry;
+import io.opencensus.implcore.temporary.metrics.MetricsComponent;
/** Implementation of {@link MetricsComponent}. */
public class MetricsComponentImplBase extends MetricsComponent {
diff --git a/impl_core/src/main/java/io/opencensus/implcore/metrics/export/ExportComponentImpl.java b/impl_core/src/main/java/io/opencensus/implcore/metrics/export/ExportComponentImpl.java
index 173c3aec..18362646 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/metrics/export/ExportComponentImpl.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/metrics/export/ExportComponentImpl.java
@@ -16,8 +16,8 @@
package io.opencensus.implcore.metrics.export;
-import io.opencensus.metrics.export.ExportComponent;
-import io.opencensus.metrics.export.MetricProducerManager;
+import io.opencensus.implcore.temporary.metrics.export.ExportComponent;
+import io.opencensus.implcore.temporary.metrics.export.MetricProducerManager;
/** Implementation of {@link ExportComponent}. */
public final class ExportComponentImpl extends ExportComponent {
diff --git a/impl_core/src/main/java/io/opencensus/implcore/metrics/export/MetricProducerManagerImpl.java b/impl_core/src/main/java/io/opencensus/implcore/metrics/export/MetricProducerManagerImpl.java
index fc9db5c1..50d15534 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/metrics/export/MetricProducerManagerImpl.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/metrics/export/MetricProducerManagerImpl.java
@@ -17,8 +17,8 @@
package io.opencensus.implcore.metrics.export;
import com.google.common.base.Preconditions;
-import io.opencensus.metrics.MetricProducer;
-import io.opencensus.metrics.export.MetricProducerManager;
+import io.opencensus.implcore.temporary.metrics.MetricProducer;
+import io.opencensus.implcore.temporary.metrics.export.MetricProducerManager;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/MeasureToViewMap.java b/impl_core/src/main/java/io/opencensus/implcore/stats/MeasureToViewMap.java
index 2e28991c..8ca7bca6 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/stats/MeasureToViewMap.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/stats/MeasureToViewMap.java
@@ -23,7 +23,7 @@ import com.google.common.collect.Sets;
import io.opencensus.common.Clock;
import io.opencensus.common.Timestamp;
import io.opencensus.implcore.internal.CurrentState.State;
-import io.opencensus.metrics.Metric;
+import io.opencensus.implcore.temporary.metrics.Metric;
import io.opencensus.stats.Measure;
import io.opencensus.stats.Measurement;
import io.opencensus.stats.View;
diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/MetricProducerImpl.java b/impl_core/src/main/java/io/opencensus/implcore/stats/MetricProducerImpl.java
index 31ef6be1..6677ef6b 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/stats/MetricProducerImpl.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/stats/MetricProducerImpl.java
@@ -16,8 +16,8 @@
package io.opencensus.implcore.stats;
-import io.opencensus.metrics.Metric;
-import io.opencensus.metrics.MetricProducer;
+import io.opencensus.implcore.temporary.metrics.Metric;
+import io.opencensus.implcore.temporary.metrics.MetricProducer;
import java.util.Collection;
import javax.annotation.concurrent.ThreadSafe;
diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/MetricUtils.java b/impl_core/src/main/java/io/opencensus/implcore/stats/MetricUtils.java
index cd1e5364..20568514 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/stats/MetricUtils.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/stats/MetricUtils.java
@@ -19,10 +19,10 @@ package io.opencensus.implcore.stats;
import com.google.common.annotations.VisibleForTesting;
import io.opencensus.common.Function;
import io.opencensus.common.Functions;
-import io.opencensus.metrics.LabelKey;
-import io.opencensus.metrics.LabelValue;
-import io.opencensus.metrics.MetricDescriptor;
-import io.opencensus.metrics.MetricDescriptor.Type;
+import io.opencensus.implcore.temporary.metrics.LabelKey;
+import io.opencensus.implcore.temporary.metrics.LabelValue;
+import io.opencensus.implcore.temporary.metrics.MetricDescriptor;
+import io.opencensus.implcore.temporary.metrics.MetricDescriptor.Type;
import io.opencensus.stats.Aggregation;
import io.opencensus.stats.Measure;
import io.opencensus.stats.View;
diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableAggregation.java b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableAggregation.java
index a41850d2..e4b33e46 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableAggregation.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableAggregation.java
@@ -21,9 +21,9 @@ import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.annotations.VisibleForTesting;
import io.opencensus.common.Timestamp;
-import io.opencensus.metrics.Distribution;
-import io.opencensus.metrics.Point;
-import io.opencensus.metrics.Value;
+import io.opencensus.implcore.temporary.metrics.Distribution;
+import io.opencensus.implcore.temporary.metrics.Point;
+import io.opencensus.implcore.temporary.metrics.Value;
import io.opencensus.stats.Aggregation;
import io.opencensus.stats.AggregationData;
import io.opencensus.stats.AggregationData.DistributionData;
diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java
index 7368a161..a0e9fd3b 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java
@@ -32,12 +32,12 @@ import io.opencensus.common.Functions;
import io.opencensus.common.Timestamp;
import io.opencensus.implcore.internal.CheckerFrameworkUtils;
import io.opencensus.implcore.internal.CurrentState.State;
-import io.opencensus.metrics.LabelValue;
-import io.opencensus.metrics.Metric;
-import io.opencensus.metrics.MetricDescriptor;
-import io.opencensus.metrics.MetricDescriptor.Type;
-import io.opencensus.metrics.Point;
-import io.opencensus.metrics.TimeSeries;
+import io.opencensus.implcore.temporary.metrics.LabelValue;
+import io.opencensus.implcore.temporary.metrics.Metric;
+import io.opencensus.implcore.temporary.metrics.MetricDescriptor;
+import io.opencensus.implcore.temporary.metrics.MetricDescriptor.Type;
+import io.opencensus.implcore.temporary.metrics.Point;
+import io.opencensus.implcore.temporary.metrics.TimeSeries;
import io.opencensus.stats.Aggregation;
import io.opencensus.stats.AggregationData;
import io.opencensus.stats.Measure;
diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/StatsComponentImplBase.java b/impl_core/src/main/java/io/opencensus/implcore/stats/StatsComponentImplBase.java
index 72791f04..1456746f 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/stats/StatsComponentImplBase.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/stats/StatsComponentImplBase.java
@@ -21,8 +21,8 @@ import io.opencensus.common.Clock;
import io.opencensus.implcore.internal.CurrentState;
import io.opencensus.implcore.internal.CurrentState.State;
import io.opencensus.implcore.internal.EventQueue;
-import io.opencensus.metrics.MetricProducer;
-import io.opencensus.metrics.Metrics;
+import io.opencensus.implcore.temporary.metrics.MetricProducer;
+import io.opencensus.implcore.temporary.metrics.Metrics;
import io.opencensus.stats.StatsCollectionState;
import io.opencensus.stats.StatsComponent;
diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/StatsManager.java b/impl_core/src/main/java/io/opencensus/implcore/stats/StatsManager.java
index a58b9a5e..0fb78480 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/stats/StatsManager.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/stats/StatsManager.java
@@ -22,7 +22,7 @@ import io.opencensus.common.Clock;
import io.opencensus.implcore.internal.CurrentState;
import io.opencensus.implcore.internal.CurrentState.State;
import io.opencensus.implcore.internal.EventQueue;
-import io.opencensus.metrics.Metric;
+import io.opencensus.implcore.temporary.metrics.Metric;
import io.opencensus.stats.View;
import io.opencensus.stats.ViewData;
import io.opencensus.tags.TagContext;
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Distribution.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Distribution.java
new file mode 100644
index 00000000..4e1d1553
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Distribution.java
@@ -0,0 +1,280 @@
+/*
+ * 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.temporary.metrics;
+
+import com.google.auto.value.AutoValue;
+import io.opencensus.common.ExperimentalApi;
+import io.opencensus.common.Timestamp;
+import io.opencensus.internal.Utils;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * {@link Distribution} contains summary statistics for a population of values. It optionally
+ * contains a histogram representing the distribution of those values across a set of buckets.
+ *
+ * @since 0.16
+ */
+@ExperimentalApi
+@AutoValue
+@Immutable
+public abstract class Distribution {
+
+ Distribution() {}
+
+ /**
+ * Creates a {@link Distribution}.
+ *
+ * @param mean mean of the population values.
+ * @param count count of the population values.
+ * @param sumOfSquaredDeviations sum of squared deviations of the population values.
+ * @param bucketBoundaries bucket boundaries of a histogram.
+ * @param buckets {@link Bucket}s of a histogram.
+ * @return a {@code Distribution}.
+ * @since 0.16
+ */
+ public static Distribution create(
+ double mean,
+ long count,
+ double sumOfSquaredDeviations,
+ List<Double> bucketBoundaries,
+ List<Bucket> buckets) {
+ Utils.checkArgument(count >= 0, "count should be non-negative.");
+ Utils.checkArgument(
+ sumOfSquaredDeviations >= 0, "sum of squared deviations should be non-negative.");
+ if (count == 0) {
+ Utils.checkArgument(mean == 0, "mean should be 0 if count is 0.");
+ Utils.checkArgument(
+ sumOfSquaredDeviations == 0, "sum of squared deviations should be 0 if count is 0.");
+ }
+ return new AutoValue_Distribution(
+ mean,
+ count,
+ sumOfSquaredDeviations,
+ copyBucketBounds(bucketBoundaries),
+ copyBucketCount(buckets));
+ }
+
+ private static List<Double> copyBucketBounds(List<Double> bucketBoundaries) {
+ Utils.checkNotNull(bucketBoundaries, "bucketBoundaries list should not be null.");
+ List<Double> bucketBoundariesCopy = new ArrayList<Double>(bucketBoundaries); // Deep copy.
+ // Check if sorted.
+ if (bucketBoundariesCopy.size() > 1) {
+ double lower = bucketBoundariesCopy.get(0);
+ for (int i = 1; i < bucketBoundariesCopy.size(); i++) {
+ double next = bucketBoundariesCopy.get(i);
+ Utils.checkArgument(lower < next, "bucket boundaries not sorted.");
+ lower = next;
+ }
+ }
+ return Collections.unmodifiableList(bucketBoundariesCopy);
+ }
+
+ private static List<Bucket> copyBucketCount(List<Bucket> buckets) {
+ Utils.checkNotNull(buckets, "bucket list should not be null.");
+ List<Bucket> bucketsCopy = new ArrayList<Bucket>(buckets);
+ for (Bucket bucket : bucketsCopy) {
+ Utils.checkNotNull(bucket, "bucket should not be null.");
+ }
+ return Collections.unmodifiableList(bucketsCopy);
+ }
+
+ /**
+ * Returns the aggregated mean.
+ *
+ * @return the aggregated mean.
+ * @since 0.16
+ */
+ public abstract double getMean();
+
+ /**
+ * Returns the aggregated count.
+ *
+ * @return the aggregated count.
+ * @since 0.16
+ */
+ public abstract long getCount();
+
+ /**
+ * Returns the aggregated sum of squared deviations.
+ *
+ * <p>The sum of squared deviations from the mean of the values in the population. For values x_i
+ * this is:
+ *
+ * <p>Sum[i=1..n]((x_i - mean)^2)
+ *
+ * <p>If count is zero then this field must be zero.
+ *
+ * @return the aggregated sum of squared deviations.
+ * @since 0.16
+ */
+ public abstract double getSumOfSquaredDeviations();
+
+ /**
+ * Returns the bucket boundaries of this distribution.
+ *
+ * <p>The bucket boundaries for that histogram are described by bucket_bounds. This defines
+ * size(bucket_bounds) + 1 (= N) buckets. The boundaries for bucket index i are:
+ *
+ * <ul>
+ * <li>{@code (-infinity, bucket_bounds[i]) for i == 0}
+ * <li>{@code [bucket_bounds[i-1], bucket_bounds[i]) for 0 < i < N-2}
+ * <li>{@code [bucket_bounds[i-1], +infinity) for i == N-1}
+ * </ul>
+ *
+ * <p>i.e. an underflow bucket (number 0), zero or more finite buckets (1 through N - 2, and an
+ * overflow bucket (N - 1), with inclusive lower bounds and exclusive upper bounds.
+ *
+ * <p>If bucket_bounds has no elements (zero size), then there is no histogram associated with the
+ * Distribution. If bucket_bounds has only one element, there are no finite buckets, and that
+ * single element is the common boundary of the overflow and underflow buckets. The values must be
+ * monotonically increasing.
+ *
+ * @return the bucket boundaries of this distribution.
+ * @since 0.16
+ */
+ public abstract List<Double> getBucketBoundaries();
+
+ /**
+ * Returns the aggregated histogram {@link Bucket}s.
+ *
+ * @return the aggregated histogram buckets.
+ * @since 0.16
+ */
+ public abstract List<Bucket> getBuckets();
+
+ /**
+ * The histogram bucket of the population values.
+ *
+ * @since 0.16
+ */
+ @AutoValue
+ @Immutable
+ public abstract static class Bucket {
+
+ Bucket() {}
+
+ /**
+ * Creates a {@link Bucket}.
+ *
+ * @param count the number of values in each bucket of the histogram.
+ * @return a {@code Bucket}.
+ * @since 0.16
+ */
+ public static Bucket create(long count) {
+ Utils.checkArgument(count >= 0, "bucket count should be non-negative.");
+ return new AutoValue_Distribution_Bucket(count, null);
+ }
+
+ /**
+ * Creates a {@link Bucket} with an {@link Exemplar}.
+ *
+ * @param count the number of values in each bucket of the histogram.
+ * @param exemplar the {@code Exemplar} of this {@code Bucket}.
+ * @return a {@code Bucket}.
+ * @since 0.16
+ */
+ public static Bucket create(long count, Exemplar exemplar) {
+ Utils.checkArgument(count >= 0, "bucket count should be non-negative.");
+ Utils.checkNotNull(exemplar, "exemplar");
+ return new AutoValue_Distribution_Bucket(count, exemplar);
+ }
+
+ /**
+ * Returns the number of values in each bucket of the histogram.
+ *
+ * @return the number of values in each bucket of the histogram.
+ * @since 0.16
+ */
+ public abstract long getCount();
+
+ /**
+ * Returns the {@link Exemplar} associated with the {@link Bucket}, or {@code null} if there
+ * isn't one.
+ *
+ * @return the {@code Exemplar} associated with the {@code Bucket}, or {@code null} if there
+ * isn't one.
+ * @since 0.16
+ */
+ @Nullable
+ public abstract Exemplar getExemplar();
+ }
+
+ /**
+ * An example point that may be used to annotate aggregated distribution values, associated with a
+ * histogram bucket.
+ *
+ * @since 0.16
+ */
+ @Immutable
+ @AutoValue
+ public abstract static class Exemplar {
+
+ Exemplar() {}
+
+ /**
+ * Returns value of the {@link Exemplar} point.
+ *
+ * @return value of the {@code Exemplar} point.
+ * @since 0.16
+ */
+ public abstract double getValue();
+
+ /**
+ * Returns the time that this {@link Exemplar}'s value was recorded.
+ *
+ * @return the time that this {@code Exemplar}'s value was recorded.
+ * @since 0.16
+ */
+ public abstract Timestamp getTimestamp();
+
+ /**
+ * Returns the contextual information about the example value, represented as a string map.
+ *
+ * @return the contextual information about the example value.
+ * @since 0.16
+ */
+ public abstract Map<String, String> getAttachments();
+
+ /**
+ * Creates an {@link Exemplar}.
+ *
+ * @param value value of the {@link Exemplar} point.
+ * @param timestamp the time that this {@code Exemplar}'s value was recorded.
+ * @param attachments the contextual information about the example value.
+ * @return an {@code Exemplar}.
+ * @since 0.16
+ */
+ public static Exemplar create(
+ double value, Timestamp timestamp, Map<String, String> attachments) {
+ Utils.checkNotNull(attachments, "attachments");
+ Map<String, String> attachmentsCopy =
+ Collections.unmodifiableMap(new HashMap<String, String>(attachments));
+ for (Entry<String, String> entry : attachmentsCopy.entrySet()) {
+ Utils.checkNotNull(entry.getKey(), "key of attachments");
+ Utils.checkNotNull(entry.getValue(), "value of attachments");
+ }
+ return new AutoValue_Distribution_Exemplar(value, timestamp, attachmentsCopy);
+ }
+ }
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/LabelKey.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/LabelKey.java
new file mode 100644
index 00000000..d0c83e5e
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/LabelKey.java
@@ -0,0 +1,62 @@
+/*
+ * 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.temporary.metrics;
+
+import com.google.auto.value.AutoValue;
+import io.opencensus.common.ExperimentalApi;
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * The key of a {@code Label} associated with a {@code MetricDescriptor}.
+ *
+ * @since 0.15
+ */
+@ExperimentalApi
+@Immutable
+@AutoValue
+public abstract class LabelKey {
+
+ LabelKey() {}
+
+ /**
+ * Creates a {@link LabelKey}.
+ *
+ * @param key the key of a {@code Label}.
+ * @param description a human-readable description of what this label key represents.
+ * @return a {@code LabelKey}.
+ * @since 0.15
+ */
+ public static LabelKey create(String key, String description) {
+ return new AutoValue_LabelKey(key, description);
+ }
+
+ /**
+ * Returns the key of this {@link LabelKey}.
+ *
+ * @return the key.
+ * @since 0.15
+ */
+ public abstract String getKey();
+
+ /**
+ * Returns the description of this {@link LabelKey}.
+ *
+ * @return the description.
+ * @since 0.15
+ */
+ public abstract String getDescription();
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/LabelValue.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/LabelValue.java
new file mode 100644
index 00000000..919b16a3
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/LabelValue.java
@@ -0,0 +1,57 @@
+/*
+ * 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.temporary.metrics;
+
+import com.google.auto.value.AutoValue;
+import io.opencensus.common.ExperimentalApi;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * The value of a {@code Label} associated with a {@code TimeSeries}.
+ *
+ * @since 0.15
+ */
+@ExperimentalApi
+@Immutable
+@AutoValue
+public abstract class LabelValue {
+
+ LabelValue() {}
+
+ /**
+ * Creates a {@link LabelValue}.
+ *
+ * @param value the value of a {@code Label}. {@code null} value indicates an unset {@code
+ * LabelValue}.
+ * @return a {@code LabelValue}.
+ * @since 0.15
+ */
+ public static LabelValue create(@Nullable String value) {
+ return new AutoValue_LabelValue(value);
+ }
+
+ /**
+ * Returns the value of this {@link LabelValue}. Returns {@code null} if the value is unset and
+ * supposed to be ignored.
+ *
+ * @return the value.
+ * @since 0.15
+ */
+ @Nullable
+ public abstract String getValue();
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Metric.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Metric.java
new file mode 100644
index 00000000..56937e8d
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Metric.java
@@ -0,0 +1,98 @@
+/*
+ * 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.temporary.metrics;
+
+import com.google.auto.value.AutoValue;
+import io.opencensus.common.ExperimentalApi;
+import io.opencensus.implcore.temporary.metrics.Value.ValueDistribution;
+import io.opencensus.implcore.temporary.metrics.Value.ValueDouble;
+import io.opencensus.implcore.temporary.metrics.Value.ValueLong;
+import io.opencensus.internal.Utils;
+import java.util.List;
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * A {@link Metric} with one or more {@link TimeSeries}.
+ *
+ * @since 0.16
+ */
+@ExperimentalApi
+@Immutable
+@AutoValue
+public abstract class Metric {
+
+ Metric() {}
+
+ /**
+ * Creates a {@link Metric}.
+ *
+ * @param metricDescriptor the {@link MetricDescriptor}.
+ * @param timeSeriesList the {@link TimeSeries} list for this metric.
+ * @return a {@code Metric}.
+ * @since 0.16
+ */
+ public static Metric create(MetricDescriptor metricDescriptor, List<TimeSeries> timeSeriesList) {
+ checkTypeMatch(metricDescriptor.getType(), timeSeriesList);
+ return new AutoValue_Metric(metricDescriptor, timeSeriesList);
+ }
+
+ /**
+ * Returns the {@link MetricDescriptor} of this metric.
+ *
+ * @return the {@code MetricDescriptor} of this metric.
+ * @since 0.16
+ */
+ public abstract MetricDescriptor getMetricDescriptor();
+
+ /**
+ * Returns the {@link TimeSeries} list for this metric.
+ *
+ * <p>The type of the {@link TimeSeries#getPoints()} must match {@link MetricDescriptor.Type}.
+ *
+ * @return the {@code TimeSeriesList} for this metric.
+ * @since 0.16
+ */
+ public abstract List<TimeSeries> getTimeSeriesList();
+
+ private static void checkTypeMatch(MetricDescriptor.Type type, List<TimeSeries> timeSeriesList) {
+ for (TimeSeries timeSeries : timeSeriesList) {
+ for (Point point : timeSeries.getPoints()) {
+ Value value = point.getValue();
+ String valueClassName = "";
+ if (value.getClass().getSuperclass() != null) { // work around nullness check
+ // AutoValue classes should always have a super class.
+ valueClassName = value.getClass().getSuperclass().getSimpleName();
+ }
+ switch (type) {
+ case GAUGE_INT64:
+ case CUMULATIVE_INT64:
+ Utils.checkArgument(
+ value instanceof ValueLong, "Type mismatch: %s, %s.", type, valueClassName);
+ break;
+ case CUMULATIVE_DOUBLE:
+ case GAUGE_DOUBLE:
+ Utils.checkArgument(
+ value instanceof ValueDouble, "Type mismatch: %s, %s.", type, valueClassName);
+ break;
+ case CUMULATIVE_DISTRIBUTION:
+ Utils.checkArgument(
+ value instanceof ValueDistribution, "Type mismatch: %s, %s.", type, valueClassName);
+ }
+ }
+ }
+ }
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricDescriptor.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricDescriptor.java
new file mode 100644
index 00000000..fb7265f1
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricDescriptor.java
@@ -0,0 +1,150 @@
+/*
+ * 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.temporary.metrics;
+
+import com.google.auto.value.AutoValue;
+import io.opencensus.common.ExperimentalApi;
+import io.opencensus.internal.Utils;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * {@link MetricDescriptor} defines a {@code Metric} type and its schema.
+ *
+ * @since 0.16
+ */
+@ExperimentalApi
+@Immutable
+@AutoValue
+public abstract class MetricDescriptor {
+
+ MetricDescriptor() {}
+
+ /**
+ * Creates a {@link MetricDescriptor}.
+ *
+ * @param name name of {@code MetricDescriptor}.
+ * @param description description of {@code MetricDescriptor}.
+ * @param unit the metric unit.
+ * @param type type of {@code MetricDescriptor}.
+ * @param labelKeys the label keys associated with the {@code MetricDescriptor}.
+ * @return a {@code MetricDescriptor}.
+ * @since 0.16
+ */
+ public static MetricDescriptor create(
+ String name, String description, String unit, Type type, List<LabelKey> labelKeys) {
+ Utils.checkNotNull(labelKeys, "labelKeys");
+ Utils.checkListElementNotNull(labelKeys, "labelKey");
+ return new AutoValue_MetricDescriptor(
+ name,
+ description,
+ unit,
+ type,
+ Collections.unmodifiableList(new ArrayList<LabelKey>(labelKeys)));
+ }
+
+ /**
+ * Returns the metric descriptor name.
+ *
+ * @return the metric descriptor name.
+ * @since 0.16
+ */
+ public abstract String getName();
+
+ /**
+ * Returns the description of this metric descriptor.
+ *
+ * @return the description of this metric descriptor.
+ * @since 0.16
+ */
+ public abstract String getDescription();
+
+ /**
+ * Returns the unit of this metric descriptor.
+ *
+ * @return the unit of this metric descriptor.
+ * @since 0.16
+ */
+ public abstract String getUnit();
+
+ /**
+ * Returns the type of this metric descriptor.
+ *
+ * @return the type of this metric descriptor.
+ * @since 0.16
+ */
+ public abstract Type getType();
+
+ /**
+ * Returns the label keys associated with this metric descriptor.
+ *
+ * @return the label keys associated with this metric descriptor.
+ * @since 0.16
+ */
+ public abstract List<LabelKey> getLabelKeys();
+
+ /**
+ * The kind of metric. It describes how the data is reported.
+ *
+ * <p>A gauge is an instantaneous measurement of a value.
+ *
+ * <p>A cumulative measurement is a value accumulated over a time interval. In a time series,
+ * cumulative measurements should have the same start time and increasing end times, until an
+ * event resets the cumulative value to zero and sets a new start time for the following points.
+ *
+ * @since 0.16
+ */
+ public enum Type {
+
+ /**
+ * An instantaneous measurement of an int64 value.
+ *
+ * @since 0.16
+ */
+ GAUGE_INT64,
+
+ /**
+ * An instantaneous measurement of a double value.
+ *
+ * @since 0.16
+ */
+ GAUGE_DOUBLE,
+
+ /**
+ * An cumulative measurement of an int64 value.
+ *
+ * @since 0.16
+ */
+ CUMULATIVE_INT64,
+
+ /**
+ * An cumulative measurement of a double value.
+ *
+ * @since 0.16
+ */
+ CUMULATIVE_DOUBLE,
+
+ /**
+ * An cumulative measurement of a distribution value.
+ *
+ * @since 0.16
+ */
+ CUMULATIVE_DISTRIBUTION,
+ }
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricProducer.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricProducer.java
new file mode 100644
index 00000000..cb56d3dc
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricProducer.java
@@ -0,0 +1,40 @@
+/*
+ * 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.temporary.metrics;
+
+import io.opencensus.common.ExperimentalApi;
+import io.opencensus.implcore.temporary.metrics.export.MetricProducerManager;
+import java.util.Collection;
+
+/**
+ * A {@link io.opencensus.implcore.temporary.metrics.Metric} producer that can be registered for
+ * exporting using {@link MetricProducerManager}.
+ *
+ * <p>All implementation MUST be thread-safe.
+ */
+@ExperimentalApi
+public abstract class MetricProducer {
+
+ /**
+ * Returns a collection of produced {@link io.opencensus.implcore.temporary.metrics.Metric}s to be
+ * exported.
+ *
+ * @return a collection of produced {@link io.opencensus.implcore.temporary.metrics.Metric}s to be
+ * exported.
+ */
+ public abstract Collection<Metric> getMetrics();
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricRegistry.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricRegistry.java
new file mode 100644
index 00000000..851fdba5
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricRegistry.java
@@ -0,0 +1,117 @@
+/*
+ * 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.temporary.metrics;
+
+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.
+ *
+ * @since 0.16
+ */
+@ExperimentalApi
+public abstract class MetricRegistry extends MetricProducer {
+ /**
+ * Build a new long gauge to be added to the registry.
+ *
+ * <p>Must be called only once.
+ *
+ * @param name the name of the metric.
+ * @param description the description of the metric.
+ * @param unit the unit of the metric.
+ * @param obj the function argument.
+ * @param function the function to be called.
+ * @since 0.16 @ExperimentalApi
+ */
+ public abstract <T> void addLongGauge(
+ String name,
+ String description,
+ String unit,
+ LinkedHashMap<LabelKey, LabelValue> labels,
+ T obj,
+ ToLongFunction<T> function);
+
+ /**
+ * Build a new double gauge to be added to the registry.
+ *
+ * <p>Must be called only once.
+ *
+ * @param name the name of the metric.
+ * @param description the description of the metric.
+ * @param unit the unit of the metric.
+ * @param obj the function argument.
+ * @param function the function to be called.
+ * @since 0.16 @ExperimentalApi
+ */
+ public abstract <T> void addDoubleGauge(
+ String name,
+ String description,
+ String unit,
+ LinkedHashMap<LabelKey, LabelValue> labels,
+ T obj,
+ ToDoubleFunction<T> function);
+
+ static MetricRegistry newNoopMetricRegistry() {
+ return new NoopMetricRegistry();
+ }
+
+ private static final class NoopMetricRegistry extends MetricRegistry {
+
+ @Override
+ public <T> void addLongGauge(
+ String name,
+ String description,
+ String unit,
+ LinkedHashMap<LabelKey, LabelValue> labels,
+ T obj,
+ ToLongFunction<T> function) {
+ Utils.checkNotNull(name, "name");
+ Utils.checkNotNull(description, "description");
+ Utils.checkNotNull(unit, "unit");
+ Utils.checkNotNull(labels, "labels");
+ Utils.checkNotNull(function, "function");
+ }
+
+ @Override
+ public <T> void addDoubleGauge(
+ String name,
+ String description,
+ String unit,
+ LinkedHashMap<LabelKey, LabelValue> labels,
+ T obj,
+ ToDoubleFunction<T> function) {
+ Utils.checkNotNull(name, "name");
+ Utils.checkNotNull(description, "description");
+ Utils.checkNotNull(unit, "unit");
+ 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/temporary/metrics/Metrics.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Metrics.java
new file mode 100644
index 00000000..cf4b3e63
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Metrics.java
@@ -0,0 +1,96 @@
+/*
+ * 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.temporary.metrics;
+
+import io.opencensus.common.ExperimentalApi;
+import io.opencensus.implcore.temporary.metrics.export.ExportComponent;
+import io.opencensus.internal.DefaultVisibilityForTesting;
+import io.opencensus.internal.Provider;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.annotation.Nullable;
+
+/**
+ * Class for accessing the default {@link MetricsComponent}.
+ *
+ * @since 0.16
+ */
+@ExperimentalApi
+public final class Metrics {
+ private static final Logger logger = Logger.getLogger(Metrics.class.getName());
+ private static final MetricsComponent metricsComponent =
+ loadMetricsComponent(MetricsComponent.class.getClassLoader());
+
+ /**
+ * Returns the global {@link ExportComponent}.
+ *
+ * @return the global {@code ExportComponent}.
+ * @since 0.16
+ */
+ public static ExportComponent getExportComponent() {
+ return metricsComponent.getExportComponent();
+ }
+
+ /**
+ * Returns the global {@link MetricRegistry}.
+ *
+ * <p>This {@code MetricRegistry} is already added to the global {@link
+ * io.opencensus.implcore.temporary.metrics.export.MetricProducerManager}.
+ *
+ * @return the global {@code MetricRegistry}.
+ * @since 0.16
+ */
+ public static MetricRegistry getMetricRegistry() {
+ return metricsComponent.getMetricRegistry();
+ }
+
+ // Any provider that may be used for MetricsComponent can be added here.
+ @DefaultVisibilityForTesting
+ static MetricsComponent loadMetricsComponent(@Nullable ClassLoader classLoader) {
+ try {
+ // Call Class.forName with literal string name of the class to help shading tools.
+ return Provider.createInstance(
+ Class.forName(
+ "io.opencensus.impl.metrics.MetricsComponentImpl", /*initialize=*/ true, classLoader),
+ MetricsComponent.class);
+ } catch (ClassNotFoundException e) {
+ logger.log(
+ Level.FINE,
+ "Couldn't load full implementation for MetricsComponent, now trying to load lite "
+ + "implementation.",
+ e);
+ }
+ try {
+ // Call Class.forName with literal string name of the class to help shading tools.
+ return Provider.createInstance(
+ Class.forName(
+ "io.opencensus.impllite.metrics.MetricsComponentImplLite",
+ /*initialize=*/ true,
+ classLoader),
+ MetricsComponent.class);
+ } catch (ClassNotFoundException e) {
+ logger.log(
+ Level.FINE,
+ "Couldn't load lite implementation for MetricsComponent, now using default "
+ + "implementation for MetricsComponent.",
+ e);
+ }
+ return MetricsComponent.newNoopMetricsComponent();
+ }
+
+ private Metrics() {}
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricsComponent.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricsComponent.java
new file mode 100644
index 00000000..e578f8b6
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/MetricsComponent.java
@@ -0,0 +1,71 @@
+/*
+ * 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.temporary.metrics;
+
+import io.opencensus.common.ExperimentalApi;
+import io.opencensus.implcore.temporary.metrics.export.ExportComponent;
+
+/**
+ * Class that holds the implementation instance for {@link ExportComponent}.
+ *
+ * @since 0.16
+ */
+@ExperimentalApi
+public abstract class MetricsComponent {
+
+ /**
+ * Returns the {@link ExportComponent} with the provided implementation. If no implementation is
+ * provided then no-op implementations will be used.
+ *
+ * @return the {@link ExportComponent} implementation.
+ * @since 0.16
+ */
+ public abstract ExportComponent getExportComponent();
+
+ /**
+ * Returns the {@link MetricRegistry} with the provided implementation.
+ *
+ * @return the {@link MetricRegistry} implementation.
+ * @since 0.16
+ */
+ public abstract MetricRegistry getMetricRegistry();
+
+ /**
+ * Returns an instance that contains no-op implementations for all the instances.
+ *
+ * @return an instance that contains no-op implementations for all the instances.
+ */
+ static MetricsComponent newNoopMetricsComponent() {
+ return new NoopMetricsComponent();
+ }
+
+ private static final class NoopMetricsComponent extends MetricsComponent {
+ private static final ExportComponent EXPORT_COMPONENT =
+ ExportComponent.newNoopExportComponent();
+ private static final MetricRegistry METRIC_REGISTRY = MetricRegistry.newNoopMetricRegistry();
+
+ @Override
+ public ExportComponent getExportComponent() {
+ return EXPORT_COMPONENT;
+ }
+
+ @Override
+ public MetricRegistry getMetricRegistry() {
+ return METRIC_REGISTRY;
+ }
+ }
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Point.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Point.java
new file mode 100644
index 00000000..e7337f59
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Point.java
@@ -0,0 +1,63 @@
+/*
+ * 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.temporary.metrics;
+
+import com.google.auto.value.AutoValue;
+import io.opencensus.common.ExperimentalApi;
+import io.opencensus.common.Timestamp;
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * A timestamped measurement of a {@code TimeSeries}.
+ *
+ * @since 0.16
+ */
+@ExperimentalApi
+@AutoValue
+@Immutable
+public abstract class Point {
+
+ Point() {}
+
+ /**
+ * Creates a {@link Point}.
+ *
+ * @param value the {@link Value} of this {@link Point}.
+ * @param timestamp the {@link Timestamp} when this {@link Point} was recorded.
+ * @return a {@code Point}.
+ * @since 0.16
+ */
+ public static Point create(Value value, Timestamp timestamp) {
+ return new AutoValue_Point(value, timestamp);
+ }
+
+ /**
+ * Returns the {@link Value}.
+ *
+ * @return the {@code Value}.
+ * @since 0.16
+ */
+ public abstract Value getValue();
+
+ /**
+ * Returns the {@link Timestamp} when this {@link Point} was recorded.
+ *
+ * @return the {@code Timestamp}.
+ * @since 0.16
+ */
+ public abstract Timestamp getTimestamp();
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/TimeSeries.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/TimeSeries.java
new file mode 100644
index 00000000..f149d06d
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/TimeSeries.java
@@ -0,0 +1,94 @@
+/*
+ * 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.temporary.metrics;
+
+import com.google.auto.value.AutoValue;
+import io.opencensus.common.ExperimentalApi;
+import io.opencensus.common.Timestamp;
+import io.opencensus.internal.Utils;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * A collection of data points that describes the time-varying values of a {@code Metric}.
+ *
+ * @since 0.16
+ */
+@ExperimentalApi
+@Immutable
+@AutoValue
+public abstract class TimeSeries {
+
+ TimeSeries() {}
+
+ /**
+ * Creates a {@link TimeSeries}.
+ *
+ * @param labelValues the {@code LabelValue}s that uniquely identify this {@code TimeSeries}.
+ * @param points the data {@code Point}s of this {@code TimeSeries}.
+ * @param startTimestamp the start {@code Timestamp} of this {@code TimeSeries}. Must be non-null
+ * for cumulative {@code Point}s.
+ * @return a {@code TimeSeries}.
+ * @since 0.16
+ */
+ public static TimeSeries create(
+ List<LabelValue> labelValues, List<Point> points, @Nullable Timestamp startTimestamp) {
+ // Fail fast on null lists to prevent NullPointerException when copying the lists.
+ Utils.checkNotNull(labelValues, "labelValues");
+ Utils.checkNotNull(points, "points");
+ Utils.checkListElementNotNull(labelValues, "labelValue");
+ Utils.checkListElementNotNull(points, "point");
+ return new AutoValue_TimeSeries(
+ Collections.unmodifiableList(new ArrayList<LabelValue>(labelValues)),
+ Collections.unmodifiableList(new ArrayList<Point>(points)),
+ startTimestamp);
+ }
+
+ /**
+ * Returns the set of {@link LabelValue}s that uniquely identify this {@link TimeSeries}.
+ *
+ * <p>Apply to all {@link Point}s.
+ *
+ * <p>The order of {@link LabelValue}s must match that of {@link LabelKey}s in the {@code
+ * MetricDescriptor}.
+ *
+ * @return the {@code LabelValue}s.
+ * @since 0.16
+ */
+ public abstract List<LabelValue> getLabelValues();
+
+ /**
+ * Returns the data {@link Point}s of this {@link TimeSeries}.
+ *
+ * @return the data {@code Point}s.
+ * @since 0.16
+ */
+ public abstract List<Point> getPoints();
+
+ /**
+ * Returns the start {@link Timestamp} of this {@link TimeSeries} if the {@link Point}s are
+ * cumulative, or {@code null} if the {@link Point}s are gauge.
+ *
+ * @return the start {@code Timestamp} or {@code null}.
+ * @since 0.16
+ */
+ @Nullable
+ public abstract Timestamp getStartTimestamp();
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Value.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Value.java
new file mode 100644
index 00000000..a17c5135
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/Value.java
@@ -0,0 +1,196 @@
+/*
+ * 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.temporary.metrics;
+
+import com.google.auto.value.AutoValue;
+import io.opencensus.common.ExperimentalApi;
+import io.opencensus.common.Function;
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * The actual point value for a {@link Point}.
+ *
+ * <p>Currently there are three types of {@link Value}:
+ *
+ * <ul>
+ * <li>{@code double}
+ * <li>{@code long}
+ * <li>{@link Distribution}
+ * </ul>
+ *
+ * <p>Each {@link Point} contains exactly one of the three {@link Value} types.
+ *
+ * @since 0.16
+ */
+@ExperimentalApi
+@Immutable
+public abstract class Value {
+
+ Value() {}
+
+ /**
+ * Returns a double {@link Value}.
+ *
+ * @param value value in double.
+ * @return a double {@code Value}.
+ * @since 0.16
+ */
+ public static Value doubleValue(double value) {
+ return ValueDouble.create(value);
+ }
+
+ /**
+ * Returns a long {@link Value}.
+ *
+ * @param value value in long.
+ * @return a long {@code Value}.
+ * @since 0.16
+ */
+ public static Value longValue(long value) {
+ return ValueLong.create(value);
+ }
+
+ /**
+ * Returns a {@link Distribution} {@link Value}.
+ *
+ * @param value value in {@link Distribution}.
+ * @return a {@code Distribution} {@code Value}.
+ * @since 0.16
+ */
+ public static Value distributionValue(Distribution value) {
+ return ValueDistribution.create(value);
+ }
+
+ /**
+ * Applies the given match function to the underlying data type.
+ *
+ * @since 0.16
+ */
+ public abstract <T> T match(
+ Function<? super Double, T> doubleFunction,
+ Function<? super Long, T> longFunction,
+ Function<? super Distribution, T> distributionFunction,
+ Function<? super Value, T> defaultFunction);
+
+ /** A 64-bit double-precision floating-point {@link Value}. */
+ @AutoValue
+ @Immutable
+ abstract static class ValueDouble extends Value {
+
+ ValueDouble() {}
+
+ @Override
+ public final <T> T match(
+ Function<? super Double, T> doubleFunction,
+ Function<? super Long, T> longFunction,
+ Function<? super Distribution, T> distributionFunction,
+ Function<? super Value, T> defaultFunction) {
+ return doubleFunction.apply(getValue());
+ }
+
+ /**
+ * Creates a {@link ValueDouble}.
+ *
+ * @param value the value in double.
+ * @return a {@code ValueDouble}.
+ */
+ static ValueDouble create(double value) {
+ return new AutoValue_Value_ValueDouble(value);
+ }
+
+ /**
+ * Returns the double value.
+ *
+ * @return the double value.
+ */
+ abstract double getValue();
+ }
+
+ /** A 64-bit integer {@link Value}. */
+ @AutoValue
+ @Immutable
+ abstract static class ValueLong extends Value {
+
+ ValueLong() {}
+
+ @Override
+ public final <T> T match(
+ Function<? super Double, T> doubleFunction,
+ Function<? super Long, T> longFunction,
+ Function<? super Distribution, T> distributionFunction,
+ Function<? super Value, T> defaultFunction) {
+ return longFunction.apply(getValue());
+ }
+
+ /**
+ * Creates a {@link ValueLong}.
+ *
+ * @param value the value in long.
+ * @return a {@code ValueLong}.
+ */
+ static ValueLong create(long value) {
+ return new AutoValue_Value_ValueLong(value);
+ }
+
+ /**
+ * Returns the long value.
+ *
+ * @return the long value.
+ */
+ abstract long getValue();
+ }
+
+ /**
+ * {@link ValueDistribution} contains summary statistics for a population of values. It optionally
+ * contains a histogram representing the distribution of those values across a set of buckets.
+ */
+ @AutoValue
+ @Immutable
+ abstract static class ValueDistribution extends Value {
+
+ ValueDistribution() {}
+
+ @Override
+ public final <T> T match(
+ Function<? super Double, T> doubleFunction,
+ Function<? super Long, T> longFunction,
+ Function<? super Distribution, T> distributionFunction,
+ Function<? super Value, T> defaultFunction) {
+ return distributionFunction.apply(getValue());
+ }
+
+ /**
+ * Creates a {@link ValueDistribution}.
+ *
+ * @param value the {@link Distribution} value.
+ * @return a {@code ValueDistribution}.
+ */
+ static ValueDistribution create(Distribution value) {
+ return new AutoValue_Value_ValueDistribution(value);
+ }
+
+ /**
+ * Returns the {@link Distribution} value.
+ *
+ * @return the {@code Distribution} value.
+ */
+ abstract Distribution getValue();
+ }
+
+ // TODO(songya): Add support for Summary type.
+ // This is an aggregation that produces percentiles directly.
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/export/ExportComponent.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/export/ExportComponent.java
new file mode 100644
index 00000000..fd299976
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/export/ExportComponent.java
@@ -0,0 +1,60 @@
+/*
+ * 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.temporary.metrics.export;
+
+import io.opencensus.common.ExperimentalApi;
+
+/**
+ * Class that holds the implementation instance for {@link MetricProducerManager}.
+ *
+ * <p>Unless otherwise noted all methods (on component) results are cacheable.
+ *
+ * @since 0.16
+ */
+@ExperimentalApi
+public abstract class ExportComponent {
+ /**
+ * Returns the no-op implementation of the {@code ExportComponent}.
+ *
+ * @return the no-op implementation of the {@code ExportComponent}.
+ * @since 0.16
+ */
+ public static ExportComponent newNoopExportComponent() {
+ return new NoopExportComponent();
+ }
+
+ /**
+ * Returns the global {@link MetricProducerManager} which can be used to register handlers to
+ * export all the recorded metrics.
+ *
+ * @return the implementation of the {@code MetricExporter} or no-op if no implementation linked
+ * in the binary.
+ * @since 0.16
+ */
+ public abstract MetricProducerManager getMetricProducerManager();
+
+ private static final class NoopExportComponent extends ExportComponent {
+
+ private static final MetricProducerManager METRIC_PRODUCER_MANAGER =
+ MetricProducerManager.newNoopMetricProducerManager();
+
+ @Override
+ public MetricProducerManager getMetricProducerManager() {
+ return METRIC_PRODUCER_MANAGER;
+ }
+ }
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/export/MetricProducerManager.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/export/MetricProducerManager.java
new file mode 100644
index 00000000..b28b094d
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/export/MetricProducerManager.java
@@ -0,0 +1,89 @@
+/*
+ * 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.temporary.metrics.export;
+
+import io.opencensus.common.ExperimentalApi;
+import io.opencensus.implcore.temporary.metrics.MetricProducer;
+import io.opencensus.internal.Utils;
+import java.util.Collections;
+import java.util.Set;
+import javax.annotation.concurrent.ThreadSafe;
+
+/**
+ * Keeps a set of {@link MetricProducer} that is used by exporters to determine the metrics that
+ * need to be exported.
+ *
+ * @since 0.16
+ */
+@ExperimentalApi
+@ThreadSafe
+public abstract class MetricProducerManager {
+
+ /**
+ * Adds the {@link MetricProducer} to the manager if it is not already present.
+ *
+ * @param metricProducer the {@code MetricProducer} to be added to the manager.
+ * @since 0.16
+ */
+ public abstract void add(MetricProducer metricProducer);
+
+ /**
+ * Removes the {@link MetricProducer} to the manager if it is present.
+ *
+ * @param metricProducer the {@code MetricProducer} to be removed from the manager.
+ * @since 0.16
+ */
+ public abstract void remove(MetricProducer metricProducer);
+
+ /**
+ * Returns all registered {@link MetricProducer}s that should be exported.
+ *
+ * <p>This method should be used by any metrics exporter that automatically exports data for
+ * {@code MetricProducer} registered with the {@code MetricProducerManager}.
+ *
+ * @return all registered {@code MetricProducer}s that should be exported.
+ * @since 0.16
+ */
+ public abstract Set<MetricProducer> getAllMetricProducer();
+
+ /**
+ * Returns a no-op implementation for {@link MetricProducerManager}.
+ *
+ * @return a no-op implementation for {@code MetricProducerManager}.
+ */
+ static MetricProducerManager newNoopMetricProducerManager() {
+ return new NoopMetricProducerManager();
+ }
+
+ private static final class NoopMetricProducerManager extends MetricProducerManager {
+
+ @Override
+ public void add(MetricProducer metricProducer) {
+ Utils.checkNotNull(metricProducer, "metricProducer");
+ }
+
+ @Override
+ public void remove(MetricProducer metricProducer) {
+ Utils.checkNotNull(metricProducer, "metricProducer");
+ }
+
+ @Override
+ public Set<MetricProducer> getAllMetricProducer() {
+ return Collections.emptySet();
+ }
+ }
+}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/package-info.java b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/package-info.java
new file mode 100644
index 00000000..f768380f
--- /dev/null
+++ b/impl_core/src/main/java/io/opencensus/implcore/temporary/metrics/package-info.java
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+/**
+ * This package describes the Metrics data model. Metrics are a data model for what stats exporters
+ * take as input. This data model may eventually become the wire format for metrics.
+ *
+ * <p>WARNING: Currently all the public classes under this package are marked as {@link
+ * io.opencensus.common.ExperimentalApi}. The classes and APIs under {@link
+ * io.opencensus.implcore.temporary.metrics} are likely to get backwards-incompatible updates in the
+ * future. DO NOT USE except for experimental purposes.
+ *
+ * <p>Please see
+ * https://github.com/census-instrumentation/opencensus-specs/blob/master/stats/Metrics.md and
+ * https://github.com/census-instrumentation/opencensus-proto/blob/master/opencensus/proto/stats/metrics/metrics.proto
+ * for more details.
+ */
+@io.opencensus.common.ExperimentalApi
+package io.opencensus.implcore.temporary.metrics;