Skip to content

Commit 09b2390

Browse files
authored
fix: O11Y-725 - Bug fix to avoid creating multiple OpenTelemetryRum instances when secondaryMobileKeys are set (#281)
## Summary - This will probably be rewritten as part of [O11Y-726](https://launchdarkly.atlassian.net/browse/O11Y-726) [O11Y-726]: https://launchdarkly.atlassian.net/browse/O11Y-726?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Gate Observability initialization to the primary mobile key and update the app to pass it, avoiding multiple OTel instances with secondary keys. > > - **SDK Plugin (`Observability.kt`)**: > - Add `mobileKey` constructor parameter and use it to gate `register(...)` so the observability client/resources initialize only when `metadata.credential` matches the primary `mobileKey`. > - Initialization of `Resource` attributes and `ObservabilityClient` now occurs only under this condition. > - **E2E App (`BaseApplication.kt`)**: > - Update `Observability` instantiation to pass `mobileKey = LAUNCHDARKLY_MOBILE_KEY`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7974321. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
1 parent 7d76e6c commit 09b2390

File tree

2 files changed

+24
-19
lines changed
  • e2e/android/app/src/main/java/com/example/androidobservability
  • sdk/@launchdarkly/observability-android/lib/src/main/kotlin/com/launchdarkly/observability/plugin

2 files changed

+24
-19
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ open class BaseApplication : Application() {
4848
open fun realInit() {
4949
val observabilityPlugin = Observability(
5050
application = this@BaseApplication,
51+
mobileKey = LAUNCHDARKLY_MOBILE_KEY,
5152
options = testUrl?.let { pluginOptions.copy(backendUrl = it, otlpEndpoint = it) } ?: pluginOptions
5253
)
5354

sdk/@launchdarkly/observability-android/lib/src/main/kotlin/com/launchdarkly/observability/plugin/Observability.kt

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ import java.util.Collections
3232
* )
3333
* .build()
3434
* ```
35-
*
35+
*
3636
* Later after initialization you can use [LDObserve] to record observability data.
37-
*
37+
*
3838
* ```
3939
* LDObserve.recordMetric(metric)
4040
* LDObserve.recordLog(message, severity, attributes)
@@ -44,9 +44,11 @@ import java.util.Collections
4444
*
4545
* @param application The application instance.
4646
* @param options The options for the plugin.
47+
* @param mobileKey The primary mobile key used in LDConfig.
4748
*/
4849
class Observability(
4950
private val application: Application,
51+
private val mobileKey: String,
5052
private val options: Options = Options() // new instance has reasonable defaults
5153
) : Plugin() {
5254
private val logger: LDLogger
@@ -69,28 +71,30 @@ class Observability(
6971
override fun register(client: LDClient, metadata: EnvironmentMetadata?) {
7072
val sdkKey = metadata?.credential ?: ""
7173

72-
val resourceBuilder = Resource.getDefault().toBuilder()
73-
resourceBuilder.put("service.name", options.serviceName)
74-
resourceBuilder.put("service.version", options.serviceVersion)
75-
resourceBuilder.put("highlight.project_id", sdkKey)
76-
resourceBuilder.putAll(options.resourceAttributes)
74+
if (mobileKey == sdkKey) {
75+
val resourceBuilder = Resource.getDefault().toBuilder()
76+
resourceBuilder.put("service.name", options.serviceName)
77+
resourceBuilder.put("service.version", options.serviceVersion)
78+
resourceBuilder.put("highlight.project_id", sdkKey)
79+
resourceBuilder.putAll(options.resourceAttributes)
7780

78-
metadata?.applicationInfo?.applicationId?.let {
79-
resourceBuilder.put("launchdarkly.application.id", it)
80-
}
81+
metadata?.applicationInfo?.applicationId?.let {
82+
resourceBuilder.put("launchdarkly.application.id", it)
83+
}
8184

82-
metadata?.applicationInfo?.applicationVersion?.let {
83-
resourceBuilder.put("launchdarkly.application.version", it)
84-
}
85+
metadata?.applicationInfo?.applicationVersion?.let {
86+
resourceBuilder.put("launchdarkly.application.version", it)
87+
}
8588

86-
metadata?.sdkMetadata?.name?.let { sdkName ->
87-
metadata.sdkMetadata?.version?.let { sdkVersion ->
88-
resourceBuilder.put("launchdarkly.sdk.version", "$sdkName/$sdkVersion")
89+
metadata?.sdkMetadata?.name?.let { sdkName ->
90+
metadata.sdkMetadata?.version?.let { sdkVersion ->
91+
resourceBuilder.put("launchdarkly.sdk.version", "$sdkName/$sdkVersion")
92+
}
8993
}
90-
}
9194

92-
observabilityClient = ObservabilityClient(application, sdkKey, resourceBuilder.build(), logger, options)
93-
observabilityClient?.let { LDObserve.init(it) }
95+
observabilityClient = ObservabilityClient(application, sdkKey, resourceBuilder.build(), logger, options)
96+
observabilityClient?.let { LDObserve.init(it) }
97+
}
9498
}
9599

96100
override fun getHooks(metadata: EnvironmentMetadata?): MutableList<Hook> {

0 commit comments

Comments
 (0)