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); }