blob: 856effdf837ecba708476c2bb4f2f2e813ec5037 [file] [log] [blame]
Adam Stonef0e618d2018-01-17 19:20:41 -08001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Adam Stonecea91ce2018-01-22 19:23:28 -080017#include <android-base/macros.h>
Adam Stonef0e618d2018-01-17 19:20:41 -080018#include <media/DrmMetrics.h>
19
Adam Stonecea91ce2018-01-22 19:23:28 -080020using ::android::hardware::drm::V1_0::EventType;
21using ::android::hardware::drm::V1_0::KeyStatusType;
Adam Stone637b7852018-01-30 12:09:36 -080022using ::android::os::PersistableBundle;
Adam Stonecea91ce2018-01-22 19:23:28 -080023
Adam Stonef0e618d2018-01-17 19:20:41 -080024namespace {
25
26template<typename T>
Adam Stonecea91ce2018-01-22 19:23:28 -080027std::string GetAttributeName(T type);
28
29template<>
30std::string GetAttributeName<KeyStatusType>(KeyStatusType type) {
31 static const char* type_names[] = {
32 "USABLE", "EXPIRED", "OUTPUT_NOT_ALLOWED",
33 "STATUS_PENDING", "INTERNAL_ERROR" };
34 if (((size_t) type) > arraysize(type_names)) {
35 return "UNKNOWN_TYPE";
36 }
37 return type_names[(size_t) type];
38}
39
40template<>
41std::string GetAttributeName<EventType>(EventType type) {
42 static const char* type_names[] = {
43 "PROVISION_REQUIRED", "KEY_NEEDED", "KEY_EXPIRED",
44 "VENDOR_DEFINED", "SESSION_RECLAIMED" };
45 if (((size_t) type) > arraysize(type_names)) {
46 return "UNKNOWN_TYPE";
47 }
48 return type_names[(size_t) type];
49}
50
51template<typename T>
Adam Stonef0e618d2018-01-17 19:20:41 -080052void ExportCounterMetric(const android::CounterMetric<T>& counter,
Adam Stone637b7852018-01-30 12:09:36 -080053 PersistableBundle* metrics) {
54 if (!metrics) {
55 ALOGE("metrics was unexpectedly null.");
Adam Stonecea91ce2018-01-22 19:23:28 -080056 return;
57 }
Adam Stone4bea53c2018-01-24 21:44:58 -080058 std::string success_count_name = counter.metric_name() + ".ok.count";
59 std::string error_count_name = counter.metric_name() + ".error.count";
Adam Stonef0e618d2018-01-17 19:20:41 -080060 counter.ExportValues(
61 [&] (const android::status_t status, const int64_t value) {
62 if (status == android::OK) {
Adam Stone637b7852018-01-30 12:09:36 -080063 metrics->putLong(android::String16(success_count_name.c_str()),
64 value);
Adam Stonef0e618d2018-01-17 19:20:41 -080065 } else {
66 int64_t total_errors(0);
Adam Stone637b7852018-01-30 12:09:36 -080067 metrics->getLong(android::String16(error_count_name.c_str()),
68 &total_errors);
69 metrics->putLong(android::String16(error_count_name.c_str()),
70 total_errors + value);
Adam Stonef0e618d2018-01-17 19:20:41 -080071 // TODO: Add support for exporting the list of error values.
Adam Stonef0e618d2018-01-17 19:20:41 -080072 }
73 });
74}
75
76template<typename T>
Adam Stonecea91ce2018-01-22 19:23:28 -080077void ExportCounterMetricWithAttributeNames(
78 const android::CounterMetric<T>& counter,
Adam Stone637b7852018-01-30 12:09:36 -080079 PersistableBundle* metrics) {
80 if (!metrics) {
81 ALOGE("metrics was unexpectedly null.");
Adam Stonecea91ce2018-01-22 19:23:28 -080082 return;
83 }
84 counter.ExportValues(
85 [&] (const T& attribute, const int64_t value) {
86 std::string name = counter.metric_name()
Adam Stone4bea53c2018-01-24 21:44:58 -080087 + "." + GetAttributeName(attribute) + ".count";
Adam Stone637b7852018-01-30 12:09:36 -080088 metrics->putLong(android::String16(name.c_str()), value);
Adam Stonecea91ce2018-01-22 19:23:28 -080089 });
90}
91
92template<typename T>
Adam Stonef0e618d2018-01-17 19:20:41 -080093void ExportEventMetric(const android::EventMetric<T>& event,
Adam Stone637b7852018-01-30 12:09:36 -080094 PersistableBundle* metrics) {
95 if (!metrics) {
96 ALOGE("metrics was unexpectedly null.");
Adam Stonecea91ce2018-01-22 19:23:28 -080097 return;
98 }
Adam Stone4bea53c2018-01-24 21:44:58 -080099 std::string success_count_name = event.metric_name() + ".ok.count";
100 std::string error_count_name = event.metric_name() + ".error.count";
101 std::string timing_name = event.metric_name() + ".ok.average_time_micros";
Adam Stonef0e618d2018-01-17 19:20:41 -0800102 event.ExportValues(
103 [&] (const android::status_t& status,
104 const android::EventStatistics& value) {
105 if (status == android::OK) {
Adam Stone637b7852018-01-30 12:09:36 -0800106 metrics->putLong(android::String16(success_count_name.c_str()),
107 value.count);
108 metrics->putLong(android::String16(timing_name.c_str()),
109 value.mean);
Adam Stonef0e618d2018-01-17 19:20:41 -0800110 } else {
111 int64_t total_errors(0);
Adam Stone637b7852018-01-30 12:09:36 -0800112 metrics->getLong(android::String16(error_count_name.c_str()),
113 &total_errors);
114 metrics->putLong(android::String16(error_count_name.c_str()),
115 total_errors + value.count);
Adam Stonef0e618d2018-01-17 19:20:41 -0800116 // TODO: Add support for exporting the list of error values.
Adam Stonef0e618d2018-01-17 19:20:41 -0800117 }
118 });
119}
120
121} // namespace anonymous
122
123namespace android {
124
125MediaDrmMetrics::MediaDrmMetrics()
Adam Stone4bea53c2018-01-24 21:44:58 -0800126 : mOpenSessionCounter("drm.mediadrm.open_session", "status"),
127 mCloseSessionCounter("drm.mediadrm.close_session", "status"),
128 mGetKeyRequestTiming("drm.mediadrm.get_key_request", "status"),
129 mProvideKeyResponseTiming("drm.mediadrm.provide_key_response", "status"),
Adam Stonecea91ce2018-01-22 19:23:28 -0800130 mGetProvisionRequestCounter(
Adam Stone4bea53c2018-01-24 21:44:58 -0800131 "drm.mediadrm.get_provision_request", "status"),
Adam Stonecea91ce2018-01-22 19:23:28 -0800132 mProvideProvisionResponseCounter(
Adam Stone4bea53c2018-01-24 21:44:58 -0800133 "drm.mediadrm.provide_provision_response", "status"),
Adam Stonecea91ce2018-01-22 19:23:28 -0800134 mKeyStatusChangeCounter(
Adam Stone4bea53c2018-01-24 21:44:58 -0800135 "drm.mediadrm.key_status_change", "key_status_type"),
136 mEventCounter("drm.mediadrm.event", "event_type"),
Adam Stonecea91ce2018-01-22 19:23:28 -0800137 mGetDeviceUniqueIdCounter(
Adam Stone4bea53c2018-01-24 21:44:58 -0800138 "drm.mediadrm.get_device_unique_id", "status") {
Adam Stonef0e618d2018-01-17 19:20:41 -0800139}
140
Adam Stone637b7852018-01-30 12:09:36 -0800141void MediaDrmMetrics::Export(PersistableBundle* metrics) {
142 if (!metrics) {
143 ALOGE("metrics was unexpectedly null.");
Adam Stonecea91ce2018-01-22 19:23:28 -0800144 return;
145 }
Adam Stone637b7852018-01-30 12:09:36 -0800146 ExportCounterMetric(mOpenSessionCounter, metrics);
147 ExportCounterMetric(mCloseSessionCounter, metrics);
148 ExportEventMetric(mGetKeyRequestTiming, metrics);
149 ExportEventMetric(mProvideKeyResponseTiming, metrics);
150 ExportCounterMetric(mGetProvisionRequestCounter, metrics);
151 ExportCounterMetric(mProvideProvisionResponseCounter, metrics);
152 ExportCounterMetricWithAttributeNames(mKeyStatusChangeCounter, metrics);
153 ExportCounterMetricWithAttributeNames(mEventCounter, metrics);
154 ExportCounterMetric(mGetDeviceUniqueIdCounter, metrics);
Adam Stonef0e618d2018-01-17 19:20:41 -0800155}
156
157} // namespace android