diff options
author | Yang Song <songy23@users.noreply.github.com> | 2018-04-27 14:47:12 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-27 14:47:12 -0700 |
commit | dec25072b4b7671a8ff35f0a121b41eddff5f66f (patch) | |
tree | f395d21ddce7c2889c987cd46c0bbdcdc469b089 /api | |
parent | 4e62aac18595243b9ed4c98137c24e7413c1dc48 (diff) | |
download | opencensus-java-dec25072b4b7671a8ff35f0a121b41eddff5f66f.tar.gz |
Add Aggregation.LastValue and AggregationData.LastValueData to support Gauge (#1055)
* Add LastValue and LastValueData
* Support LastValue and LastValueData in impl
* Use Utils instead of Precondition
* Add LastValue and remove Mean from match() method.
* Support LastValue and LastValueData in exporters and zpages.
* Update MutableLastValue, add comments on why Mean is still supported.
Diffstat (limited to 'api')
6 files changed, 223 insertions, 160 deletions
diff --git a/api/src/main/java/io/opencensus/stats/Aggregation.java b/api/src/main/java/io/opencensus/stats/Aggregation.java index e8579c33..f5efed9b 100644 --- a/api/src/main/java/io/opencensus/stats/Aggregation.java +++ b/api/src/main/java/io/opencensus/stats/Aggregation.java @@ -25,12 +25,13 @@ import javax.annotation.concurrent.Immutable; * {@link Aggregation} is the process of combining a certain set of {@code MeasureValue}s for a * given {@code Measure} into an {@link AggregationData}. * - * <p>{@link Aggregation} currently supports 3 types of basic aggregation: + * <p>{@link Aggregation} currently supports 4 types of basic aggregation: * * <ul> * <li>Sum * <li>Count * <li>Distribution + * <li>LastValue * </ul> * * <p>When creating a {@link View}, one {@link Aggregation} needs to be specified as how to @@ -46,27 +47,13 @@ public abstract class Aggregation { /** * Applies the given match function to the underlying data type. * - * @since 0.8 - * @deprecated in favor of {@link #match(Function, Function, Function, Function)}. - */ - @Deprecated - public abstract <T> T match( - Function<? super Sum, T> p0, - Function<? super Count, T> p1, - Function<? super Mean, T> p2, - Function<? super Distribution, T> p3, - Function<? super Aggregation, T> defaultFunction); - - /** - * Applies the given match function to the underlying data type. - * * @since 0.13 */ - @SuppressWarnings("InconsistentOverloads") public abstract <T> T match( Function<? super Sum, T> p0, Function<? super Count, T> p1, Function<? super Distribution, T> p2, + Function<? super LastValue, T> p3, Function<? super Aggregation, T> defaultFunction); /** @@ -96,17 +83,8 @@ public abstract class Aggregation { public final <T> T match( Function<? super Sum, T> p0, Function<? super Count, T> p1, - Function<? super Mean, T> p2, - Function<? super Distribution, T> p3, - Function<? super Aggregation, T> defaultFunction) { - return p0.apply(this); - } - - @Override - public final <T> T match( - Function<? super Sum, T> p0, - Function<? super Count, T> p1, Function<? super Distribution, T> p2, + Function<? super LastValue, T> p3, Function<? super Aggregation, T> defaultFunction) { return p0.apply(this); } @@ -139,17 +117,8 @@ public abstract class Aggregation { public final <T> T match( Function<? super Sum, T> p0, Function<? super Count, T> p1, - Function<? super Mean, T> p2, - Function<? super Distribution, T> p3, - Function<? super Aggregation, T> defaultFunction) { - return p1.apply(this); - } - - @Override - public final <T> T match( - Function<? super Sum, T> p0, - Function<? super Count, T> p1, Function<? super Distribution, T> p2, + Function<? super LastValue, T> p3, Function<? super Aggregation, T> defaultFunction) { return p1.apply(this); } @@ -185,17 +154,8 @@ public abstract class Aggregation { public final <T> T match( Function<? super Sum, T> p0, Function<? super Count, T> p1, - Function<? super Mean, T> p2, - Function<? super Distribution, T> p3, - Function<? super Aggregation, T> defaultFunction) { - return p2.apply(this); - } - - @Override - public final <T> T match( - Function<? super Sum, T> p0, - Function<? super Count, T> p1, Function<? super Distribution, T> p2, + Function<? super LastValue, T> p3, Function<? super Aggregation, T> defaultFunction) { return defaultFunction.apply(this); } @@ -236,10 +196,34 @@ public abstract class Aggregation { public final <T> T match( Function<? super Sum, T> p0, Function<? super Count, T> p1, - Function<? super Mean, T> p2, - Function<? super Distribution, T> p3, + Function<? super Distribution, T> p2, + Function<? super LastValue, T> p3, Function<? super Aggregation, T> defaultFunction) { - return p3.apply(this); + return p2.apply(this); + } + } + + /** + * Calculate the last value of aggregated {@code MeasureValue}s. + * + * @since 0.13 + */ + @Immutable + @AutoValue + public abstract static class LastValue extends Aggregation { + + LastValue() {} + + private static final LastValue INSTANCE = new AutoValue_Aggregation_LastValue(); + + /** + * Construct a {@code LastValue}. + * + * @return a new {@code LastValue}. + * @since 0.13 + */ + public static LastValue create() { + return INSTANCE; } @Override @@ -247,8 +231,9 @@ public abstract class Aggregation { Function<? super Sum, T> p0, Function<? super Count, T> p1, Function<? super Distribution, T> p2, + Function<? super LastValue, T> p3, Function<? super Aggregation, T> defaultFunction) { - return p2.apply(this); + return p3.apply(this); } } } diff --git a/api/src/main/java/io/opencensus/stats/AggregationData.java b/api/src/main/java/io/opencensus/stats/AggregationData.java index 716e97d8..95ac3282 100644 --- a/api/src/main/java/io/opencensus/stats/AggregationData.java +++ b/api/src/main/java/io/opencensus/stats/AggregationData.java @@ -28,13 +28,15 @@ import javax.annotation.concurrent.Immutable; * {@link AggregationData} is the result of applying a given {@link Aggregation} to a set of {@code * MeasureValue}s. * - * <p>{@link AggregationData} currently supports 4 types of basic aggregation values: + * <p>{@link AggregationData} currently supports 6 types of basic aggregation values: * * <ul> * <li>SumDataDouble * <li>SumDataLong * <li>CountData * <li>DistributionData + * <li>LastValueDataDouble + * <li>LastValueDataLong * </ul> * * <p>{@link ViewData} will contain one {@link AggregationData}, corresponding to its {@link @@ -50,29 +52,15 @@ public abstract class AggregationData { /** * Applies the given match function to the underlying data type. * - * @since 0.8 - * @deprecated in favor of {@link #match(Function, Function, Function, Function, Function)}. - */ - @Deprecated - public abstract <T> T match( - Function<? super SumDataDouble, T> p0, - Function<? super SumDataLong, T> p1, - Function<? super CountData, T> p2, - Function<? super MeanData, T> p3, - Function<? super DistributionData, T> p4, - Function<? super AggregationData, T> defaultFunction); - - /** - * Applies the given match function to the underlying data type. - * * @since 0.13 */ - @SuppressWarnings("InconsistentOverloads") public abstract <T> T match( Function<? super SumDataDouble, T> p0, Function<? super SumDataLong, T> p1, Function<? super CountData, T> p2, Function<? super DistributionData, T> p3, + Function<? super LastValueDataDouble, T> p4, + Function<? super LastValueDataLong, T> p5, Function<? super AggregationData, T> defaultFunction); /** @@ -110,18 +98,9 @@ public abstract class AggregationData { Function<? super SumDataDouble, T> p0, Function<? super SumDataLong, T> p1, Function<? super CountData, T> p2, - Function<? super MeanData, T> p3, - Function<? super DistributionData, T> p4, - Function<? super AggregationData, T> defaultFunction) { - return p0.apply(this); - } - - @Override - public final <T> T match( - Function<? super SumDataDouble, T> p0, - Function<? super SumDataLong, T> p1, - Function<? super CountData, T> p2, Function<? super DistributionData, T> p3, + Function<? super LastValueDataDouble, T> p4, + Function<? super LastValueDataLong, T> p5, Function<? super AggregationData, T> defaultFunction) { return p0.apply(this); } @@ -162,18 +141,9 @@ public abstract class AggregationData { Function<? super SumDataDouble, T> p0, Function<? super SumDataLong, T> p1, Function<? super CountData, T> p2, - Function<? super MeanData, T> p3, - Function<? super DistributionData, T> p4, - Function<? super AggregationData, T> defaultFunction) { - return p1.apply(this); - } - - @Override - public final <T> T match( - Function<? super SumDataDouble, T> p0, - Function<? super SumDataLong, T> p1, - Function<? super CountData, T> p2, Function<? super DistributionData, T> p3, + Function<? super LastValueDataDouble, T> p4, + Function<? super LastValueDataLong, T> p5, Function<? super AggregationData, T> defaultFunction) { return p1.apply(this); } @@ -214,18 +184,9 @@ public abstract class AggregationData { Function<? super SumDataDouble, T> p0, Function<? super SumDataLong, T> p1, Function<? super CountData, T> p2, - Function<? super MeanData, T> p3, - Function<? super DistributionData, T> p4, - Function<? super AggregationData, T> defaultFunction) { - return p2.apply(this); - } - - @Override - public final <T> T match( - Function<? super SumDataDouble, T> p0, - Function<? super SumDataLong, T> p1, - Function<? super CountData, T> p2, Function<? super DistributionData, T> p3, + Function<? super LastValueDataDouble, T> p4, + Function<? super LastValueDataLong, T> p5, Function<? super AggregationData, T> defaultFunction) { return p2.apply(this); } @@ -278,18 +239,9 @@ public abstract class AggregationData { Function<? super SumDataDouble, T> p0, Function<? super SumDataLong, T> p1, Function<? super CountData, T> p2, - Function<? super MeanData, T> p3, - Function<? super DistributionData, T> p4, - Function<? super AggregationData, T> defaultFunction) { - return p3.apply(this); - } - - @Override - public final <T> T match( - Function<? super SumDataDouble, T> p0, - Function<? super SumDataLong, T> p1, - Function<? super CountData, T> p2, Function<? super DistributionData, T> p3, + Function<? super LastValueDataDouble, T> p4, + Function<? super LastValueDataLong, T> p5, Function<? super AggregationData, T> defaultFunction) { return defaultFunction.apply(this); } @@ -394,11 +346,86 @@ public abstract class AggregationData { Function<? super SumDataDouble, T> p0, Function<? super SumDataLong, T> p1, Function<? super CountData, T> p2, - Function<? super MeanData, T> p3, - Function<? super DistributionData, T> p4, + Function<? super DistributionData, T> p3, + Function<? super LastValueDataDouble, T> p4, + Function<? super LastValueDataLong, T> p5, + Function<? super AggregationData, T> defaultFunction) { + return p3.apply(this); + } + } + + /** + * The last value of aggregated {@code MeasureValueDouble}s. + * + * @since 0.13 + */ + @Immutable + @AutoValue + public abstract static class LastValueDataDouble extends AggregationData { + + LastValueDataDouble() {} + + /** + * Creates a {@code LastValueDataDouble}. + * + * @param lastValue the last value. + * @return a {@code LastValueDataDouble}. + * @since 0.13 + */ + public static LastValueDataDouble create(double lastValue) { + return new AutoValue_AggregationData_LastValueDataDouble(lastValue); + } + + /** + * Returns the last value. + * + * @return the last value. + * @since 0.13 + */ + public abstract double getLastValue(); + + @Override + public final <T> T match( + Function<? super SumDataDouble, T> p0, + Function<? super SumDataLong, T> p1, + Function<? super CountData, T> p2, + Function<? super DistributionData, T> p3, + Function<? super LastValueDataDouble, T> p4, + Function<? super LastValueDataLong, T> p5, Function<? super AggregationData, T> defaultFunction) { return p4.apply(this); } + } + + /** + * The last value of aggregated {@code MeasureValueLong}s. + * + * @since 0.13 + */ + @Immutable + @AutoValue + public abstract static class LastValueDataLong extends AggregationData { + + LastValueDataLong() {} + + /** + * Creates a {@code LastValueDataLong}. + * + * @param lastValue the last value. + * @return a {@code LastValueDataLong}. + * @since 0.13 + */ + public static LastValueDataLong create(long lastValue) { + return new AutoValue_AggregationData_LastValueDataLong(lastValue); + } + + /** + * Returns the last value. + * + * @return the last value. + * @since 0.13 + */ + public abstract long getLastValue(); @Override public final <T> T match( @@ -406,8 +433,10 @@ public abstract class AggregationData { Function<? super SumDataLong, T> p1, Function<? super CountData, T> p2, Function<? super DistributionData, T> p3, + Function<? super LastValueDataDouble, T> p4, + Function<? super LastValueDataLong, T> p5, Function<? super AggregationData, T> defaultFunction) { - return p3.apply(this); + return p5.apply(this); } } } diff --git a/api/src/main/java/io/opencensus/stats/ViewData.java b/api/src/main/java/io/opencensus/stats/ViewData.java index c511edab..259f1068 100644 --- a/api/src/main/java/io/opencensus/stats/ViewData.java +++ b/api/src/main/java/io/opencensus/stats/ViewData.java @@ -24,9 +24,12 @@ import io.opencensus.common.Timestamp; import io.opencensus.internal.Utils; import io.opencensus.stats.Aggregation.Count; import io.opencensus.stats.Aggregation.Distribution; +import io.opencensus.stats.Aggregation.LastValue; import io.opencensus.stats.Aggregation.Sum; import io.opencensus.stats.AggregationData.CountData; import io.opencensus.stats.AggregationData.DistributionData; +import io.opencensus.stats.AggregationData.LastValueDataDouble; +import io.opencensus.stats.AggregationData.LastValueDataLong; import io.opencensus.stats.AggregationData.SumDataDouble; import io.opencensus.stats.AggregationData.SumDataLong; import io.opencensus.stats.Measure.MeasureDouble; @@ -272,25 +275,56 @@ public abstract class ViewData { return null; } }, - new Function<Aggregation.Mean, Void>() { + new Function<Distribution, Void>() { @Override - public Void apply(Aggregation.Mean arg) { + public Void apply(Distribution arg) { Utils.checkArgument( - aggregationData instanceof AggregationData.MeanData, + aggregationData instanceof DistributionData, createErrorMessageForAggregation(aggregation, aggregationData)); return null; } }, - new Function<Distribution, Void>() { + new Function<LastValue, Void>() { @Override - public Void apply(Distribution arg) { - Utils.checkArgument( - aggregationData instanceof DistributionData, - createErrorMessageForAggregation(aggregation, aggregationData)); + public Void apply(LastValue arg) { + measure.match( + new Function<MeasureDouble, Void>() { + @Override + public Void apply(MeasureDouble arg) { + Utils.checkArgument( + aggregationData instanceof LastValueDataDouble, + createErrorMessageForAggregation(aggregation, aggregationData)); + return null; + } + }, + new Function<MeasureLong, Void>() { + @Override + public Void apply(MeasureLong arg) { + Utils.checkArgument( + aggregationData instanceof LastValueDataLong, + createErrorMessageForAggregation(aggregation, aggregationData)); + return null; + } + }, + Functions.</*@Nullable*/ Void>throwAssertionError()); return null; } }, - Functions.</*@Nullable*/ Void>throwAssertionError()); + new Function<Aggregation, Void>() { + @Override + public Void apply(Aggregation arg) { + // TODO(songya): remove this once Mean aggregation is completely removed. Before that + // we need to continue supporting Mean, since it could still be used by users and some + // deprecated RPC views. + if (arg instanceof Aggregation.Mean) { + Utils.checkArgument( + aggregationData instanceof AggregationData.MeanData, + createErrorMessageForAggregation(aggregation, aggregationData)); + return null; + } + throw new AssertionError(); + } + }); } private static String createErrorMessageForAggregation( diff --git a/api/src/test/java/io/opencensus/stats/AggregationDataTest.java b/api/src/test/java/io/opencensus/stats/AggregationDataTest.java index 3431d043..9f2aa589 100644 --- a/api/src/test/java/io/opencensus/stats/AggregationDataTest.java +++ b/api/src/test/java/io/opencensus/stats/AggregationDataTest.java @@ -23,6 +23,8 @@ import io.opencensus.common.Function; import io.opencensus.common.Functions; import io.opencensus.stats.AggregationData.CountData; import io.opencensus.stats.AggregationData.DistributionData; +import io.opencensus.stats.AggregationData.LastValueDataDouble; +import io.opencensus.stats.AggregationData.LastValueDataLong; import io.opencensus.stats.AggregationData.MeanData; import io.opencensus.stats.AggregationData.SumDataDouble; import io.opencensus.stats.AggregationData.SumDataLong; @@ -95,6 +97,8 @@ public class AggregationDataTest { .addEqualityGroup(DistributionData.create(10, 10, 1, 1, 55.5, Arrays.asList(0L, 10L, 0L))) .addEqualityGroup(MeanData.create(5.0, 1), MeanData.create(5.0, 1)) .addEqualityGroup(MeanData.create(-5.0, 1), MeanData.create(-5.0, 1)) + .addEqualityGroup(LastValueDataDouble.create(20.0), LastValueDataDouble.create(20.0)) + .addEqualityGroup(LastValueDataLong.create(20), LastValueDataLong.create(20)) .testEquals(); } @@ -105,8 +109,9 @@ public class AggregationDataTest { SumDataDouble.create(10.0), SumDataLong.create(100000000), CountData.create(40), - MeanData.create(5.0, 1), - DistributionData.create(1, 1, 1, 1, 0, Arrays.asList(0L, 10L, 0L))); + DistributionData.create(1, 1, 1, 1, 0, Arrays.asList(0L, 10L, 0L)), + LastValueDataDouble.create(20.0), + LastValueDataLong.create(200000000L)); final List<Object> actual = new ArrayList<Object>(); for (AggregationData aggregation : aggregations) { @@ -132,17 +137,24 @@ public class AggregationDataTest { return null; } }, - new Function<MeanData, Void>() { + new Function<DistributionData, Void>() { @Override - public Void apply(MeanData arg) { - actual.add(arg.getMean()); + public Void apply(DistributionData arg) { + actual.add(arg.getBucketCounts()); return null; } }, - new Function<DistributionData, Void>() { + new Function<LastValueDataDouble, Void>() { @Override - public Void apply(DistributionData arg) { - actual.add(arg.getBucketCounts()); + public Void apply(LastValueDataDouble arg) { + actual.add(arg.getLastValue()); + return null; + } + }, + new Function<LastValueDataLong, Void>() { + @Override + public Void apply(LastValueDataLong arg) { + actual.add(arg.getLastValue()); return null; } }, @@ -150,6 +162,7 @@ public class AggregationDataTest { } assertThat(actual) - .isEqualTo(Arrays.asList(10.0, 100000000L, 40L, 5.0, Arrays.asList(0L, 10L, 0L))); + .containsExactly(10.0, 100000000L, 40L, Arrays.asList(0L, 10L, 0L), 20.0, 200000000L) + .inOrder(); } } diff --git a/api/src/test/java/io/opencensus/stats/AggregationTest.java b/api/src/test/java/io/opencensus/stats/AggregationTest.java index 3ef131b8..c2e6a716 100644 --- a/api/src/test/java/io/opencensus/stats/AggregationTest.java +++ b/api/src/test/java/io/opencensus/stats/AggregationTest.java @@ -19,10 +19,10 @@ package io.opencensus.stats; import static com.google.common.truth.Truth.assertThat; import com.google.common.testing.EqualsTester; -import io.opencensus.common.Function; import io.opencensus.common.Functions; import io.opencensus.stats.Aggregation.Count; import io.opencensus.stats.Aggregation.Distribution; +import io.opencensus.stats.Aggregation.LastValue; import io.opencensus.stats.Aggregation.Mean; import io.opencensus.stats.Aggregation.Sum; import java.util.ArrayList; @@ -66,6 +66,7 @@ public class AggregationTest { Distribution.create(BucketBoundaries.create(Arrays.asList(0.0, 1.0, 5.0))), Distribution.create(BucketBoundaries.create(Arrays.asList(0.0, 1.0, 5.0)))) .addEqualityGroup(Mean.create(), Mean.create()) + .addEqualityGroup(LastValue.create(), LastValue.create()) .testEquals(); } @@ -76,39 +77,21 @@ public class AggregationTest { Sum.create(), Count.create(), Mean.create(), - Distribution.create(BucketBoundaries.create(Arrays.asList(-10.0, 1.0, 5.0)))); + Distribution.create(BucketBoundaries.create(Arrays.asList(-10.0, 1.0, 5.0))), + LastValue.create()); List<String> actual = new ArrayList<String>(); for (Aggregation aggregation : aggregations) { actual.add( aggregation.match( - new Function<Sum, String>() { - @Override - public String apply(Sum arg) { - return "SUM"; - } - }, - new Function<Count, String>() { - @Override - public String apply(Count arg) { - return "COUNT"; - } - }, - new Function<Mean, String>() { - @Override - public String apply(Mean arg) { - return "MEAN"; - } - }, - new Function<Distribution, String>() { - @Override - public String apply(Distribution arg) { - return "DISTRIBUTION"; - } - }, - Functions.<String>throwIllegalArgumentException())); + Functions.returnConstant("SUM"), + Functions.returnConstant("COUNT"), + Functions.returnConstant("DISTRIBUTION"), + Functions.returnConstant("LASTVALUE"), + Functions.returnConstant("UNKNOWN"))); } - assertThat(actual).isEqualTo(Arrays.asList("SUM", "COUNT", "MEAN", "DISTRIBUTION")); + assertThat(actual) + .isEqualTo(Arrays.asList("SUM", "COUNT", "UNKNOWN", "DISTRIBUTION", "LASTVALUE")); } } diff --git a/api/src/test/java/io/opencensus/stats/ViewDataTest.java b/api/src/test/java/io/opencensus/stats/ViewDataTest.java index 0dc78e33..89009f34 100644 --- a/api/src/test/java/io/opencensus/stats/ViewDataTest.java +++ b/api/src/test/java/io/opencensus/stats/ViewDataTest.java @@ -27,10 +27,13 @@ import io.opencensus.common.Functions; import io.opencensus.common.Timestamp; import io.opencensus.stats.Aggregation.Count; import io.opencensus.stats.Aggregation.Distribution; +import io.opencensus.stats.Aggregation.LastValue; import io.opencensus.stats.Aggregation.Mean; import io.opencensus.stats.Aggregation.Sum; import io.opencensus.stats.AggregationData.CountData; import io.opencensus.stats.AggregationData.DistributionData; +import io.opencensus.stats.AggregationData.LastValueDataDouble; +import io.opencensus.stats.AggregationData.LastValueDataLong; import io.opencensus.stats.AggregationData.SumDataDouble; import io.opencensus.stats.AggregationData.SumDataLong; import io.opencensus.stats.View.AggregationWindow; @@ -218,6 +221,22 @@ public final class ViewDataTest { CountData.create(100))); } + @Test + public void preventAggregationAndAggregationDataMismatch_LastValueDouble_LastValueLong() { + aggregationAndAggregationDataMismatch( + createView(LastValue.create(), MEASURE_DOUBLE), + ImmutableMap.<List<TagValue>, AggregationData>of( + Arrays.asList(V1, V2), LastValueDataLong.create(100))); + } + + @Test + public void preventAggregationAndAggregationDataMismatch_LastValueLong_LastValueDouble() { + aggregationAndAggregationDataMismatch( + createView(LastValue.create(), MEASURE_LONG), + ImmutableMap.<List<TagValue>, AggregationData>of( + Arrays.asList(V1, V2), LastValueDataDouble.create(100))); + } + private static View createView(Aggregation aggregation) { return createView(aggregation, MEASURE_DOUBLE); } |