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