Skip to content

Commit 210ab48

Browse files
committed
Merge branch 'main' into agrognetti/O11Y-418
2 parents abed3f0 + 906aca2 commit 210ab48

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+2906
-113
lines changed

.release-please-manifest.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
22
"go": "0.4.0",
3-
"sdk/@launchdarkly/observability": "0.4.5",
4-
"sdk/@launchdarkly/observability-android": "0.11.0",
3+
"sdk/@launchdarkly/observability": "0.4.6",
4+
"sdk/@launchdarkly/observability-android": "0.12.0",
55
"sdk/@launchdarkly/observability-dotnet": "0.3.0",
66
"sdk/@launchdarkly/observability-node": "0.3.1",
77
"sdk/@launchdarkly/observability-python": "0.1.1",
88
"sdk/@launchdarkly/observability-react-native": "0.7.0",
9-
"sdk/@launchdarkly/session-replay": "0.4.5",
10-
"sdk/highlight-run": "9.22.2"
9+
"sdk/@launchdarkly/session-replay": "0.4.6",
10+
"sdk/highlight-run": "9.22.3"
1111
}

e2e/android/app/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ plugins {
77

88
android {
99
namespace = "com.example.androidobservability"
10-
compileSdk = 35
10+
compileSdk = 36
1111

1212
defaultConfig {
1313
applicationId = "com.example.androidobservability"

e2e/android/app/src/main/java/com/example/androidobservability/BaseApplication.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.launchdarkly.sdk.android.Components
99
import com.launchdarkly.sdk.android.LDClient
1010
import com.launchdarkly.sdk.android.LDConfig
1111
import com.launchdarkly.observability.plugin.Observability
12+
import com.launchdarkly.observability.replay.ReplayInstrumentation
1213
import com.launchdarkly.sdk.android.LDAndroidLogging
1314
import com.launchdarkly.sdk.android.integrations.Plugin
1415
import io.opentelemetry.api.common.AttributeKey
@@ -29,6 +30,10 @@ open class BaseApplication : Application() {
2930
),
3031
debug = true,
3132
logAdapter = LDAndroidLogging.adapter(),
33+
// TODO: consider these being factories so that the obs plugin can pass instantiation data, log adapter
34+
instrumentations = listOf(
35+
ReplayInstrumentation()
36+
),
3237
)
3338

3439
var telemetryInspector: TelemetryInspector? = null

e2e/android/app/src/main/java/com/example/androidobservability/MainActivity.kt

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.Column
1010
import androidx.compose.foundation.layout.Spacer
1111
import androidx.compose.foundation.layout.fillMaxSize
1212
import androidx.compose.foundation.layout.height
13+
import androidx.compose.foundation.layout.imePadding
1314
import androidx.compose.foundation.layout.padding
1415
import androidx.compose.foundation.rememberScrollState
1516
import androidx.compose.foundation.verticalScroll
@@ -35,16 +36,21 @@ class MainActivity : ComponentActivity() {
3536
enableEdgeToEdge()
3637
setContent {
3738
AndroidObservabilityTheme {
38-
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
39+
Scaffold(
40+
modifier = Modifier
41+
.fillMaxSize()
42+
.imePadding()
43+
) { innerPadding ->
3944
var customLogText by remember { mutableStateOf("") }
4045
var customSpanText by remember { mutableStateOf("") }
4146
var customContextKey by remember { mutableStateOf("") }
4247

4348
Column(
4449
modifier = Modifier
50+
.fillMaxSize()
4551
.padding(innerPadding)
46-
.padding(16.dp)
4752
.verticalScroll(rememberScrollState())
53+
.padding(16.dp)
4854
) {
4955
Text(
5056
text = "Hello Telemetry",
@@ -77,6 +83,34 @@ class MainActivity : ComponentActivity() {
7783
) {
7884
Text("Trigger Metric")
7985
}
86+
Button(
87+
onClick = {
88+
viewModel.triggerHistogramMetric()
89+
}
90+
) {
91+
Text("Trigger Histogram Metric")
92+
}
93+
Button(
94+
onClick = {
95+
viewModel.triggerCountMetric()
96+
}
97+
) {
98+
Text("Trigger Count Metric")
99+
}
100+
Button(
101+
onClick = {
102+
viewModel.triggerIncrementalMetric()
103+
}
104+
) {
105+
Text("Trigger Incremental Metric")
106+
}
107+
Button(
108+
onClick = {
109+
viewModel.triggerUpDownCounterMetric()
110+
}
111+
) {
112+
Text("Trigger UpDownCounter Metric")
113+
}
80114
Button(
81115
onClick = {
82116
viewModel.triggerError()

e2e/android/app/src/main/java/com/example/androidobservability/ViewModel.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,23 @@ import java.net.URL
2424
class ViewModel(application: Application) : AndroidViewModel(application) {
2525

2626
fun triggerMetric() {
27-
LDObserve.recordMetric(Metric("test", 50.0))
27+
LDObserve.recordMetric(Metric("test-gauge", 50.0))
28+
}
29+
30+
fun triggerHistogramMetric() {
31+
LDObserve.recordHistogram(Metric("test-histogram", 15.0))
32+
}
33+
34+
fun triggerCountMetric() {
35+
LDObserve.recordCount(Metric("test-counter", 10.0))
36+
}
37+
38+
fun triggerIncrementalMetric() {
39+
LDObserve.recordIncr(Metric("test-incremental-counter", 12.0))
40+
}
41+
42+
fun triggerUpDownCounterMetric() {
43+
LDObserve.recordUpDownCounter(Metric("test-up-down-counter", 25.0))
2844
}
2945

3046
fun triggerError() {

e2e/android/app/src/test/java/com/example/androidobservability/DisablingConfigOptionsE2ETest.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@ package com.example.androidobservability
22

33
import android.app.Application
44
import androidx.test.core.app.ApplicationProvider
5+
import com.example.androidobservability.TestUtils.TelemetryType
56
import com.example.androidobservability.TestUtils.waitForTelemetryData
7+
import com.launchdarkly.observability.api.Options
68
import com.launchdarkly.observability.interfaces.Metric
79
import com.launchdarkly.observability.sdk.LDObserve
810
import io.opentelemetry.api.common.AttributeKey
911
import io.opentelemetry.api.common.Attributes
1012
import io.opentelemetry.api.logs.Severity
11-
import com.example.androidobservability.TestUtils.TelemetryType
12-
import com.launchdarkly.observability.api.Options
1313
import junit.framework.TestCase.assertEquals
1414
import junit.framework.TestCase.assertFalse
1515
import junit.framework.TestCase.assertNotNull
16-
import junit.framework.TestCase.assertNull
1716
import junit.framework.TestCase.assertTrue
1817
import org.junit.Test
1918
import org.junit.runner.RunWith
@@ -96,7 +95,6 @@ class DisablingConfigOptionsE2ETest {
9695
LDObserve.flush()
9796
waitForTelemetryData(telemetryInspector = application.telemetryInspector, telemetryType = TelemetryType.METRICS)
9897

99-
assertNull(application.telemetryInspector?.metricExporter)
10098
assertFalse(requestsContainsUrl(metricsUrl))
10199
}
102100

@@ -110,7 +108,6 @@ class DisablingConfigOptionsE2ETest {
110108
LDObserve.flush()
111109
waitForTelemetryData(telemetryInspector = application.telemetryInspector, telemetryType = TelemetryType.METRICS)
112110

113-
assertNotNull(application.telemetryInspector?.metricExporter)
114111
assertTrue(requestsContainsUrl(metricsUrl))
115112
}
116113

sdk/@launchdarkly/observability-android/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## [0.12.0](https://github.com/launchdarkly/observability-sdk/compare/launchdarkly-observability-android-0.11.0...launchdarkly-observability-android-0.12.0) (2025-10-24)
4+
5+
6+
### Features
7+
8+
* Android observability plugin session replay support ([#268](https://github.com/launchdarkly/observability-sdk/issues/268)) ([4ba5124](https://github.com/launchdarkly/observability-sdk/commit/4ba5124e59ebd5b46a55b124a749eeec715cff55))
9+
* O11Y-601 - Add Android launch time instrumentation ([#274](https://github.com/launchdarkly/observability-sdk/issues/274)) ([38b4a84](https://github.com/launchdarkly/observability-sdk/commit/38b4a8475b51bd8686f5e1cc0e6c3d47e3ebc2e2))
10+
311
## [0.11.0](https://github.com/launchdarkly/observability-sdk/compare/launchdarkly-observability-android-0.10.0...launchdarkly-observability-android-0.11.0) (2025-10-10)
412

513

sdk/@launchdarkly/observability-android/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
android.useAndroidX=true
55

66
#x-release-please-start-version
7-
version=0.11.0
7+
version=0.12.0
88
#x-release-please-end

sdk/@launchdarkly/observability-android/lib/build.gradle.kts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ dependencies {
2323
implementation("com.launchdarkly:launchdarkly-android-client-sdk:5.9.0")
2424
implementation("com.jakewharton.timber:timber:5.0.1")
2525

26+
// Android
27+
implementation("androidx.activity:activity:1.11.0")
28+
2629
// Coroutines
2730
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2")
2831
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2")
@@ -52,6 +55,11 @@ dependencies {
5255
// Android crash instrumentation
5356
implementation("io.opentelemetry.android.instrumentation:crash:0.11.0-alpha")
5457

58+
// TODO: O11Y-626 - move replay instrumentation and associated compose dependencies into dedicated package
59+
// Compose dependencies for capture functionality
60+
implementation("androidx.compose.ui:ui:1.7.5")
61+
implementation("androidx.compose.ui:ui-tooling:1.7.5")
62+
5563
// Use JUnit Jupiter for testing.
5664
testImplementation(platform("org.junit:junit-bom:5.13.4"))
5765
testImplementation("org.junit.jupiter:junit-jupiter")
@@ -69,7 +77,7 @@ tasks.withType<Test> {
6977

7078
android {
7179
namespace = "com.launchdarkly.observability"
72-
compileSdk = 35
80+
compileSdk = 36
7381

7482
buildFeatures {
7583
buildConfig = true

sdk/@launchdarkly/observability-android/lib/src/main/kotlin/com/launchdarkly/observability/api/Options.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ package com.launchdarkly.observability.api
22

33
import com.launchdarkly.logging.LDLogAdapter
44
import com.launchdarkly.observability.BuildConfig
5+
import com.launchdarkly.observability.interfaces.LDExtendedInstrumentation
56
import com.launchdarkly.sdk.android.LDTimberLogging
67
import io.opentelemetry.api.common.Attributes
78
import kotlin.time.Duration
89
import kotlin.time.Duration.Companion.minutes
910

10-
private const val DEFAULT_OTLP_ENDPOINT = "https://otel.observability.app.launchdarkly.com:4318"
11-
private const val DEFAULT_BACKEND_URL = "https://pub.observability.app.launchdarkly.com"
11+
const val DEFAULT_SERVICE_NAME = "observability-android"
12+
const val DEFAULT_OTLP_ENDPOINT = "https://otel.observability.app.launchdarkly.com:4318"
13+
const val DEFAULT_BACKEND_URL = "https://pub.observability.app.launchdarkly.com"
1214

1315
/**
1416
* Configuration options for the Observability plugin.
@@ -27,21 +29,23 @@ private const val DEFAULT_BACKEND_URL = "https://pub.observability.app.launchdar
2729
* @property disableMetrics Disables metrics if true. Defaults to false.
2830
* @property logAdapter The log adapter to use. Defaults to using the LaunchDarkly SDK's LDTimberLogging.adapter(). Use LDAndroidLogging.adapter() to use the Android logging adapter.
2931
* @property loggerName The name of the logger to use. Defaults to "LaunchDarklyObservabilityPlugin".
32+
* @property instrumentations List of additional instrumentations to use
3033
*/
3134
data class Options(
32-
val serviceName: String = "observability-android",
35+
val serviceName: String = DEFAULT_SERVICE_NAME,
3336
val serviceVersion: String = BuildConfig.OBSERVABILITY_SDK_VERSION,
3437
val otlpEndpoint: String = DEFAULT_OTLP_ENDPOINT,
3538
val backendUrl: String = DEFAULT_BACKEND_URL,
3639
val resourceAttributes: Attributes = Attributes.empty(),
3740
val customHeaders: Map<String, String> = emptyMap(),
3841
val sessionBackgroundTimeout: Duration = 15.minutes,
3942
val debug: Boolean = false,
40-
// TODO O11Y-398: implement disable config options after all other instrumentations are implemented
4143
val disableErrorTracking: Boolean = false,
4244
val disableLogs: Boolean = false,
4345
val disableTraces: Boolean = false,
4446
val disableMetrics: Boolean = false,
4547
val logAdapter: LDLogAdapter = LDTimberLogging.adapter(), // this follows the LaunchDarkly SDK's default log adapter
46-
val loggerName: String = "LaunchDarklyObservabilityPlugin"
48+
val loggerName: String = "LaunchDarklyObservabilityPlugin",
49+
// TODO: update this to provide a list of factories instead of instances
50+
val instrumentations: List<LDExtendedInstrumentation> = emptyList()
4751
)

0 commit comments

Comments
 (0)