From 9a18aa5070d387ecf5b425e0b9a06a75be53d8c8 Mon Sep 17 00:00:00 2001 From: Arpan Kaphle Date: Thu, 4 May 2023 21:54:10 +0000 Subject: [PATCH] Primary Info in Candidate Metric This adds a bit to indicate which candidate provider is a candidate in the candidate metric, within the flow where we know who the candidates are, but not who the calling app is. Bug: 271135048 Test: Build Test Change-Id: I531c1be0ed67c29ebd01c6d8a52d08ec83144421 --- .../android/server/credentials/MetricUtilities.java | 4 +++- .../android/server/credentials/ProviderSession.java | 4 +++- .../credentials/metrics/CandidatePhaseMetric.java | 10 ++++++++++ .../credentials/metrics/ProviderSessionMetric.java | 5 ++++- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/services/credentials/java/com/android/server/credentials/MetricUtilities.java b/services/credentials/java/com/android/server/credentials/MetricUtilities.java index 35fbc9f899145..64a73c92ca1f0 100644 --- a/services/credentials/java/com/android/server/credentials/MetricUtilities.java +++ b/services/credentials/java/com/android/server/credentials/MetricUtilities.java @@ -307,6 +307,7 @@ public class MetricUtilities { int[] candidateAuthEntryCountList = new int[providerSize]; int[] candidateRemoteEntryCountList = new int[providerSize]; String[] frameworkExceptionList = new String[providerSize]; + boolean[] candidatePrimaryProviderList = new boolean[providerSize]; int index = 0; for (var session : providerSessions) { CandidatePhaseMetric metric = session.mProviderSessionMetric @@ -339,6 +340,7 @@ public class MetricUtilities { candidateRemoteEntryCountList[index] = metric.getResponseCollective() .getCountForEntry(EntryEnum.REMOTE_ENTRY); frameworkExceptionList[index] = metric.getFrameworkException(); + candidatePrimaryProviderList[index] = metric.isPrimary(); index++; } FrameworkStatsLog.write(FrameworkStatsLog.CREDENTIAL_MANAGER_CANDIDATE_PHASE_REPORTED, @@ -372,7 +374,7 @@ public class MetricUtilities { /* api_name */ initialPhaseMetric.getApiName(), /* primary_candidates_indicated */ - DEFAULT_REPEATED_BOOL + candidatePrimaryProviderList ); } catch (Exception e) { Slog.w(TAG, "Unexpected error during candidate provider uid metric emit: " + e); diff --git a/services/credentials/java/com/android/server/credentials/ProviderSession.java b/services/credentials/java/com/android/server/credentials/ProviderSession.java index 068ca79281171..83f21afa1a324 100644 --- a/services/credentials/java/com/android/server/credentials/ProviderSession.java +++ b/services/credentials/java/com/android/server/credentials/ProviderSession.java @@ -214,9 +214,11 @@ public abstract class ProviderSession protected void updateStatusAndInvokeCallback(@NonNull Status status, CredentialsSource source) { setStatus(status); + boolean isPrimary = mProviderInfo != null && mProviderInfo.isPrimary(); mProviderSessionMetric.collectCandidateMetricUpdate(isTerminatingStatus(status), isCompletionStatus(status), mProviderSessionUid, - source == CredentialsSource.AUTH_ENTRY); + /*isAuthEntry*/source == CredentialsSource.AUTH_ENTRY, + /*isPrimary*/isPrimary); mCallbacks.onProviderStatusChanged(status, mComponentName, source); } /** Common method that transfers metrics from the init phase to candidates */ diff --git a/services/credentials/java/com/android/server/credentials/metrics/CandidatePhaseMetric.java b/services/credentials/java/com/android/server/credentials/metrics/CandidatePhaseMetric.java index d9bf4a134adb9..56140f367263a 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/CandidatePhaseMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/CandidatePhaseMetric.java @@ -59,6 +59,8 @@ public class CandidatePhaseMetric { // 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 candidate is a primary provider, false by default + private boolean mIsPrimary = false; public CandidatePhaseMetric(int sessionIdTrackTwo) { mSessionIdProvider = sessionIdTrackTwo; @@ -185,4 +187,12 @@ public class CandidatePhaseMetric { public String getFrameworkException() { return mFrameworkException; } + + public void setPrimary(boolean primary) { + mIsPrimary = primary; + } + + public boolean isPrimary() { + return mIsPrimary; + } } diff --git a/services/credentials/java/com/android/server/credentials/metrics/ProviderSessionMetric.java b/services/credentials/java/com/android/server/credentials/metrics/ProviderSessionMetric.java index 99181c80bbd4f..44d845eaaf43e 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/ProviderSessionMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/ProviderSessionMetric.java @@ -149,14 +149,17 @@ public class ProviderSessionMetric { * @param isFailureStatus indicates the candidate provider sent back a terminated response * @param isCompletionStatus indicates the candidate provider sent back a completion response * @param providerSessionUid the uid of the provider + * @param isPrimary indicates if this candidate provider was the primary provider */ public void collectCandidateMetricUpdate(boolean isFailureStatus, - boolean isCompletionStatus, int providerSessionUid, boolean isAuthEntry) { + boolean isCompletionStatus, int providerSessionUid, boolean isAuthEntry, + boolean isPrimary) { try { if (isAuthEntry) { collectAuthEntryUpdate(isFailureStatus, isCompletionStatus, providerSessionUid); return; } + mCandidatePhasePerProviderMetric.setPrimary(isPrimary); mCandidatePhasePerProviderMetric.setCandidateUid(providerSessionUid); mCandidatePhasePerProviderMetric .setQueryFinishTimeNanoseconds(System.nanoTime());