From 6b7f096c1715abc43c3f2bcb207eb8e1946486cb Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Fri, 25 Aug 2023 14:54:46 -0700 Subject: [PATCH 1/2] fix up some nullaway and errorprone issues. --- .../android/SessionIdRatioBasedSampler.java | 9 ++++-- .../instrumentation/ScreenNameExtractor.java | 5 ---- .../activity/ActivityTracer.java | 28 +++++++++++++------ .../fragment/FragmentTracer.java | 14 ++++++++-- ...ndroidLifecycleInstrumentationBuilder.java | 12 ++++++-- .../startup/AppStartupTimer.java | 4 +-- 6 files changed, 48 insertions(+), 24 deletions(-) diff --git a/instrumentation/src/main/java/io/opentelemetry/android/SessionIdRatioBasedSampler.java b/instrumentation/src/main/java/io/opentelemetry/android/SessionIdRatioBasedSampler.java index 2ad6e9bad..5586f4209 100644 --- a/instrumentation/src/main/java/io/opentelemetry/android/SessionIdRatioBasedSampler.java +++ b/instrumentation/src/main/java/io/opentelemetry/android/SessionIdRatioBasedSampler.java @@ -11,7 +11,10 @@ import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.SamplingResult; + +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * Session ID ratio based sampler. Uses {@link Sampler#traceIdRatioBased(double)} sampler @@ -22,10 +25,10 @@ */ public class SessionIdRatioBasedSampler implements Sampler { private final Sampler ratioBasedSampler; - private final SessionId sessionid; + private final SessionId sessionId; public SessionIdRatioBasedSampler(double ratio, SessionId sessionId) { - this.sessionid = sessionId; + this.sessionId = sessionId; // SessionId uses the same format as TraceId, so we can reuse trace ID ratio sampler. this.ratioBasedSampler = Sampler.traceIdRatioBased(ratio); } @@ -40,7 +43,7 @@ public SamplingResult shouldSample( List parentLinks) { // Replace traceId with sessionId return ratioBasedSampler.shouldSample( - parentContext, sessionid.getSessionId(), name, spanKind, attributes, parentLinks); + parentContext, sessionId.getSessionId(), name, spanKind, attributes, parentLinks); } @Override diff --git a/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/ScreenNameExtractor.java b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/ScreenNameExtractor.java index ed6c5682e..61ba79315 100644 --- a/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/ScreenNameExtractor.java +++ b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/ScreenNameExtractor.java @@ -6,26 +6,21 @@ package io.opentelemetry.android.instrumentation; import android.app.Activity; -import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; public interface ScreenNameExtractor { - @Nullable String extract(Activity activity); - @Nullable String extract(Fragment fragment); ScreenNameExtractor DEFAULT = new ScreenNameExtractor() { - @Nullable @Override public String extract(Activity activity) { return useAnnotationOrClassName(activity.getClass()); } - @Nullable @Override public String extract(Fragment fragment) { return useAnnotationOrClassName(fragment.getClass()); diff --git a/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/activity/ActivityTracer.java b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/activity/ActivityTracer.java index 19c7614dd..8d47593a8 100644 --- a/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/activity/ActivityTracer.java +++ b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/activity/ActivityTracer.java @@ -139,12 +139,15 @@ public static Builder builder(Activity activity) { } static class Builder { + private static final ActiveSpan INVALID_ACTIVE_SPAN = new ActiveSpan(() -> null); + private static final Tracer INVALID_TRACER = spanName -> null; + private static final AppStartupTimer INVALID_TIMER = new AppStartupTimer(); private final Activity activity; - public String screenName; + public String screenName = "unknown_screen"; private AtomicReference initialAppActivity = new AtomicReference<>(); - private Tracer tracer; - private AppStartupTimer appStartupTimer; - private ActiveSpan activeSpan; + private Tracer tracer = INVALID_TRACER; + private AppStartupTimer appStartupTimer = INVALID_TIMER; + private ActiveSpan activeSpan = INVALID_ACTIVE_SPAN; public Builder(Activity activity) { this.activity = activity; @@ -184,13 +187,22 @@ private String getActivityName() { return activity.getClass().getSimpleName(); } - public ActivityTracer build() { - return new ActivityTracer(this); - } - public Builder setScreenName(String screenName) { this.screenName = screenName; return this; } + + public ActivityTracer build() { + if (activeSpan == INVALID_ACTIVE_SPAN) { + throw new IllegalStateException("activeSpan must be configured."); + } + if (tracer == INVALID_TRACER) { + throw new IllegalStateException("tracer must be configured."); + } + if (appStartupTimer == INVALID_TIMER) { + throw new IllegalStateException("appStartupTimer must be configured."); + } + return new ActivityTracer(this); + } } } diff --git a/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/fragment/FragmentTracer.java b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/fragment/FragmentTracer.java index 0dc9e2b8c..43a4909fc 100644 --- a/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/fragment/FragmentTracer.java +++ b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/fragment/FragmentTracer.java @@ -70,10 +70,12 @@ static Builder builder(Fragment fragment) { } static class Builder { + private static final ActiveSpan INVALID_ACTIVE_SPAN = new ActiveSpan(() -> null); + private static final Tracer INVALID_TRACER = spanName -> null; private final Fragment fragment; - public String screenName; - private Tracer tracer; - private ActiveSpan activeSpan; + public String screenName = ""; + private Tracer tracer = INVALID_TRACER; + private ActiveSpan activeSpan = INVALID_ACTIVE_SPAN; public Builder(Fragment fragment) { this.fragment = fragment; @@ -99,6 +101,12 @@ public String getFragmentName() { } FragmentTracer build() { + if (activeSpan == INVALID_ACTIVE_SPAN) { + throw new IllegalStateException("activeSpan must be configured."); + } + if (tracer == INVALID_TRACER) { + throw new IllegalStateException("tracer must be configured."); + } return new FragmentTracer(this); } } diff --git a/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/lifecycle/AndroidLifecycleInstrumentationBuilder.java b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/lifecycle/AndroidLifecycleInstrumentationBuilder.java index 7a1e6194d..3ac7f2fbd 100644 --- a/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/lifecycle/AndroidLifecycleInstrumentationBuilder.java +++ b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/lifecycle/AndroidLifecycleInstrumentationBuilder.java @@ -12,9 +12,11 @@ import java.util.function.Function; public class AndroidLifecycleInstrumentationBuilder { + private static final VisibleScreenTracker INVALID_SCREEN_TRACKER = new VisibleScreenTracker(); + private static final AppStartupTimer INVALID_TIMER = new AppStartupTimer(); ScreenNameExtractor screenNameExtractor = ScreenNameExtractor.DEFAULT; - AppStartupTimer startupTimer; - VisibleScreenTracker visibleScreenTracker; + AppStartupTimer startupTimer = INVALID_TIMER; + VisibleScreenTracker visibleScreenTracker = INVALID_SCREEN_TRACKER; Function tracerCustomizer = Function.identity(); public AndroidLifecycleInstrumentationBuilder setStartupTimer(AppStartupTimer timer) { @@ -41,6 +43,12 @@ public AndroidLifecycleInstrumentationBuilder setScreenNameExtractor( } public AndroidLifecycleInstrumentation build() { + if (visibleScreenTracker == INVALID_SCREEN_TRACKER) { + throw new IllegalStateException("visibleScreenTracker must be configured."); + } + if (startupTimer == INVALID_TIMER) { + throw new IllegalStateException("startupTimer must be configured."); + } return new AndroidLifecycleInstrumentation(this); } } diff --git a/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/startup/AppStartupTimer.java b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/startup/AppStartupTimer.java index b7766913d..13335e1c4 100644 --- a/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/startup/AppStartupTimer.java +++ b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/startup/AppStartupTimer.java @@ -54,9 +54,7 @@ public Span start(Tracer tracer) { return appStart; } - /** - * @return epoch timestamp in nanos calculated by the startupClock. - */ + /** Returns the epoch timestamp in nanos calculated by the startupClock. */ public long clockNow() { return startupClock.now(); } From c52da97d8c57a645c1b1003a6b9eb9b11781d157 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Fri, 25 Aug 2023 14:55:22 -0700 Subject: [PATCH 2/2] spotless --- .../io/opentelemetry/android/SessionIdRatioBasedSampler.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/instrumentation/src/main/java/io/opentelemetry/android/SessionIdRatioBasedSampler.java b/instrumentation/src/main/java/io/opentelemetry/android/SessionIdRatioBasedSampler.java index 5586f4209..c321b34d9 100644 --- a/instrumentation/src/main/java/io/opentelemetry/android/SessionIdRatioBasedSampler.java +++ b/instrumentation/src/main/java/io/opentelemetry/android/SessionIdRatioBasedSampler.java @@ -11,10 +11,7 @@ import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.SamplingResult; - -import java.util.HashSet; import java.util.List; -import java.util.Set; /** * Session ID ratio based sampler. Uses {@link Sampler#traceIdRatioBased(double)} sampler