summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Arpan Kaphle <akaphle@google.com> 2023-04-20 23:48:15 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-04-20 23:48:15 +0000
commit90d2c471badc53e4e4c3d79ba3b5c6776364f422 (patch)
treeec3b79af90c389dbfdea855354c06f3805c9742a
parent38e29af2f3e5c7e0910f6edc796e781958d4274e (diff)
parent40b3810bc2618df89923164acfb4e0ca674f5c44 (diff)
Merge "Collecting query framework exception and origin" into udc-dev
-rw-r--r--services/credentials/java/com/android/server/credentials/MetricUtilities.java22
-rw-r--r--services/credentials/java/com/android/server/credentials/ProviderClearSession.java2
-rw-r--r--services/credentials/java/com/android/server/credentials/ProviderCreateSession.java2
-rw-r--r--services/credentials/java/com/android/server/credentials/ProviderGetSession.java2
-rw-r--r--services/credentials/java/com/android/server/credentials/metrics/ApiName.java4
-rw-r--r--services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java4
-rw-r--r--services/credentials/java/com/android/server/credentials/metrics/CandidatePhaseMetric.java42
-rw-r--r--services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java24
-rw-r--r--services/credentials/java/com/android/server/credentials/metrics/EntryEnum.java4
-rw-r--r--services/credentials/java/com/android/server/credentials/metrics/ProviderSessionMetric.java12
-rw-r--r--services/credentials/java/com/android/server/credentials/metrics/ProviderStatusForMetrics.java4
-rw-r--r--services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java2
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 c07f06b332fb..50e5163cea55 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<String, ProviderSession> 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 9ec0ecd93b3c..8af6b56f881d 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<ClearCredentialS
public void onProviderResponseFailure(int errorCode, Exception exception) {
if (exception instanceof ClearCredentialStateException) {
mProviderException = (ClearCredentialStateException) exception;
+ // TODO(b/271135048) : Decide on exception type length
+ mProviderSessionMetric.collectCandidateFrameworkException(mProviderException.getType());
}
mProviderSessionMetric.collectCandidateExceptionStatus(/*hasException=*/true);
updateStatusAndInvokeCallback(toStatus(errorCode),
diff --git a/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java b/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java
index 09433dbb0c52..520b937d24c5 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java
@@ -155,6 +155,8 @@ public final class ProviderCreateSession extends ProviderSession<
if (exception instanceof CreateCredentialException) {
// Store query phase exception for aggregation with final response
mProviderException = (CreateCredentialException) exception;
+ // TODO(b/271135048) : Decide on exception type length
+ mProviderSessionMetric.collectCandidateFrameworkException(mProviderException.getType());
}
mProviderSessionMetric.collectCandidateExceptionStatus(/*hasException=*/true);
updateStatusAndInvokeCallback(toStatus(errorCode),
diff --git a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java
index 0c2b5633d501..a62d9e805a93 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java
@@ -217,6 +217,8 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
public void onProviderResponseFailure(int errorCode, Exception exception) {
if (exception instanceof GetCredentialException) {
mProviderException = (GetCredentialException) exception;
+ // TODO(b/271135048) : Decide on exception type length
+ mProviderSessionMetric.collectCandidateFrameworkException(mProviderException.getType());
}
mProviderSessionMetric.collectCandidateExceptionStatus(/*hasException=*/true);
updateStatusAndInvokeCallback(toStatus(errorCode),
diff --git a/services/credentials/java/com/android/server/credentials/metrics/ApiName.java b/services/credentials/java/com/android/server/credentials/metrics/ApiName.java
index ce84d9af8c14..b99f28d07f75 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/ApiName.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/ApiName.java
@@ -57,7 +57,7 @@ CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_IS_ENABLED_CREDENT
);
ApiName(int innerMetricCode) {
- this.mInnerMetricCode = innerMetricCode;
+ mInnerMetricCode = innerMetricCode;
}
/**
@@ -66,7 +66,7 @@ CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_IS_ENABLED_CREDENT
* @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/ApiStatus.java b/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java
index 4097765b8736..ece729fe5b32 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java
@@ -32,7 +32,7 @@ public enum ApiStatus {
private final int mInnerMetricCode;
ApiStatus(int innerMetricCode) {
- this.mInnerMetricCode = innerMetricCode;
+ mInnerMetricCode = innerMetricCode;
}
/**
@@ -41,6 +41,6 @@ public enum ApiStatus {
* @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/CandidatePhaseMetric.java b/services/credentials/java/com/android/server/credentials/metrics/CandidatePhaseMetric.java
index 10d4f9c7590e..721d3d782653 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/CandidatePhaseMetric.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/CandidatePhaseMetric.java
@@ -73,6 +73,8 @@ public class CandidatePhaseMetric {
private int mAuthenticationEntryCount = -1;
// Gathered to pass on to chosen provider when required
private final IntArray mAvailableEntries = new IntArray();
+ // The *framework only* exception held by this provider, empty string by default
+ private String mFrameworkException = "";
public CandidatePhaseMetric() {
}
@@ -82,27 +84,27 @@ public class CandidatePhaseMetric {
/* -- Timestamps -- */
public void setServiceBeganTimeNanoseconds(long serviceBeganTimeNanoseconds) {
- this.mServiceBeganTimeNanoseconds = serviceBeganTimeNanoseconds;
+ mServiceBeganTimeNanoseconds = serviceBeganTimeNanoseconds;
}
public void setStartQueryTimeNanoseconds(long startQueryTimeNanoseconds) {
- this.mStartQueryTimeNanoseconds = startQueryTimeNanoseconds;
+ mStartQueryTimeNanoseconds = startQueryTimeNanoseconds;
}
public void setQueryFinishTimeNanoseconds(long queryFinishTimeNanoseconds) {
- this.mQueryFinishTimeNanoseconds = queryFinishTimeNanoseconds;
+ mQueryFinishTimeNanoseconds = queryFinishTimeNanoseconds;
}
public long getServiceBeganTimeNanoseconds() {
- return this.mServiceBeganTimeNanoseconds;
+ return mServiceBeganTimeNanoseconds;
}
public long getStartQueryTimeNanoseconds() {
- return this.mStartQueryTimeNanoseconds;
+ return mStartQueryTimeNanoseconds;
}
public long getQueryFinishTimeNanoseconds() {
- return this.mQueryFinishTimeNanoseconds;
+ return mQueryFinishTimeNanoseconds;
}
/* -- Actual time delta latencies (for local utility) -- */
@@ -111,8 +113,8 @@ public class CandidatePhaseMetric {
* Returns the latency in microseconds for the query phase.
*/
public int getQueryLatencyMicroseconds() {
- return (int) ((this.getQueryFinishTimeNanoseconds()
- - this.getStartQueryTimeNanoseconds()) / 1000);
+ return (int) ((getQueryFinishTimeNanoseconds()
+ - getStartQueryTimeNanoseconds()) / 1000);
}
/* --- Time Stamp Conversion to Microseconds from Reference --- */
@@ -126,32 +128,32 @@ public class CandidatePhaseMetric {
* @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 Query Status ------------ */
public void setProviderQueryStatus(int providerQueryStatus) {
- this.mProviderQueryStatus = providerQueryStatus;
+ mProviderQueryStatus = providerQueryStatus;
}
public int getProviderQueryStatus() {
- return this.mProviderQueryStatus;
+ return mProviderQueryStatus;
}
/* -------------- Candidate Uid ---------------- */
public void setCandidateUid(int candidateUid) {
- this.mCandidateUid = candidateUid;
+ mCandidateUid = candidateUid;
}
public int getCandidateUid() {
- return this.mCandidateUid;
+ return mCandidateUid;
}
/* -------------- Session Id ---------------- */
@@ -254,7 +256,7 @@ public class CandidatePhaseMetric {
* collector
*/
public void addEntry(EntryEnum e) {
- this.mAvailableEntries.add(e.getMetricCode());
+ mAvailableEntries.add(e.getMetricCode());
}
/**
@@ -267,4 +269,14 @@ public class CandidatePhaseMetric {
public List<Integer> 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 2eef19732723..c80cc24fa455 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<Integer> 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<Integer> 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 80f9fdc85a7a..b9125ddf1145 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 76fd4786f9ee..9a88255ce973 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/ProviderSessionMetric.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/ProviderSessionMetric.java
@@ -61,6 +61,18 @@ public class ProviderSessionMetric {
}
/**
+ * 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.
*
* @param isFailureStatus indicates the candidate provider sent back a terminated response
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 a12a6942a5c2..b1e6a4c78fb0 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 18e04df9416a..547c09a625f6 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<String, ProviderSession> providers) {
try {
- logApiCalledCandidatePhase(providers, ++mSequenceCounter);
+ logApiCalledCandidatePhase(providers, ++mSequenceCounter, mInitialPhaseMetric);
} catch (Exception e) {
Log.w(TAG, "Unexpected error during metric logging: " + e);
}