From 274b969619eaf19e14f89d6263066155535f7c99 Mon Sep 17 00:00:00 2001 From: shankar yadav Date: Thu, 15 May 2025 14:09:20 +0530 Subject: [PATCH] NTP-64514 | Trim ANR and Crash StackTrace (#16174) --- .../naviapp/analytics/utils/NaviAnalytics.kt | 5 ++- .../AnrErrorHandlerInitializer.kt | 32 +++++++------------ .../initializers/CrashHandlerInitializer.kt | 20 ++++++------ .../common/checkmate/core/CheckMateManager.kt | 18 +++-------- .../FirebaseRemoteConfigHelper.kt | 1 + 5 files changed, 29 insertions(+), 47 deletions(-) diff --git a/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt b/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt index 02f59c6a87..c5f9f40d93 100644 --- a/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt +++ b/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt @@ -1320,9 +1320,6 @@ class NaviAnalytics private constructor() { const val HL_PPP_BACK_BTN_CLICK = "HL_ppp_FAQ_back_click" const val PL_PPP_BACK_BTN_CLICK = "PL_ppp_FAQ_back_click" const val PL_GLOBAL_THIRD_PARTY_INIT = "pl_global_3rd_party_init" - const val GLOBAL_APP_CRASH = "global_app_crash" - const val GLOBAL_ANR = "global_screen_freeze" - const val GLOBAL_ANR_THIRD_PARTY = "global_screen_freeze_3rd_party" const val NAVIAPP_BACKGROUND_PUSH = "NaviApp_background_push" const val SCREEN_NAME = "screen_name" const val METHOD_NAME = "method_name" @@ -1338,6 +1335,8 @@ class NaviAnalytics private constructor() { const val EXTERNAL = "EXTERNAL" const val TRACE_SIZE = "trace_size" const val APP_IN_FOREGROUND = "app_in_foreground" + const val IS_APP_CRASH = "isAppCrash" + const val IS_APP_ANR = "isAppAnr" const val UPDATE_DEVICE_DETAILS_ERROR = "update_device_details_error" const val STACK_TRACE = "stack_trace" const val IP_ADDRESS_DATA = "ip_address_data" diff --git a/android/app/src/main/java/com/naviapp/app/initializers/AnrErrorHandlerInitializer.kt b/android/app/src/main/java/com/naviapp/app/initializers/AnrErrorHandlerInitializer.kt index 1da615e90c..098f646549 100644 --- a/android/app/src/main/java/com/naviapp/app/initializers/AnrErrorHandlerInitializer.kt +++ b/android/app/src/main/java/com/naviapp/app/initializers/AnrErrorHandlerInitializer.kt @@ -17,23 +17,17 @@ import com.navi.base.utils.orZero import com.navi.common.checkmate.core.CheckMateManager import com.navi.common.checkmate.utils.getVerticalFromStackTrace import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper -import com.navi.common.network.isNetworkConnectivityInterceptorEnabled -import com.navi.common.utils.TemporaryStorageHelper import com.navi.insurance.util.FALSE import com.navi.insurance.util.TRUE import com.naviapp.analytics.utils.NaviAnalytics.Companion.ALFRED_SESSION_ID import com.naviapp.analytics.utils.NaviAnalytics.Companion.ANR_MESSAGE -import com.naviapp.analytics.utils.NaviAnalytics.Companion.ANR_STACK_TRACE import com.naviapp.analytics.utils.NaviAnalytics.Companion.APP_IN_FOREGROUND -import com.naviapp.analytics.utils.NaviAnalytics.Companion.CUSTOM_DNS_ENABLED import com.naviapp.analytics.utils.NaviAnalytics.Companion.FOREGROUND_SCREEN import com.naviapp.analytics.utils.NaviAnalytics.Companion.FOREGROUND_VERTICAL -import com.naviapp.analytics.utils.NaviAnalytics.Companion.GLOBAL_ANR -import com.naviapp.analytics.utils.NaviAnalytics.Companion.GLOBAL_ANR_THIRD_PARTY +import com.naviapp.analytics.utils.NaviAnalytics.Companion.IS_APP_ANR import com.naviapp.analytics.utils.NaviAnalytics.Companion.LINE_NUMBER import com.naviapp.analytics.utils.NaviAnalytics.Companion.METHOD_NAME import com.naviapp.analytics.utils.NaviAnalytics.Companion.NAP_METRIC -import com.naviapp.analytics.utils.NaviAnalytics.Companion.NETWORK_CONNECTIVITY_INTERCEPTOR_ENABLED import com.naviapp.analytics.utils.NaviAnalytics.Companion.SCREEN_NAME import com.naviapp.analytics.utils.NaviAnalytics.Companion.STACK_TRACE import com.naviapp.analytics.utils.NaviAnalytics.Companion.TRACE_SIZE @@ -42,7 +36,6 @@ import com.naviapp.anr_monitor.AnrError import com.naviapp.anr_monitor.AnrMonitor import com.naviapp.anr_monitor.AnrMonitor.AnrListener import com.naviapp.app.NaviApplication -import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ANR_MONITOR import com.naviapp.utils.Constants.ANR_SOURCE import com.naviapp.utils.Constants.DEV_ANR_LISTENER @@ -84,7 +77,7 @@ class AnrErrorHandlerInitializer @Inject constructor() : ComponentInitializer { val className = stackTraceElement.className val anrEventProperties = buildAnrEventProperties(error, stackTraceElement, className) anrEventProperties[ANR_SOURCE] = ANR_MONITOR - trackEvent(className, anrEventProperties) + trackEvent(anrEventProperties) handleAnrEventIfNeeded(anrEventProperties) } } @@ -98,7 +91,7 @@ class AnrErrorHandlerInitializer @Inject constructor() : ComponentInitializer { val stackTraceElement = error.cause?.stackTrace?.firstOrNull() ?: return@ANRListener val className = stackTraceElement.className val anrEventProperties = buildAnrEventProperties(error, stackTraceElement, className) - trackEvent(className, anrEventProperties) + trackEvent(anrEventProperties) handleAnrEventIfNeeded(anrEventProperties) } } @@ -108,34 +101,33 @@ class AnrErrorHandlerInitializer @Inject constructor() : ComponentInitializer { stackTraceElement: StackTraceElement, className: String, ): MutableMap { + val stackTraceSize = + FirebaseRemoteConfigHelper.getLong( + FirebaseRemoteConfigHelper.STACE_TRACE_SIZE_LIMIT, + 1000, + ) + .toInt() return mutableMapOf( SCREEN_NAME to (NaviTrackEvent.currentScreenName ?: className), METHOD_NAME to stackTraceElement.methodName, LINE_NUMBER to stackTraceElement.lineNumber.toString(), APP_IN_FOREGROUND to (application.getAppInForegroundCounter() >= 1).toString(), ANR_MESSAGE to error.message.orEmpty(), - ANR_STACK_TRACE to error.stackTraceToString(), TRACE_SIZE to (error.stackTrace.size + error.cause?.stackTrace?.size.orZero()).toString(), VERTICAL to getVerticalFromStackTrace(error), FOREGROUND_SCREEN to NaviTrackEvent.foregroundScreen.orEmpty(), FOREGROUND_VERTICAL to NaviTrackEvent.foregroundVertical.orEmpty(), - STACK_TRACE to error.stackTraceToString(), ALFRED_SESSION_ID to AlfredManager.getAlfredSessionId(), - CUSTOM_DNS_ENABLED to TemporaryStorageHelper.isOkHttpCustomDnsV2Enabled.toString(), - NETWORK_CONNECTIVITY_INTERCEPTOR_ENABLED to - isNetworkConnectivityInterceptorEnabled().toString(), + STACK_TRACE to error.stackTraceToString().take(stackTraceSize), + IS_APP_ANR to true.toString(), ) } - private fun trackEvent(className: String, anrEventProperties: MutableMap) { - val eventName = - if (className.contains(Constants.ANR_NAVI_REGEX)) GLOBAL_ANR else GLOBAL_ANR_THIRD_PARTY + private fun trackEvent(anrEventProperties: MutableMap) { CheckMateManager.logVerticalWiseAppCrashOrAnrEvent( eventName = NAP_METRIC, eventValues = anrEventProperties, - isAppCrash = false, - isAppAnr = true, ) } diff --git a/android/app/src/main/java/com/naviapp/app/initializers/CrashHandlerInitializer.kt b/android/app/src/main/java/com/naviapp/app/initializers/CrashHandlerInitializer.kt index 3dca740c8d..bd541c90cf 100644 --- a/android/app/src/main/java/com/naviapp/app/initializers/CrashHandlerInitializer.kt +++ b/android/app/src/main/java/com/naviapp/app/initializers/CrashHandlerInitializer.kt @@ -12,17 +12,15 @@ import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.utils.orZero import com.navi.common.checkmate.core.CheckMateManager import com.navi.common.checkmate.utils.getVerticalFromStackTrace -import com.navi.common.network.isNetworkConnectivityInterceptorEnabled -import com.navi.common.utils.TemporaryStorageHelper +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper import com.naviapp.analytics.utils.NaviAnalytics.Companion.ALFRED_SESSION_ID import com.naviapp.analytics.utils.NaviAnalytics.Companion.APP_IN_FOREGROUND -import com.naviapp.analytics.utils.NaviAnalytics.Companion.CUSTOM_DNS_ENABLED import com.naviapp.analytics.utils.NaviAnalytics.Companion.FOREGROUND_SCREEN import com.naviapp.analytics.utils.NaviAnalytics.Companion.FOREGROUND_VERTICAL +import com.naviapp.analytics.utils.NaviAnalytics.Companion.IS_APP_CRASH import com.naviapp.analytics.utils.NaviAnalytics.Companion.LINE_NUMBER import com.naviapp.analytics.utils.NaviAnalytics.Companion.METHOD_NAME import com.naviapp.analytics.utils.NaviAnalytics.Companion.NAP_METRIC -import com.naviapp.analytics.utils.NaviAnalytics.Companion.NETWORK_CONNECTIVITY_INTERCEPTOR_ENABLED import com.naviapp.analytics.utils.NaviAnalytics.Companion.SCREEN_NAME import com.naviapp.analytics.utils.NaviAnalytics.Companion.STACK_TRACE import com.naviapp.analytics.utils.NaviAnalytics.Companion.TRACE_SIZE @@ -60,8 +58,6 @@ class CrashHandlerInitializer @Inject constructor() : ComponentInitializer { CheckMateManager.logVerticalWiseAppCrashOrAnrEvent( eventName = NAP_METRIC, eventValues = crashEventProperties, - isAppCrash = true, - isAppAnr = false, ) } finally { defaultHandler?.uncaughtException(thread, exception) @@ -69,6 +65,12 @@ class CrashHandlerInitializer @Inject constructor() : ComponentInitializer { } private fun buildCrashEventProperties(exception: Throwable): MutableMap { + val stackTraceSize = + FirebaseRemoteConfigHelper.getLong( + FirebaseRemoteConfigHelper.STACE_TRACE_SIZE_LIMIT, + 1000, + ) + .toInt() return mutableMapOf( SCREEN_NAME to (NaviTrackEvent.currentScreenName @@ -81,11 +83,9 @@ class CrashHandlerInitializer @Inject constructor() : ComponentInitializer { VERTICAL to getVerticalFromStackTrace(exception), FOREGROUND_SCREEN to NaviTrackEvent.foregroundScreen.orEmpty(), FOREGROUND_VERTICAL to NaviTrackEvent.foregroundVertical.orEmpty(), - STACK_TRACE to exception.stackTraceToString(), ALFRED_SESSION_ID to AlfredManager.getAlfredSessionId(), - CUSTOM_DNS_ENABLED to TemporaryStorageHelper.isOkHttpCustomDnsV2Enabled.toString(), - NETWORK_CONNECTIVITY_INTERCEPTOR_ENABLED to - isNetworkConnectivityInterceptorEnabled().toString(), + STACK_TRACE to exception.stackTraceToString().take(stackTraceSize), + IS_APP_CRASH to true.toString(), ) } } diff --git a/android/navi-common/src/main/java/com/navi/common/checkmate/core/CheckMateManager.kt b/android/navi-common/src/main/java/com/navi/common/checkmate/core/CheckMateManager.kt index 9d6b16988c..a3d2611196 100644 --- a/android/navi-common/src/main/java/com/navi/common/checkmate/core/CheckMateManager.kt +++ b/android/navi-common/src/main/java/com/navi/common/checkmate/core/CheckMateManager.kt @@ -11,7 +11,6 @@ import com.navi.alfred.AlfredManager import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.AppServiceManager import com.navi.base.bandwidthbuddy.BandwidthAccessor -import com.navi.base.utils.orFalse import com.navi.base.utils.orZero import com.navi.common.checkmate.model.EventType import com.navi.common.checkmate.model.MetricInfo @@ -21,6 +20,7 @@ import com.navi.common.checkmate.utils.getErrorDescription import com.navi.common.checkmate.utils.getErrorTitle import com.navi.common.checkmate.utils.getEventNameWithVerticalPrefix import com.navi.common.checkmate.utils.getIsNae +import com.navi.common.constants.VERTICAL import com.navi.common.network.models.GenericResponse import com.navi.common.network.models.RepoResult import com.navi.common.utils.NetworkStats @@ -180,24 +180,14 @@ object CheckMateManager { } /** This method will only be used for vertical wise app crash and anr event logging. */ - fun logVerticalWiseAppCrashOrAnrEvent( - eventName: String, - eventValues: Map, - isAppCrash: Boolean? = null, - isAppAnr: Boolean? = null, - ) { + fun logVerticalWiseAppCrashOrAnrEvent(eventName: String, eventValues: Map) { NaviTrackEvent.trackEventOnClickStream( eventName = getEventNameWithVerticalPrefix( eventName = eventName, - vertical = eventValues["vertical"].orEmpty(), + vertical = eventValues[VERTICAL].orEmpty(), ), - eventValues = - eventValues + - mapOf( - "isAppCrash" to isAppCrash.orFalse().toString(), - "isAppAnr" to isAppAnr.orFalse().toString(), - ), + eventValues = eventValues, ) } diff --git a/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt b/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt index 127de7196c..ff2ae3c779 100644 --- a/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt +++ b/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt @@ -157,6 +157,7 @@ object FirebaseRemoteConfigHelper { const val LOW_NETWORK_SIGNAL_ERROR_CODE_ENABLED = "LOW_NETWORK_SIGNAL_ERROR_CODE_ENABLED" const val LOW_NETWORK_SIGNAL_QUALITY_LIST = "LOW_NETWORK_SIGNAL_QUALITY_LIST" const val ENABLE_GEO_NETWORK_SIGNATURE_USECASE = "ENABLE_GEO_NETWORK_SIGNATURE_USECASE" + const val STACE_TRACE_SIZE_LIMIT = "STACE_TRACE_SIZE_LIMIT" // GI const val NAVI_GI_RETRY_POLICY_ENABLED = "NAVI_GI_RETRY_POLICY_ENABLED"