| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "google_apis/gcm/monitoring/gcm_stats_recorder.h" | 5 #include "google_apis/gcm/monitoring/gcm_stats_recorder.h" |
| 6 | 6 |
| 7 #include <deque> | 7 #include <deque> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
| 13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
| 14 #include "base/strings/stringprintf.h" | 14 #include "base/strings/stringprintf.h" |
| 15 | 15 |
| 16 namespace gcm { | 16 namespace gcm { |
| 17 | 17 |
| 18 const uint32 MAX_LOGGED_ACTIVITY_COUNT = 100; | 18 const uint32 MAX_LOGGED_ACTIVITY_COUNT = 100; |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 // Insert an itme to the front of deque while maintaining the size of the deque. | 22 // Insert an item to the front of deque while maintaining the size of the deque. |
| 23 // Overflow item is discarded. | 23 // Overflow item is discarded. |
| 24 template <typename T> | 24 template <typename T> |
| 25 T* InsertCircularBuffer(std::deque<T>* q, const T& item) { | 25 T* InsertCircularBuffer(std::deque<T>* q, const T& item) { |
| 26 DCHECK(q); | 26 DCHECK(q); |
| 27 q->push_front(item); | 27 q->push_front(item); |
| 28 if (q->size() > MAX_LOGGED_ACTIVITY_COUNT) { | 28 if (q->size() > MAX_LOGGED_ACTIVITY_COUNT) { |
| 29 q->pop_back(); | 29 q->pop_back(); |
| 30 } | 30 } |
| 31 return &q->front(); | 31 return &q->front(); |
| 32 } | 32 } |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 | 140 |
| 141 } // namespace | 141 } // namespace |
| 142 | 142 |
| 143 GCMStatsRecorder::Activity::Activity() | 143 GCMStatsRecorder::Activity::Activity() |
| 144 : time(base::Time::Now()) { | 144 : time(base::Time::Now()) { |
| 145 } | 145 } |
| 146 | 146 |
| 147 GCMStatsRecorder::Activity::~Activity() { | 147 GCMStatsRecorder::Activity::~Activity() { |
| 148 } | 148 } |
| 149 | 149 |
| 150 GCMStatsRecorder::CheckinActivity::CheckinActivity() { |
| 151 } |
| 152 |
| 153 GCMStatsRecorder::CheckinActivity::~CheckinActivity() { |
| 154 } |
| 155 |
| 150 GCMStatsRecorder::ConnectionActivity::ConnectionActivity() { | 156 GCMStatsRecorder::ConnectionActivity::ConnectionActivity() { |
| 151 } | 157 } |
| 152 | 158 |
| 153 GCMStatsRecorder::ConnectionActivity::~ConnectionActivity() { | 159 GCMStatsRecorder::ConnectionActivity::~ConnectionActivity() { |
| 154 } | 160 } |
| 155 | 161 |
| 156 GCMStatsRecorder::RegistrationActivity::RegistrationActivity() { | 162 GCMStatsRecorder::RegistrationActivity::RegistrationActivity() { |
| 157 } | 163 } |
| 158 | 164 |
| 159 GCMStatsRecorder::RegistrationActivity::~RegistrationActivity() { | 165 GCMStatsRecorder::RegistrationActivity::~RegistrationActivity() { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 182 } | 188 } |
| 183 | 189 |
| 184 GCMStatsRecorder::~GCMStatsRecorder() { | 190 GCMStatsRecorder::~GCMStatsRecorder() { |
| 185 } | 191 } |
| 186 | 192 |
| 187 void GCMStatsRecorder::SetRecording(bool recording) { | 193 void GCMStatsRecorder::SetRecording(bool recording) { |
| 188 is_recording_ = recording; | 194 is_recording_ = recording; |
| 189 } | 195 } |
| 190 | 196 |
| 191 void GCMStatsRecorder::Clear() { | 197 void GCMStatsRecorder::Clear() { |
| 198 checkin_activities_.clear(); |
| 192 connection_activities_.clear(); | 199 connection_activities_.clear(); |
| 193 registration_activities_.clear(); | 200 registration_activities_.clear(); |
| 194 receiving_activities_.clear(); | 201 receiving_activities_.clear(); |
| 195 sending_activities_.clear(); | 202 sending_activities_.clear(); |
| 196 } | 203 } |
| 197 | 204 |
| 205 void GCMStatsRecorder::RecordCheckin( |
| 206 const std::string& event, |
| 207 const std::string& details) { |
| 208 CheckinActivity data; |
| 209 CheckinActivity* inserted_data = InsertCircularBuffer( |
| 210 &checkin_activities_, data); |
| 211 inserted_data->event = event; |
| 212 inserted_data->details = details; |
| 213 } |
| 214 |
| 215 void GCMStatsRecorder::RecordCheckinInitiated(uint64 android_id) { |
| 216 if (!is_recording_) |
| 217 return; |
| 218 RecordCheckin("Checkin initiated", |
| 219 base::StringPrintf("Android Id: %" PRIu64, android_id)); |
| 220 } |
| 221 |
| 222 void GCMStatsRecorder::RecordCheckinDelayedDueToBackoff(int64 delay_msec) { |
| 223 if (!is_recording_) |
| 224 return; |
| 225 RecordCheckin("Checkin backoff", |
| 226 base::StringPrintf("Delayed for %" PRId64 " msec", |
| 227 delay_msec)); |
| 228 } |
| 229 |
| 230 void GCMStatsRecorder::RecordCheckinSuccess() { |
| 231 if (!is_recording_) |
| 232 return; |
| 233 RecordCheckin("Checkin succeeded", std::string()); |
| 234 } |
| 235 |
| 236 void GCMStatsRecorder::RecordCheckinFailure(std::string status, |
| 237 bool will_retry) { |
| 238 if (!is_recording_) |
| 239 return; |
| 240 RecordCheckin("Checkin failed", base::StringPrintf( |
| 241 "%s.%s", |
| 242 status.c_str(), |
| 243 will_retry ? " Will retry." : "Will not retry.")); |
| 244 } |
| 245 |
| 198 void GCMStatsRecorder::RecordConnection( | 246 void GCMStatsRecorder::RecordConnection( |
| 199 const std::string& event, | 247 const std::string& event, |
| 200 const std::string& details) { | 248 const std::string& details) { |
| 201 ConnectionActivity data; | 249 ConnectionActivity data; |
| 202 ConnectionActivity* inserted_data = InsertCircularBuffer( | 250 ConnectionActivity* inserted_data = InsertCircularBuffer( |
| 203 &connection_activities_, data); | 251 &connection_activities_, data); |
| 204 inserted_data->event = event; | 252 inserted_data->event = event; |
| 205 inserted_data->details = details; | 253 inserted_data->details = details; |
| 206 } | 254 } |
| 207 | 255 |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 "Message has been deleted on server"); | 405 "Message has been deleted on server"); |
| 358 break; | 406 break; |
| 359 default: | 407 default: |
| 360 NOTREACHED(); | 408 NOTREACHED(); |
| 361 } | 409 } |
| 362 } | 410 } |
| 363 } | 411 } |
| 364 | 412 |
| 365 void GCMStatsRecorder::CollectActivities( | 413 void GCMStatsRecorder::CollectActivities( |
| 366 RecordedActivities* recorder_activities) const { | 414 RecordedActivities* recorder_activities) const { |
| 415 recorder_activities->checkin_activities.insert( |
| 416 recorder_activities->checkin_activities.begin(), |
| 417 checkin_activities_.begin(), |
| 418 checkin_activities_.end()); |
| 367 recorder_activities->connection_activities.insert( | 419 recorder_activities->connection_activities.insert( |
| 368 recorder_activities->connection_activities.begin(), | 420 recorder_activities->connection_activities.begin(), |
| 369 connection_activities_.begin(), | 421 connection_activities_.begin(), |
| 370 connection_activities_.end()); | 422 connection_activities_.end()); |
| 371 recorder_activities->registration_activities.insert( | 423 recorder_activities->registration_activities.insert( |
| 372 recorder_activities->registration_activities.begin(), | 424 recorder_activities->registration_activities.begin(), |
| 373 registration_activities_.begin(), | 425 registration_activities_.begin(), |
| 374 registration_activities_.end()); | 426 registration_activities_.end()); |
| 375 recorder_activities->receiving_activities.insert( | 427 recorder_activities->receiving_activities.insert( |
| 376 recorder_activities->receiving_activities.begin(), | 428 recorder_activities->receiving_activities.begin(), |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 const std::string& receiver_id, | 485 const std::string& receiver_id, |
| 434 const std::string& message_id) { | 486 const std::string& message_id) { |
| 435 UMA_HISTOGRAM_COUNTS("GCM.IncomingSendErrors", 1); | 487 UMA_HISTOGRAM_COUNTS("GCM.IncomingSendErrors", 1); |
| 436 if (!is_recording_) | 488 if (!is_recording_) |
| 437 return; | 489 return; |
| 438 RecordSending(app_id, receiver_id, message_id, "Received 'send error' msg", | 490 RecordSending(app_id, receiver_id, message_id, "Received 'send error' msg", |
| 439 std::string()); | 491 std::string()); |
| 440 } | 492 } |
| 441 | 493 |
| 442 } // namespace gcm | 494 } // namespace gcm |
| OLD | NEW |