| 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..1748fbff22dc303f89a52a12a671b2f1f5bce2f8 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 kFailedSessionDurationHistogram[] =
|
| + "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,56 @@ void ChromotingInstance::OnVideoFrameDirtyRegion(
|
| void ChromotingInstance::OnConnectionState(
|
| protocol::ConnectionToHost::State state,
|
| protocol::ErrorCode error) {
|
| + pp::UMAPrivate uma(this);
|
| +
|
| + switch (state) {
|
| + case protocol::ConnectionToHost::CONNECTING:
|
| + connection_started_time = base::TimeTicks::Now();
|
| + break;
|
| + case protocol::ConnectionToHost::AUTHENTICATED:
|
| + connection_authenticated_time_ = base::TimeTicks::Now();
|
| + uma.HistogramCustomTimes(
|
| + kTimeToAuthenticateHistogram,
|
| + (connection_authenticated_time_ - connection_started_time)
|
| + .InMilliseconds(),
|
| + kConnectionTimesHistogramMinMs, kConnectionTimesHistogramMaxMs,
|
| + kConnectionTimesHistogramBuckets);
|
| + break;
|
| + case protocol::ConnectionToHost::CONNECTED:
|
| + connection_connected_time_ = base::TimeTicks::Now();
|
| + uma.HistogramCustomTimes(
|
| + kTimeToConnectHistogram,
|
| + (connection_connected_time_ - connection_authenticated_time_)
|
| + .InMilliseconds(),
|
| + kConnectionTimesHistogramMinMs, kConnectionTimesHistogramMaxMs,
|
| + kConnectionTimesHistogramBuckets);
|
| + break;
|
| + case protocol::ConnectionToHost::CLOSED:
|
| + if (!connection_connected_time_.is_null()) {
|
| + uma.HistogramCustomTimes(
|
| + kClosedSessionDurationHistogram,
|
| + (base::TimeTicks::Now() - connection_connected_time_)
|
| + .InMilliseconds(),
|
| + kConnectionDurationHistogramMinMinutes,
|
| + kConnectionDurationHistogramMaxMinutes,
|
| + kConnectionDurationHistogramBuckets);
|
| + }
|
| + break;
|
| + case protocol::ConnectionToHost::FAILED:
|
| + if (!connection_connected_time_.is_null()) {
|
| + uma.HistogramCustomTimes(
|
| + kFailedSessionDurationHistogram,
|
| + (base::TimeTicks::Now() - connection_connected_time_)
|
| + .InMilliseconds(),
|
| + 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));
|
|
|