From 40b3810bc2618df89923164acfb4e0ca674f5c44 Mon Sep 17 00:00:00 2001 From: Arpan Kaphle Date: Mon, 17 Apr 2023 19:10:26 +0000 Subject: [PATCH] Collecting query framework exception and origin This collects, for the candidate phase, specifically for Track 2 (but this code will collect for both Tracks 1 and 2, with 1 just requiring aggregators/totals), information about the origin and if a framework exception occured or not. The length of the exception strings are still to be decided by the team and this CL should be another place to discuss that. Further E2E testing may also give good clarifications. Bug: 271135048 Test: Build and E2E Test in Progress (Won't Submit till done) Change-Id: Ic7baac708f64c9eea5eaca8c3426fb05286d0c33 --- .../server/credentials/MetricUtilities.java | 22 ++++++---- .../credentials/ProviderClearSession.java | 2 + .../credentials/ProviderCreateSession.java | 2 + .../credentials/ProviderGetSession.java | 2 + .../server/credentials/metrics/ApiName.java | 4 +- .../server/credentials/metrics/ApiStatus.java | 4 +- .../metrics/CandidatePhaseMetric.java | 42 ++++++++++++------- .../ChosenProviderFinalPhaseMetric.java | 24 +++++------ .../server/credentials/metrics/EntryEnum.java | 4 +- .../metrics/ProviderSessionMetric.java | 12 ++++++ .../metrics/ProviderStatusForMetrics.java | 4 +- .../metrics/RequestSessionMetric.java | 2 +- 12 files changed, 81 insertions(+), 43 deletions(-) diff --git a/services/credentials/java/com/android/server/credentials/MetricUtilities.java b/services/credentials/java/com/android/server/credentials/MetricUtilities.java index c07f06b332fb8..50e5163cea55c 100644 --- a/services/credentials/java/com/android/server/credentials/MetricUtilities.java +++ b/services/credentials/java/com/android/server/credentials/MetricUtilities.java @@ -178,9 +178,11 @@ public class MetricUtilities { * * @param providers a map with known providers and their held metric objects * @param emitSequenceId an emitted sequence id for the current session + * @param initialPhaseMetric contains initial phase data to avoid repetition for candidate + * phase, track 2, logging */ public static void logApiCalledCandidatePhase(Map providers, - int emitSequenceId) { + int emitSequenceId, InitialPhaseMetric initialPhaseMetric) { try { if (!LOG_FLAG) { return; @@ -200,6 +202,7 @@ public class MetricUtilities { int[] candidateActionEntryCountList = new int[providerSize]; int[] candidateAuthEntryCountList = new int[providerSize]; int[] candidateRemoteEntryCountList = new int[providerSize]; + String[] frameworkExceptionList = new String[providerSize]; int index = 0; for (var session : providerSessions) { CandidatePhaseMetric metric = session.mProviderSessionMetric @@ -225,7 +228,7 @@ public class MetricUtilities { candidateActionEntryCountList[index] = metric.getActionEntryCount(); candidateAuthEntryCountList[index] = metric.getAuthenticationEntryCount(); candidateRemoteEntryCountList[index] = metric.getRemoteEntryCount(); - // frameworkExceptionList[index] = metric.getFrameworkException(); + frameworkExceptionList[index] = metric.getFrameworkException(); index++; } FrameworkStatsLog.write(FrameworkStatsLog.CREDENTIAL_MANAGER_CANDIDATE_PHASE_REPORTED, @@ -246,11 +249,16 @@ public class MetricUtilities { /* candidate_provider_credential_entry_type_count */ candidateCredentialTypeCountList, /* candidate_provider_remote_entry_count */ candidateRemoteEntryCountList, - /* candidate_provider_authentication_entry_count */ candidateAuthEntryCountList, - DEFAULT_REPEATED_STR, - false, - DEFAULT_REPEATED_STR, - DEFAULT_REPEATED_INT_32 + /* candidate_provider_authentication_entry_count */ + candidateAuthEntryCountList, + /* framework_exception_per_provider */ + frameworkExceptionList, + /* origin_specified originSpecified */ + initialPhaseMetric.isOriginSpecified(), + /* request_unique_classtypes */ + initialPhaseMetric.getUniqueRequestStrings(), + /* per_classtype_counts */ + initialPhaseMetric.getUniqueRequestCounts() ); } catch (Exception e) { Log.w(TAG, "Unexpected error during metric logging: " + e); diff --git a/services/credentials/java/com/android/server/credentials/ProviderClearSession.java b/services/credentials/java/com/android/server/credentials/ProviderClearSession.java index 9ec0ecd93b3c0..8af6b56f881dd 100644 --- a/services/credentials/java/com/android/server/credentials/ProviderClearSession.java +++ b/services/credentials/java/com/android/server/credentials/ProviderClearSession.java @@ -91,6 +91,8 @@ public final class ProviderClearSession extends ProviderSession getAvailableEntries() { return Arrays.stream(mAvailableEntries.toArray()).boxed().collect(Collectors.toList()); } + + /* ------ Framework Exception for this Candidate ------ */ + + public void setFrameworkException(String frameworkException) { + mFrameworkException = frameworkException; + } + + public String getFrameworkException() { + return mFrameworkException; + } } 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 2eef197327237..c80cc24fa455b 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java @@ -138,8 +138,8 @@ public class ChosenProviderFinalPhaseMetric { } public int getUiPhaseLatencyMicroseconds() { - return (int) ((this.mUiCallEndTimeNanoseconds - - this.mUiCallStartTimeNanoseconds) / 1000); + return (int) ((mUiCallEndTimeNanoseconds + - mUiCallStartTimeNanoseconds) / 1000); } /** @@ -147,8 +147,8 @@ public class ChosenProviderFinalPhaseMetric { * start time to be provided, such as from {@link CandidatePhaseMetric}. */ public int getEntireProviderLatencyMicroseconds() { - return (int) ((this.mFinalFinishTimeNanoseconds - - this.mQueryStartTimeNanoseconds) / 1000); + return (int) ((mFinalFinishTimeNanoseconds + - mQueryStartTimeNanoseconds) / 1000); } /** @@ -156,8 +156,8 @@ public class ChosenProviderFinalPhaseMetric { * start time to be provided, such as from {@link InitialPhaseMetric}. */ public int getEntireLatencyMicroseconds() { - return (int) ((this.mFinalFinishTimeNanoseconds - - this.mServiceBeganTimeNanoseconds) / 1000); + return (int) ((mFinalFinishTimeNanoseconds + - mServiceBeganTimeNanoseconds) / 1000); } /* ----- Timestamps for Latency ----- */ @@ -183,11 +183,11 @@ public class ChosenProviderFinalPhaseMetric { } public void setUiCallStartTimeNanoseconds(long uiCallStartTimeNanoseconds) { - this.mUiCallStartTimeNanoseconds = uiCallStartTimeNanoseconds; + mUiCallStartTimeNanoseconds = uiCallStartTimeNanoseconds; } public void setUiCallEndTimeNanoseconds(long uiCallEndTimeNanoseconds) { - this.mUiCallEndTimeNanoseconds = uiCallEndTimeNanoseconds; + mUiCallEndTimeNanoseconds = uiCallEndTimeNanoseconds; } public void setFinalFinishTimeNanoseconds(long finalFinishTimeNanoseconds) { @@ -229,12 +229,12 @@ public class ChosenProviderFinalPhaseMetric { * @return the microsecond integer timestamp from service start to query began */ public int getTimestampFromReferenceStartMicroseconds(long specificTimestamp) { - if (specificTimestamp < this.mServiceBeganTimeNanoseconds) { + if (specificTimestamp < mServiceBeganTimeNanoseconds) { Log.i(TAG, "The timestamp is before service started, falling back to default int"); return MetricUtilities.DEFAULT_INT_32; } return (int) ((specificTimestamp - - this.mServiceBeganTimeNanoseconds) / 1000); + - mServiceBeganTimeNanoseconds) / 1000); } /* ----------- Provider Status -------------- */ @@ -334,7 +334,7 @@ public class ChosenProviderFinalPhaseMetric { * chosen phase in a semantically correct way. */ public void setAvailableEntries(List entries) { - this.mAvailableEntries = new ArrayList<>(entries); // no alias copy + mAvailableEntries = new ArrayList<>(entries); // no alias copy } /** @@ -345,7 +345,7 @@ public class ChosenProviderFinalPhaseMetric { * candidate phase. */ public List getAvailableEntries() { - return new ArrayList<>(this.mAvailableEntries); // no alias copy + return new ArrayList<>(mAvailableEntries); // no alias copy } /* -------------- Has Exception ---------------- */ diff --git a/services/credentials/java/com/android/server/credentials/metrics/EntryEnum.java b/services/credentials/java/com/android/server/credentials/metrics/EntryEnum.java index 80f9fdc85a7ac..b9125ddf11452 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/EntryEnum.java +++ b/services/credentials/java/com/android/server/credentials/metrics/EntryEnum.java @@ -56,7 +56,7 @@ public enum EntryEnum { ); EntryEnum(int innerMetricCode) { - this.mInnerMetricCode = innerMetricCode; + mInnerMetricCode = innerMetricCode; } /** @@ -65,7 +65,7 @@ public enum EntryEnum { * @return a code corresponding to the west world metric name */ public int getMetricCode() { - return this.mInnerMetricCode; + return mInnerMetricCode; } /** 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 76fd4786f9eec..9a88255ce973c 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/ProviderSessionMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/ProviderSessionMetric.java @@ -60,6 +60,18 @@ public class ProviderSessionMetric { mCandidatePhasePerProviderMetric.setHasException(hasException); } + /** + * Collects the framework only exception encountered in a candidate flow. + * @param exceptionType the string, cut to desired length, of the exception type + */ + public void collectCandidateFrameworkException(String exceptionType) { + try { + mCandidatePhasePerProviderMetric.setFrameworkException(exceptionType); + } catch (Exception e) { + Log.w(TAG, "Unexpected error during metric logging: " + e); + } + } + /** * Used to collect metrics at the update stage when a candidate provider gives back an update. * diff --git a/services/credentials/java/com/android/server/credentials/metrics/ProviderStatusForMetrics.java b/services/credentials/java/com/android/server/credentials/metrics/ProviderStatusForMetrics.java index a12a6942a5c23..b1e6a4c78fb07 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/ProviderStatusForMetrics.java +++ b/services/credentials/java/com/android/server/credentials/metrics/ProviderStatusForMetrics.java @@ -38,7 +38,7 @@ public enum ProviderStatusForMetrics { private final int mInnerMetricCode; ProviderStatusForMetrics(int innerMetricCode) { - this.mInnerMetricCode = innerMetricCode; + mInnerMetricCode = innerMetricCode; } /** @@ -47,6 +47,6 @@ public enum ProviderStatusForMetrics { * @return a code corresponding to the west world metric name */ public int getMetricCode() { - return this.mInnerMetricCode; + return mInnerMetricCode; } } 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 18e04df9416ae..547c09a625f65 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java @@ -324,7 +324,7 @@ public class RequestSessionMetric { */ public void logCandidatePhaseMetrics(Map providers) { try { - logApiCalledCandidatePhase(providers, ++mSequenceCounter); + logApiCalledCandidatePhase(providers, ++mSequenceCounter, mInitialPhaseMetric); } catch (Exception e) { Log.w(TAG, "Unexpected error during metric logging: " + e); }