@barrysolomon/mobile-react-native 0.4.1-alpha → 0.5.2-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,7 +5,7 @@ existing native Android (`otel-android-mobile`) and iOS (`otel-ios-mobile`)
5
5
  SDKs — native owns buffering, policy evaluation, OTLP export, and crash
6
6
  recovery. JS stays thin.
7
7
 
8
- **Version:** `0.4.1-alpha`, published under the `alpha` dist-tag.
8
+ **Version:** `0.5.2-alpha`, published under the `alpha` dist-tag.
9
9
 
10
10
  **Status:** Validated end-to-end in Dash0. All 4 platforms (Android native,
11
11
  iOS native, RN Android, RN iOS) have a UAT matrix of 12/12 cells green.
@@ -17,7 +17,7 @@ iOS native, RN Android, RN iOS) have a UAT matrix of 12/12 cells green.
17
17
  # resolves the OLD 0.1.0-alpha — always pin the dist-tag or version):
18
18
  npm install @barrysolomon/mobile-react-native@alpha
19
19
  # or pin the exact version:
20
- # npm install @barrysolomon/mobile-react-native@0.4.1-alpha
20
+ # npm install @barrysolomon/mobile-react-native@0.5.2-alpha
21
21
 
22
22
  cd ios && pod install
23
23
  ```
@@ -25,17 +25,21 @@ cd ios && pod install
25
25
  This JS package wraps the native SDKs; install those too:
26
26
 
27
27
  - **iOS** — add the Swift Package `https://github.com/barrysolomon/mobile-otel`
28
- at tag `v0.4.1-alpha` to your app target, then copy
28
+ at tag `v0.5.2-alpha` to your app target, then copy
29
29
  `OTelMobileCallSink.swift` (+ `BoundedLiveSpanStore.swift`) from this package
30
30
  into your app target and call
31
31
  `Dash0MobileModule.installSink { OTelMobileCallSink() }`. The pod intentionally
32
32
  excludes the sink because it depends on the SwiftPM SDK delivered on the app
33
33
  side.
34
- - **Android** — `io.opentelemetry.android:mobile:0.4.1-alpha` from GitHub
35
- Packages (`https://maven.pkg.github.com/barrysolomon/mobile-otel`). As of
36
- 0.2.0-alpha the full module set (`mobile-core` + all
37
- `mobile-instrumentation-*` modules) publishes there, so the dependency tree
38
- resolves.
34
+ - **Android** — `io.github.barrysolomon:mobile:0.5.2-alpha` from the public
35
+ Maven repo on GitHub Pages
36
+ (`https://barrysolomon.github.io/mobile-otel/maven`) no PAT / no
37
+ authentication required. As of 0.2.0-alpha the full module set
38
+ (`mobile-core` + all `mobile-instrumentation-*` modules) publishes there, so
39
+ the dependency tree resolves. (Legacy / transition: the artifact is also
40
+ still available from GitHub Packages at
41
+ `https://maven.pkg.github.com/barrysolomon/mobile-otel`, which requires a
42
+ `read:packages` PAT — prefer the public repo above.)
39
43
 
40
44
  ## Quickstart
41
45
 
