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