MediaMetrics: Implement AudioTrack status logging
Convert error field to status field to be more generic.
Incorporate the HeatMap to track general item status.
Test: atest AudioTrackTest#testBuilderError
Test: adb shell dumpsys media.metrics
Bug: 199763036
Change-Id: I53f3064e614d7e49bed3bf63cc5e6faf19684d2f
diff --git a/media/libmediametrics/MediaMetricsItem.cpp b/media/libmediametrics/MediaMetricsItem.cpp
index 36ab8c3..57fc49d 100644
--- a/media/libmediametrics/MediaMetricsItem.cpp
+++ b/media/libmediametrics/MediaMetricsItem.cpp
@@ -57,19 +57,19 @@
// This may be found in frameworks/av/media/libmediametrics/include/MediaMetricsConstants.h
static std::unordered_map<std::string, int32_t> map{
{"", NO_ERROR},
- {AMEDIAMETRICS_PROP_ERROR_VALUE_OK, NO_ERROR},
- {AMEDIAMETRICS_PROP_ERROR_VALUE_ARGUMENT, BAD_VALUE},
- {AMEDIAMETRICS_PROP_ERROR_VALUE_IO, DEAD_OBJECT},
- {AMEDIAMETRICS_PROP_ERROR_VALUE_MEMORY, NO_MEMORY},
- {AMEDIAMETRICS_PROP_ERROR_VALUE_SECURITY, PERMISSION_DENIED},
- {AMEDIAMETRICS_PROP_ERROR_VALUE_STATE, INVALID_OPERATION},
- {AMEDIAMETRICS_PROP_ERROR_VALUE_TIMEOUT, WOULD_BLOCK},
- {AMEDIAMETRICS_PROP_ERROR_VALUE_UNKNOWN, UNKNOWN_ERROR},
+ {AMEDIAMETRICS_PROP_STATUS_VALUE_OK, NO_ERROR},
+ {AMEDIAMETRICS_PROP_STATUS_VALUE_ARGUMENT, BAD_VALUE},
+ {AMEDIAMETRICS_PROP_STATUS_VALUE_IO, DEAD_OBJECT},
+ {AMEDIAMETRICS_PROP_STATUS_VALUE_MEMORY, NO_MEMORY},
+ {AMEDIAMETRICS_PROP_STATUS_VALUE_SECURITY, PERMISSION_DENIED},
+ {AMEDIAMETRICS_PROP_STATUS_VALUE_STATE, INVALID_OPERATION},
+ {AMEDIAMETRICS_PROP_STATUS_VALUE_TIMEOUT, WOULD_BLOCK},
+ {AMEDIAMETRICS_PROP_STATUS_VALUE_UNKNOWN, UNKNOWN_ERROR},
};
return map;
}
-status_t errorStringToStatus(const char *error) {
+status_t statusStringToStatus(const char *error) {
const auto& map = getErrorStringMap();
if (error == nullptr || error[0] == '\0') return NO_ERROR;
auto it = map.find(error);
diff --git a/media/libmediametrics/include/MediaMetricsConstants.h b/media/libmediametrics/include/MediaMetricsConstants.h
index 7d120b5..2bf72a7 100644
--- a/media/libmediametrics/include/MediaMetricsConstants.h
+++ b/media/libmediametrics/include/MediaMetricsConstants.h
@@ -119,18 +119,6 @@
#define AMEDIAMETRICS_PROP_DURATIONNS "durationNs" // int64 duration time span
#define AMEDIAMETRICS_PROP_ENCODING "encoding" // string value of format
-// Error statistics
-#define AMEDIAMETRICS_PROP_ERROR "error#" // string, empty or one of
- // AMEDIAMETRICS_PROP_ERROR_VALUE_*
- // Used for error categorization.
-#define AMEDIAMETRICS_PROP_ERRORSUBCODE "errorSubCode#" // int32, specific code for error
- // used in conjunction with error#.
-#define AMEDIAMETRICS_PROP_ERRORMESSAGE "errorMessage#" // string, supplemental to error.
- // Arbitrary information treated as
- // informational, may be logcat msg,
- // or an exception with stack trace.
- // Treated as "debug" information.
-
#define AMEDIAMETRICS_PROP_EVENT "event#" // string value (often func name)
#define AMEDIAMETRICS_PROP_EXECUTIONTIMENS "executionTimeNs" // time to execute the event
@@ -162,7 +150,17 @@
#define AMEDIAMETRICS_PROP_STARTUPMS "startupMs" // double value
// State is "ACTIVE" or "STOPPED" for AudioRecord
#define AMEDIAMETRICS_PROP_STATE "state" // string
-#define AMEDIAMETRICS_PROP_STATUS "status" // int32 status_t
+#define AMEDIAMETRICS_PROP_STATUS "status#" // int32 status_t
+ // AAudio uses their own status codes
+// Supplemental information to the status code.
+#define AMEDIAMETRICS_PROP_STATUSSUBCODE "statusSubCode" // int32, specific code
+ // used in conjunction with status.
+#define AMEDIAMETRICS_PROP_STATUSMESSAGE "statusMessage" // string, supplemental info.
+ // Arbitrary information treated as
+ // informational, may be logcat msg,
+ // or an exception with stack trace.
+ // Treated as "debug" information.
+
#define AMEDIAMETRICS_PROP_STREAMTYPE "streamType" // string (AudioTrack)
#define AMEDIAMETRICS_PROP_THREADID "threadId" // int32 value io handle
#define AMEDIAMETRICS_PROP_THROTTLEMS "throttleMs" // double
@@ -237,17 +235,20 @@
// https://cs.android.com/android/platform/superproject/+/master:frameworks/native/libs/binder/include/binder/Status.h;drc=88e25c0861499ee3ab885814dddc097ab234cb7b;l=57
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/media/java/android/media/AudioSystem.java;drc=3ac246c43294d7f7012bdcb0ccb7bae1aa695bd4;l=785
// https://cs.android.com/android/platform/superproject/+/master:frameworks/av/media/libaaudio/include/aaudio/AAudio.h;drc=cfd3a6fa3aaaf712a890dc02452b38ef401083b8;l=120
+// https://abseil.io/docs/cpp/guides/status-codes
// Status errors:
// An empty status string or "ok" is interpreted as no error.
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_OK "ok"
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_OK "ok"
// Error category: argument
// IllegalArgumentException
// NullPointerException
// BAD_VALUE
+// absl::INVALID_ARGUMENT
+// absl::OUT_OF_RANGE
// Out of range, out of bounds.
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_ARGUMENT "argument"
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_ARGUMENT "argument"
// Error category: io
// IOException
@@ -258,36 +259,48 @@
// file or ioctl failure
// Service, rpc, binder, or socket failure.
// Hardware or device failure.
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_IO "io"
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_IO "io"
// Error category: outOfMemory
// OutOfMemoryException
// NO_MEMORY
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_MEMORY "memory"
+// absl::RESOURCE_EXHAUSTED
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_MEMORY "memory"
// Error category: security
// SecurityException
// PERMISSION_DENIED
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_SECURITY "security"
+// absl::PERMISSION_DENIED
+// absl::UNAUTHENTICATED
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_SECURITY "security"
// Error category: state
// IllegalStateException
// UnsupportedOperationException
// INVALID_OPERATION
// NO_INIT
+// absl::NOT_FOUND
+// absl::ALREADY_EXISTS
+// absl::FAILED_PRECONDITION
+// absl::UNAVAILABLE
+// absl::UNIMPLEMENTED
// Functionality not implemented (argument may or may not be correct).
// Call unexpected or out of order.
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_STATE "state"
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_STATE "state"
// Error category: timeout
// TimeoutException
// WOULD_BLOCK
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_TIMEOUT "timeout"
+// absl::DEADLINE_EXCEEDED
+// absl::ABORTED
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_TIMEOUT "timeout"
// Error category: unknown
// Exception (Java specified not listed above, or custom app/service)
// UNKNOWN_ERROR
+// absl::INTERNAL
+// absl::DATA_LOSS
// Catch-all bucket for errors not listed above.
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_UNKNOWN "unknown"
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_UNKNOWN "unknown"
#endif // ANDROID_MEDIA_MEDIAMETRICSCONSTANTS_H
diff --git a/media/libmediametrics/include/media/MediaMetricsItem.h b/media/libmediametrics/include/media/MediaMetricsItem.h
index 87f608f..de56665 100644
--- a/media/libmediametrics/include/media/MediaMetricsItem.h
+++ b/media/libmediametrics/include/media/MediaMetricsItem.h
@@ -106,34 +106,34 @@
};
/*
- * Helper for error conversions
+ * Helper for status conversions
*/
-static inline constexpr const char* statusToErrorString(status_t status) {
+inline constexpr const char* statusToStatusString(status_t status) {
switch (status) {
- case NO_ERROR:
- return "";
case BAD_VALUE:
- return AMEDIAMETRICS_PROP_ERROR_VALUE_ARGUMENT;
+ return AMEDIAMETRICS_PROP_STATUS_VALUE_ARGUMENT;
case DEAD_OBJECT:
case FAILED_TRANSACTION:
- return AMEDIAMETRICS_PROP_ERROR_VALUE_IO;
+ return AMEDIAMETRICS_PROP_STATUS_VALUE_IO;
case NO_MEMORY:
- return AMEDIAMETRICS_PROP_ERROR_VALUE_MEMORY;
+ return AMEDIAMETRICS_PROP_STATUS_VALUE_MEMORY;
case PERMISSION_DENIED:
- return AMEDIAMETRICS_PROP_ERROR_VALUE_SECURITY;
+ return AMEDIAMETRICS_PROP_STATUS_VALUE_SECURITY;
case NO_INIT:
case INVALID_OPERATION:
- return AMEDIAMETRICS_PROP_ERROR_VALUE_STATE;
+ return AMEDIAMETRICS_PROP_STATUS_VALUE_STATE;
case WOULD_BLOCK:
- return AMEDIAMETRICS_PROP_ERROR_VALUE_TIMEOUT;
- case UNKNOWN_ERROR:
+ return AMEDIAMETRICS_PROP_STATUS_VALUE_TIMEOUT;
default:
- return AMEDIAMETRICS_PROP_ERROR_VALUE_UNKNOWN;
+ if (status >= 0) return AMEDIAMETRICS_PROP_STATUS_VALUE_OK; // non-negative values "OK"
+ [[fallthrough]]; // negative values are error.
+ case UNKNOWN_ERROR:
+ return AMEDIAMETRICS_PROP_STATUS_VALUE_UNKNOWN;
}
}
-status_t errorStringToStatus(const char *error);
+status_t statusStringToStatus(const char *error);
/*
* Time printing