Skip to content

Commit 7828651

Browse files
committed
wip
1 parent 1bc3c4c commit 7828651

File tree

9 files changed

+92
-9
lines changed

9 files changed

+92
-9
lines changed

sample-app/src/main/AndroidManifest.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,15 @@
2121
android:exported="true">
2222
<intent-filter>
2323
<action android:name="android.intent.action.MAIN" />
24-
2524
<category android:name="android.intent.category.LAUNCHER" />
2625
</intent-filter>
2726
</activity>
27+
<activity
28+
android:name=".JetpackComposeActivity"
29+
android:theme="@style/Theme.SplunkRUMSampleApp.NoActionBar"
30+
android:label="@string/app_name"
31+
android:exported="true">
32+
</activity>
2833
<service
2934
android:name=".SplunkBackgroundService"
3035
android:exported="false"

sample-app/src/main/java/com/splunk/android/sample/FirstFragment.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static io.opentelemetry.api.common.AttributeKey.longKey;
2020

2121
import android.annotation.SuppressLint;
22+
import android.content.Intent;
2223
import android.os.Bundle;
2324
import android.view.LayoutInflater;
2425
import android.view.View;
@@ -80,6 +81,10 @@ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
8081
NavHostFragment.findNavController(FirstFragment.this)
8182
.navigate(R.id.action_FirstFragment_to_SecondFragment));
8283

84+
binding.buttonScreenName.setOnClickListener(v -> {
85+
SplunkRum.getInstance().setScreenName("custom-screen");
86+
});
87+
8388
binding.crash.setOnClickListener(v -> multiThreadCrashing());
8489

