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