summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Arpan <akaphle@google.com> 2025-03-18 23:13:54 +0000
committer Arpan <akaphle@google.com> 2025-03-20 00:10:46 +0000
commit4fc89d8644cea8052c86044fb79c69b1591b110d (patch)
treeb12b05cc31bae34b3b4171f4ac19577801aeea3d
parent26865aff18a4f89587ca427661b91e957ec49d1c (diff)
[Metrics] Log the Selected Type
This logs the selected credential type, by focusing on the response. This will lose metadata on half-way clicks/mid clicks/etc... - those might be explorable via the list of tapped entries. In the future, depending on product need, adding the rest of the string classtypes can be explored. Bug: 364444783 Test: Stats_d, eventually chained, build Flag: android.credentials.flags.fix_metric_duplication_emits Change-Id: I274692b2d3fe016142ea81c9fe34cbf31aab5566
-rw-r--r--services/credentials/java/com/android/server/credentials/CreateRequestSession.java4
-rw-r--r--services/credentials/java/com/android/server/credentials/GetRequestSession.java7
-rw-r--r--services/credentials/java/com/android/server/credentials/MetricUtilities.java6
-rw-r--r--services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java12
-rw-r--r--services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java15
5 files changed, 42 insertions, 2 deletions
diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
index 9781fb9a1830..e4c214fd93e6 100644
--- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
@@ -27,6 +27,7 @@ import android.credentials.CreateCredentialResponse;
import android.credentials.CredentialManager;
import android.credentials.CredentialProviderInfo;
import android.credentials.ICreateCredentialCallback;
+import android.credentials.flags.Flags;
import android.credentials.selection.ProviderData;
import android.credentials.selection.RequestInfo;
import android.os.CancellationSignal;
@@ -145,6 +146,9 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR
if (response != null) {
mRequestSessionMetric.collectChosenProviderStatus(
ProviderStatusForMetrics.FINAL_SUCCESS.getMetricCode());
+ if (Flags.fixMetricDuplicationEmits()) {
+ mRequestSessionMetric.collectChosenClassType(mClientRequest.getType());
+ }
respondToClientWithResponseAndFinish(response);
} else {
mRequestSessionMetric.collectChosenProviderStatus(
diff --git a/services/credentials/java/com/android/server/credentials/GetRequestSession.java b/services/credentials/java/com/android/server/credentials/GetRequestSession.java
index be36b6c5690b..fd00f6dde815 100644
--- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java
@@ -27,6 +27,7 @@ import android.credentials.GetCredentialException;
import android.credentials.GetCredentialRequest;
import android.credentials.GetCredentialResponse;
import android.credentials.IGetCredentialCallback;
+import android.credentials.flags.Flags;
import android.credentials.selection.ProviderData;
import android.credentials.selection.RequestInfo;
import android.os.Binder;
@@ -146,6 +147,12 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest,
if (response != null) {
mRequestSessionMetric.collectChosenProviderStatus(
ProviderStatusForMetrics.FINAL_SUCCESS.getMetricCode());
+ if (Flags.fixMetricDuplicationEmits()) {
+ if (response.getCredential() != null) {
+ mRequestSessionMetric.collectChosenClassType(response.getCredential()
+ .getType());
+ }
+ }
respondToClientWithResponseAndFinish(response);
} else {
mRequestSessionMetric.collectChosenProviderStatus(
diff --git a/services/credentials/java/com/android/server/credentials/MetricUtilities.java b/services/credentials/java/com/android/server/credentials/MetricUtilities.java
index ac4aac694c3a..92e831913de1 100644
--- a/services/credentials/java/com/android/server/credentials/MetricUtilities.java
+++ b/services/credentials/java/com/android/server/credentials/MetricUtilities.java
@@ -201,7 +201,8 @@ public class MetricUtilities {
finalPhaseMetric.getResponseCollective().getUniqueResponseCounts(),
/* framework_exception_unique_classtype */
finalPhaseMetric.getFrameworkException(),
- /* primary_indicated */ finalPhaseMetric.isPrimary()
+ /* primary_indicated */ finalPhaseMetric.isPrimary(),
+ /* chosen_classtype */ finalPhaseMetric.getChosenClassType()
);
} catch (Exception e) {
Slog.w(TAG, "Unexpected error during final provider uid emit: " + e);
@@ -583,7 +584,8 @@ public class MetricUtilities {
/* primary_indicated */ finalPhaseMetric.isPrimary(),
/* oem_credential_manager_ui_uid */ finalPhaseMetric.getOemUiUid(),
/* fallback_credential_manager_ui_uid */ finalPhaseMetric.getFallbackUiUid(),
- /* oem_ui_usage_status */ finalPhaseMetric.getOemUiUsageStatus()
+ /* oem_ui_usage_status */ finalPhaseMetric.getOemUiUsageStatus(),
+ /* chosen_classtype */ finalPhaseMetric.getChosenClassType()
);
} catch (Exception e) {
Slog.w(TAG, "Unexpected error during final no uid metric logging: " + e);
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 9dd6db6f9d6a..c8f6ba06d020 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java
@@ -83,12 +83,24 @@ public class ChosenProviderFinalPhaseMetric {
// Indicates if this chosen provider was the primary provider, false by default
private boolean mIsPrimary = false;
+ private String mChosenClassType = "";
+
public ChosenProviderFinalPhaseMetric(int sessionIdCaller, int sessionIdProvider) {
mSessionIdCaller = sessionIdCaller;
mSessionIdProvider = sessionIdProvider;
}
+ /* ------------------- Chosen Credential ------------------- */
+
+ public void setChosenClassType(String clickedClassType) {
+ mChosenClassType = clickedClassType;
+ }
+
+ public String getChosenClassType() {
+ return mChosenClassType;
+ }
+
/* ------------------- UID ------------------- */
public int getChosenUid() {
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 619a56846e95..dceef810797a 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java
@@ -246,6 +246,21 @@ public class RequestSessionMetric {
}
/**
+ * This collects the final chosen class type. While it is possible to collect this during
+ * browsing, note this only collects the final tapped bit.
+ *
+ * @param createOrCredentialType the string type to collect when an entry is tapped by the user
+ */
+ public void collectChosenClassType(String createOrCredentialType) {
+ String truncatedType = generateMetricKey(createOrCredentialType, DELTA_EXCEPTION_CUT);
+ try {
+ mChosenProviderFinalPhaseMetric.setChosenClassType(truncatedType);
+ } catch (Exception e) {
+ Slog.i(TAG, "Unexpected error collecting chosen class type metadata: " + e);
+ }
+ }
+
+ /**
* Updates the final phase metric with the designated bit.
*
* @param exceptionBitFinalPhase represents if the final phase provider had an exception