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:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user