Metric System Cleanup
This fixes any final issues in the metric collection and emission system, including logs. The fixes primarily focus on ensuring the timestamps are properly recorded, the aggregations are done properly for the total canddiate, and that all types and values are recorded or collected as they should be and emitted when they should be. Statuses and TODOs are also fixed here, alongside any final logs. Bug: 271135048 Bug: 270568738 Test: Build, won't submit without E2E Test (No Affect + Validate Metric Emits) Change-Id: I3637bf4a84596ba72bdab9ef225e4e5c77ab0bb6
This commit is contained in:
@@ -93,6 +93,7 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta
|
||||
public void onFinalResponseReceived(
|
||||
ComponentName componentName,
|
||||
Void response) {
|
||||
mRequestSessionMetric.collectUiResponseData(/*uiReturned=*/ true, System.nanoTime());
|
||||
mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName,
|
||||
isPrimaryProviderViaProviderInfo(componentName));
|
||||
respondToClientWithResponseAndFinish(null);
|
||||
|
||||
@@ -64,7 +64,7 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR
|
||||
RequestInfo.TYPE_CREATE,
|
||||
callingAppInfo, enabledProviders, cancellationSignal, startedTimestamp);
|
||||
mRequestSessionMetric.collectCreateFlowInitialMetricInfo(
|
||||
/*origin=*/request.getOrigin() != null);
|
||||
/*origin=*/request.getOrigin() != null, request);
|
||||
mPrimaryProviders = primaryProviders;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,6 @@ import android.os.IBinder;
|
||||
import android.os.Looper;
|
||||
import android.os.ResultReceiver;
|
||||
import android.service.credentials.CredentialProviderInfoFactory;
|
||||
import android.util.Log;
|
||||
import android.util.Slog;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -72,7 +71,6 @@ public class CredentialManagerUi {
|
||||
};
|
||||
|
||||
private void handleUiResult(int resultCode, Bundle resultData) {
|
||||
Log.i("reemademo", "handleUiResult with resultCOde: " + resultCode);
|
||||
|
||||
switch (resultCode) {
|
||||
case UserSelectionDialogResult.RESULT_CODE_DIALOG_COMPLETE_WITH_SELECTION:
|
||||
@@ -86,13 +84,11 @@ public class CredentialManagerUi {
|
||||
}
|
||||
break;
|
||||
case UserSelectionDialogResult.RESULT_CODE_DIALOG_USER_CANCELED:
|
||||
Log.i("reemademo", "RESULT_CODE_DIALOG_USER_CANCELED");
|
||||
|
||||
mStatus = UiStatus.TERMINATED;
|
||||
mCallbacks.onUiCancellation(/* isUserCancellation= */ true);
|
||||
break;
|
||||
case UserSelectionDialogResult.RESULT_CODE_CANCELED_AND_LAUNCHED_SETTINGS:
|
||||
Log.i("reemademo", "RESULT_CODE_CANCELED_AND_LAUNCHED_SETTINGS");
|
||||
|
||||
mStatus = UiStatus.TERMINATED;
|
||||
mCallbacks.onUiCancellation(/* isUserCancellation= */ false);
|
||||
@@ -102,7 +98,6 @@ public class CredentialManagerUi {
|
||||
mCallbacks.onUiSelectorInvocationFailure();
|
||||
break;
|
||||
default:
|
||||
Log.i("reemademo", "Unknown error code returned from the UI");
|
||||
mStatus = UiStatus.IN_PROGRESS;
|
||||
mCallbacks.onUiSelectorInvocationFailure();
|
||||
break;
|
||||
|
||||
@@ -133,6 +133,7 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest,
|
||||
public void onFinalResponseReceived(ComponentName componentName,
|
||||
@Nullable GetCredentialResponse response) {
|
||||
Slog.i(TAG, "onFinalResponseReceived from: " + componentName.flattenToString());
|
||||
mRequestSessionMetric.collectUiResponseData(/*uiReturned=*/ true, System.nanoTime());
|
||||
mRequestSessionMetric.updateMetricsOnResponseReceived(mProviders, componentName,
|
||||
isPrimaryProviderViaProviderInfo(componentName));
|
||||
if (response != null) {
|
||||
|
||||
@@ -39,7 +39,6 @@ import java.util.Map;
|
||||
/**
|
||||
* For all future metric additions, this will contain their names for local usage after importing
|
||||
* from {@link com.android.internal.util.FrameworkStatsLog}.
|
||||
* TODO(b/271135048) - Emit all atoms, including all V4 atoms (specifically the rest of track 1).
|
||||
*/
|
||||
public class MetricUtilities {
|
||||
private static final boolean LOG_FLAG = true;
|
||||
@@ -101,7 +100,9 @@ public class MetricUtilities {
|
||||
*/
|
||||
protected static int getMetricTimestampDifferenceMicroseconds(long t2, long t1) {
|
||||
if (t2 - t1 > Integer.MAX_VALUE) {
|
||||
throw new ArithmeticException("Input timestamps are too far apart and unsupported");
|
||||
Slog.i(TAG, "Input timestamps are too far apart and unsupported, "
|
||||
+ "falling back to default int");
|
||||
return DEFAULT_INT_32;
|
||||
}
|
||||
if (t2 < t1) {
|
||||
Slog.i(TAG, "The timestamps aren't in expected order, falling back to default int");
|
||||
@@ -229,7 +230,7 @@ public class MetricUtilities {
|
||||
authenticationMetric.isAuthReturned()
|
||||
);
|
||||
} catch (Exception e) {
|
||||
Slog.w(TAG, "Unexpected error during candidate get metric logging: " + e);
|
||||
Slog.w(TAG, "Unexpected error during candidate auth metric logging: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,22 +253,18 @@ public class MetricUtilities {
|
||||
}
|
||||
var sessions = providers.values();
|
||||
for (var session : sessions) {
|
||||
try {
|
||||
var metric = session.getProviderSessionMetric()
|
||||
.getCandidatePhasePerProviderMetric();
|
||||
FrameworkStatsLog.write(
|
||||
FrameworkStatsLog.CREDENTIAL_MANAGER_GET_REPORTED,
|
||||
/* session_id */ metric.getSessionIdProvider(),
|
||||
/* sequence_num */ emitSequenceId,
|
||||
/* candidate_provider_uid */ metric.getCandidateUid(),
|
||||
/* response_unique_classtypes */
|
||||
metric.getResponseCollective().getUniqueResponseStrings(),
|
||||
/* per_classtype_counts */
|
||||
metric.getResponseCollective().getUniqueResponseCounts()
|
||||
);
|
||||
} catch (Exception e) {
|
||||
Slog.w(TAG, "Unexpected exception during get metric logging" + e);
|
||||
}
|
||||
var metric = session.getProviderSessionMetric()
|
||||
.getCandidatePhasePerProviderMetric();
|
||||
FrameworkStatsLog.write(
|
||||
FrameworkStatsLog.CREDENTIAL_MANAGER_GET_REPORTED,
|
||||
/* session_id */ metric.getSessionIdProvider(),
|
||||
/* sequence_num */ emitSequenceId,
|
||||
/* candidate_provider_uid */ metric.getCandidateUid(),
|
||||
/* response_unique_classtypes */
|
||||
metric.getResponseCollective().getUniqueResponseStrings(),
|
||||
/* per_classtype_counts */
|
||||
metric.getResponseCollective().getUniqueResponseCounts()
|
||||
);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Slog.w(TAG, "Unexpected error during candidate get metric logging: " + e);
|
||||
@@ -399,7 +396,7 @@ public class MetricUtilities {
|
||||
/* caller_uid */ callingUid,
|
||||
/* api_status */ apiStatus.getMetricCode());
|
||||
} catch (Exception e) {
|
||||
Slog.w(TAG, "Unexpected error during metric logging: " + e);
|
||||
Slog.w(TAG, "Unexpected error during simple v2 metric logging: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -505,7 +502,7 @@ public class MetricUtilities {
|
||||
candidateAggregateMetric.isAuthReturned()
|
||||
);
|
||||
} catch (Exception e) {
|
||||
Slog.w(TAG, "Unexpected error during metric logging: " + e);
|
||||
Slog.w(TAG, "Unexpected error during total candidate metric logging: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -570,7 +567,7 @@ public class MetricUtilities {
|
||||
/* primary_indicated */ finalPhaseMetric.isPrimary()
|
||||
);
|
||||
} catch (Exception e) {
|
||||
Slog.w(TAG, "Unexpected error during metric logging: " + e);
|
||||
Slog.w(TAG, "Unexpected error during final no uid metric logging: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ public final class ProviderCreateSession extends ProviderSession<
|
||||
private static final String TAG = "ProviderCreateSession";
|
||||
|
||||
// Key to be used as an entry key for a save entry
|
||||
private static final String SAVE_ENTRY_KEY = "save_entry_key";
|
||||
public static final String SAVE_ENTRY_KEY = "save_entry_key";
|
||||
// Key to be used as an entry key for a remote entry
|
||||
private static final String REMOTE_ENTRY_KEY = "remote_entry_key";
|
||||
|
||||
@@ -193,11 +193,13 @@ public final class ProviderCreateSession extends ProviderSession<
|
||||
mProviderResponseDataHandler.addResponseContent(response.getCreateEntries(),
|
||||
response.getRemoteCreateEntry());
|
||||
if (mProviderResponseDataHandler.isEmptyResponse(response)) {
|
||||
mProviderSessionMetric.collectCandidateEntryMetrics(response, /*isAuthEntry*/false);
|
||||
mProviderSessionMetric.collectCandidateEntryMetrics(response, /*isAuthEntry*/false,
|
||||
((RequestSession) mCallbacks).mRequestSessionMetric.getInitialPhaseMetric());
|
||||
updateStatusAndInvokeCallback(Status.EMPTY_RESPONSE,
|
||||
/*source=*/ CredentialsSource.REMOTE_PROVIDER);
|
||||
} else {
|
||||
mProviderSessionMetric.collectCandidateEntryMetrics(response, /*isAuthEntry*/false);
|
||||
mProviderSessionMetric.collectCandidateEntryMetrics(response, /*isAuthEntry*/false,
|
||||
((RequestSession) mCallbacks).mRequestSessionMetric.getInitialPhaseMetric());
|
||||
updateStatusAndInvokeCallback(Status.SAVE_ENTRIES_RECEIVED,
|
||||
/*source=*/ CredentialsSource.REMOTE_PROVIDER);
|
||||
}
|
||||
|
||||
@@ -435,7 +435,7 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
|
||||
BeginGetCredentialResponse response = PendingIntentResultHandler
|
||||
.extractResponseContent(providerPendingIntentResponse
|
||||
.getResultData());
|
||||
mProviderSessionMetric.collectCandidateEntryMetrics(response, /*isAuthEntry*/true);
|
||||
mProviderSessionMetric.collectCandidateEntryMetrics(response, /*isAuthEntry*/true, null);
|
||||
if (response != null && !mProviderResponseDataHandler.isEmptyResponse(response)) {
|
||||
addToInitialRemoteResponse(response, /*isInitialResponse=*/ false);
|
||||
// Additional content received is in the form of new response content.
|
||||
@@ -473,12 +473,14 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
|
||||
addToInitialRemoteResponse(response, /*isInitialResponse=*/true);
|
||||
// Log the data.
|
||||
if (mProviderResponseDataHandler.isEmptyResponse(response)) {
|
||||
mProviderSessionMetric.collectCandidateEntryMetrics(response, /*isAuthEntry*/false);
|
||||
mProviderSessionMetric.collectCandidateEntryMetrics(response, /*isAuthEntry*/false,
|
||||
null);
|
||||
updateStatusAndInvokeCallback(Status.EMPTY_RESPONSE,
|
||||
/*source=*/ CredentialsSource.REMOTE_PROVIDER);
|
||||
return;
|
||||
}
|
||||
mProviderSessionMetric.collectCandidateEntryMetrics(response, /*isAuthEntry*/false);
|
||||
mProviderSessionMetric.collectCandidateEntryMetrics(response, /*isAuthEntry*/false,
|
||||
null);
|
||||
updateStatusAndInvokeCallback(Status.CREDENTIALS_RECEIVED,
|
||||
/*source=*/ CredentialsSource.REMOTE_PROVIDER);
|
||||
}
|
||||
|
||||
@@ -215,8 +215,10 @@ public abstract class ProviderSession<T, R>
|
||||
CredentialsSource source) {
|
||||
setStatus(status);
|
||||
boolean isPrimary = mProviderInfo != null && mProviderInfo.isPrimary();
|
||||
mProviderSessionMetric.collectCandidateMetricUpdate(isTerminatingStatus(status),
|
||||
isCompletionStatus(status), mProviderSessionUid,
|
||||
mProviderSessionMetric.collectCandidateMetricUpdate(isTerminatingStatus(status)
|
||||
|| isStatusWaitingForRemoteResponse(status),
|
||||
isCompletionStatus(status) || isUiInvokingStatus(status),
|
||||
mProviderSessionUid,
|
||||
/*isAuthEntry*/source == CredentialsSource.AUTH_ENTRY,
|
||||
/*isPrimary*/isPrimary);
|
||||
mCallbacks.onProviderStatusChanged(status, mComponentName, source);
|
||||
|
||||
@@ -43,9 +43,6 @@ public class BrowsedAuthenticationMetric {
|
||||
// Indicates if this provider returned from the authentication entry query, default false
|
||||
private boolean mAuthReturned = false;
|
||||
|
||||
// TODO(b/271135048) - Match the atom and provide a clean per provider session metric
|
||||
// encapsulation.
|
||||
|
||||
public BrowsedAuthenticationMetric(int sessionIdProvider) {
|
||||
mSessionIdProvider = sessionIdProvider;
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.android.server.credentials.metrics;
|
||||
|
||||
import com.android.server.credentials.MetricUtilities;
|
||||
import com.android.server.credentials.ProviderSession;
|
||||
import com.android.server.credentials.metrics.shared.ResponseCollective;
|
||||
|
||||
@@ -29,7 +30,7 @@ import java.util.Map;
|
||||
*/
|
||||
public class CandidateAggregateMetric {
|
||||
|
||||
private static final String TAG = "CandidateProviderMetric";
|
||||
private static final String TAG = "CandidateTotalMetric";
|
||||
// The session id of this provider metric
|
||||
private final int mSessionIdProvider;
|
||||
// Indicates if this provider returned from the candidate query phase,
|
||||
@@ -74,8 +75,6 @@ public class CandidateAggregateMetric {
|
||||
|
||||
/**
|
||||
* This will take all the candidate data captured and aggregate that information.
|
||||
* TODO(b/271135048) : Add on authentication entry outputs from track 2 here as well once
|
||||
* generated
|
||||
* @param providers the providers associated with the candidate flow
|
||||
*/
|
||||
public void collectAverages(Map<String, ProviderSession> providers) {
|
||||
@@ -88,11 +87,15 @@ public class CandidateAggregateMetric {
|
||||
Map<String, Integer> responseCountQuery = new LinkedHashMap<>();
|
||||
Map<EntryEnum, Integer> entryCountQuery = new LinkedHashMap<>();
|
||||
var providerSessions = providers.values();
|
||||
long min_query_start = Integer.MAX_VALUE;
|
||||
long max_query_end = Integer.MIN_VALUE;
|
||||
long min_query_start = Long.MAX_VALUE;
|
||||
long max_query_end = Long.MIN_VALUE;
|
||||
for (var session : providerSessions) {
|
||||
var sessionMetric = session.getProviderSessionMetric();
|
||||
var candidateMetric = sessionMetric.getCandidatePhasePerProviderMetric();
|
||||
if (candidateMetric.getCandidateUid() == MetricUtilities.DEFAULT_INT_32) {
|
||||
mNumProviders--;
|
||||
continue; // Do not aggregate this one and reduce the size of actual candidates
|
||||
}
|
||||
if (mServiceBeganTimeNanoseconds == -1) {
|
||||
mServiceBeganTimeNanoseconds = candidateMetric.getServiceBeganTimeNanoseconds();
|
||||
}
|
||||
@@ -119,15 +122,17 @@ public class CandidateAggregateMetric {
|
||||
}
|
||||
|
||||
private void collectAuthAggregates(Map<String, ProviderSession> providers) {
|
||||
mNumProviders = providers.size();
|
||||
Map<String, Integer> responseCountAuth = new LinkedHashMap<>();
|
||||
Map<EntryEnum, Integer> entryCountAuth = new LinkedHashMap<>();
|
||||
var providerSessions = providers.values();
|
||||
for (var session : providerSessions) {
|
||||
var sessionMetric = session.getProviderSessionMetric();
|
||||
var authMetrics = sessionMetric.getBrowsedAuthenticationMetric();
|
||||
mNumAuthEntriesTapped += authMetrics.size();
|
||||
for (var authMetric : authMetrics) {
|
||||
if (authMetric.getProviderUid() == MetricUtilities.DEFAULT_INT_32) {
|
||||
continue; // skip this unfilled base auth entry
|
||||
}
|
||||
mNumAuthEntriesTapped++;
|
||||
mAuthReturned = mAuthReturned || authMetric.isAuthReturned();
|
||||
ResponseCollective authCollective = authMetric.getAuthEntryCollective();
|
||||
ResponseCollective.combineTypeCountMaps(responseCountAuth,
|
||||
|
||||
@@ -28,6 +28,8 @@ import static com.android.server.credentials.ProviderGetSession.REMOTE_ENTRY_KEY
|
||||
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.credentials.ProviderCreateSession;
|
||||
|
||||
import java.util.AbstractMap;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -52,6 +54,8 @@ public enum EntryEnum {
|
||||
new AbstractMap.SimpleEntry<>(REMOTE_ENTRY_KEY,
|
||||
REMOTE_ENTRY.mInnerMetricCode),
|
||||
new AbstractMap.SimpleEntry<>(CREDENTIAL_ENTRY_KEY,
|
||||
CREDENTIAL_ENTRY.mInnerMetricCode),
|
||||
new AbstractMap.SimpleEntry<>(ProviderCreateSession.SAVE_ENTRY_KEY,
|
||||
CREDENTIAL_ENTRY.mInnerMetricCode)
|
||||
);
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ import static com.android.server.credentials.MetricUtilities.DELTA_RESPONSES_CUT
|
||||
import static com.android.server.credentials.MetricUtilities.generateMetricKey;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.service.credentials.BeginCreateCredentialResponse;
|
||||
import android.service.credentials.BeginGetCredentialResponse;
|
||||
import android.service.credentials.CredentialEntry;
|
||||
@@ -205,18 +206,22 @@ public class ProviderSessionMetric {
|
||||
*
|
||||
* @param response contains entries and data from the candidate provider responses
|
||||
* @param isAuthEntry indicates if this is an auth entry collection or not
|
||||
* @param initialPhaseMetric for create flows, this helps identify the response type, which
|
||||
* will identify the *type* of create flow, especially important in
|
||||
* track 2. This is expected to be null in get flows.
|
||||
* @param <R> the response type associated with the API flow in progress
|
||||
*/
|
||||
public <R> void collectCandidateEntryMetrics(R response, boolean isAuthEntry) {
|
||||
public <R> void collectCandidateEntryMetrics(R response, boolean isAuthEntry,
|
||||
@Nullable InitialPhaseMetric initialPhaseMetric) {
|
||||
try {
|
||||
if (response instanceof BeginGetCredentialResponse) {
|
||||
beginGetCredentialResponseCollectionCandidateEntryMetrics(
|
||||
(BeginGetCredentialResponse) response, isAuthEntry);
|
||||
} else if (response instanceof BeginCreateCredentialResponse) {
|
||||
beginCreateCredentialResponseCollectionCandidateEntryMetrics(
|
||||
(BeginCreateCredentialResponse) response);
|
||||
(BeginCreateCredentialResponse) response, initialPhaseMetric);
|
||||
} else {
|
||||
Slog.i(TAG, "Your response type is unsupported for metric logging");
|
||||
Slog.i(TAG, "Your response type is unsupported for candidate metric logging");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Slog.i(TAG, "Unexpected error during candidate entry metric logging: " + e);
|
||||
@@ -245,7 +250,6 @@ public class ProviderSessionMetric {
|
||||
String entryKey = generateMetricKey(entry.getType(), DELTA_RESPONSES_CUT);
|
||||
responseCounts.put(entryKey, responseCounts.getOrDefault(entryKey, 0) + 1);
|
||||
});
|
||||
|
||||
ResponseCollective responseCollective = new ResponseCollective(responseCounts, entryCounts);
|
||||
mCandidatePhasePerProviderMetric.setResponseCollective(responseCollective);
|
||||
}
|
||||
@@ -262,19 +266,21 @@ public class ProviderSessionMetric {
|
||||
}
|
||||
|
||||
private void beginCreateCredentialResponseCollectionCandidateEntryMetrics(
|
||||
BeginCreateCredentialResponse response) {
|
||||
BeginCreateCredentialResponse response, InitialPhaseMetric initialPhaseMetric) {
|
||||
Map<EntryEnum, Integer> entryCounts = new LinkedHashMap<>();
|
||||
var createEntries = response.getCreateEntries();
|
||||
int numRemoteEntry = response.getRemoteCreateEntry() != null ? MetricUtilities.ZERO :
|
||||
int numRemoteEntry = response.getRemoteCreateEntry() == null ? MetricUtilities.ZERO :
|
||||
MetricUtilities.UNIT;
|
||||
int numCreateEntries = createEntries.size();
|
||||
entryCounts.put(EntryEnum.REMOTE_ENTRY, numRemoteEntry);
|
||||
entryCounts.put(EntryEnum.CREDENTIAL_ENTRY, numCreateEntries);
|
||||
|
||||
Map<String, Integer> responseCounts = new LinkedHashMap<>();
|
||||
responseCounts.put(MetricUtilities.DEFAULT_STRING, numCreateEntries);
|
||||
// We don't store create response because it's directly related to the request
|
||||
// We do still store the count, however
|
||||
String[] requestStrings = initialPhaseMetric == null ? new String[0] :
|
||||
initialPhaseMetric.getUniqueRequestStrings();
|
||||
if (requestStrings.length > 0) {
|
||||
responseCounts.put(requestStrings[0], initialPhaseMetric.getUniqueRequestCounts()[0]);
|
||||
}
|
||||
|
||||
ResponseCollective responseCollective = new ResponseCollective(responseCounts, entryCounts);
|
||||
mCandidatePhasePerProviderMetric.setResponseCollective(responseCollective);
|
||||
|
||||
@@ -26,13 +26,17 @@ import static com.android.server.credentials.MetricUtilities.logApiCalledCandida
|
||||
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 static com.android.server.credentials.metrics.ApiName.GET_CREDENTIAL;
|
||||
import static com.android.server.credentials.metrics.ApiName.GET_CREDENTIAL_VIA_REGISTRY;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.ComponentName;
|
||||
import android.credentials.CreateCredentialRequest;
|
||||
import android.credentials.GetCredentialRequest;
|
||||
import android.credentials.ui.UserSelectionDialogResult;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.credentials.MetricUtilities;
|
||||
import com.android.server.credentials.ProviderSession;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -112,7 +116,7 @@ public class RequestSessionMetric {
|
||||
mInitialPhaseMetric.setCallerUid(mCallingUid);
|
||||
mInitialPhaseMetric.setApiName(metricCode);
|
||||
} catch (Exception e) {
|
||||
Slog.i(TAG, "Unexpected error collecting initial metrics: " + e);
|
||||
Slog.i(TAG, "Unexpected error collecting initial phase metric start info: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -177,9 +181,12 @@ public class RequestSessionMetric {
|
||||
*
|
||||
* @param origin indicates if an origin was passed in or not
|
||||
*/
|
||||
public void collectCreateFlowInitialMetricInfo(boolean origin) {
|
||||
public void collectCreateFlowInitialMetricInfo(boolean origin,
|
||||
CreateCredentialRequest request) {
|
||||
try {
|
||||
mInitialPhaseMetric.setOriginSpecified(origin);
|
||||
mInitialPhaseMetric.setRequestCounts(Map.of(generateMetricKey(request.getType(),
|
||||
DELTA_RESPONSES_CUT), MetricUtilities.UNIT));
|
||||
} catch (Exception e) {
|
||||
Slog.i(TAG, "Unexpected error collecting create flow metric: " + e);
|
||||
}
|
||||
@@ -195,7 +202,7 @@ public class RequestSessionMetric {
|
||||
0) + 1);
|
||||
});
|
||||
} catch (Exception e) {
|
||||
Slog.i(TAG, "Unexpected error during get request metric logging: " + e);
|
||||
Slog.i(TAG, "Unexpected error during get request count map metric logging: " + e);
|
||||
}
|
||||
return uniqueRequestCounts;
|
||||
}
|
||||
@@ -210,7 +217,7 @@ public class RequestSessionMetric {
|
||||
mInitialPhaseMetric.setOriginSpecified(request.getOrigin() != null);
|
||||
mInitialPhaseMetric.setRequestCounts(getRequestCountMap(request));
|
||||
} catch (Exception e) {
|
||||
Slog.i(TAG, "Unexpected error collecting get flow metric: " + e);
|
||||
Slog.i(TAG, "Unexpected error collecting get flow initial metric: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -277,7 +284,7 @@ public class RequestSessionMetric {
|
||||
mChosenProviderFinalPhaseMetric.setChosenProviderStatus(
|
||||
finalStatus.getMetricCode());
|
||||
} catch (Exception e) {
|
||||
Slog.i(TAG, "Unexpected error during metric logging: " + e);
|
||||
Slog.i(TAG, "Unexpected error during final phase provider status metric logging: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -367,7 +374,11 @@ public class RequestSessionMetric {
|
||||
public void logCandidatePhaseMetrics(Map<String, ProviderSession> providers) {
|
||||
try {
|
||||
logApiCalledCandidatePhase(providers, ++mSequenceCounter, mInitialPhaseMetric);
|
||||
logApiCalledCandidateGetMetric(providers, mSequenceCounter);
|
||||
if (mInitialPhaseMetric.getApiName() == GET_CREDENTIAL.getMetricCode()
|
||||
|| mInitialPhaseMetric.getApiName() == GET_CREDENTIAL_VIA_REGISTRY
|
||||
.getMetricCode()) {
|
||||
logApiCalledCandidateGetMetric(providers, mSequenceCounter);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Slog.i(TAG, "Unexpected error during candidate metric emit: " + e);
|
||||
}
|
||||
@@ -405,7 +416,7 @@ public class RequestSessionMetric {
|
||||
}
|
||||
logApiCalledAuthenticationMetric(browsedAuthenticationMetric, ++mSequenceCounter);
|
||||
} catch (Exception e) {
|
||||
Slog.i(TAG, "Unexpected error during metric logging: " + e);
|
||||
Slog.i(TAG, "Unexpected error during auth entry metric emit: " + e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.android.server.credentials.metrics.shared;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
|
||||
import com.android.server.credentials.MetricUtilities;
|
||||
import com.android.server.credentials.metrics.EntryEnum;
|
||||
|
||||
import java.util.Collections;
|
||||
@@ -121,7 +122,7 @@ public class ResponseCollective {
|
||||
* @return a count of this particular entry enum stored by this provider
|
||||
*/
|
||||
public int getCountForEntry(EntryEnum e) {
|
||||
return mEntryCounts.get(e);
|
||||
return mEntryCounts.getOrDefault(e, MetricUtilities.ZERO);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -167,7 +168,7 @@ public class ResponseCollective {
|
||||
public static <T> Map<T, Integer> combineTypeCountMaps(Map<T, Integer> first,
|
||||
Map<T, Integer> second) {
|
||||
for (T response : second.keySet()) {
|
||||
first.merge(response, first.getOrDefault(response, 0), Integer::sum);
|
||||
first.put(response, first.getOrDefault(response, 0) + second.get(response));
|
||||
}
|
||||
return first;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user