Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Mapbox welcomes participation and contributions from everyone.
#### Bug fixes and improvements
- Improved experience in tunnels and reduced the likelihood of losing road edge matching candidates. [#6510](https://github.com/mapbox/mapbox-navigation-android/pull/6510)
- Fixed an issue with `NavigationView` that caused road label position to not update in some cases. [#6508](https://github.com/mapbox/mapbox-navigation-android/pull/6508)
- Fixed an issue when the SDK was trying to send telemetry events when it's when telemetry is switched off globally. [#6512](https://github.com/mapbox/mapbox-navigation-android/pull/6512)

## Mapbox Navigation SDK 2.9.0-beta.3 - 21 October, 2022
### Changelog
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.mapbox.navigation.base.internal.metric

import com.mapbox.bindgen.Value

fun Value.extractEventsNames(): List<String>? = (this.contents as? List<Value>)
?.mapNotNull { (it.contents as? Map<String, Value>)?.get("event")?.contents as? String }
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@ import com.mapbox.common.EventsServiceObserver
import com.mapbox.common.TelemetryService
import com.mapbox.common.TurnstileEvent
import com.mapbox.navigation.base.internal.metric.MetricEventInternal
import com.mapbox.navigation.base.internal.metric.extractEventsNames
import com.mapbox.navigation.base.metrics.MetricEvent
import com.mapbox.navigation.base.metrics.MetricsObserver
import com.mapbox.navigation.base.metrics.MetricsReporter
import com.mapbox.navigation.metrics.internal.EventsServiceProvider
import com.mapbox.navigation.metrics.internal.TelemetryServiceProvider
import com.mapbox.navigation.metrics.internal.TelemetryUtilsDelegate
import com.mapbox.navigation.utils.internal.InternalJobControlFactory
import com.mapbox.navigation.utils.internal.logD
import com.mapbox.navigation.utils.internal.logE
Expand All @@ -35,7 +37,7 @@ object MapboxMetricsReporter : MetricsReporter {
private lateinit var telemetryService: TelemetryService

@Volatile
private var enableTelemetry = false
private var isTelemetryInitialized = false

@Volatile
private var metricsObserver: MetricsObserver? = null
Expand All @@ -44,11 +46,19 @@ object MapboxMetricsReporter : MetricsReporter {
private val eventsServiceObserver =
object : EventsServiceObserver {
override fun didEncounterError(error: EventsServiceError, events: Value) {
logE("EventsService failure: $error for event $events", LOG_CATEGORY)
ifTelemetryIsRunning {
logE(LOG_CATEGORY) {
"EventsService failure: $error for events ${events.extractEventsNames()}"
}
}
}

override fun didSendEvents(events: Value) {
logD("Event has been sent $events", LOG_CATEGORY)
ifTelemetryIsRunning {
logD(LOG_CATEGORY) {
"Events has been sent ${events.extractEventsNames()}"
}
}
}
}

Expand All @@ -66,7 +76,7 @@ object MapboxMetricsReporter : MetricsReporter {
accessToken: String,
userAgent: String
) {
enableTelemetry = true
isTelemetryInitialized = true
val eventsServerOptions = EventsServerOptions(accessToken, userAgent, null)
eventsService = EventsServiceProvider.provideEventsService(eventsServerOptions)
telemetryService = TelemetryServiceProvider.provideTelemetryService(eventsServerOptions)
Expand All @@ -90,7 +100,7 @@ object MapboxMetricsReporter : MetricsReporter {
*/
@JvmStatic
fun disable() {
enableTelemetry = false
isTelemetryInitialized = false
removeObserver()
eventsService.unregisterObserver(eventsServiceObserver)
ioJobController.job.cancelChildren()
Expand Down Expand Up @@ -150,10 +160,10 @@ object MapboxMetricsReporter : MetricsReporter {
}

private inline fun ifTelemetryIsRunning(func: () -> Unit) {
if (enableTelemetry) {
if (isTelemetryInitialized && TelemetryUtilsDelegate.getEventsCollectionState()) {
func.invoke()
} else {
logW(
logD(
"Navigation Telemetry is disabled",
LOG_CATEGORY
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import com.mapbox.navigation.testing.LoggingFrontendTestRule
import com.mapbox.navigation.testing.MainCoroutineRule
import com.mapbox.navigation.utils.internal.InternalJobControlFactory
import com.mapbox.navigation.utils.internal.LoggerFrontend
import com.mapbox.navigation.utils.internal.logW
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
Expand Down Expand Up @@ -53,7 +52,7 @@ class MapboxMetricsReporterTest {
mockkObject(TelemetryServiceProvider)

every { TelemetryUtilsDelegate.setEventsCollectionState(any()) } just runs
every { TelemetryUtilsDelegate.getEventsCollectionState() } returns false
every { TelemetryUtilsDelegate.getEventsCollectionState() } returns true
}

@After
Expand All @@ -76,7 +75,7 @@ class MapboxMetricsReporterTest {
MapboxMetricsReporter.addEvent(mockk())

verify(exactly = 2) {
logger.logW(
logger.logD(
"Navigation Telemetry is disabled",
"MapboxMetricsReporter"
)
Expand All @@ -96,6 +95,18 @@ class MapboxMetricsReporterTest {
verify(exactly = 0) { eventService.sendEvent(any(), any()) }
}

@Test
fun `events aren't sent if telemetry is disabled globally`() {
val eventService = initMetricsReporterWithTelemetry()

every { TelemetryUtilsDelegate.getEventsCollectionState() } returns false
MapboxMetricsReporter.sendTurnstileEvent(mockk())
MapboxMetricsReporter.addEvent(mockk())

verify(exactly = 0) { eventService.sendTurnstileEvent(any(), any()) }
verify(exactly = 0) { eventService.sendEvent(any(), any()) }
}

@Test
fun telemetryPushCalledWhenAddValidEvent() = coroutineRule.runBlockingTest {
mockkObject(InternalJobControlFactory) {
Expand Down