NTP-13907 | PS | improved analytics logging (#13998)

This commit is contained in:
Prakhar Saxena
2024-12-05 19:48:01 +05:30
committed by GitHub
parent c9183e571b
commit 1e90bebbe3
14 changed files with 91 additions and 49 deletions

View File

@@ -15,6 +15,7 @@ import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_PMT_
import com.navi.common.network.models.ErrorMessage
import com.navi.common.network.models.GenericErrorResponse
import com.navi.payment.nativepayment.db.model.TransactionStatusRequestEntity
import com.navi.payment.paymentscreen.model.ErrorReason
import com.navi.payment.paymentscreen.model.TransactionStatusRequest
import com.navi.payment.utils.usecases.CardValidator
import com.navi.payment.utils.usecases.ExpiryDateValidator
@@ -588,7 +589,7 @@ class NaviPaymentAnalytics private constructor() {
fun onSdkPaymentError(provider: String, error: String) {
NaviTrackEvent.trackEventOnClickStream(
eventName =
"${NAVI_PMT}_${NaviPaymentAnalyticScreenName.SDK_INTEGRATION_SCREEN.screenName}_error",
"${NAVI_PMT}_${NaviPaymentAnalyticScreenName.SDK_INTEGRATION_SCREEN.screenName}_Error",
eventValues = mapOf("provider" to provider, "error" to error)
)
}
@@ -636,21 +637,21 @@ class NaviPaymentAnalytics private constructor() {
inner class ErrorBottomSheet {
fun onPrimaryCtaClick(primaryButtonText: String) {
NaviTrackEvent.trackEventOnClickStream(
eventName = "${NAVI_PMT}_error_BottomSheetPrimaryCtaClick",
eventName = "${NAVI_PMT}_ErrorBottomSheet_PrimaryCtaClick",
eventValues = mapOf("cta_text" to primaryButtonText)
)
}
fun onSecondaryCtaClick(secondaryButtonText: String) {
NaviTrackEvent.trackEventOnClickStream(
eventName = "${NAVI_PMT}_error_BottomSheetSecondaryCtaClick",
eventName = "${NAVI_PMT}_ErrorBottomSheet_SecondaryCtaClick",
eventValues = mapOf("cta_text" to secondaryButtonText)
)
}
fun onDismissClick() {
NaviTrackEvent.trackEventOnClickStream(
eventName = "${NAVI_PMT}_error_BottomSheetDismissClick"
eventName = "${NAVI_PMT}_ErrorBottomSheet_DismissClick"
)
}
@@ -667,9 +668,11 @@ class NaviPaymentAnalytics private constructor() {
additionalDescription: String?,
title: String,
description: String,
errorReason: ErrorReason
) {
val map =
mapOf(
Pair("error_reason", errorReason.toString()),
Pair("screenName", screenName),
Pair("apiUrl", apiUrl.toString()),
Pair("statusCode", statusCode.orEmpty()),

View File

@@ -35,6 +35,7 @@ import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.google.gson.Gson
import com.navi.alfred.AlfredManager
import com.navi.base.utils.isNotNull
import com.navi.base.utils.isNotNullAndNotEmpty
import com.navi.base.utils.isNull
@@ -90,8 +91,8 @@ import com.navi.payment.nativepayment.utils.toGenericError
import com.navi.payment.nativepayment.viewmodel.MPSViewModel
import com.navi.payment.nativepayment.viewmodel.NaviPaymentViewModel
import com.navi.payment.navigator.NaviPaymentDeeplinkNavigator
import com.navi.payment.paymentscreen.model.MPSErrorReason
import com.navi.payment.paymentscreen.model.NaviPayProcessPayload
import com.navi.payment.paymentscreen.model.PMSErrorReason
import com.navi.payment.paymentscreen.model.PaymentErrorData
import com.navi.payment.paymentscreen.model.TransactionStatus
import com.navi.payment.paymentscreen.model.TransactionStatusRequest
@@ -260,7 +261,7 @@ fun MPSScreen(
MPSScreenUtils.MPSScreenType.Error(
PaymentErrorData(
error = upiError,
errorReason = MPSErrorReason.UPIError
errorReason = PMSErrorReason.UPIError
)
),
true
@@ -641,15 +642,16 @@ fun MPSScreen(
.errorData
paymentViewModel.sendEvent(
"${NAVI_PMT}_${NaviPaymentAnalyticScreenName.MINI_PAYMENT_SCREEN.screenName}_error",
"${NAVI_PMT}_${NaviPaymentAnalyticScreenName.MINI_PAYMENT_SCREEN.screenName}_Error",
mapOf(
"error_reason" to errorData?.errorReason.toString(),
"error_code" to errorData?.error?.code.orEmpty(),
"error_status_code" to errorData?.error?.statusCode.toString(),
"error_exception" to errorData?.error?.logMessage.orEmpty(),
"error_title" to errorData?.error?.title.orEmpty(),
"error_message" to errorData?.error?.message.orEmpty(),
"error_data" to errorData?.error.toString(),
"apiUrl" to errorData?.error?.apiUrl.orEmpty(),
"statusCode" to errorData?.error?.statusCode.toString(),
"genericErrorCode" to errorData?.error?.code.orEmpty(),
"exception" to errorData?.error?.logMessage.orEmpty(),
"title" to errorData?.error?.title.orEmpty(),
"additionalDescription" to
errorData?.error?.additionalDescription.toString(),
"isRetryOnConnectionFaliureEnabled" to
FirebaseRemoteConfigHelper.getBoolean(NAVI_PMT_RETRY_POLICY_ENABLED)
.toString(),
@@ -658,7 +660,10 @@ fun MPSScreen(
NAVI_PMT_API_CONNECT_TIMEOUT,
20L
)
.toString()
.toString(),
"genericErrorData" to errorData?.error.toString(),
"description" to errorData?.error?.message.orEmpty(),
"alfredSessionId" to AlfredManager.getAlfredSessionId()
)
)
BottomSheetContentWithVerticalPrimarySecondaryButton(

View File

@@ -148,6 +148,15 @@ fun TransactionPollingScreen(
}
LaunchedEffect(key1 = Unit) {
paymentViewModel.sendEvent(
eventName =
"${NAVI_PMT}_${NaviPaymentAnalyticScreenName.TRANSACTION_POLLING_SCREEN.screenName}_Landed",
additionalParams =
mapOf(
"screenName" to
NaviPaymentAnalyticScreenName.TRANSACTION_POLLING_SCREEN.screenName
)
)
paymentViewModel.sendEvent(
eventName =
"${NAVI_PMT}_${NaviPaymentAnalyticScreenName.TRANSACTION_POLLING_SCREEN.screenName}_PollingLoadInit",

View File

@@ -34,7 +34,7 @@ import com.navi.payment.nativepayment.utils.getPayloadBasedOnType
import com.navi.payment.nativepayment.utils.toGenericErrorResponse
import com.navi.payment.nativepayment.viewmodel.NaviPaymentBaseVM
import com.navi.payment.network.util.PaymentsSdkRetrofit
import com.navi.payment.paymentscreen.model.MPSErrorReason
import com.navi.payment.paymentscreen.model.PMSErrorReason
import com.navi.payment.paymentscreen.model.PaymentErrorData
import com.navi.payment.utils.Constants
import com.navi.payment.utils.Constants.DATA
@@ -110,7 +110,7 @@ constructor(
val error = response.toGenericErrorResponse()
paymentDataProvider.add(
ERROR_RESPONSE,
PaymentErrorData(error = error, errorReason = MPSErrorReason.GetMethodsError)
PaymentErrorData(error = error, errorReason = PMSErrorReason.GetMethodsError)
)
}
paymentDataProvider.add(SDK_PARAMS, paymentSdkInitParams)

View File

@@ -63,6 +63,7 @@ import com.navi.payment.nativepayment.presentation.reducer.ErrorDetails
import com.navi.payment.nativepayment.repository.PaymentRepository
import com.navi.payment.paymentscreen.model.ExternalPayNowResponse
import com.navi.payment.paymentscreen.model.ExternalProcessPayload
import com.navi.payment.paymentscreen.model.PMSErrorReason
import com.navi.payment.paymentscreen.model.PayNowResponse
import com.navi.payment.paymentscreen.model.TransactionStatus
import com.navi.payment.paymentscreen.model.TransactionStatusRequest
@@ -422,7 +423,7 @@ constructor(
}
} else {
isInteractionAllowed = true
handleError(response)
handleError(response = response, errorReason = PMSErrorReason.PayNowError)
}
}
}

View File

@@ -69,7 +69,7 @@ import com.navi.payment.nativepayment.utils.toGenericErrorResponse
import com.navi.payment.nativepayment.utils.updateAccountEligibilityStatus
import com.navi.payment.nativepayment.utils.updateUpiAccountsRanking
import com.navi.payment.network.util.PaymentsSdkRetrofit
import com.navi.payment.paymentscreen.model.MPSErrorReason
import com.navi.payment.paymentscreen.model.PMSErrorReason
import com.navi.payment.paymentscreen.model.PaymentErrorData
import com.navi.payment.paymentscreen.model.PaymentFeedbackConfig
import com.navi.payment.paymentscreen.model.PaymentFeedbackRequest
@@ -442,7 +442,7 @@ constructor(
errorData =
PaymentErrorData(
error = errorResponse,
errorReason = MPSErrorReason.PayNowError
errorReason = PMSErrorReason.PayNowError
)
),
bottomSheetStateChange = true
@@ -507,7 +507,7 @@ constructor(
MPSScreenUtils.MPSScreenType.Error(
PaymentErrorData(
error = response.toGenericErrorResponse(),
errorReason = MPSErrorReason.GetMethodsError
errorReason = PMSErrorReason.GetMethodsError
)
),
bottomSheetStateChange = true
@@ -517,7 +517,7 @@ constructor(
} else {
CheckMateManager.logAppErrorEvent(
metricInfo = MetricInfo.PMSMetric<Any>(screen = screenName),
errorCode = MPSErrorReason.TokenNotFoundError.toString(),
errorCode = PMSErrorReason.TokenNotFoundError.toString(),
errorTitle = resourceProvider.getString(R.string.something_went_wrong),
errorDes = resourceProvider.getString(R.string.technical_issue),
)
@@ -526,7 +526,7 @@ constructor(
bottomSheetUIState =
MPSScreenUtils.MPSScreenType.Error(
errorData =
PaymentErrorData(errorReason = MPSErrorReason.TokenNotFoundError)
PaymentErrorData(errorReason = PMSErrorReason.TokenNotFoundError)
),
bottomSheetStateChange = true
)

View File

@@ -97,6 +97,7 @@ import com.navi.payment.paymentscreen.model.ExternalPayNowResponse
import com.navi.payment.paymentscreen.model.IntentUriPayNowResponse
import com.navi.payment.paymentscreen.model.InternalPayNowResponse
import com.navi.payment.paymentscreen.model.NaviPayProcessPayload
import com.navi.payment.paymentscreen.model.PMSErrorReason
import com.navi.payment.paymentscreen.model.PayNowResponse
import com.navi.payment.paymentscreen.model.TransactionStatus
import com.navi.payment.paymentscreen.model.TransactionStatusRequest
@@ -846,7 +847,10 @@ constructor(
if (errorConfig.code == CANCEL) {
transactionStatus = TransactionStatus.USER_CANCELLED_TRANSACTION.name
} else {
handleError(errorConfig.toGenericError())
handleError(
genericErrorResponse = errorConfig.toGenericError(),
errorReason = PMSErrorReason.UPIError
)
}
notifyNaviUpiExitWithError(transactionStatus, errorConfig)
}
@@ -1047,7 +1051,7 @@ constructor(
} else {
showLoader(false)
updateBottomSheetUIState(false)
handleError(response)
handleError(response = response, errorReason = PMSErrorReason.PayNowError)
}
}
}
@@ -1211,7 +1215,7 @@ constructor(
if (response.isSuccessWithData()) {
paymentDataProvider.updatePaymentMethodResponse(response.data)
} else {
handleError(response)
handleError(response = response, errorReason = PMSErrorReason.GetMethodsError)
}
_state.update { npsScreenState.copy(isLoading = false) }
}

View File

@@ -21,6 +21,8 @@ import com.navi.payment.nativepayment.utils.NaviPaymentEventHandler
import com.navi.payment.nativepayment.utils.getGenericPaymentErrorConfig
import com.navi.payment.nativepayment.utils.toGenericErrorResponse
import com.navi.payment.nativepayment.utils.toPaymentNaviPaymentErrorConfig
import com.navi.payment.paymentscreen.model.ErrorReason
import com.navi.payment.paymentscreen.model.PMSErrorReason
import dagger.Lazy
import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
@@ -39,11 +41,16 @@ abstract class NaviPaymentBaseVM(open val screenName: String) : BaseVM() {
* @param shouldNotifyError Flag indicating if the error should be notified.
* @param T The type of the API response.
*/
fun <T> handleError(response: RepoResult<T>, shouldNotifyError: Boolean = true) {
fun <T> handleError(
response: RepoResult<T>,
shouldNotifyError: Boolean = true,
errorReason: ErrorReason? = null
) {
sendFailureEvent(
screenName = screenName,
genericError = response.errors?.firstOrNull(),
localError = response.error
localError = response.error,
errorReason = errorReason ?: PMSErrorReason.Unknown
)
if (shouldNotifyError) {
val errorConfig = response.toGenericErrorResponse().toPaymentNaviPaymentErrorConfig()
@@ -56,11 +63,12 @@ abstract class NaviPaymentBaseVM(open val screenName: String) : BaseVM() {
*
* @param genericErrorResponse The generic error response.
*/
fun handleError(genericErrorResponse: GenericErrorResponse?) {
fun handleError(genericErrorResponse: GenericErrorResponse?, errorReason: ErrorReason? = null) {
sendFailureEvent(
screenName = screenName,
genericError = genericErrorResponse,
localError = null
localError = null,
errorReason = errorReason ?: PMSErrorReason.Unknown
)
val naviPaymentErrorConfig =
genericErrorResponse?.toPaymentNaviPaymentErrorConfig()
@@ -80,9 +88,10 @@ abstract class NaviPaymentBaseVM(open val screenName: String) : BaseVM() {
private fun sendFailureEvent(
screenName: String,
genericError: GenericErrorResponse?,
localError: ErrorMessage?
localError: ErrorMessage?,
errorReason: ErrorReason
) {
val eventName = "${NAVI_PMT}_${screenName}_error"
val eventName = "${NAVI_PMT}_${screenName}_Error"
naviPaymentAnalytics.onError(
eventName = eventName,
@@ -96,7 +105,8 @@ abstract class NaviPaymentBaseVM(open val screenName: String) : BaseVM() {
localError = localError,
title = genericError?.title ?: localError?.message.orEmpty(),
description = genericError?.message ?: localError?.description.orEmpty(),
moduleName = ModuleNameV2.PG.name
moduleName = ModuleNameV2.PG.name,
errorReason = errorReason
)
}

View File

@@ -30,6 +30,7 @@ import com.navi.payment.nativepayment.presentation.reducer.NetBankingScreenState
import com.navi.payment.nativepayment.repository.PaymentRepository
import com.navi.payment.network.util.PaymentsSdkRetrofit
import com.navi.payment.paymentscreen.model.ExternalPayNowResponse
import com.navi.payment.paymentscreen.model.PMSErrorReason
import com.navi.payment.paymentscreen.model.PayNowResponse
import com.navi.payment.paymentscreen.utils.PaymentScreenUtil
import com.navi.payment.turbocheckout.model.NetBankingPayNowRequest
@@ -314,7 +315,7 @@ constructor(
}
}
} else {
handleError(response)
handleError(response = response, errorReason = PMSErrorReason.PayNowError)
_state.update { it.copy(selectedBank = null) }
}
}

View File

@@ -74,7 +74,7 @@ constructor(
val errorData =
paymentDataProvider.getAndRemove(PaymentDataProvider.ERROR_RESPONSE)
as PaymentErrorData?
errorData?.let { handleError(it.error) }
errorData?.let { handleError(it.error, it.errorReason) }
?: run {
paymentDataProvider.paymentMethodResponse.collectLatest {
(it as? SdkPaymentMethodResponse?)?.let { paymentMethodResponse ->

View File

@@ -35,7 +35,7 @@ import com.navi.payment.nativepayment.utils.getGenericPaymentErrorConfig
import com.navi.payment.nativepayment.utils.nextPollRequired
import com.navi.payment.nativepayment.utils.toGenericErrorResponse
import com.navi.payment.nativepayment.utils.toPaymentNaviPaymentErrorConfig
import com.navi.payment.paymentscreen.model.MPSErrorReason
import com.navi.payment.paymentscreen.model.PMSErrorReason
import com.navi.payment.paymentscreen.model.PaymentErrorData
import com.navi.payment.paymentscreen.model.PaymentErrorDataWrapper
import com.navi.payment.paymentscreen.model.TransactionPollingApiState
@@ -150,7 +150,7 @@ constructor(
errorData?.errorConfig
?: transactionStatusData.toGenericErrorResponse(),
feedbackConfig = errorData?.feedbackConfig,
errorReason = MPSErrorReason.TransactionPollingFailure
errorReason = PMSErrorReason.TransactionPollingFailure
)
)
} else {
@@ -184,11 +184,14 @@ constructor(
ERROR_RESPONSE,
PaymentErrorData(
error = error,
errorReason = MPSErrorReason.TransactionPollingError
errorReason = PMSErrorReason.TransactionPollingError
)
)
} else {
handleError(error)
handleError(
genericErrorResponse = error,
errorReason = PMSErrorReason.TransactionPollingError
)
}
_paymentTransactionStatusPolling.emit(
TransactionPollingApiState.Failure(

View File

@@ -59,6 +59,7 @@ import com.navi.payment.paymentscreen.model.ExternalPayNowResponse
import com.navi.payment.paymentscreen.model.IntentUriPayNowResponse
import com.navi.payment.paymentscreen.model.InternalPayNowResponse
import com.navi.payment.paymentscreen.model.NaviPayProcessPayload
import com.navi.payment.paymentscreen.model.PMSErrorReason
import com.navi.payment.paymentscreen.model.PayNowResponse
import com.navi.payment.paymentscreen.model.TransactionStatus
import com.navi.payment.paymentscreen.model.TransactionStatusRequest
@@ -383,7 +384,7 @@ constructor(
}
} else {
showLoader(false)
handleError(response)
handleError(response = response, errorReason = PMSErrorReason.PayNowError)
}
}
@@ -397,7 +398,10 @@ constructor(
if (errorConfig.code == CANCEL) {
transactionStatus = TransactionStatus.USER_CANCELLED_TRANSACTION.name
} else {
handleError(errorConfig.toGenericError())
handleError(
genericErrorResponse = errorConfig.toGenericError(),
errorReason = PMSErrorReason.UPIError
)
}
notifyNaviUpiExitWithError(transactionStatus, errorConfig)
}

View File

@@ -56,7 +56,7 @@ import com.navi.payment.nativepayment.utils.toGenericErrorResponse
import com.navi.payment.nativepayment.utils.updateAccountEligibilityStatus
import com.navi.payment.nativepayment.utils.updateUpiAccountsRanking
import com.navi.payment.network.util.PaymentsSdkRetrofit
import com.navi.payment.paymentscreen.model.MPSErrorReason
import com.navi.payment.paymentscreen.model.PMSErrorReason
import com.navi.payment.paymentscreen.model.PaymentErrorData
import com.navi.payment.turbocheckout.model.PayAmountRequest
import com.navi.payment.turbocheckout.ui.PayNowState
@@ -240,7 +240,7 @@ constructor(
} else {
CheckMateManager.logAppErrorEvent(
metricInfo = MetricInfo.PMSMetric<Any>(screen = screenName),
errorCode = MPSErrorReason.TokenNotFoundError.toString(),
errorCode = PMSErrorReason.TokenNotFoundError.toString(),
errorTitle = resourceProvider.getString(R.string.something_went_wrong),
errorDes = resourceProvider.getString(R.string.technical_issue),
)

View File

@@ -13,16 +13,18 @@ import kotlinx.parcelize.Parcelize
interface ErrorReason : Parcelable
@Parcelize
sealed class MPSErrorReason : Parcelable, ErrorReason {
data object UPIError : MPSErrorReason()
sealed class PMSErrorReason : Parcelable, ErrorReason {
data object UPIError : PMSErrorReason()
data object PayNowError : MPSErrorReason()
data object PayNowError : PMSErrorReason()
data object TransactionPollingError : MPSErrorReason()
data object TransactionPollingError : PMSErrorReason()
data object GetMethodsError : MPSErrorReason()
data object GetMethodsError : PMSErrorReason()
data object TransactionPollingFailure : MPSErrorReason()
data object TransactionPollingFailure : PMSErrorReason()
data object TokenNotFoundError : MPSErrorReason()
data object TokenNotFoundError : PMSErrorReason()
data object Unknown : PMSErrorReason()
}