From 59f28d4865c6ddd6f5d8cb68a3e7873924218587 Mon Sep 17 00:00:00 2001 From: Arpan Kaphle Date: Mon, 1 May 2023 01:25:10 +0000 Subject: [PATCH] Sets up Final Phase Emit for Calling App Track When we know the calling app, this sets up the final phase emit, where we do not know the providers. The session ID is properly transferred and different. We call this the 'track one' emit for the final phase. Bug: 271135048 Test: Build and won't submit without E2E test. Change-Id: If8cf0831f49eec7171c549fab1db471825fe6282 --- .../credentials/ClearRequestSession.java | 11 ++- .../credentials/CreateRequestSession.java | 10 ++- .../server/credentials/GetRequestSession.java | 10 ++- .../server/credentials/MetricUtilities.java | 74 ++++++++++++++++++- .../server/credentials/RequestSession.java | 3 +- .../metrics/BrowsedAuthenticationMetric.java | 11 +-- .../metrics/CandidateAggregateMetric.java | 10 +-- .../metrics/CandidatePhaseMetric.java | 10 +-- .../ChosenProviderFinalPhaseMetric.java | 20 +++-- .../metrics/InitialPhaseMetric.java | 10 +-- .../metrics/RequestSessionMetric.java | 6 +- 11 files changed, 132 insertions(+), 43 deletions(-) diff --git a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java index e9efe7eb62472..e3d4c224f1fda 100644 --- a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java @@ -30,6 +30,8 @@ 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; @@ -93,9 +95,12 @@ public final class ClearRequestSession extends RequestSession browsingPhaseMetrics, int apiStatus, + int emitSequenceId) { + try { + if (!LOG_FLAG) { + return; + } + int browsedSize = browsingPhaseMetrics.size(); + int[] browsedClickedEntries = new int[browsedSize]; + int[] browsedProviderUid = new int[browsedSize]; + int index = 0; + for (CandidateBrowsingPhaseMetric metric : browsingPhaseMetrics) { + browsedClickedEntries[index] = metric.getEntryEnum(); + browsedProviderUid[index] = metric.getProviderUid(); + index++; + } + FrameworkStatsLog.write(FrameworkStatsLog.CREDENTIAL_MANAGER_FINALNOUID_REPORTED, + /* session_id */ finalPhaseMetric.getSessionIdCaller(), + /* sequence_num */ emitSequenceId, + /* ui_returned_final_start */ finalPhaseMetric.isUiReturned(), + /* chosen_provider_query_start_timestamp_microseconds */ + finalPhaseMetric.getTimestampFromReferenceStartMicroseconds(finalPhaseMetric + .getQueryStartTimeNanoseconds()), + /* chosen_provider_query_end_timestamp_microseconds */ + finalPhaseMetric.getTimestampFromReferenceStartMicroseconds(finalPhaseMetric + .getQueryEndTimeNanoseconds()), + /* chosen_provider_ui_invoked_timestamp_microseconds */ + finalPhaseMetric.getTimestampFromReferenceStartMicroseconds(finalPhaseMetric + .getUiCallStartTimeNanoseconds()), + /* chosen_provider_ui_finished_timestamp_microseconds */ + finalPhaseMetric.getTimestampFromReferenceStartMicroseconds(finalPhaseMetric + .getUiCallEndTimeNanoseconds()), + /* chosen_provider_finished_timestamp_microseconds */ + finalPhaseMetric.getTimestampFromReferenceStartMicroseconds(finalPhaseMetric + .getFinalFinishTimeNanoseconds()), + /* chosen_provider_status */ finalPhaseMetric.getChosenProviderStatus(), + /* chosen_provider_has_exception */ finalPhaseMetric.isHasException(), + /* unique_entries */ + finalPhaseMetric.getResponseCollective().getUniqueEntries(), + /* per_entry_counts */ + finalPhaseMetric.getResponseCollective().getUniqueEntryCounts(), + /* unique_response_classtypes */ + finalPhaseMetric.getResponseCollective().getUniqueResponseStrings(), + /* per_classtype_counts */ + finalPhaseMetric.getResponseCollective().getUniqueResponseCounts(), + /* framework_exception_unique_classtype */ + finalPhaseMetric.getFrameworkException(), + /* clicked_entries */ browsedClickedEntries, + /* provider_of_clicked_entry */ browsedProviderUid, + /* api_status */ apiStatus, + /* primary_indicated */ false + ); + } catch (Exception e) { + Slog.w(TAG, "Unexpected error during metric logging: " + e); + } + } + } diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java index fb7aef0b7bd1c..a41b5713ee145 100644 --- a/services/credentials/java/com/android/server/credentials/RequestSession.java +++ b/services/credentials/java/com/android/server/credentials/RequestSession.java @@ -138,8 +138,7 @@ abstract class RequestSession implements CredentialManagerUi.Credential mRequestSessionMetric = new RequestSessionMetric(mUniqueSessionInteger, MetricUtilities.getHighlyUniqueInteger()); mRequestSessionMetric.collectInitialPhaseMetricInfo(timestampStarted, - mCallingUid, ApiName.getMetricCodeFromRequestInfo(mRequestType), - mUniqueSessionInteger); + mCallingUid, ApiName.getMetricCodeFromRequestInfo(mRequestType)); setCancellationListener(); } diff --git a/services/credentials/java/com/android/server/credentials/metrics/BrowsedAuthenticationMetric.java b/services/credentials/java/com/android/server/credentials/metrics/BrowsedAuthenticationMetric.java index 20e33738b6e42..51e86d51acdfd 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/BrowsedAuthenticationMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/BrowsedAuthenticationMetric.java @@ -21,15 +21,16 @@ package com.android.server.credentials.metrics; * Contains information about what was collected from the authentication entry output. */ public class BrowsedAuthenticationMetric { - private final int mSessionIdTrackTwo; + // The session id of this provider known flow related metric + private final int mSessionIdProvider; // TODO(b/271135048) - Match the atom and provide a clean per provider session metric // encapsulation. - public BrowsedAuthenticationMetric(int sessionIdTrackTwo) { - mSessionIdTrackTwo = sessionIdTrackTwo; + public BrowsedAuthenticationMetric(int sessionIdProvider) { + mSessionIdProvider = sessionIdProvider; } - public int getSessionIdTrackTwo() { - return mSessionIdTrackTwo; + public int getSessionIdProvider() { + return mSessionIdProvider; } } diff --git a/services/credentials/java/com/android/server/credentials/metrics/CandidateAggregateMetric.java b/services/credentials/java/com/android/server/credentials/metrics/CandidateAggregateMetric.java index acf608447c64a..08e75837a2748 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/CandidateAggregateMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/CandidateAggregateMetric.java @@ -27,8 +27,8 @@ import java.util.Map; public class CandidateAggregateMetric { private static final String TAG = "CandidateProviderMetric"; - // The session id of this provider, default set to -1 - private final int mSessionId; + // The session id of this provider metric + private final int mSessionIdProvider; // Indicates if this provider returned from the query phase, default false private boolean mQueryReturned = false; // Indicates the total number of providers this aggregate captures information for, default 0 @@ -37,11 +37,11 @@ public class CandidateAggregateMetric { private int mNumAuthEntriesTapped = 0; public CandidateAggregateMetric(int sessionIdTrackOne) { - mSessionId = sessionIdTrackOne; + mSessionIdProvider = sessionIdTrackOne; } - public int getSessionId() { - return mSessionId; + public int getSessionIdProvider() { + return mSessionIdProvider; } /** 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 9d7268f180e6e..d9bf4a134adb9 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/CandidatePhaseMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/CandidatePhaseMetric.java @@ -32,8 +32,8 @@ import java.util.Map; public class CandidatePhaseMetric { private static final String TAG = "CandidateProviderMetric"; - // The session id of this provider, default set to -1 - private final int mSessionIdTrackTwo; + // The session id of this provider metric + private final int mSessionIdProvider; // Indicates if this provider returned from the query phase, default false private boolean mQueryReturned = false; @@ -61,7 +61,7 @@ public class CandidatePhaseMetric { private ResponseCollective mResponseCollective = new ResponseCollective(Map.of(), Map.of()); public CandidatePhaseMetric(int sessionIdTrackTwo) { - mSessionIdTrackTwo = sessionIdTrackTwo; + mSessionIdProvider = sessionIdTrackTwo; } /* ---------- Latencies ---------- */ @@ -143,8 +143,8 @@ public class CandidatePhaseMetric { /* -------------- Session Id ---------------- */ - public int getSessionIdTrackTwo() { - return mSessionIdTrackTwo; + public int getSessionIdProvider() { + return mSessionIdProvider; } /* -------------- Query Returned Status ---------------- */ 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 7e9c8baa564cc..e8af86012aaf9 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java @@ -34,10 +34,10 @@ public class ChosenProviderFinalPhaseMetric { private static final String TAG = "ChosenFinalPhaseMetric"; // The session id associated with this API call, used to unite split emits, for the flow // where we know the calling app - private final int mSessionIdTrackOne; + private final int mSessionIdCaller; // The session id associated with this API call, used to unite split emits, for the flow // where we know the provider apps - private final int mSessionIdTrackTwo; + private final int mSessionIdProvider; // Reveals if the UI was returned, false by default private boolean mUiReturned = false; private int mChosenUid = -1; @@ -78,9 +78,9 @@ public class ChosenProviderFinalPhaseMetric { private ResponseCollective mResponseCollective = new ResponseCollective(Map.of(), Map.of()); - public ChosenProviderFinalPhaseMetric(int sessionIdTrackOne, int sessionIdTrackTwo) { - mSessionIdTrackOne = sessionIdTrackOne; - mSessionIdTrackTwo = sessionIdTrackTwo; + public ChosenProviderFinalPhaseMetric(int sessionIdCaller, int sessionIdProvider) { + mSessionIdCaller = sessionIdCaller; + mSessionIdProvider = sessionIdProvider; } /* ------------------- UID ------------------- */ @@ -243,8 +243,8 @@ public class ChosenProviderFinalPhaseMetric { /* ----------- Session ID -------------- */ - public int getSessionIdTrackTwo() { - return mSessionIdTrackTwo; + public int getSessionIdProvider() { + return mSessionIdProvider; } /* ----------- UI Returned Successfully -------------- */ @@ -286,4 +286,10 @@ public class ChosenProviderFinalPhaseMetric { public String getFrameworkException() { return mFrameworkException; } + + /* -------------- Session ID for Track One (Known Calling App) ---------------- */ + + public int getSessionIdCaller() { + return mSessionIdCaller; + } } diff --git a/services/credentials/java/com/android/server/credentials/metrics/InitialPhaseMetric.java b/services/credentials/java/com/android/server/credentials/metrics/InitialPhaseMetric.java index eb88d37639436..8e965e3e5ba5d 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/InitialPhaseMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/InitialPhaseMetric.java @@ -32,8 +32,8 @@ public class InitialPhaseMetric { private int mApiName = ApiName.UNKNOWN.getMetricCode(); // The caller uid of the calling application, default to -1 private int mCallerUid = -1; - // The session id to unite multiple atom emits, default to -1 - private final int mSessionId; + // The session id to unite multiple atom emits + private final int mSessionIdCaller; // Raw timestamps in nanoseconds, *the only* one logged as such (i.e. 64 bits) since it is a // reference point. @@ -51,7 +51,7 @@ public class InitialPhaseMetric { public InitialPhaseMetric(int sessionIdTrackOne) { - mSessionId = sessionIdTrackOne; + mSessionIdCaller = sessionIdTrackOne; } /* ---------- Latencies ---------- */ @@ -106,8 +106,8 @@ public class InitialPhaseMetric { /* ------ SessionId ------ */ - public int getSessionId() { - return mSessionId; + public int getSessionIdCaller() { + return mSessionIdCaller; } /* ------ Count Request Class Types ------ */ 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 a399b1935accf..03ffe23f98866 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java @@ -21,6 +21,7 @@ import static com.android.server.credentials.MetricUtilities.DELTA_RESPONSES_CUT import static com.android.server.credentials.MetricUtilities.generateMetricKey; import static com.android.server.credentials.MetricUtilities.logApiCalledCandidatePhase; import static com.android.server.credentials.MetricUtilities.logApiCalledFinalPhase; +import static com.android.server.credentials.MetricUtilities.logApiCalledNoUidFinal; import android.annotation.NonNull; import android.credentials.GetCredentialRequest; @@ -103,7 +104,7 @@ public class RequestSessionMetric { * known flow */ public void collectInitialPhaseMetricInfo(long timestampStarted, - int mCallingUid, int metricCode, int callingAppFlowUniqueInt) { + int mCallingUid, int metricCode) { try { mInitialPhaseMetric.setCredentialServiceStartedTimeNanoseconds(timestampStarted); mInitialPhaseMetric.setCallerUid(mCallingUid); @@ -371,6 +372,9 @@ public class RequestSessionMetric { logApiCalledFinalPhase(mChosenProviderFinalPhaseMetric, mCandidateBrowsingPhaseMetric, apiStatus, ++mSequenceCounter); + logApiCalledNoUidFinal(mChosenProviderFinalPhaseMetric, mCandidateBrowsingPhaseMetric, + apiStatus, + ++mSequenceCounter); } catch (Exception e) { Slog.i(TAG, "Unexpected error during final metric emit: " + e); }