Adds most remaining framework metrics
Adds nearly all of the remaining specified framework level metrics.
Also adds a basic unit test to verify that metrics are exported
correctly. A follow-up CL will update the CTS test to touch all metric
values in DrmHal.
BUG: 64001676
Test: New unit test. Smoke tested with GPlay/Walleye.
Change-Id: I4df90675ae304d3c62b7886537328b3d848fd77c
diff --git a/drm/libmediadrm/DrmMetrics.cpp b/drm/libmediadrm/DrmMetrics.cpp
index f536545..68730b7 100644
--- a/drm/libmediadrm/DrmMetrics.cpp
+++ b/drm/libmediadrm/DrmMetrics.cpp
@@ -14,13 +14,46 @@
* limitations under the License.
*/
+#include <android-base/macros.h>
#include <media/DrmMetrics.h>
+using ::android::hardware::drm::V1_0::EventType;
+using ::android::hardware::drm::V1_0::KeyStatusType;
+
namespace {
template<typename T>
+std::string GetAttributeName(T type);
+
+template<>
+std::string GetAttributeName<KeyStatusType>(KeyStatusType type) {
+ static const char* type_names[] = {
+ "USABLE", "EXPIRED", "OUTPUT_NOT_ALLOWED",
+ "STATUS_PENDING", "INTERNAL_ERROR" };
+ if (((size_t) type) > arraysize(type_names)) {
+ return "UNKNOWN_TYPE";
+ }
+ return type_names[(size_t) type];
+}
+
+template<>
+std::string GetAttributeName<EventType>(EventType type) {
+ static const char* type_names[] = {
+ "PROVISION_REQUIRED", "KEY_NEEDED", "KEY_EXPIRED",
+ "VENDOR_DEFINED", "SESSION_RECLAIMED" };
+ if (((size_t) type) > arraysize(type_names)) {
+ return "UNKNOWN_TYPE";
+ }
+ return type_names[(size_t) type];
+}
+
+template<typename T>
void ExportCounterMetric(const android::CounterMetric<T>& counter,
android::MediaAnalyticsItem* item) {
+ if (!item) {
+ ALOGE("item was unexpectedly null.");
+ return;
+ }
std::string success_count_name = counter.metric_name() + "/ok/count";
std::string error_count_name = counter.metric_name() + "/error/count";
counter.ExportValues(
@@ -38,11 +71,31 @@
}
template<typename T>
+void ExportCounterMetricWithAttributeNames(
+ const android::CounterMetric<T>& counter,
+ android::MediaAnalyticsItem* item) {
+ if (!item) {
+ ALOGE("item was unexpectedly null.");
+ return;
+ }
+ counter.ExportValues(
+ [&] (const T& attribute, const int64_t value) {
+ std::string name = counter.metric_name()
+ + "/" + GetAttributeName(attribute) + "/count";
+ item->setInt64(name.c_str(), value);
+ });
+}
+
+template<typename T>
void ExportEventMetric(const android::EventMetric<T>& event,
android::MediaAnalyticsItem* item) {
+ if (!item) {
+ ALOGE("item was unexpectedly null.");
+ return;
+ }
std::string success_count_name = event.metric_name() + "/ok/count";
std::string error_count_name = event.metric_name() + "/error/count";
- std::string timing_name = event.metric_name() + "/average_time_micros";
+ std::string timing_name = event.metric_name() + "/ok/average_time_micros";
event.ExportValues(
[&] (const android::status_t& status,
const android::EventStatistics& value) {
@@ -66,12 +119,34 @@
MediaDrmMetrics::MediaDrmMetrics()
: mOpenSessionCounter("/drm/mediadrm/open_session", "status"),
- mGetKeyRequestTiming("/drm/mediadrm/get_key_request", "status") {
+ mCloseSessionCounter("/drm/mediadrm/close_session", "status"),
+ mGetKeyRequestTiming("/drm/mediadrm/get_key_request", "status"),
+ mProvideKeyResponseTiming("/drm/mediadrm/provide_key_response", "status"),
+ mGetProvisionRequestCounter(
+ "/drm/mediadrm/get_provision_request", "status"),
+ mProvideProvisionResponseCounter(
+ "/drm/mediadrm/provide_provision_response", "status"),
+ mKeyStatusChangeCounter(
+ "/drm/mediadrm/key_status_change", "key_status_type"),
+ mEventCounter("/drm/mediadrm/event", "event_type"),
+ mGetDeviceUniqueIdCounter(
+ "/drm/mediadrm/get_device_unique_id", "status") {
}
void MediaDrmMetrics::Export(MediaAnalyticsItem* item) {
+ if (!item) {
+ ALOGE("item was unexpectedly null.");
+ return;
+ }
ExportCounterMetric(mOpenSessionCounter, item);
+ ExportCounterMetric(mCloseSessionCounter, item);
ExportEventMetric(mGetKeyRequestTiming, item);
+ ExportEventMetric(mProvideKeyResponseTiming, item);
+ ExportCounterMetric(mGetProvisionRequestCounter, item);
+ ExportCounterMetric(mProvideProvisionResponseCounter, item);
+ ExportCounterMetricWithAttributeNames(mKeyStatusChangeCounter, item);
+ ExportCounterMetricWithAttributeNames(mEventCounter, item);
+ ExportCounterMetric(mGetDeviceUniqueIdCounter, item);
}
} // namespace android