Loading services/credentials/java/com/android/server/credentials/ClearRequestSession.java +6 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.credentials.ClearCredentialStateRequest; import android.credentials.CredentialManager; import android.credentials.CredentialProviderInfo; import android.credentials.IClearCredentialStateCallback; import android.credentials.flags.Flags; import android.credentials.selection.ProviderData; import android.credentials.selection.RequestInfo; import android.os.CancellationSignal; Loading Loading @@ -140,6 +141,11 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta if (session.isProviderResponseSet()) { // If even one provider responded successfully, send back the response // TODO: Aggregate other exceptions if (Flags.metricBugfixesContinued()) { ComponentName componentName = session.getComponentName(); mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } respondToClientWithResponseAndFinish(null); return; } Loading services/credentials/java/com/android/server/credentials/CreateRequestSession.java +8 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,10 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR @Override public void onFinalErrorReceived(ComponentName componentName, String errorType, String message) { if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } respondToClientWithErrorAndFinish(errorType, message); } Loading Loading @@ -199,6 +203,10 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR getProviderDataAndInitiateUi(); } else { String exception = CreateCredentialException.TYPE_NO_CREATE_OPTIONS; if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } mRequestSessionMetric.collectFrameworkException(exception); respondToClientWithErrorAndFinish(exception, "No create options available."); Loading services/credentials/java/com/android/server/credentials/GetRequestSession.java +12 −0 Original line number Diff line number Diff line Loading @@ -168,6 +168,10 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest, @Override public void onFinalErrorReceived(ComponentName componentName, String errorType, String message) { if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } respondToClientWithErrorAndFinish(errorType, message); } Loading Loading @@ -212,6 +216,10 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest, getProviderDataAndInitiateUi(); } else { String exception = GetCredentialException.TYPE_NO_CREDENTIAL; if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } mRequestSessionMetric.collectFrameworkException(exception); respondToClientWithErrorAndFinish(exception, "No credentials available"); Loading @@ -235,6 +243,10 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest, // Respond to client if all auth entries are empty and nothing else to show on the UI if (providerDataContainsEmptyAuthEntriesOnly()) { String exception = GetCredentialException.TYPE_NO_CREDENTIAL; if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } mRequestSessionMetric.collectFrameworkException(exception); respondToClientWithErrorAndFinish(exception, "No credentials available"); Loading services/credentials/java/com/android/server/credentials/RequestSession.java +3 −0 Original line number Diff line number Diff line Loading @@ -283,6 +283,9 @@ abstract class RequestSession<T, U, V> implements CredentialManagerUi.Credential mRequestSessionMetric.collectFinalPhaseProviderMetricStatus(/*hasException=*/ false, ProviderStatusForMetrics.FINAL_SUCCESS); } if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.captureMissingLogMetadata(); } } void cancelExistingPendingIntent() { Loading services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java +24 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.credentials.metrics; import static com.android.server.credentials.MetricUtilities.DEFAULT_INT_32; import static com.android.server.credentials.MetricUtilities.DELTA_EXCEPTION_CUT; import static com.android.server.credentials.MetricUtilities.DELTA_RESPONSES_CUT; import static com.android.server.credentials.MetricUtilities.UNIT; import static com.android.server.credentials.MetricUtilities.generateMetricKey; import static com.android.server.credentials.MetricUtilities.logApiCalledAggregateCandidate; import static com.android.server.credentials.MetricUtilities.logApiCalledAuthenticationMetric; Loading Loading @@ -337,6 +338,29 @@ public class RequestSessionMetric { } } /** * In certain flows, such as exceptions where no provider is specified (e.g. user cancellations * or client cancellations), this can be used at the very final point to collect missing meta * data. Certain metadata, therefore, is undefined - specifically the provider. However, other * metadata, such as latency figures, can now be properly seen. */ public void captureMissingLogMetadata() { try { if (mChosenProviderFinalPhaseMetric.getChosenUid() == DEFAULT_INT_32 && mChosenProviderFinalPhaseMetric.getQueryStartTimeNanoseconds() < UNIT) { mChosenProviderFinalPhaseMetric.setServiceBeganTimeNanoseconds( mCandidateAggregateMetric.getServiceBeganTimeNanoseconds()); mChosenProviderFinalPhaseMetric.setQueryStartTimeNanoseconds( mCandidateAggregateMetric.getMinProviderTimestampNanoseconds()); mChosenProviderFinalPhaseMetric.setQueryEndTimeNanoseconds( mCandidateAggregateMetric.getMaxProviderTimestampNanoseconds()); mChosenProviderFinalPhaseMetric.setFinalFinishTimeNanoseconds(System.nanoTime()); } } catch (Exception e) { Slog.i(TAG, "Unexpected error during final phase missing metadata logging " + e); } } /** * Used to update metrics when a response is received in a RequestSession. * Loading Loading
services/credentials/java/com/android/server/credentials/ClearRequestSession.java +6 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.credentials.ClearCredentialStateRequest; import android.credentials.CredentialManager; import android.credentials.CredentialProviderInfo; import android.credentials.IClearCredentialStateCallback; import android.credentials.flags.Flags; import android.credentials.selection.ProviderData; import android.credentials.selection.RequestInfo; import android.os.CancellationSignal; Loading Loading @@ -140,6 +141,11 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta if (session.isProviderResponseSet()) { // If even one provider responded successfully, send back the response // TODO: Aggregate other exceptions if (Flags.metricBugfixesContinued()) { ComponentName componentName = session.getComponentName(); mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } respondToClientWithResponseAndFinish(null); return; } Loading
services/credentials/java/com/android/server/credentials/CreateRequestSession.java +8 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,10 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR @Override public void onFinalErrorReceived(ComponentName componentName, String errorType, String message) { if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } respondToClientWithErrorAndFinish(errorType, message); } Loading Loading @@ -199,6 +203,10 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR getProviderDataAndInitiateUi(); } else { String exception = CreateCredentialException.TYPE_NO_CREATE_OPTIONS; if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } mRequestSessionMetric.collectFrameworkException(exception); respondToClientWithErrorAndFinish(exception, "No create options available."); Loading
services/credentials/java/com/android/server/credentials/GetRequestSession.java +12 −0 Original line number Diff line number Diff line Loading @@ -168,6 +168,10 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest, @Override public void onFinalErrorReceived(ComponentName componentName, String errorType, String message) { if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } respondToClientWithErrorAndFinish(errorType, message); } Loading Loading @@ -212,6 +216,10 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest, getProviderDataAndInitiateUi(); } else { String exception = GetCredentialException.TYPE_NO_CREDENTIAL; if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } mRequestSessionMetric.collectFrameworkException(exception); respondToClientWithErrorAndFinish(exception, "No credentials available"); Loading @@ -235,6 +243,10 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest, // Respond to client if all auth entries are empty and nothing else to show on the UI if (providerDataContainsEmptyAuthEntriesOnly()) { String exception = GetCredentialException.TYPE_NO_CREDENTIAL; if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName, isPrimaryProviderViaProviderInfo(componentName)); } mRequestSessionMetric.collectFrameworkException(exception); respondToClientWithErrorAndFinish(exception, "No credentials available"); Loading
services/credentials/java/com/android/server/credentials/RequestSession.java +3 −0 Original line number Diff line number Diff line Loading @@ -283,6 +283,9 @@ abstract class RequestSession<T, U, V> implements CredentialManagerUi.Credential mRequestSessionMetric.collectFinalPhaseProviderMetricStatus(/*hasException=*/ false, ProviderStatusForMetrics.FINAL_SUCCESS); } if (Flags.metricBugfixesContinued()) { mRequestSessionMetric.captureMissingLogMetadata(); } } void cancelExistingPendingIntent() { Loading
services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java +24 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.credentials.metrics; import static com.android.server.credentials.MetricUtilities.DEFAULT_INT_32; import static com.android.server.credentials.MetricUtilities.DELTA_EXCEPTION_CUT; import static com.android.server.credentials.MetricUtilities.DELTA_RESPONSES_CUT; import static com.android.server.credentials.MetricUtilities.UNIT; import static com.android.server.credentials.MetricUtilities.generateMetricKey; import static com.android.server.credentials.MetricUtilities.logApiCalledAggregateCandidate; import static com.android.server.credentials.MetricUtilities.logApiCalledAuthenticationMetric; Loading Loading @@ -337,6 +338,29 @@ public class RequestSessionMetric { } } /** * In certain flows, such as exceptions where no provider is specified (e.g. user cancellations * or client cancellations), this can be used at the very final point to collect missing meta * data. Certain metadata, therefore, is undefined - specifically the provider. However, other * metadata, such as latency figures, can now be properly seen. */ public void captureMissingLogMetadata() { try { if (mChosenProviderFinalPhaseMetric.getChosenUid() == DEFAULT_INT_32 && mChosenProviderFinalPhaseMetric.getQueryStartTimeNanoseconds() < UNIT) { mChosenProviderFinalPhaseMetric.setServiceBeganTimeNanoseconds( mCandidateAggregateMetric.getServiceBeganTimeNanoseconds()); mChosenProviderFinalPhaseMetric.setQueryStartTimeNanoseconds( mCandidateAggregateMetric.getMinProviderTimestampNanoseconds()); mChosenProviderFinalPhaseMetric.setQueryEndTimeNanoseconds( mCandidateAggregateMetric.getMaxProviderTimestampNanoseconds()); mChosenProviderFinalPhaseMetric.setFinalFinishTimeNanoseconds(System.nanoTime()); } } catch (Exception e) { Slog.i(TAG, "Unexpected error during final phase missing metadata logging " + e); } } /** * Used to update metrics when a response is received in a RequestSession. * Loading