1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/socket_stream/socket_stream_metrics.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string.h>
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/time.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "googleurl/src/gurl.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottSocketStreamMetrics::SocketStreamMetrics(const GURL& url)
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    : received_bytes_(0),
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      received_counts_(0),
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      sent_bytes_(0),
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      sent_counts_(0) {
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ProtocolType proto_type = PROTOCOL_UNKNOWN;
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (url.SchemeIs("ws"))
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    proto_type = PROTOCOL_WEBSOCKET;
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  else if (url.SchemeIs("wss"))
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    proto_type = PROTOCOL_WEBSOCKET_SECURE;
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CountProtocolType(proto_type);
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottSocketStreamMetrics::~SocketStreamMetrics() {}
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SocketStreamMetrics::OnWaitConnection() {
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  wait_start_time_ = base::TimeTicks::Now();
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SocketStreamMetrics::OnStartConnection() {
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  connect_start_time_ = base::TimeTicks::Now();
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!wait_start_time_.is_null())
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UMA_HISTOGRAM_TIMES("Net.SocketStream.ConnectionLatency",
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        connect_start_time_ - wait_start_time_);
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CountConnectionType(ALL_CONNECTIONS);
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SocketStreamMetrics::OnTunnelProxy() {
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CountConnectionType(TUNNEL_CONNECTION);
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SocketStreamMetrics::OnSOCKSProxy() {
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CountConnectionType(SOCKS_CONNECTION);
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SocketStreamMetrics::OnSSLConnection() {
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CountConnectionType(SSL_CONNECTION);
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SocketStreamMetrics::OnConnected() {
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  connect_establish_time_ = base::TimeTicks::Now();
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  UMA_HISTOGRAM_TIMES("Net.SocketStream.ConnectionEstablish",
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                      connect_establish_time_ - connect_start_time_);
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SocketStreamMetrics::OnRead(int len) {
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  received_bytes_ += len;
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ++received_counts_;
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SocketStreamMetrics::OnWrite(int len) {
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  sent_bytes_ += len;
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ++sent_counts_;
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SocketStreamMetrics::OnClose() {
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::TimeTicks closed_time = base::TimeTicks::Now();
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!connect_establish_time_.is_null()) {
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UMA_HISTOGRAM_LONG_TIMES("Net.SocketStream.Duration",
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             closed_time - connect_establish_time_);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UMA_HISTOGRAM_COUNTS("Net.SocketStream.ReceivedBytes",
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         received_bytes_);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UMA_HISTOGRAM_COUNTS("Net.SocketStream.ReceivedCounts",
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         received_counts_);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UMA_HISTOGRAM_COUNTS("Net.SocketStream.SentBytes",
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         sent_bytes_);
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UMA_HISTOGRAM_COUNTS("Net.SocketStream.SentCounts",
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         sent_counts_);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SocketStreamMetrics::CountProtocolType(ProtocolType protocol_type) {
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  UMA_HISTOGRAM_ENUMERATION("Net.SocketStream.ProtocolType",
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       protocol_type, NUM_PROTOCOL_TYPES);
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SocketStreamMetrics::CountConnectionType(ConnectionType connection_type) {
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  UMA_HISTOGRAM_ENUMERATION("Net.SocketStream.ConnectionType",
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       connection_type, NUM_CONNECTION_TYPES);
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace net
99