Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Unified Diff: google_apis/gcm/monitoring/gcm_stats_recorder.cc

Issue 248213004: Record connection, registration, and receiving activities. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: google_apis/gcm/monitoring/gcm_stats_recorder.cc
diff --git a/google_apis/gcm/monitoring/gcm_stats_recorder.cc b/google_apis/gcm/monitoring/gcm_stats_recorder.cc
index 6e0cb48d7b57b0c0d0c6962886e71e77d47ba24b..ed9389197cd76681138772f153c0d4c37e321530 100644
--- a/google_apis/gcm/monitoring/gcm_stats_recorder.cc
+++ b/google_apis/gcm/monitoring/gcm_stats_recorder.cc
@@ -7,6 +7,7 @@
#include <deque>
#include <vector>
+#include "base/format_macros.h"
#include "base/logging.h"
#include "base/metrics/histogram.h"
#include "base/strings/string_util.h"
@@ -54,6 +55,89 @@ std::string GetMessageSendStatusString(
}
}
+// Helper for getting string representation of the
+// ConnectionFactory::ConnectionResetReason enum.
+std::string GetConnectionResetReasonString(
+ gcm::ConnectionFactory::ConnectionResetReason reason) {
+ switch (reason) {
+ case gcm::ConnectionFactory::LOGIN_FAILURE:
+ return "LOGIN_FAILURE";
+ case gcm::ConnectionFactory::CLOSE_COMMAND:
+ return "CLOSE_COMMAND";
+ case gcm::ConnectionFactory::HEARTBEAT_FAILURE:
+ return "HEARTBEAT_FAILURE";
+ case gcm::ConnectionFactory::SOCKET_FAILURE:
+ return "SOCKET_FAILURE";
+ case gcm::ConnectionFactory::NETWORK_CHANGE:
+ return "NETWORK_CHANGE";
+ default:
+ NOTREACHED();
+ return "UNKNOWN_REASON";
+ }
+}
+
+// Helper for getting string representation of the RegistrationRequest::Status
+// enum.
+std::string GetRegistrationStatusString(
+ gcm::RegistrationRequest::Status status) {
+ switch (status) {
+ case gcm::RegistrationRequest::SUCCESS:
+ return "SUCCESS";
+ case gcm::RegistrationRequest::INVALID_PARAMETERS:
+ return "INVALID_PARAMETERS";
+ case gcm::RegistrationRequest::INVALID_SENDER:
+ return "INVALID_SENDER";
+ case gcm::RegistrationRequest::AUTHENTICATION_FAILED:
+ return "AUTHENTICATION_FAILED";
+ case gcm::RegistrationRequest::DEVICE_REGISTRATION_ERROR:
+ return "DEVICE_REGISTRATION_ERROR";
+ case gcm::RegistrationRequest::UNKNOWN_ERROR:
+ return "UNKNOWN_ERROR";
+ case gcm::RegistrationRequest::URL_FETCHING_FAILED:
+ return "URL_FETCHING_FAILED";
+ case gcm::RegistrationRequest::HTTP_NOT_OK:
+ return "HTTP_NOT_OK";
+ case gcm::RegistrationRequest::RESPONSE_PARSING_FAILED:
+ return "RESPONSE_PARSING_FAILED";
+ case gcm::RegistrationRequest::REACHED_MAX_RETRIES:
+ return "REACHED_MAX_RETRIES";
+ default:
+ NOTREACHED();
+ return "UNKNOWN_STATUS";
+ }
+}
+
+// Helper for getting string representation of the RegistrationRequest::Status
+// enum.
+std::string GetUnregistrationStatusString(
+ gcm::UnregistrationRequest::Status status) {
+ switch (status) {
+ case gcm::UnregistrationRequest::SUCCESS:
+ return "SUCCESS";
+ case gcm::UnregistrationRequest::URL_FETCHING_FAILED:
+ return "URL_FETCHING_FAILED";
+ case gcm::UnregistrationRequest::NO_RESPONSE_BODY:
+ return "NO_RESPONSE_BODY";
+ case gcm::UnregistrationRequest::RESPONSE_PARSING_FAILED:
+ return "RESPONSE_PARSING_FAILED";
+ case gcm::UnregistrationRequest::INCORRECT_APP_ID:
+ return "INCORRECT_APP_ID";
+ case gcm::UnregistrationRequest::INVALID_PARAMETERS:
+ return "INVALID_PARAMETERS";
+ case gcm::UnregistrationRequest::SERVICE_UNAVAILABLE:
+ return "SERVICE_UNAVAILABLE";
+ case gcm::UnregistrationRequest::INTERNAL_SERVER_ERROR:
+ return "INTERNAL_SERVER_ERROR";
+ case gcm::UnregistrationRequest::HTTP_NOT_OK:
+ return "HTTP_NOT_OK";
+ case gcm::UnregistrationRequest::UNKNOWN_ERROR:
+ return "UNKNOWN_ERROR";
+ default:
+ NOTREACHED();
+ return "UNKNOWN_STATUS";
+ }
+}
+
} // namespace
GCMStatsRecorder::Activity::Activity()
@@ -63,12 +147,37 @@ GCMStatsRecorder::Activity::Activity()
GCMStatsRecorder::Activity::~Activity() {
}
+GCMStatsRecorder::ConnectionActivity::ConnectionActivity() {
+}
+
+GCMStatsRecorder::ConnectionActivity::~ConnectionActivity() {
+}
+
+GCMStatsRecorder::RegistrationActivity::RegistrationActivity() {
+}
+
+GCMStatsRecorder::RegistrationActivity::~RegistrationActivity() {
+}
+
+GCMStatsRecorder::ReceivingActivity::ReceivingActivity()
+ : message_byte_size(0) {
+}
+
+GCMStatsRecorder::ReceivingActivity::~ReceivingActivity() {
+}
+
GCMStatsRecorder::SendingActivity::SendingActivity() {
}
GCMStatsRecorder::SendingActivity::~SendingActivity() {
}
+GCMStatsRecorder::RecordedActivities::RecordedActivities() {
+}
+
+GCMStatsRecorder::RecordedActivities::~RecordedActivities() {
+}
+
GCMStatsRecorder::GCMStatsRecorder() : is_recording_(false) {
}
@@ -80,14 +189,197 @@ void GCMStatsRecorder::SetRecording(bool recording) {
}
void GCMStatsRecorder::Clear() {
+ connection_activities_.clear();
+ registration_activities_.clear();
+ receiving_activities_.clear();
sending_activities_.clear();
}
-void GCMStatsRecorder::CollectSendingActivities(
- std::vector<SendingActivity>* activities) const {
- activities->insert(activities->begin(),
- sending_activities_.begin(),
- sending_activities_.end());
+void GCMStatsRecorder::RecordConnection(
+ const std::string& event,
+ const std::string& details) {
+ ConnectionActivity data;
+ ConnectionActivity* inserted_data = InsertCircularBuffer(
+ &connection_activities_, data);
+ inserted_data->event = event;
+ inserted_data->details = details;
+}
+
+void GCMStatsRecorder::RecordConnectionInitiated(const std::string& host) {
+ if (!is_recording_)
+ return;
+ RecordConnection("Connection initiated", host);
+}
+
+void GCMStatsRecorder::RecordConnectionDelayedDueToBackoff(int64 delay_msec) {
+ if (!is_recording_)
+ return;
+ RecordConnection("Connection backoff",
+ base::StringPrintf("Delayed for %" PRId64 " msec",
+ delay_msec));
+}
+
+void GCMStatsRecorder::RecordConnectionSuccess() {
+ if (!is_recording_)
+ return;
+ RecordConnection("Connection succeeded", std::string());
+}
+
+void GCMStatsRecorder::RecordConnectionFailure(int network_error) {
+ if (!is_recording_)
+ return;
+ RecordConnection("Connection failed",
+ base::StringPrintf("With network error %d", network_error));
+}
+
+void GCMStatsRecorder::RecordConnectionResetSignaled(
+ ConnectionFactory::ConnectionResetReason reason) {
+ if (!is_recording_)
+ return;
+ RecordConnection("Connection reset",
+ GetConnectionResetReasonString(reason));
+}
+
+void GCMStatsRecorder::RecordRegistration(
+ const std::string& app_id,
+ const std::string& sender_ids,
+ const std::string& event,
+ const std::string& details) {
+ RegistrationActivity data;
+ RegistrationActivity* inserted_data = InsertCircularBuffer(
+ &registration_activities_, data);
+ inserted_data->app_id = app_id;
+ inserted_data->sender_ids = sender_ids;
+ inserted_data->event = event;
+ inserted_data->details = details;
+}
+
+void GCMStatsRecorder::RecordRegistrationSent(
+ const std::string& app_id,
+ const std::string& sender_ids) {
+ UMA_HISTOGRAM_COUNTS("GCM.RegistrationRequest", 1);
+ if (!is_recording_)
+ return;
+ RecordRegistration(app_id, sender_ids,
+ "Registration request sent", std::string());
+}
+
+void GCMStatsRecorder::RecordRegistrationResponse(
+ const std::string& app_id,
+ const std::vector<std::string>& sender_ids,
+ RegistrationRequest::Status status) {
+ RecordRegistration(app_id, JoinString(sender_ids, ","),
+ "Registration response received",
+ GetRegistrationStatusString(status));
+}
+
+void GCMStatsRecorder::RecordRegistrationRetryRequested(
+ const std::string& app_id,
+ const std::vector<std::string>& sender_ids,
+ int retries_left) {
+ if (!is_recording_)
+ return;
+ RecordRegistration(app_id, JoinString(sender_ids, ","),
+ "Registration retry requested",
+ base::StringPrintf("Retries left: %d", retries_left));
+}
+
+void GCMStatsRecorder::RecordUnregistrationSent(
+ const std::string& app_id) {
+ UMA_HISTOGRAM_COUNTS("GCM.UnregistrationRequest", 1);
+ if (!is_recording_)
+ return;
+ RecordRegistration(app_id, std::string(), "Unregistration request sent",
+ std::string());
+}
+
+void GCMStatsRecorder::RecordUnregistrationResponse(
+ const std::string& app_id,
+ UnregistrationRequest::Status status) {
+ if (!is_recording_)
+ return;
+ RecordRegistration(app_id,
+ std::string(),
+ "Unregistration response received",
+ GetUnregistrationStatusString(status));
+}
+
+void GCMStatsRecorder::RecordUnregistrationRetryDelayed(
+ const std::string& app_id,
+ int64 delay_msec) {
+ if (!is_recording_)
+ return;
+ RecordRegistration(app_id,
+ std::string(),
+ "Unregistration retry delayed",
+ base::StringPrintf("Delayed for %" PRId64 " msec",
+ delay_msec));
+}
+
+void GCMStatsRecorder::RecordReceiving(
+ const std::string& app_id,
+ const std::string& from,
+ int message_byte_size,
+ const std::string& event,
+ const std::string& details) {
+ ReceivingActivity data;
+ ReceivingActivity* inserted_data = InsertCircularBuffer(
+ &receiving_activities_, data);
+ inserted_data->app_id = app_id;
+ inserted_data->from = from;
+ inserted_data->message_byte_size = message_byte_size;
+ inserted_data->event = event;
+ inserted_data->details = details;
+}
+
+void GCMStatsRecorder::RecordDataMessageRecieved(
+ const std::string& app_id,
+ const std::string& from,
+ int message_byte_size,
+ bool to_registered_app,
+ ReceivedMessageType message_type) {
+ if (to_registered_app)
+ UMA_HISTOGRAM_COUNTS("GCM.DataMessageReceived", 1);
+ if (!is_recording_)
+ return;
+ if (!to_registered_app) {
+ RecordReceiving(app_id, from, message_byte_size, "Data msg received",
+ to_registered_app ? std::string() :
+ "No such registered app found");
+ } else {
+ switch(message_type) {
+ case GCMStatsRecorder::DATA_MESSAGE:
+ RecordReceiving(app_id, from, message_byte_size, "Data msg received",
+ std::string());
+ break;
+ case GCMStatsRecorder::DELETED_MESSAGES:
+ RecordReceiving(app_id, from, message_byte_size, "Data msg received",
+ "Message has been deleted on server");
+ break;
+ default:
+ NOTREACHED();
+ }
+ }
+}
+
+void GCMStatsRecorder::CollectActivities(
+ RecordedActivities* recorder_activities) const {
+ recorder_activities->connection_activities.insert(
+ recorder_activities->connection_activities.begin(),
+ connection_activities_.begin(),
+ connection_activities_.end());
+ recorder_activities->registration_activities.insert(
+ recorder_activities->registration_activities.begin(),
+ registration_activities_.begin(),
+ registration_activities_.end());
+ recorder_activities->receiving_activities.insert(
+ recorder_activities->receiving_activities.begin(),
+ receiving_activities_.begin(),
+ receiving_activities_.end());
+ recorder_activities->sending_activities.insert(
+ recorder_activities->sending_activities.begin(),
+ sending_activities_.begin(),
+ sending_activities_.end());
}
void GCMStatsRecorder::RecordSending(const std::string& app_id,
@@ -110,10 +402,10 @@ void GCMStatsRecorder::RecordDataSentToWire(
const std::string& receiver_id,
const std::string& message_id,
int queued) {
- if (is_recording_) {
- RecordSending(app_id, receiver_id, message_id, "Data msg sent to wire",
- base::StringPrintf("Msg queued for %d seconds", queued));
- }
+ if (!is_recording_)
+ return;
+ RecordSending(app_id, receiver_id, message_id, "Data msg sent to wire",
+ base::StringPrintf("Msg queued for %d seconds", queued));
}
void GCMStatsRecorder::RecordNotifySendStatus(
@@ -125,15 +417,15 @@ void GCMStatsRecorder::RecordNotifySendStatus(
int ttl) {
UMA_HISTOGRAM_ENUMERATION("GCM.SendMessageStatus", status,
gcm::MCSClient::SEND_STATUS_COUNT);
- if (is_recording_) {
- RecordSending(
- app_id,
- receiver_id,
- message_id,
- base::StringPrintf("SEND status: %s",
- GetMessageSendStatusString(status).c_str()),
- base::StringPrintf("Msg size: %d bytes, TTL: %d", byte_size, ttl));
- }
+ if (!is_recording_)
+ return;
+ RecordSending(
+ app_id,
+ receiver_id,
+ message_id,
+ base::StringPrintf("SEND status: %s",
+ GetMessageSendStatusString(status).c_str()),
+ base::StringPrintf("Msg size: %d bytes, TTL: %d", byte_size, ttl));
}
void GCMStatsRecorder::RecordIncomingSendError(
@@ -141,10 +433,10 @@ void GCMStatsRecorder::RecordIncomingSendError(
const std::string& receiver_id,
const std::string& message_id) {
UMA_HISTOGRAM_COUNTS("GCM.IncomingSendErrors", 1);
- if (is_recording_) {
- RecordSending(app_id, receiver_id, message_id, "Received 'send error' msg",
- std::string());
- }
+ if (!is_recording_)
+ return;
+ RecordSending(app_id, receiver_id, message_id, "Received 'send error' msg",
+ std::string());
}
} // namespace gcm
« no previous file with comments | « google_apis/gcm/monitoring/gcm_stats_recorder.h ('k') | google_apis/gcm/monitoring/gcm_stats_recorder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698