From f553aa0a6b7de01aded0157b062a0b12054db0ae Mon Sep 17 00:00:00 2001 From: Anuraag Agrawal Date: Fri, 5 Mar 2021 11:37:24 +0900 Subject: [PATCH] =?UTF-8?q?Add=20an=20internal=20GuardedBy=20annotation=20?= =?UTF-8?q?to=20enable=20our=20own=20error=20prone=20ch=E2=80=A6=20(#2978)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add an internal GuardedBy annotation to enable our own error prone checker without affecting downstream. * Method --- .../api/GlobalOpenTelemetry.java | 2 +- .../opentelemetry/api/internal/GuardedBy.java | 46 +++++++++++++++++++ .../sdk/extension/zpages/ZPageServer.java | 2 +- .../sdk/common/CompletableResultCode.java | 2 +- .../opentelemetry/sdk/internal/TestClock.java | 2 +- .../aggregator/DoubleHistogramAggregator.java | 2 +- .../DoubleMinMaxSumCountAggregator.java | 2 +- .../LongMinMaxSumCountAggregator.java | 2 +- .../sdk/trace/RecordEventsReadableSpan.java | 2 +- .../trace/export/BatchSpanProcessorTest.java | 2 +- 10 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 api/all/src/main/java/io/opentelemetry/api/internal/GuardedBy.java diff --git a/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java b/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java index 70ddc87d97..9f91cf6a39 100644 --- a/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java +++ b/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java @@ -5,6 +5,7 @@ package io.opentelemetry.api; +import io.opentelemetry.api.internal.GuardedBy; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.TracerProvider; import io.opentelemetry.context.propagation.ContextPropagators; @@ -13,7 +14,6 @@ import java.lang.reflect.Method; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Nullable; -import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; /** diff --git a/api/all/src/main/java/io/opentelemetry/api/internal/GuardedBy.java b/api/all/src/main/java/io/opentelemetry/api/internal/GuardedBy.java new file mode 100644 index 0000000000..4cf630a567 --- /dev/null +++ b/api/all/src/main/java/io/opentelemetry/api/internal/GuardedBy.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.internal; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The field or method to which this annotation is applied can only be accessed when holding a + * particular lock, which may be a built-in (synchronization) lock, or may be an explicit {@link + * java.util.concurrent.locks.Lock}. + * + *

The argument determines which lock guards the annotated field or method: + * + *

+ * + *

This annotation is similar to {@link javax.annotation.concurrent.GuardedBy} but has {@link + * RetentionPolicy#SOURCE} so it is not in published artifacts. We only apply this to private + * members, so there is no reason to publish them and we avoid requiring end users to have to depend + * on the annotations in their own build. See the original issue for more info. + */ +@Target({ElementType.FIELD, ElementType.METHOD}) +@Retention(RetentionPolicy.SOURCE) +public @interface GuardedBy { + /** The name of the object guarding the target. */ + String value(); +} diff --git a/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java b/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java index 22a1a006c2..5d04a7fbe4 100644 --- a/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java +++ b/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java @@ -6,6 +6,7 @@ package io.opentelemetry.sdk.extension.zpages; import com.sun.net.httpserver.HttpServer; +import io.opentelemetry.api.internal.GuardedBy; import io.opentelemetry.sdk.trace.SpanLimits; import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.samplers.Sampler; @@ -14,7 +15,6 @@ import java.net.InetSocketAddress; import java.util.Arrays; import java.util.function.Supplier; import javax.annotation.Nullable; -import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; /** diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java b/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java index c5f1d5eaa5..6258eed1f1 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java @@ -5,6 +5,7 @@ package io.opentelemetry.sdk.common; +import io.opentelemetry.api.internal.GuardedBy; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -13,7 +14,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import javax.annotation.Nullable; -import javax.annotation.concurrent.GuardedBy; /** * This class models JDK 8's CompletableFuture to afford migration should Open Telemetry's SDK diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/internal/TestClock.java b/sdk/common/src/main/java/io/opentelemetry/sdk/internal/TestClock.java index e1ec8abe05..7265396c95 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/internal/TestClock.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/internal/TestClock.java @@ -5,9 +5,9 @@ package io.opentelemetry.sdk.internal; +import io.opentelemetry.api.internal.GuardedBy; import io.opentelemetry.sdk.common.Clock; import java.util.concurrent.TimeUnit; -import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; /** A mutable {@link Clock} that allows the time to be set for testing. */ diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/DoubleHistogramAggregator.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/DoubleHistogramAggregator.java index 35a8f1cd5a..f476a2d9b0 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/DoubleHistogramAggregator.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/DoubleHistogramAggregator.java @@ -5,6 +5,7 @@ package io.opentelemetry.sdk.metrics.aggregator; +import io.opentelemetry.api.internal.GuardedBy; import io.opentelemetry.api.metrics.common.Labels; import io.opentelemetry.sdk.common.InstrumentationLibraryInfo; import io.opentelemetry.sdk.metrics.common.InstrumentDescriptor; @@ -18,7 +19,6 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.locks.ReentrantLock; -import javax.annotation.concurrent.GuardedBy; final class DoubleHistogramAggregator extends AbstractAggregator { private final double[] boundaries; diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/DoubleMinMaxSumCountAggregator.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/DoubleMinMaxSumCountAggregator.java index 56c742de23..58dabbd65e 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/DoubleMinMaxSumCountAggregator.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/DoubleMinMaxSumCountAggregator.java @@ -5,11 +5,11 @@ package io.opentelemetry.sdk.metrics.aggregator; +import io.opentelemetry.api.internal.GuardedBy; import io.opentelemetry.sdk.common.InstrumentationLibraryInfo; import io.opentelemetry.sdk.metrics.common.InstrumentDescriptor; import io.opentelemetry.sdk.resources.Resource; import java.util.concurrent.locks.ReentrantReadWriteLock; -import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; @ThreadSafe diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/LongMinMaxSumCountAggregator.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/LongMinMaxSumCountAggregator.java index 2bef381708..855411ed19 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/LongMinMaxSumCountAggregator.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/aggregator/LongMinMaxSumCountAggregator.java @@ -5,11 +5,11 @@ package io.opentelemetry.sdk.metrics.aggregator; +import io.opentelemetry.api.internal.GuardedBy; import io.opentelemetry.sdk.common.InstrumentationLibraryInfo; import io.opentelemetry.sdk.metrics.common.InstrumentDescriptor; import io.opentelemetry.sdk.resources.Resource; import java.util.concurrent.locks.ReentrantReadWriteLock; -import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; @ThreadSafe diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java index 4d570993d0..4603302678 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java @@ -8,6 +8,7 @@ package io.opentelemetry.sdk.trace; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.internal.GuardedBy; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; @@ -32,7 +33,6 @@ import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; /** Implementation for the {@link Span} class that records trace events. */ diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java index 9283221068..7e6f1eb49b 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java @@ -16,6 +16,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.when; +import io.opentelemetry.api.internal.GuardedBy; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.sdk.common.CompletableResultCode; @@ -33,7 +34,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.Nullable; -import javax.annotation.concurrent.GuardedBy; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test;