Add session metric pruning.

[ Merge of http://go/wvgerrit/65983 ]

Add support to drop closed metrics in order to save space for
long-running applications (and CdmEngine instances). The code now keeps
only a limited number of metrics collections after the session is closed.
As a session (and its metrics session) is closed, the oldest, closed metrics
session is dropped. This means those metrics will not be reported nor
accessible in the client.

Bug: http://b/118664842

Test: CDM Unit tests. Android Unit Test. Ran GPLay Manually.
Change-Id: I27d6e61a8fe4148ad1ef2a433c8e5f4cdd84cc72
This commit is contained in:
Adam Stone
2019-01-15 18:21:47 -08:00
parent 92e123d8ea
commit 700ee5160a
5 changed files with 270 additions and 284 deletions

View File

@@ -13,13 +13,15 @@ using ::google::protobuf::RepeatedPtrField;
using ::wvcdm::metrics::EventMetric;
namespace {
// Helper struct for comparing session ids.
struct CompareSessionIds {
const std::string &target_;
CompareSessionIds(const wvcdm::CdmSessionId &target) : target_(target){};
bool operator()(const wvcdm::metrics::SessionMetrics *metrics) const {
bool operator()(const std::shared_ptr<wvcdm::metrics::SessionMetrics> metrics)
const {
return metrics->GetSessionId() == target_;
}
};
@@ -258,31 +260,60 @@ EngineMetrics::EngineMetrics() {
EngineMetrics::~EngineMetrics() {
std::unique_lock<std::mutex> lock(session_metrics_lock_);
std::vector<SessionMetrics *>::iterator i;
if (!session_metrics_list_.empty()) {
LOGV("EngineMetrics::~EngineMetrics. Session count: %d",
session_metrics_list_.size());
if (!active_session_metrics_list_.empty()
|| !completed_session_metrics_list_.empty()) {
LOGV("EngineMetrics::~EngineMetrics. Session counts: "
"active %d. completed %d.", active_session_metrics_list_.size(),
completed_session_metrics_list_.size());
}
for (i = session_metrics_list_.begin(); i != session_metrics_list_.end();
i++) {
delete *i;
}
session_metrics_list_.clear();
}
SessionMetrics *EngineMetrics::AddSession() {
std::unique_lock<std::mutex> lock(session_metrics_lock_);
SessionMetrics *metrics = new SessionMetrics();
session_metrics_list_.push_back(metrics);
return metrics;
active_session_metrics_list_.push_back(std::make_shared<SessionMetrics>());
return active_session_metrics_list_.back().get();
}
void EngineMetrics::RemoveSession(wvcdm::CdmSessionId session_id) {
std::unique_lock<std::mutex> lock(session_metrics_lock_);
session_metrics_list_.erase(
std::remove_if(session_metrics_list_.begin(), session_metrics_list_.end(),
active_session_metrics_list_.erase(
std::remove_if(active_session_metrics_list_.begin(),
active_session_metrics_list_.end(),
CompareSessionIds(session_id)),
session_metrics_list_.end());
active_session_metrics_list_.end());
completed_session_metrics_list_.erase(
std::remove_if(completed_session_metrics_list_.begin(),
completed_session_metrics_list_.end(),
CompareSessionIds(session_id)),
completed_session_metrics_list_.end());
}
void EngineMetrics::ConsolidateSessions() {
auto completed_filter =
[] (const std::shared_ptr<SessionMetrics>& session_metrics) {
return session_metrics->IsCompleted();
};
std::unique_lock<std::mutex> lock(session_metrics_lock_);
std::copy_if(active_session_metrics_list_.begin(),
active_session_metrics_list_.end(),
std::back_inserter(completed_session_metrics_list_),
completed_filter);
active_session_metrics_list_.erase(
std::remove_if(active_session_metrics_list_.begin(),
active_session_metrics_list_.end(),
completed_filter),
active_session_metrics_list_.end());
// TODO(b/118664842): Add support to merge older metrics into one
// consolidated metric.
int excess_completed = completed_session_metrics_list_.size()
- kMaxCompletedSessions;
if (excess_completed > 0) {
completed_session_metrics_list_.erase(
completed_session_metrics_list_.begin(),
completed_session_metrics_list_.begin() + excess_completed);
}
}
void EngineMetrics::Serialize(WvCdmMetrics *wv_metrics) const {
@@ -299,8 +330,12 @@ void EngineMetrics::Serialize(WvCdmMetrics *wv_metrics) const {
}
SerializeEngineMetrics(engine_metrics);
for (std::vector<metrics::SessionMetrics *>::const_iterator it =
session_metrics_list_.begin(); it != session_metrics_list_.end(); it++) {
for (auto it = completed_session_metrics_list_.begin();
it != completed_session_metrics_list_.end(); it++) {
(*it)->Serialize(wv_metrics->add_session_metrics());
}
for (auto it = active_session_metrics_list_.begin();
it != active_session_metrics_list_.end(); it++) {
(*it)->Serialize(wv_metrics->add_session_metrics());
}
}