Chromium Code Reviews| Index: google_apis/gcm/gcm_stats_recorder.cc |
| diff --git a/google_apis/gcm/gcm_stats_recorder.cc b/google_apis/gcm/gcm_stats_recorder.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..7e34256bc7166344c579d96c97ab84a8911f9478 |
| --- /dev/null |
| +++ b/google_apis/gcm/gcm_stats_recorder.cc |
| @@ -0,0 +1,198 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "google_apis/gcm/gcm_stats_recorder.h" |
| + |
| +#include <deque> |
| + |
| +#include "base/logging.h" |
| +#include "base/strings/string_util.h" |
| +#include "base/strings/stringprintf.h" |
| + |
| +namespace gcm { |
| + |
| +const uint32 MAX_LOGGED_ACTIVITY_COUNT = 100; |
| + |
| +namespace { |
| + |
| +template <typename T> |
| +void InsertCircularBuffer(std::deque<T>* q, const T& item) { |
| + DCHECK(q); |
| + q->push_front(item); |
| + if (q->size() > MAX_LOGGED_ACTIVITY_COUNT) { |
| + q->pop_back(); |
| + } |
| +} |
| + |
| +} // namespace |
| + |
| +GCMStatsRecorder::Activity::Activity() |
| + : time(base::Time::Now()), type(GCMStatsRecorder::Initiated) { |
| +} |
| + |
| +GCMStatsRecorder::Activity::~Activity() { |
| +} |
| + |
| +std::string GCMStatsRecorder::Activity::GetTypeString() const { |
| + switch(type) { |
| + case GCMStatsRecorder::Initiated: |
| + return "Initiated"; |
| + case GCMStatsRecorder::RetryRequested: |
| + return "RetryRequested"; |
| + case GCMStatsRecorder::Retry: |
| + return "Retry"; |
| + case GCMStatsRecorder::Success: |
| + return "Success"; |
| + case GCMStatsRecorder::Intermediate: |
| + return "Intermediate"; |
| + case GCMStatsRecorder::Failure: |
| + return "Failure"; |
| + case GCMStatsRecorder::Error: |
| + return "Error"; |
| + default: |
| + return "Unknown"; |
| + } |
| +} |
| + |
| +GCMStatsRecorder::CheckinActivity::CheckinActivity() |
| + : android_id(0) { |
| +} |
| + |
| +GCMStatsRecorder::CheckinActivity::~CheckinActivity() { |
| +} |
| + |
| +GCMStatsRecorder::RegisterActivity::RegisterActivity() { |
| +} |
| + |
| +GCMStatsRecorder::RegisterActivity::~RegisterActivity() { |
| +} |
| + |
| +GCMStatsRecorder::SendMessageActivity::SendMessageActivity() |
| + : message_len(0) { |
| +} |
| + |
| +GCMStatsRecorder::SendMessageActivity::~SendMessageActivity() { |
| +} |
| + |
| +GCMStatsRecorder::ReceiveMessageActivity::ReceiveMessageActivity() |
| + : message_size(0) { |
| +} |
| + |
| +GCMStatsRecorder::ReceiveMessageActivity::~ReceiveMessageActivity() { |
| +} |
| + |
| +GCMStatsRecorder::GCMStatsRecorder() : is_recording_(false) { |
| +} |
| + |
| +GCMStatsRecorder::~GCMStatsRecorder() { |
| +} |
| + |
| +void GCMStatsRecorder::SetRecording(bool recording) { |
| + is_recording_ = recording; |
| +} |
| + |
| +void GCMStatsRecorder::Clear() { |
| + checkin_activities_.clear(); |
| + register_activities_.clear(); |
| + send_activities_.clear(); |
| + receive_activities_.clear(); |
| +} |
| + |
| +void GCMStatsRecorder::RecordCheckin(uint64 android_id, ActivityType type){ |
| + if (!is_recording_) |
| + return; |
| + CheckinActivity data; |
| + data.type = type; |
| + data.android_id = android_id; |
| + InsertCircularBuffer(&checkin_activities_, data); |
|
jianli
2014/03/18 23:53:23
It might be a bit more efficient by doing somethin
juyik
2014/03/20 01:09:53
Done.
|
| +} |
| + |
| +void GCMStatsRecorder::RecordRegister( |
| + const std::string& app_id, |
| + ActivityType type, |
| + const std::vector<std::string>& sender_id) { |
| + if (!is_recording_) |
| + return; |
| + RegisterActivity data; |
| + data.type = type; |
| + data.app_id = app_id; |
| + data.sender_id = JoinString(sender_id, ','); |
| + InsertCircularBuffer(®ister_activities_, data); |
| +} |
| + |
| +void GCMStatsRecorder::RecordRegisterWithStatus( |
| + const std::string& app_id, |
| + ActivityType type, |
| + const std::vector<std::string>& sender_id, |
| + std::string status) { |
| + if (!is_recording_) |
| + return; |
| + RegisterActivity data; |
| + data.type = type; |
| + data.app_id = app_id; |
| + data.sender_id = JoinString(sender_id, ','); |
| + data.details = status; |
| + InsertCircularBuffer(®ister_activities_, data); |
| +} |
| + |
| +void GCMStatsRecorder::RecordSend(const std::string& app_id, |
| + ActivityType type, |
| + const std::string& receiver_id, |
| + const std::string& message_id, |
| + uint64 msg_len) { |
| + if (!is_recording_) |
| + return; |
| + RecordSendWithDetails(app_id, |
| + type, |
| + receiver_id, |
| + message_id, |
| + msg_len, |
| + std::string()); |
| +} |
| + |
| +void GCMStatsRecorder::RecordSendWithDetails(const std::string& app_id, |
| + ActivityType type, |
| + const std::string& receiver_id, |
| + const std::string& message_id, |
| + uint64 msg_len, |
|
fgorski
2014/03/18 21:28:37
you are not using msg_len
juyik
2014/03/20 01:09:53
Done.
|
| + const std::string& details) { |
| + if (!is_recording_) |
| + return; |
| + SendMessageActivity data; |
| + data.type = type; |
| + data.app_id = app_id; |
| + data.receiver_id = receiver_id; |
| + data.message_id = message_id; |
| + data.details = details; |
| + InsertCircularBuffer(&send_activities_, data); |
| +} |
| + |
| +void GCMStatsRecorder::RecordReceiveDataMessage(const std::string& sender_id, |
| + const std::string& app_id, |
| + int message_size) { |
| + if (!is_recording_) |
| + return; |
| + ReceiveMessageActivity data; |
| + data.type = GCMStatsRecorder::Success; |
| + data.app_id = app_id; |
| + data.sender_id = sender_id; |
| + data.message_size = message_size; |
| + InsertCircularBuffer(&receive_activities_, data); |
| +} |
| + |
| +void GCMStatsRecorder::RecordReceiveWithDetails(ActivityType type, |
| + const std::string& sender_id, |
| + const std::string& app_id, |
| + const std::string& details) { |
| + if (!is_recording_) |
| + return; |
| + ReceiveMessageActivity data; |
| + data.type = type; |
| + data.app_id = app_id; |
| + data.sender_id = sender_id; |
| + data.details = details; |
| + InsertCircularBuffer(&receive_activities_, data); |
| +} |
| + |
| +} // namespace gcm |