Index: remoting/client/plugin/chromoting_instance.cc |
diff --git a/remoting/client/plugin/chromoting_instance.cc b/remoting/client/plugin/chromoting_instance.cc |
index c0ad2d3eaacb7d6bf7807cc6c84a6aa6c9a4ede2..3676cfd4c8d121a16d41123694f1d592a627d387 100644 |
--- a/remoting/client/plugin/chromoting_instance.cc |
+++ b/remoting/client/plugin/chromoting_instance.cc |
@@ -67,6 +67,24 @@ const int kDefaultDPI = 96; |
// state, so we initialize it with 1k or random data. |
const int kRandomSeedSize = 1024; |
+// The connection times and duration values are stored in UMA custom-time |
+// histograms, specified based off values seen over a recent 7-day period. |
+// The connection times histograms are in milliseconds and the connection |
+// duration histograms are in minutes. |
+const char kTimeToAuthenticateHistogram[] = |
+ "Chromoting.Connections.TimesMs.Authenticate"; |
+const char kTimeToConnectHistogram[] = "Chromoting.Connections.TimesMs.Connect"; |
+const char kClosedSessionDurationHistogram[] = |
+ "Chromoting.Connections.DurationsMinutes.Closed"; |
+const char kDroppedSessionDurationHistogram[] = |
+ "Chromoting.Connections.DurationsMinutes.Failed"; |
+const int kConnectionTimesHistogramMinMs = 1; |
+const int kConnectionTimesHistogramMaxMs = 30000; |
+const int kConnectionTimesHistogramBuckets = 50; |
+const int kConnectionDurationHistogramMinMinutes = 1; |
+const int kConnectionDurationHistogramMaxMinutes = 24 * 60; |
+const int kConnectionDurationHistogramBuckets = 50; |
+ |
// TODO(sergeyu): Ideally we should just pass ErrorCode to the webapp |
// and let it handle it, but it would be hard to fix it now because |
// client plugin and webapp versions may not be in sync. It should be |
@@ -364,6 +382,48 @@ void ChromotingInstance::OnVideoFrameDirtyRegion( |
void ChromotingInstance::OnConnectionState( |
protocol::ConnectionToHost::State state, |
protocol::ErrorCode error) { |
+ pp::UMAPrivate uma(this); |
+ |
+ switch (state) { |
+ case protocol::ConnectionToHost::CONNECTING: |
+ connection_connecting_ = base::Time::Now(); |
+ break; |
+ case protocol::ConnectionToHost::AUTHENTICATED: |
+ connection_authenticated_ = base::Time::Now(); |
+ uma.HistogramCustomTimes( |
+ kTimeToAuthenticateHistogram, |
+ (connection_authenticated_ - connection_connecting_).InMilliseconds(), |
+ kConnectionTimesHistogramMinMs, kConnectionTimesHistogramMaxMs, |
+ kConnectionTimesHistogramBuckets); |
+ break; |
+ case protocol::ConnectionToHost::CONNECTED: |
+ connection_connected_ = base::Time::Now(); |
+ uma.HistogramCustomTimes( |
+ kTimeToConnectHistogram, |
+ (connection_connected_ - connection_authenticated_).InMilliseconds(), |
+ kConnectionTimesHistogramMinMs, kConnectionTimesHistogramMaxMs, |
+ kConnectionTimesHistogramBuckets); |
+ break; |
+ case protocol::ConnectionToHost::CLOSED: |
+ uma.HistogramCustomTimes( |
+ kClosedSessionDurationHistogram, |
+ (base::Time::Now() - connection_connected_).InMilliseconds(), |
+ kConnectionDurationHistogramMinMinutes, |
+ kConnectionDurationHistogramMaxMinutes, |
+ kConnectionDurationHistogramBuckets); |
+ break; |
+ case protocol::ConnectionToHost::FAILED: |
+ uma.HistogramCustomTimes( |
+ kDroppedSessionDurationHistogram, |
+ (base::Time::Now() - connection_connected_).InMilliseconds(), |
Sergey Ulanov
2015/08/20 21:05:19
connection_connected_ is set only if the session w
anandc
2015/08/20 23:12:01
Done.
|
+ kConnectionDurationHistogramMinMinutes, |
+ kConnectionDurationHistogramMaxMinutes, |
+ kConnectionDurationHistogramBuckets); |
+ break; |
+ case protocol::ConnectionToHost::INITIALIZING: |
+ break; |
+ } |
+ |
scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); |
data->SetString("state", protocol::ConnectionToHost::StateToString(state)); |
data->SetString("error", ConnectionErrorToString(error)); |