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 3 // found in the LICENSE file. 4 5 #ifndef COMPONENTS_GCM_DRIVER_GCM_STATS_RECORDER_IMPL_H_ 6 #define COMPONENTS_GCM_DRIVER_GCM_STATS_RECORDER_IMPL_H_ 7 8 #include <stdint.h> 9 10 #include <string> 11 #include <vector> 12 13 #include "base/containers/circular_deque.h" 14 #include "base/macros.h" 15 #include "base/time/time.h" 16 #include "components/gcm_driver/gcm_activity.h" 17 #include "google_apis/gcm/engine/connection_factory.h" 18 #include "google_apis/gcm/engine/mcs_client.h" 19 #include "google_apis/gcm/engine/registration_request.h" 20 #include "google_apis/gcm/engine/unregistration_request.h" 21 #include "google_apis/gcm/monitoring/gcm_stats_recorder.h" 22 23 namespace gcm { 24 25 enum class GCMDecryptionResult; 26 27 // Records GCM internal stats and activities for debugging purpose. Recording 28 // can be turned on/off by calling set_is_recording(...) function. It is turned 29 // off by default. 30 // This class is not thread safe. It is meant to be owned by a gcm client 31 // instance. 32 class GCMStatsRecorderImpl : public GCMStatsRecorder { 33 public: 34 GCMStatsRecorderImpl(); 35 ~GCMStatsRecorderImpl() override; 36 37 // Set a delegate to receive callback from the recorder. 38 void SetDelegate(Delegate* delegate); 39 40 // Clear all recorded activities. 41 void Clear(); 42 43 // Records a message decryption failure caused by |result| for |app_id|. 44 void RecordDecryptionFailure(const std::string& app_id, 45 GCMDecryptionResult result); 46 47 // GCMStatsRecorder implementation: 48 void RecordCheckinInitiated(uint64_t android_id) override; 49 void RecordCheckinDelayedDueToBackoff(int64_t delay_msec) override; 50 void RecordCheckinSuccess() override; 51 void RecordCheckinFailure(const std::string& status, 52 bool will_retry) override; 53 void RecordConnectionInitiated(const std::string& host) override; 54 void RecordConnectionDelayedDueToBackoff(int64_t delay_msec) override; 55 void RecordConnectionSuccess() override; 56 void RecordConnectionFailure(int network_error) override; 57 void RecordConnectionResetSignaled( 58 ConnectionFactory::ConnectionResetReason reason) override; 59 void RecordRegistrationSent(const std::string& app_id, 60 const std::string& source) override; 61 void RecordRegistrationResponse(const std::string& app_id, 62 const std::string& source, 63 RegistrationRequest::Status status) override; 64 void RecordRegistrationRetryDelayed(const std::string& app_id, 65 const std::string& source, 66 int64_t delay_msec, 67 int retries_left) override; 68 void RecordUnregistrationSent(const std::string& app_id, 69 const std::string& source) override; 70 void RecordUnregistrationResponse( 71 const std::string& app_id, 72 const std::string& source, 73 UnregistrationRequest::Status status) override; 74 void RecordUnregistrationRetryDelayed(const std::string& app_id, 75 const std::string& source, 76 int64_t delay_msec, 77 int retries_left) override; 78 void RecordDataMessageReceived(const std::string& app_id, 79 const std::string& from, 80 int message_byte_size, 81 ReceivedMessageType message_type) override; 82 void RecordDataSentToWire(const std::string& app_id, 83 const std::string& receiver_id, 84 const std::string& message_id, 85 int queued) override; 86 void RecordNotifySendStatus(const std::string& app_id, 87 const std::string& receiver_id, 88 const std::string& message_id, 89 MCSClient::MessageSendStatus status, 90 int byte_size, 91 int ttl) override; 92 void RecordIncomingSendError(const std::string& app_id, 93 const std::string& receiver_id, 94 const std::string& message_id) override; 95 96 // Collect all recorded activities into |*recorded_activities|. 97 void CollectActivities(RecordedActivities* recorded_activities) const; 98 is_recording()99 bool is_recording() const { return is_recording_; } set_is_recording(bool recording)100 void set_is_recording(bool recording) { is_recording_ = recording; } 101 checkin_activities()102 const base::circular_deque<CheckinActivity>& checkin_activities() const { 103 return checkin_activities_; 104 } connection_activities()105 const base::circular_deque<ConnectionActivity>& connection_activities() 106 const { 107 return connection_activities_; 108 } registration_activities()109 const base::circular_deque<RegistrationActivity>& registration_activities() 110 const { 111 return registration_activities_; 112 } receiving_activities()113 const base::circular_deque<ReceivingActivity>& receiving_activities() const { 114 return receiving_activities_; 115 } sending_activities()116 const base::circular_deque<SendingActivity>& sending_activities() const { 117 return sending_activities_; 118 } 119 const base::circular_deque<DecryptionFailureActivity>& decryption_failure_activities()120 decryption_failure_activities() const { 121 return decryption_failure_activities_; 122 } 123 124 protected: 125 // Notify the recorder delegate, if it exists, that an activity has been 126 // recorded. 127 void NotifyActivityRecorded(); 128 129 void RecordCheckin(const std::string& event, 130 const std::string& details); 131 132 void RecordConnection(const std::string& event, 133 const std::string& details); 134 135 void RecordRegistration(const std::string& app_id, 136 const std::string& source, 137 const std::string& event, 138 const std::string& details); 139 140 void RecordReceiving(const std::string& app_id, 141 const std::string& from, 142 int message_byte_size, 143 const std::string& event, 144 const std::string& details); 145 146 void RecordSending(const std::string& app_id, 147 const std::string& receiver_id, 148 const std::string& message_id, 149 const std::string& event, 150 const std::string& details); 151 152 bool is_recording_; 153 Delegate* delegate_; 154 155 base::circular_deque<CheckinActivity> checkin_activities_; 156 base::circular_deque<ConnectionActivity> connection_activities_; 157 base::circular_deque<RegistrationActivity> registration_activities_; 158 base::circular_deque<ReceivingActivity> receiving_activities_; 159 base::circular_deque<SendingActivity> sending_activities_; 160 base::circular_deque<DecryptionFailureActivity> 161 decryption_failure_activities_; 162 163 base::TimeTicks last_connection_initiation_time_; 164 165 DISALLOW_COPY_AND_ASSIGN(GCMStatsRecorderImpl); 166 }; 167 168 } // namespace gcm 169 170 #endif // COMPONENTS_GCM_DRIVER_GCM_STATS_RECORDER_IMPL_H_ 171