@@ -76,11 +76,15 @@ android {
76
76
  repositories {
77
77
  google()
78
78
  mavenCentral()
79
- // The native Android SDK (io.opentelemetry.android:mobile) is this repo's
80
- // own artifact, published to the local Maven cache by the demo-app build
81
- // (examples/demo-app publishes :otel-android-mobile* to mavenLocal). It is
82
- // not on a public repo, so resolve it from mavenLocal for the standalone
83
- // test build. Listed last so public deps still come from google()/central.
79
+ // The native Android SDK (io.github.barrysolomon:mobile) is this repo's own
80
+ // artifact. It is published to a PUBLIC, no-auth Maven repo on GitHub Pages
81
+ // this is what a clean-room consumer resolves it from (see the README RN
82
+ // section). Host-autolinked builds resolve via the CONSUMER's settings.gradle
83
+ // repositories (RepositoriesMode.PREFER_SETTINGS ignores this module block),
84
+ // so the README instructs the consumer to add this same URL there.
85
+ maven { url "https://barrysolomon.github.io/mobile-otel/maven" }
86
+ // mavenLocal last: lets a dev who ran `examples/demo-app` publishReleaseToMavenLocal
87
+ // consume an unreleased build without hitting the network.
84
88
  mavenLocal()
85
89
  }
86
90
 
@@ -90,14 +94,45 @@ repositories {
90
94
  // build against the version this package's package.json devDepends on.
91
95
  ext.reactAndroidVersion = project.findProperty('Dash0Mobile_reactAndroidVersion') ?: '+'
92
96
 
93
- // Version of the native Android SDK (io.opentelemetry.android:mobile) this RN
94
- // module depends on. Single source of truth MUST track the published SDK
95
- // version (see the publishing convention in examples/demo-app/build.gradle.kts).
96
- // Kept as a property so a version bump updates one place, not N hardcoded
97
- // dependency strings (which silently drifted to 0.1.0-alpha vs the published
98
- // 0.2.0-alpha and broke clean-.m2 CI while passing on caches that still had the
99
- // old artifact).
100
- ext.dash0SdkVersion = project.findProperty('Dash0Mobile_sdkVersion') ?: '0.4.1-alpha'
97
+ // Version of the native Android SDK (io.github.barrysolomon:mobile) this RN
98
+ // module depends on. DERIVED from this package's own package.json `version`,
99
+ // which carries the lockstep release version shared by all three artifacts
100
+ // (npm + Android Maven + iOS SwiftPM see docs/VERSIONING.md). Deriving it
101
+ // means the consumer can never drift from the published SDK: a release bump
102
+ // touches package.json (release-checklist item #1) and this tracks it
103
+ // automatically, instead of being a 4th place a human must remember to edit.
104
+ // A consumer can still pin an explicit SDK build via -PDash0Mobile_sdkVersion.
105
+ //
106
+ // History: a HARDCODED pin here silently drifted from the published version
107
+ // TWICE — 0.1.0 vs 0.2.0, then 0.4.1 vs 0.4.2 — each time breaking clean-.m2
108
+ // CI (the RN-android job) while passing on caches that still held the old
109
+ // artifact. Deriving from package.json removes that failure mode at the root.
110
+ ext.dash0SdkVersion = project.findProperty('Dash0Mobile_sdkVersion')
111
+ ?: new groovy.json.JsonSlurper().parse(file('../package.json')).version
112
+
113
+ // Maven groupId of the native Android SDK. Migrated from io.opentelemetry.android
114
+ // (that namespace belongs to the OpenTelemetry project and cannot ship to Maven
115
+ // Central) to io.github.barrysolomon (Central Portal auto-verifies io.github.<user>
116
+ // against GitHub ownership). Consumers can override via -PDash0Mobile_sdkGroupId.
117
+ ext.dash0SdkGroupId = project.findProperty('Dash0Mobile_sdkGroupId') ?: 'io.github.barrysolomon'
118
+
119
+ // Pin the transitive kotlin-stdlib down to a version our Kotlin compiler can
120
+ // read. io.github.barrysolomon:mobile (>= 0.5.0-alpha) depends on
121
+ // opentelemetry-android 1.5.0, which transitively declares kotlin-stdlib 2.4.0.
122
+ // This module compiles with Kotlin 2.1.20 (matching RN 0.85's bundled Kotlin —
123
+ // see settings.gradle), and a 2.1.x compiler cannot parse 2.4.0 stdlib metadata:
124
+ // FirIncompatibleClassExpressionChecker throws "source must not be null" and the
125
+ // build dies with an internal compiler error. The SDK's own 2.2.10 classes are
126
+ // fine for 2.1.20; only the stdlib jump is fatal.
127
+ //
128
+ // Mirrors the demo-app's subprojects force. This also protects real RN hosts:
129
+ // any consumer on Kotlin 2.1.x autolinking this module would otherwise hit the
130
+ // same ICE. stdlib is backward-compatible, so pinning to 2.2.10 is safe.
131
+ configurations.all {
132
+ resolutionStrategy {
133
+ force "org.jetbrains.kotlin:kotlin-stdlib:2.2.10"
134
+ }
135
+ }
101
136
 
102
137
  dependencies {
103
138
  implementation "com.facebook.react:react-android:$reactAndroidVersion"
@@ -114,7 +149,7 @@ dependencies {
114
149
  // (not `compileOnly`) so Kotlin can resolve transitive config classes
115
150
  // (TextInputConfig, BreadcrumbConfig, VitalsConfig, etc.) referenced
116
151
  // through MobileConfig's constructor signature.
117
- implementation "io.opentelemetry.android:mobile:${dash0SdkVersion}"
152
+ implementation "${dash0SdkGroupId}:mobile:${dash0SdkVersion}"
118
153
  implementation 'io.opentelemetry:opentelemetry-api:1.58.0'
119
154
 
120
155
  testImplementation 'junit:junit:4.13.2'
@@ -123,7 +158,7 @@ dependencies {
123
158
  // on Java 25 ("Could not modify all classes ... ReactApplicationContext").
124
159
  testImplementation 'org.mockito:mockito-core:5.18.0'
125
160
  testImplementation 'org.mockito.kotlin:mockito-kotlin:5.4.0'
126
- testImplementation "io.opentelemetry.android:mobile:${dash0SdkVersion}"
161
+ testImplementation "${dash0SdkGroupId}:mobile:${dash0SdkVersion}"
127
162
  testImplementation 'io.opentelemetry:opentelemetry-api:1.58.0'
128
163
 
129
164
  // Network-interceptor unit tests: real OkHttp + the OTel SDK in-memory
@@ -10,10 +10,10 @@ org.gradle.jvmargs=-Xmx2g -Dfile.encoding=UTF-8
10
10
  # 0.76-stable OkHttpClientProvider APIs and compiles here.)
11
11
  Dash0Mobile_standaloneTestBuild=true
12
12
 
13
- # Version of the native Android SDK (io.opentelemetry.android:mobile) this module
14
- # depends on. MUST match the version the repo publishes (currently 0.4.1-alpha).
15
- # Single source of truth, read by build.gradle's dash0SdkVersion.
16
- Dash0Mobile_sdkVersion=0.4.1-alpha
13
+ # NOTE: the native Android SDK version (io.opentelemetry.android:mobile) is NOT
14
+ # pinned here anymore build.gradle derives it from this package's package.json
15
+ # `version` (the lockstep release version), so the consumer can't drift from the
16
+ # published SDK. Set -PDash0Mobile_sdkVersion only to pin an explicit override.
17
17
 
18
18
  # Pin the Kotlin version the module's build.gradle reads (it defaults to
19
19
  # 2.1.20 and honors this property) so stdlib matches the compiler the
@@ -369,11 +369,14 @@ private class InvalidContextSpanBuilder : io.opentelemetry.api.trace.SpanBuilder
369
369
  override fun setNoParent() = this
370
370
  override fun addLink(spanContext: io.opentelemetry.api.trace.SpanContext) = this
371
371
  override fun addLink(spanContext: io.opentelemetry.api.trace.SpanContext, attributes: io.opentelemetry.api.common.Attributes) = this
372
- override fun setAttribute(key: String, value: String) = this
372
+ // OTel API 1.63.0 added nullness annotations to SpanBuilder: the object-typed
373
+ // setAttribute value params are now @Nullable (String? / T?). The primitive
374
+ // overloads are unannotated (a primitive can't be null), so they stay non-null.
375
+ override fun setAttribute(key: String, value: String?) = this
373
376
  override fun setAttribute(key: String, value: Long) = this
374
377
  override fun setAttribute(key: String, value: Double) = this
375
378
  override fun setAttribute(key: String, value: Boolean) = this
376
- override fun <T : Any?> setAttribute(key: io.opentelemetry.api.common.AttributeKey<T>, value: T) = this
379
+ override fun <T : Any> setAttribute(key: io.opentelemetry.api.common.AttributeKey<T>, value: T?) = this
377
380
  override fun setSpanKind(spanKind: io.opentelemetry.api.trace.SpanKind) = this
378
381
  override fun setStartTimestamp(startTimestamp: Long, unit: java.util.concurrent.TimeUnit) = this
379
382
  // Span.getInvalid() carries an invalid SpanContext and is a no-op.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EACV,UAAU,EAEV,uBAAuB,EAEvB,cAAc,EACd,QAAQ,EAER,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,qCAAqC,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAClE,SAAS,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1D,GAAG,IAAI,IAAI,CAAC;CACb;AA8ED,wBAAgB,gCAAgC,IAAI,IAAI,CAGvD;AAyCD,eAAO,MAAM,WAAW;kBACF,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;cAoFrC,MAAM,eAAc,UAAU,aAAiB,cAAc,GAAO,IAAI;oBAwBlE,MAAM,eAAc,UAAU,aAAiB,QAAQ,GAAgB,UAAU;SAsDtF,CAAC,QACJ,MAAM,MACR,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,eAC7B,UAAU,GACtB,OAAO,CAAC,CAAC,CAAC;uBAeL,MAAM,SACL,MAAM,mBACG,SAAS,GAAG,WAAW,GAAG,OAAO,eACrC,UAAU,GACrB,IAAI;yBAYoB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjD,4FAA4F;uBACnE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOxD,4FAA4F;0BAChE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlD,4FAA4F;gCAC3D,MAAM,GAAc,OAAO,CAAC,IAAI,CAAC;IAOlE,4FAA4F;+BAC5D,MAAM,GAAc,OAAO,CAAC,IAAI,CAAC;gBAO/C,OAAO,CAAC,IAAI,CAAC;CAgBhC,CAAC;AA6EF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,GAAG,IAAI,CAElF;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EACV,UAAU,EAEV,uBAAuB,EAEvB,cAAc,EACd,QAAQ,EAER,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,qCAAqC,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAClE,SAAS,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1D,GAAG,IAAI,IAAI,CAAC;CACb;AA8ED,wBAAgB,gCAAgC,IAAI,IAAI,CAGvD;AA4CD,eAAO,MAAM,WAAW;kBACF,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;cAoFrC,MAAM,eAAc,UAAU,aAAiB,cAAc,GAAO,IAAI;oBAwBlE,MAAM,eAAc,UAAU,aAAiB,QAAQ,GAAgB,UAAU;SAsDtF,CAAC,QACJ,MAAM,MACR,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,eAC7B,UAAU,GACtB,OAAO,CAAC,CAAC,CAAC;uBAeL,MAAM,SACL,MAAM,mBACG,SAAS,GAAG,WAAW,GAAG,OAAO,eACrC,UAAU,GACrB,IAAI;yBAYoB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjD,4FAA4F;uBACnE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOxD,4FAA4F;0BAChE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlD,4FAA4F;gCAC3D,MAAM,GAAc,OAAO,CAAC,IAAI,CAAC;IAOlE,4FAA4F;+BAC5D,MAAM,GAAc,OAAO,CAAC,IAAI,CAAC;gBAO/C,OAAO,CAAC,IAAI,CAAC;CAgBhC,CAAC;AA6EF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,GAAG,IAAI,CAElF;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC"}
package/lib/index.js CHANGED
@@ -105,7 +105,10 @@ function resolveNative() {
105
105
  // callers and correlate issues to a specific bridge release. Keep this in
106
106
  // sync with package.json on each release.
107
107
  const DISTRO_NAME = 'dash0-react-native';
108
- const DISTRO_VERSION = '0.4.1-alpha';
108
+ // Keep in lockstep with package.json `version`. The publish CI job asserts this
109
+ // equals the npm version + git tag + native gradle version
110
+ // (scripts/ci/check-version-parity.sh), so a drift here fails the release.
111
+ const DISTRO_VERSION = '0.5.2-alpha';
109
112
  function resolveReactNativeVersion() {
110
113
  try {
111
114
  // eslint-disable-next-line @typescript-eslint/no-var-requires
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/instrumentation/navigation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,UAAU,UAAU;IAClB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5D,eAAe,IAAI;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACjD;AAED,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,GACpC,MAAM,IAAI,CA8DZ"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/instrumentation/navigation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,UAAU,UAAU;IAClB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5D,eAAe,IAAI;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACjD;AAED,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,GACpC,MAAM,IAAI,CAuEZ"}
@@ -28,7 +28,12 @@ export function installReactNavigationInstrumentation(navRef) {
28
28
  return;
29
29
  endCurrentSpan();
30
30
  currentName = route.name;
31
- Dash0Mobile.log('ui.screen_view', { 'screen.name': route.name }, 9);
31
+ // Semconv screen-name convergence (docs/SEMCONV_AUDIT.md): upstream
32
+ // opentelemetry-android renamed `screen.name` -> `app.screen.name` in 1.5.0.
33
+ // RN has a single screen-name emit site (unlike native's ~20), so we emit
34
+ // the new key directly here alongside the legacy `screen.name` alias rather
35
+ // than relying on a native choke-point mirror. The legacy alias drops at 1.0.
36
+ Dash0Mobile.log('ui.screen_view', { 'screen.name': route.name, 'app.screen.name': route.name }, 9);
32
37
  currentSpan = Dash0Mobile.startSpan(`page.${route.name}`);
33
38
  };
34
39
  const unsub = navRef.addListener('state', onState);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@barrysolomon/mobile-react-native",
3
- "version": "0.4.1-alpha",
4
- "description": "Dash0 Mobile Observability SDK for React Native (JS/TS bridge). For native iOS use the Swift Package at https://github.com/barrysolomon/mobile-otel. For native Android use io.opentelemetry.android:mobile on GitHub Packages.",
3
+ "version": "0.5.2-alpha",
4
+ "description": "Dash0 Mobile Observability SDK for React Native (JS/TS bridge) — OpenTelemetry auto-instrumentation for React Native apps: network/fetch spans, JS errors, crash recovery, offline buffering, native Android + iOS SDKs. For native iOS use the Swift Package at https://github.com/barrysolomon/mobile-otel. For native Android use io.github.barrysolomon:mobile from the public Maven repo (https://barrysolomon.github.io/mobile-otel/maven).",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -34,10 +34,20 @@
34
34
  "keywords": [
35
35
  "react-native",
36
36
  "opentelemetry",
37
+ "otel",
37
38
  "observability",
38
39
  "dash0",
39
40
  "mobile",
40
- "rum"
41
+ "rum",
42
+ "telemetry",
43
+ "tracing",
44
+ "monitoring",
45
+ "instrumentation",
46
+ "apm",
47
+ "crash-reporting",
48
+ "expo",
49
+ "android",
50
+ "ios"
41
51
  ],
42
52
  "repository": "https://github.com/barrysolomon/mobile-otel",
43
53
  "license": "Apache-2.0",
package/src/index.ts CHANGED
@@ -142,7 +142,10 @@ function resolveNative(): NativeDash0MobileModule | null {
142
142
  // callers and correlate issues to a specific bridge release. Keep this in
143
143
  // sync with package.json on each release.
144
144
  const DISTRO_NAME = 'dash0-react-native';
145
- const DISTRO_VERSION = '0.4.1-alpha';
145
+ // Keep in lockstep with package.json `version`. The publish CI job asserts this
146
+ // equals the npm version + git tag + native gradle version
147
+ // (scripts/ci/check-version-parity.sh), so a drift here fails the release.
148
+ const DISTRO_VERSION = '0.5.2-alpha';
146
149
 
147
150
  function resolveReactNativeVersion(): string | undefined {
148
151
  try {
@@ -40,7 +40,16 @@ export function installReactNavigationInstrumentation(
40
40
  endCurrentSpan();
41
41
 
42
42
  currentName = route.name;
43
- Dash0Mobile.log('ui.screen_view', { 'screen.name': route.name }, 9);
43
+ // Semconv screen-name convergence (docs/SEMCONV_AUDIT.md): upstream
44
+ // opentelemetry-android renamed `screen.name` -> `app.screen.name` in 1.5.0.
45
+ // RN has a single screen-name emit site (unlike native's ~20), so we emit
46
+ // the new key directly here alongside the legacy `screen.name` alias rather
47
+ // than relying on a native choke-point mirror. The legacy alias drops at 1.0.
48
+ Dash0Mobile.log(
49
+ 'ui.screen_view',
50
+ { 'screen.name': route.name, 'app.screen.name': route.name },
51
+ 9,
52
+ );
44
53
  currentSpan = Dash0Mobile.startSpan(`page.${route.name}`);
45
54
  };
46
55