diff options
10 files changed, 83 insertions, 31 deletions
diff --git a/api/src/main/java/io/opencensus/stats/ViewData.java b/api/src/main/java/io/opencensus/stats/ViewData.java index dc8fd555..fe2510bc 100644 --- a/api/src/main/java/io/opencensus/stats/ViewData.java +++ b/api/src/main/java/io/opencensus/stats/ViewData.java @@ -44,6 +44,10 @@ import java.util.Map; import java.util.Map.Entry; import javax.annotation.concurrent.Immutable; +/*>>> +import org.checkerframework.checker.nullness.qual.Nullable; +*/ + /** The aggregated data for a particular {@link View}. */ @Immutable @AutoValue @@ -117,7 +121,7 @@ public abstract class ViewData { return null; } }, - Functions.<Void>throwIllegalArgumentException()); + Functions.</*@Nullable*/ Void>throwIllegalArgumentException()); } private static String createErrorMessageForWindow( diff --git a/api/src/main/java/io/opencensus/trace/Status.java b/api/src/main/java/io/opencensus/trace/Status.java index d5807ef5..f5a275bf 100644 --- a/api/src/main/java/io/opencensus/trace/Status.java +++ b/api/src/main/java/io/opencensus/trace/Status.java @@ -28,6 +28,10 @@ import java.util.TreeMap; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; +/*>>> +import org.checkerframework.dataflow.qual.Deterministic; +*/ + /** * Defines the status of a {@link Span} by providing a standard {@link CanonicalCode} in conjunction * with an optional descriptive message. Instances of {@code Status} are created by starting with @@ -286,6 +290,7 @@ public final class Status { * @return the description of this {@code Status}. */ @Nullable + /*@Deterministic*/ public String getDescription() { return description; } diff --git a/api/src/main/java/io/opencensus/trace/export/SpanData.java b/api/src/main/java/io/opencensus/trace/export/SpanData.java index c268d6b4..498c142e 100644 --- a/api/src/main/java/io/opencensus/trace/export/SpanData.java +++ b/api/src/main/java/io/opencensus/trace/export/SpanData.java @@ -36,6 +36,10 @@ import java.util.Map; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; +/*>>> +import org.checkerframework.dataflow.qual.Deterministic; +*/ + /** Immutable representation of all data collected by the {@link Span} class. */ @Immutable @AutoValue @@ -106,6 +110,7 @@ public abstract class SpanData { * @return the parent {@code SpanId} or {@code null} if the {@code Span} is a root {@code Span}. */ @Nullable + /*@Deterministic*/ public abstract SpanId getParentSpanId(); /** @@ -177,6 +182,7 @@ public abstract class SpanData { * @return the {@code Status} or {@code null} if {@code Span} is still active. */ @Nullable + /*@Deterministic*/ public abstract Status getStatus(); /** @@ -185,6 +191,7 @@ public abstract class SpanData { * @return the end {@code Timestamp} or {@code null} if the {@code Span} is still active. */ @Nullable + /*@Deterministic*/ public abstract Timestamp getEndTimestamp(); SpanData() {} @@ -224,6 +231,7 @@ public abstract class SpanData { * * @return the event. */ + /*@Deterministic*/ public abstract T getEvent(); TimedEvent() {} diff --git a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/TraceConfigzZPageHandler.java b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/TraceConfigzZPageHandler.java index 9b075b30..5257960d 100644 --- a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/TraceConfigzZPageHandler.java +++ b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/TraceConfigzZPageHandler.java @@ -16,8 +16,6 @@ package io.opencensus.contrib.zpages; -import static com.google.common.base.Strings.isNullOrEmpty; - import com.google.common.base.Charsets; import io.opencensus.trace.config.TraceConfig; import io.opencensus.trace.config.TraceParams; @@ -27,6 +25,11 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Map; +import javax.annotation.Nullable; + +/*>>> +import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; +*/ // TODO(bdrutu): Add tests. /** @@ -167,6 +170,13 @@ final class TraceConfigzZPageHandler extends ZPageHandler { } } + // TODO(sebright): Try to use a Checker Framework stub file for the Guava Strings class and use + // Strings.isNullOrEmpty instead. + /*>>> @EnsuresNonNullIf(result = false, expression = "#1") */ + private static boolean isNullOrEmpty(@Nullable String str) { + return str == null || str.isEmpty(); + } + // Prints a table to a PrintWriter that shows existing trace parameters. private static void emitTraceParamsTable(TraceParams params, PrintWriter out) { out.write( 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 f90a520b..e3abe988 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 @@ -64,7 +64,10 @@ import java.util.Map; import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; -import javax.annotation.Nullable; + +/*>>> +import org.checkerframework.checker.nullness.qual.Nullable; +*/ /** Util methods to convert OpenCensus Stats data models to StackDriver monitoring data models. */ final class StackdriverExportUtils { @@ -96,7 +99,7 @@ final class StackdriverExportUtils { } // Construct a MetricDescriptor using a View. - @Nullable + @javax.annotation.Nullable static MetricDescriptor createMetricDescriptor(View view, String projectId) { if (!(view.getWindow() instanceof Cumulative)) { // TODO(songya): Only Cumulative view will be exported to Stackdriver in this version. @@ -170,7 +173,7 @@ final class StackdriverExportUtils { // Convert ViewData to a list of TimeSeries, so that ViewData can be uploaded to Stackdriver. static List<TimeSeries> createTimeSeriesList( - ViewData viewData, MonitoredResource monitoredResource) { + @javax.annotation.Nullable ViewData viewData, MonitoredResource monitoredResource) { List<TimeSeries> timeSeriesList = Lists.newArrayList(); if (viewData == null) { return timeSeriesList; @@ -252,7 +255,7 @@ final class StackdriverExportUtils { throw new IllegalArgumentException("IntervalData not supported"); } }, - Functions.<Void>throwIllegalArgumentException()); + Functions.</*@Nullable*/ Void>throwIllegalArgumentException()); return builder.build(); } @@ -303,7 +306,7 @@ final class StackdriverExportUtils { return null; } }, - Functions.<Void>throwIllegalArgumentException()); + Functions.</*@Nullable*/ Void>throwIllegalArgumentException()); return builder.build(); } 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 80c78de5..24c0f0ed 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 @@ -43,6 +43,10 @@ import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.concurrent.NotThreadSafe; +/*>>> +import org.checkerframework.checker.nullness.qual.Nullable; +*/ + /** * Worker {@code Runnable} that polls ViewData from Stats library and batch export to StackDriver. * @@ -151,7 +155,7 @@ final class StackdriverExporterWorker implements Runnable { // StackDriver. @VisibleForTesting void export() { - List<ViewData> viewDataList = Lists.newArrayList(); + List</*@Nullable*/ ViewData> viewDataList = Lists.newArrayList(); for (View view : viewManager.getAllExportedViews()) { if (registerView(view)) { // Only upload stats for valid views. @@ -160,7 +164,7 @@ final class StackdriverExporterWorker implements Runnable { } List<TimeSeries> timeSeriesList = Lists.newArrayList(); - for (ViewData viewData : viewDataList) { + for (/*@Nullable*/ ViewData viewData : viewDataList) { timeSeriesList.addAll( StackdriverExportUtils.createTimeSeriesList(viewData, monitoredResource)); } diff --git a/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverV2ExporterHandler.java b/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverV2ExporterHandler.java index d3ade520..3ff61bfe 100644 --- a/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverV2ExporterHandler.java +++ b/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverV2ExporterHandler.java @@ -58,6 +58,10 @@ import java.util.Collections; import java.util.List; import java.util.Map; +/*>>> +import org.checkerframework.checker.nullness.qual.Nullable; +*/ + /** Exporter to Stackdriver Trace API v2. */ final class StackdriverV2ExporterHandler extends SpanExporter.Handler { private static final Tracer tracer = Tracing.getTracer(); @@ -252,7 +256,7 @@ final class StackdriverV2ExporterHandler extends SpanExporter.Handler { return null; } }, - Functions.<Void>returnNull()); + Functions.</*@Nullable*/ Void>returnNull()); return attributeValueBuilder.build(); } diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/IntervalBucket.java b/impl_core/src/main/java/io/opencensus/implcore/stats/IntervalBucket.java index 68380791..a35948a7 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/stats/IntervalBucket.java +++ b/impl_core/src/main/java/io/opencensus/implcore/stats/IntervalBucket.java @@ -28,6 +28,10 @@ import io.opencensus.tags.TagValue; import java.util.List; import java.util.Map; +/*>>> +import org.checkerframework.checker.nullness.qual.Nullable; +*/ + /** The bucket with aggregated {@code MeasureValue}s used for {@code IntervalViewData}. */ final class IntervalBucket { @@ -36,7 +40,8 @@ final class IntervalBucket { private final Timestamp start; private final Duration duration; private final Aggregation aggregation; - private final Map<List<TagValue>, MutableAggregation> tagValueAggregationMap = Maps.newHashMap(); + private final Map<List</*@Nullable*/ TagValue>, MutableAggregation> tagValueAggregationMap = + Maps.newHashMap(); IntervalBucket(Timestamp start, Duration duration, Aggregation aggregation) { checkNotNull(start, "Start"); @@ -48,7 +53,7 @@ final class IntervalBucket { this.aggregation = aggregation; } - Map<List<TagValue>, MutableAggregation> getTagValueAggregationMap() { + Map<List</*@Nullable*/ TagValue>, MutableAggregation> getTagValueAggregationMap() { return tagValueAggregationMap; } @@ -57,7 +62,7 @@ final class IntervalBucket { } // Puts a new value into the internal MutableAggregations, based on the TagValues. - void record(List<TagValue> tagValues, double value) { + void record(List</*@Nullable*/ TagValue> tagValues, double value) { if (!tagValueAggregationMap.containsKey(tagValues)) { tagValueAggregationMap.put(tagValues, MutableViewData.createMutableAggregation(aggregation)); } 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 4e55c741..64173713 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 @@ -40,9 +40,12 @@ import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; +/*>>> +import org.checkerframework.checker.nullness.qual.Nullable; +*/ + /** A class that stores a singleton map from {@code MeasureName}s to {@link MutableViewData}s. */ final class MeasureToViewMap { @@ -63,10 +66,10 @@ final class MeasureToViewMap { // Cached set of exported views. It must be set to null whenever a view is registered or // unregistered. - @Nullable private volatile Set<View> exportedViews; + @javax.annotation.Nullable private volatile Set<View> exportedViews; /** Returns a {@link ViewData} corresponding to the given {@link View.Name}. */ - @Nullable + @javax.annotation.Nullable synchronized ViewData getView(View.Name viewName, Clock clock, StatsCollectionState state) { MutableViewData view = getMutableViewData(viewName); return view == null ? null : view.toViewData(clock.now(), state); @@ -119,7 +122,7 @@ final class MeasureToViewMap { mutableMap.put(view.getMeasure().getName(), MutableViewData.create(view, clock.now())); } - @Nullable + @javax.annotation.Nullable private synchronized MutableViewData getMutableViewData(View.Name viewName) { View view = registeredViews.get(viewName); if (view == null) { @@ -155,7 +158,7 @@ final class MeasureToViewMap { measurement.match( new RecordDoubleValueFunc(tags, view, timestamp), new RecordLongValueFunc(tags, view, timestamp), - Functions.<Void>throwAssertionError()); + Functions.</*@Nullable*/ Void>throwAssertionError()); } } } 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 7d251559..4963ce59 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 @@ -63,7 +63,10 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import javax.annotation.Nullable; + +/*>>> +import org.checkerframework.checker.nullness.qual.Nullable; +*/ /** A mutable version of {@link ViewData}, used for recording stats and start/end time. */ abstract class MutableViewData { @@ -71,7 +74,7 @@ abstract class MutableViewData { private static final long MILLIS_PER_SECOND = 1000L; private static final long NANOS_PER_MILLI = 1000 * 1000; - @Nullable @VisibleForTesting static final TagValue UNKNOWN_TAG_VALUE = null; + @javax.annotation.Nullable @VisibleForTesting static final TagValue UNKNOWN_TAG_VALUE = null; @VisibleForTesting static final Timestamp ZERO_TIMESTAMP = Timestamp.create(0, 0); @@ -134,9 +137,9 @@ abstract class MutableViewData { } @VisibleForTesting - static List<TagValue> getTagValues( + static List</*@Nullable*/ TagValue> getTagValues( Map<? extends TagKey, ? extends TagValue> tags, List<? extends TagKey> columns) { - List<TagValue> tagValues = new ArrayList<TagValue>(columns.size()); + List</*@Nullable*/ TagValue> tagValues = new ArrayList</*@Nullable*/ TagValue>(columns.size()); // Record all the measures in a "Greedy" way. // Every view aggregates every measure. This is similar to doing a GROUPBY view’s keys. for (int i = 0; i < columns.size(); ++i) { @@ -202,7 +205,7 @@ abstract class MutableViewData { private static final class CumulativeMutableViewData extends MutableViewData { private Timestamp start; - private final Map<List<TagValue>, MutableAggregation> tagValueAggregationMap = + private final Map<List</*@Nullable*/ TagValue>, MutableAggregation> tagValueAggregationMap = Maps.newHashMap(); private CumulativeMutableViewData(View view, Timestamp start) { @@ -212,7 +215,8 @@ abstract class MutableViewData { @Override void record(TagContext context, double value, Timestamp timestamp) { - List<TagValue> tagValues = getTagValues(getTagMap(context), super.view.getColumns()); + List</*@Nullable*/ TagValue> tagValues = + getTagValues(getTagMap(context), super.view.getColumns()); if (!tagValueAggregationMap.containsKey(tagValues)) { tagValueAggregationMap.put( tagValues, createMutableAggregation(super.view.getAggregation())); @@ -305,7 +309,8 @@ abstract class MutableViewData { @Override void record(TagContext context, double value, Timestamp timestamp) { - List<TagValue> tagValues = getTagValues(getTagMap(context), super.view.getColumns()); + List</*@Nullable*/ TagValue> tagValues = + getTagValues(getTagMap(context), super.view.getColumns()); refreshBucketList(timestamp); // It is always the last bucket that does the recording. NullnessUtils.castNonNull(buckets.peekLast()).record(tagValues, value); @@ -390,8 +395,9 @@ abstract class MutableViewData { // Combine stats within each bucket, aggregate stats by tag values, and return the mapping from // tag values to aggregation data. - private Map<List<TagValue>, AggregationData> combineBucketsAndGetAggregationMap(Timestamp now) { - Multimap<List<TagValue>, MutableAggregation> multimap = HashMultimap.create(); + private Map<List</*@Nullable*/ TagValue>, AggregationData> combineBucketsAndGetAggregationMap( + Timestamp now) { + Multimap<List</*@Nullable*/ TagValue>, MutableAggregation> multimap = HashMultimap.create(); // TODO(sebright): Decide whether to use a different class instead of LinkedList. @SuppressWarnings("JdkObsolete") @@ -399,7 +405,7 @@ abstract class MutableViewData { Aggregation aggregation = super.view.getAggregation(); putBucketsIntoMultiMap(shallowCopy, multimap, aggregation, now); - Map<List<TagValue>, MutableAggregation> singleMap = + Map<List</*@Nullable*/ TagValue>, MutableAggregation> singleMap = aggregateOnEachTagValueList(multimap, aggregation); return createAggregationMap(singleMap, super.getView().getMeasure()); } @@ -408,7 +414,7 @@ abstract class MutableViewData { // mutable aggregations (map value) from different buckets. private static void putBucketsIntoMultiMap( LinkedList<IntervalBucket> buckets, - Multimap<List<TagValue>, MutableAggregation> multimap, + Multimap<List</*@Nullable*/ TagValue>, MutableAggregation> multimap, Aggregation aggregation, Timestamp now) { // Put fractional stats of the head (oldest) bucket. @@ -430,7 +436,7 @@ abstract class MutableViewData { shouldSkipFirst = false; continue; // skip the first bucket } - for (Entry<List<TagValue>, MutableAggregation> entry : + for (Entry<List</*@Nullable*/ TagValue>, MutableAggregation> entry : bucket.getTagValueAggregationMap().entrySet()) { multimap.put(entry.getKey(), entry.getValue()); } |