From 8fad04bb1df55614cf71c886f47801a7d51c0838 Mon Sep 17 00:00:00 2001 From: Arpan Kaphle Date: Thu, 4 May 2023 20:02:28 +0000 Subject: [PATCH] Adding isPrimary to Final Phase Metrics This captures, for any API flows, if the chosen provider was the primary provider. It's the first of a few changes that capture these additional details and smaller API metrics. Bug: 271135048 Test: Build and Won't Submit without E2E Test Change-Id: Ib3870fb1f1f0ce870dd05bc1fc3901b5ef9e8200 --- .../credentials/ClearRequestSession.java | 10 ++----- .../credentials/CreateRequestSession.java | 9 ++----- .../server/credentials/GetRequestSession.java | 10 ++----- .../server/credentials/MetricUtilities.java | 4 +-- .../server/credentials/RequestSession.java | 12 +++++++++ .../ChosenProviderFinalPhaseMetric.java | 10 +++++++ .../metrics/RequestSessionMetric.java | 26 ++++++++++++++++++- 7 files changed, 55 insertions(+), 26 deletions(-) diff --git a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java index e3d4c224f1fda..fe8a8c8979f7c 100644 --- a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java @@ -30,8 +30,6 @@ import android.os.RemoteException; import android.service.credentials.CallingAppInfo; import android.util.Slog; -import com.android.server.credentials.metrics.ProviderSessionMetric; - import java.util.ArrayList; import java.util.Set; @@ -95,12 +93,8 @@ public final class ClearRequestSession extends RequestSession implements CredentialManagerUi.Credential mRequestSessionMetric.logFailureOrUserCancel(isUserCanceled); finishSession(/*propagateCancellation=*/false); } + + /** + * Reveals if a certain provider is primary after ensuring it exists at all in the designated + * provider info. + * + * @param componentName used to identify the provider we want to check primary status for + */ + protected boolean isPrimaryProviderViaProviderInfo(ComponentName componentName) { + var chosenProviderSession = mProviders.get(componentName.flattenToString()); + return chosenProviderSession != null && chosenProviderSession.mProviderInfo != null + && chosenProviderSession.mProviderInfo.isPrimary(); + } } diff --git a/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java b/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java index e8af86012aaf9..468d3c80707c7 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java @@ -76,6 +76,8 @@ public class ChosenProviderFinalPhaseMetric { // Stores the response credential information, as well as the response entry information which // by default, contains empty info private ResponseCollective mResponseCollective = new ResponseCollective(Map.of(), Map.of()); + // Indicates if this chosen provider was the primary provider, false by default + private boolean mIsPrimary = false; public ChosenProviderFinalPhaseMetric(int sessionIdCaller, int sessionIdProvider) { @@ -292,4 +294,12 @@ public class ChosenProviderFinalPhaseMetric { public int getSessionIdCaller() { return mSessionIdCaller; } + + public void setPrimary(boolean primary) { + mIsPrimary = primary; + } + + public boolean isPrimary() { + return mIsPrimary; + } } diff --git a/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java b/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java index a9e241fc7fce9..281f3cc705be3 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java @@ -28,6 +28,7 @@ import static com.android.server.credentials.MetricUtilities.logApiCalledFinalPh import static com.android.server.credentials.MetricUtilities.logApiCalledNoUidFinal; import android.annotation.NonNull; +import android.content.ComponentName; import android.credentials.GetCredentialRequest; import android.credentials.ui.UserSelectionDialogResult; import android.util.Slog; @@ -280,6 +281,26 @@ public class RequestSessionMetric { } } + /** + * Used to update metrics when a response is received in a RequestSession. + * + * @param componentName the component name associated with the provider the response is for + */ + public void updateMetricsOnResponseReceived(Map providers, + ComponentName componentName, boolean isPrimary) { + try { + var chosenProviderSession = providers.get(componentName.flattenToString()); + if (chosenProviderSession != null) { + ProviderSessionMetric providerSessionMetric = + chosenProviderSession.getProviderSessionMetric(); + collectChosenMetricViaCandidateTransfer(providerSessionMetric + .getCandidatePhasePerProviderMetric(), isPrimary); + } + } catch (Exception e) { + Slog.i(TAG, "Exception upon candidate to chosen metric transfer: " + e); + } + } + /** * Called by RequestSessions upon chosen metric determination. It's expected that most bits * are transferred here. However, certain new information, such as the selected provider's final @@ -289,10 +310,13 @@ public class RequestSessionMetric { * {@link com.android.internal.util.FrameworkStatsLog} metric generation. * * @param candidatePhaseMetric the componentName to associate with a provider + * @param isPrimary indicates that this chosen provider is the primary provider (or not) */ - public void collectChosenMetricViaCandidateTransfer(CandidatePhaseMetric candidatePhaseMetric) { + public void collectChosenMetricViaCandidateTransfer(CandidatePhaseMetric candidatePhaseMetric, + boolean isPrimary) { try { mChosenProviderFinalPhaseMetric.setChosenUid(candidatePhaseMetric.getCandidateUid()); + mChosenProviderFinalPhaseMetric.setPrimary(isPrimary); mChosenProviderFinalPhaseMetric.setQueryPhaseLatencyMicroseconds( candidatePhaseMetric.getQueryLatencyMicroseconds());