8590
binding.httpMe.setOnClickListener(
@@ -184,6 +189,8 @@ public LiveData<String> getSessionId() {
184189
public void onDestroyView() {
185190
super.onDestroyView();
186191
binding = null;
192+
193+
SplunkRum.getInstance().setScreenName(null);
187194
}
188195

189196
@Override

sample-app/src/main/res/layout/fragment_first.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@
4242
android:layout_height="wrap_content"
4343
android:text="@string/next" />
4444

45+
<Button
46+
android:id="@+id/button_screen_name"
47+
android:layout_width="wrap_content"
48+
android:layout_height="wrap_content"
49+
android:text="@string/screen_name" />
50+
4551
<Button
4652
android:id="@+id/crash"
4753
android:layout_width="wrap_content"

sample-app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<string name="second_fragment_label">Second Fragment</string>
77
<string name="next">Next</string>
88
<string name="previous">Previous</string>
9+
<string name="screen_name">Custom screen name</string>
910

1011
<string name="hello_first_fragment">Hello first fragment</string>
1112
<string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.splunk.rum;
2+
3+
import androidx.annotation.Nullable;
4+
5+
import java.util.concurrent.atomic.AtomicReference;
6+
7+
import io.opentelemetry.android.instrumentation.activity.VisibleScreenTracker;
8+
9+
public class ExplicitVisibleScreenNameTracker extends VisibleScreenTracker {
10+
private final AtomicReference<String> lastScreenName = new AtomicReference<>();
11+
private final AtomicReference<String> previouslyLastScreenName = new AtomicReference<>();
12+
13+
public void setExplicitScreenName(String screenName) {
14+
this.previouslyLastScreenName.set(this.lastScreenName.get());
15+
this.lastScreenName.set(screenName);
16+
}
17+
18+
@Nullable
19+
@Override
20+
public String getPreviouslyVisibleScreen() {
21+
String screenName = previouslyLastScreenName.get();
22+
if (screenName != null) {
23+
return screenName;
24+
}
25+
26+
return super.getPreviouslyVisibleScreen();
27+
}
28+
29+
@Override
30+
public String getCurrentlyVisibleScreen() {
31+
String screenName = lastScreenName.get();
32+
if (screenName != null) {
33+
return screenName;
34+
}
35+
36+
return super.getCurrentlyVisibleScreen();
37+
}
38+
39+
}

splunk-otel-android/src/main/java/com/splunk/rum/NoOpSplunkRum.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class NoOpSplunkRum extends SplunkRum {
3232
// passing null values here is fine, they'll never get used anyway
3333
@SuppressWarnings("NullAway")
3434
private NoOpSplunkRum() {
35-
super(OpenTelemetryRum.noop(), null);
35+
super(OpenTelemetryRum.noop(), null, null);
3636
}
3737

3838
@Override

splunk-otel-android/src/main/java/com/splunk/rum/RumInitializer.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import io.opentelemetry.android.OpenTelemetryRum;
3737
import io.opentelemetry.android.OpenTelemetryRumBuilder;
3838
import io.opentelemetry.android.RuntimeDetailsExtractor;
39+
import io.opentelemetry.android.ScreenAttributesSpanProcessor;
3940
import io.opentelemetry.android.config.OtelRumConfig;
4041
import io.opentelemetry.android.instrumentation.activity.VisibleScreenTracker;
4142
import io.opentelemetry.android.instrumentation.anr.AnrDetector;
@@ -52,6 +53,7 @@
5253
import io.opentelemetry.sdk.resources.Resource;
5354
import io.opentelemetry.sdk.resources.ResourceBuilder;
5455
import io.opentelemetry.sdk.trace.SpanLimits;
56+
import io.opentelemetry.sdk.trace.SpanProcessor;
5557
import io.opentelemetry.sdk.trace.data.SpanData;
5658
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
5759
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
@@ -86,7 +88,7 @@ class RumInitializer {
8688
}
8789

8890
SplunkRum initialize(Looper mainLooper) {
89-
VisibleScreenTracker visibleScreenTracker = new VisibleScreenTracker();
91+
ExplicitVisibleScreenNameTracker visibleScreenTracker = new ExplicitVisibleScreenNameTracker();
9092

9193
initializationEvents.begin();
9294

@@ -98,6 +100,7 @@ SplunkRum initialize(Looper mainLooper) {
98100
config.disableNetworkChangeMonitoring();
99101
}
100102

103+
config.disableScreenAttributes();
101104
OpenTelemetryRumBuilder otelRumBuilder = OpenTelemetryRum.builder(application, config);
102105

103106
otelRumBuilder.mergeResource(createSplunkResource());
@@ -193,6 +196,13 @@ SplunkRum initialize(Looper mainLooper) {
193196
installCrashReporter(otelRumBuilder);
194197
}
195198

199+
otelRumBuilder.addTracerProviderCustomizer(
200+
(tracerProviderBuilder, app) -> {
201+
SpanProcessor screenAttributesAppender =
202+
new ScreenAttributesSpanProcessor(visibleScreenTracker);
203+
return tracerProviderBuilder.addSpanProcessor(screenAttributesAppender);
204+
});
205+
196206
// Lifecycle events instrumentation are always installed.
197207
installLifecycleInstrumentations(otelRumBuilder, visibleScreenTracker);
198208

@@ -204,7 +214,7 @@ SplunkRum initialize(Looper mainLooper) {
204214
builder.getConfigFlags(),
205215
openTelemetryRum.getOpenTelemetry().getTracer(RUM_TRACER_NAME));
206216

207-
return new SplunkRum(openTelemetryRum, globalAttributeSupplier);
217+
return new SplunkRum(openTelemetryRum, globalAttributeSupplier, visibleScreenTracker);
208218
}
209219

210220
@NonNull

splunk-otel-android/src/main/java/com/splunk/rum/SplunkRum.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import androidx.annotation.Nullable;
2929
import com.splunk.rum.internal.GlobalAttributesSupplier;
3030
import io.opentelemetry.android.OpenTelemetryRum;
31+
import io.opentelemetry.android.instrumentation.activity.VisibleScreenTracker;
3132
import io.opentelemetry.android.instrumentation.startup.AppStartupTimer;
3233
import io.opentelemetry.api.OpenTelemetry;
3334
import io.opentelemetry.api.common.AttributeKey;
@@ -72,15 +73,17 @@ public class SplunkRum {
7273

7374
private final OpenTelemetryRum openTelemetryRum;
7475
private final GlobalAttributesSupplier globalAttributes;
76+
private final ExplicitVisibleScreenNameTracker visibleScreenTracker;
7577

7678
static {
7779
Handler handler = new Handler(Looper.getMainLooper());
7880
startupTimer.detectBackgroundStart(handler);
7981
}
8082

81-
SplunkRum(OpenTelemetryRum openTelemetryRum, GlobalAttributesSupplier globalAttributes) {
83+
SplunkRum(OpenTelemetryRum openTelemetryRum, GlobalAttributesSupplier globalAttributes, ExplicitVisibleScreenNameTracker visibleScreenTracker) {
8284
this.openTelemetryRum = openTelemetryRum;
8385
this.globalAttributes = globalAttributes;
86+
this.visibleScreenTracker = visibleScreenTracker;
8487
}
8588

8689
/** Creates a new {@link SplunkRumBuilder}, used to set up a {@link SplunkRum} instance. */
@@ -113,6 +116,18 @@ static SplunkRum initialize(SplunkRumBuilder builder, Application application) {
113116
return INSTANCE;
114117
}
115118

119+
public void setScreenName(String screenName) {
120+
if (visibleScreenTracker != null) {
121+
visibleScreenTracker.setExplicitScreenName(screenName);
122+
}
123+
124+
getTracer()
125+
.spanBuilder("Created")
126+
.setAttribute(COMPONENT_KEY, "ui")
127+
.startSpan()
128+
.end();
129+
}
130+
116131
/** Returns {@code true} if the Splunk RUM library has been successfully initialized. */
117132
public static boolean isInitialized() {
118133
return INSTANCE != null;

splunk-otel-android/src/test/java/com/splunk/rum/SplunkRumTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ void nonNullMethods() {
148148
void addEvent() {
149149
when(openTelemetryRum.getOpenTelemetry()).thenReturn(otelTesting.getOpenTelemetry());
150150

151-
SplunkRum splunkRum = new SplunkRum(openTelemetryRum, globalAttributes);
151+
SplunkRum splunkRum = new SplunkRum(openTelemetryRum, globalAttributes, null);
152152

153153
Attributes attributes = Attributes.of(stringKey("one"), "1", longKey("two"), 2L);
154154
splunkRum.addRumEvent("foo", attributes);
@@ -166,7 +166,7 @@ void addException() {
166166

167167
when(openTelemetryRum.getOpenTelemetry()).thenReturn(testSdk);
168168

169-
SplunkRum splunkRum = new SplunkRum(openTelemetryRum, globalAttributes);
169+
SplunkRum splunkRum = new SplunkRum(openTelemetryRum, globalAttributes, null);
170170

171171
NullPointerException exception = new NullPointerException("oopsie");
172172
Attributes attributes = Attributes.of(stringKey("one"), "1", longKey("two"), 2L);
@@ -197,7 +197,7 @@ private OpenTelemetrySdk buildTestSdk(InMemorySpanExporter testExporter) {
197197
void createAndEnd() {
198198
when(openTelemetryRum.getOpenTelemetry()).thenReturn(otelTesting.getOpenTelemetry());
199199

200-
SplunkRum splunkRum = new SplunkRum(openTelemetryRum, globalAttributes);
200+
SplunkRum splunkRum = new SplunkRum(openTelemetryRum, globalAttributes, null);
201201

202202
Span span = splunkRum.startWorkflow("workflow");
203203
Span inner = tracer.spanBuilder("foo").startSpan();
@@ -255,7 +255,7 @@ void updateLocation() {
255255
.when(globalAttributes)
256256
.update(isA(Consumer.class));
257257

258-
SplunkRum splunkRum = new SplunkRum(openTelemetryRum, globalAttributes);
258+
SplunkRum splunkRum = new SplunkRum(openTelemetryRum, globalAttributes, null);
259259

260260
Location location = mock(Location.class);
261261
when(location.getLatitude()).thenReturn(42d);

0 commit comments

Comments
 (0)