NTP-64514 | Trim ANR and Crash StackTrace (#16174)

This commit is contained in:
shankar yadav
2025-05-15 14:09:20 +05:30
committed by GitHub
parent 12511878f6
commit 274b969619
5 changed files with 29 additions and 47 deletions

View File

@@ -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"

View File

@@ -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<String, String> {
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<String, String>) {
val eventName =
if (className.contains(Constants.ANR_NAVI_REGEX)) GLOBAL_ANR else GLOBAL_ANR_THIRD_PARTY
private fun trackEvent(anrEventProperties: MutableMap<String, String>) {
CheckMateManager.logVerticalWiseAppCrashOrAnrEvent(
eventName = NAP_METRIC,
eventValues = anrEventProperties,
isAppCrash = false,
isAppAnr = true,
)
}

View File

@@ -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<String, String> {
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(),
)
}
}

View File

@@ -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<String, String>,
isAppCrash: Boolean? = null,
isAppAnr: Boolean? = null,
) {
fun logVerticalWiseAppCrashOrAnrEvent(eventName: String, eventValues: Map<String, String>) {
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,
)
}

View File

@@ -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"