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

Side by Side Diff: chrome/browser/net/network_stats.h

Issue 10206035: NetConnectivity - Collect stats for TCP/UDP network (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/net/network_stats.cc » ('j') | chrome/browser/net/network_stats.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_NET_NETWORK_STATS_H_ 5 #ifndef CHROME_BROWSER_NET_NETWORK_STATS_H_
6 #define CHROME_BROWSER_NET_NETWORK_STATS_H_ 6 #define CHROME_BROWSER_NET_NETWORK_STATS_H_
7 #pragma once 7 #pragma once
8 8
9 #include <string> 9 #include <string>
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
14 #include "base/string_util.h" 14 #include "base/string_util.h"
15 #include "base/time.h" 15 #include "base/time.h"
16 #include "chrome/browser/io_thread.h" 16 #include "chrome/browser/io_thread.h"
17 #include "net/base/address_list.h" 17 #include "net/base/address_list.h"
18 #include "net/base/completion_callback.h" 18 #include "net/base/completion_callback.h"
19 #include "net/base/host_port_pair.h" 19 #include "net/base/host_port_pair.h"
20 #include "net/base/host_resolver.h" 20 #include "net/base/host_resolver.h"
21 #include "net/base/io_buffer.h" 21 #include "net/base/io_buffer.h"
22 #include "net/base/ip_endpoint.h" 22 #include "net/base/ip_endpoint.h"
23 #include "net/base/test_data_stream.h" 23 #include "net/base/test_data_stream.h"
24 #include "net/proxy/proxy_info.h"
24 #include "net/socket/socket.h" 25 #include "net/socket/socket.h"
25 26
26 namespace chrome_browser_net { 27 namespace chrome_browser_net {
27 28
28 // This class is used for live experiment of network connectivity (either TCP or 29 // This class is used for live experiment of network connectivity (either TCP or
29 // UDP) metrics. A small percentage of users participate in this experiment. All 30 // UDP) metrics. A small percentage of users participate in this experiment. All
30 // users (who are in the experiment) must have enabled "UMA upload". 31 // users (who are in the experiment) must have enabled "UMA upload".
31 // 32 //
32 // This class collects the following stats from users who have opted in. 33 // This class collects the following stats from users who have opted in.
33 // a) What percentage of users can get a message end-to-end to a UDP server? 34 // a) What percentage of users can get a message end-to-end to a UDP server?
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 // Starts the client, connecting to |server|. 94 // Starts the client, connecting to |server|.
94 // Client will send |bytes_to_send| bytes to |server|. 95 // Client will send |bytes_to_send| bytes to |server|.
95 // When client has received all echoed bytes from the server, or 96 // When client has received all echoed bytes from the server, or
96 // when an error occurs causing the client to stop, |Finish| will be 97 // when an error occurs causing the client to stop, |Finish| will be
97 // called with a net status code. 98 // called with a net status code.
98 // |Finish| will collect histogram stats. 99 // |Finish| will collect histogram stats.
99 // Returns true if successful in starting the client. 100 // Returns true if successful in starting the client.
100 bool Start(net::HostResolver* host_resolver, 101 bool Start(net::HostResolver* host_resolver,
101 const net::HostPortPair& server, 102 const net::HostPortPair& server,
102 HistogramPortSelector histogram_port, 103 HistogramPortSelector histogram_port,
104 bool has_no_proxy_server,
103 uint32 bytes_to_send, 105 uint32 bytes_to_send,
104 const net::CompletionCallback& callback); 106 const net::CompletionCallback& callback);
105 107
106 protected: 108 protected:
107 // Constructs an NetworkStats object that collects metrics for network 109 // Constructs an NetworkStats object that collects metrics for network
108 // connectivity (either TCP or UDP). 110 // connectivity (either TCP or UDP).
109 NetworkStats(); 111 NetworkStats();
110 virtual ~NetworkStats(); 112 virtual ~NetworkStats();
111 113
112 // Initializes |finished_callback_| and the number of bytes to send to the 114 // Initializes |finished_callback_| and the number of bytes to send to the
113 // server. |finished_callback| is called when we are done with the test. 115 // server. |finished_callback| is called when we are done with the test.
114 // |finished_callback| is mainly useful for unittests. 116 // |finished_callback| is mainly useful for unittests.
115 void Initialize(uint32 bytes_to_send, 117 void Initialize(uint32 bytes_to_send,
116 HistogramPortSelector histogram_port, 118 HistogramPortSelector histogram_port,
119 bool has_no_proxy_server,
117 const net::CompletionCallback& finished_callback); 120 const net::CompletionCallback& finished_callback);
118 121
119 // Called after host is resolved. UDPStatsClient and TCPStatsClient implement 122 // Called after host is resolved. UDPStatsClient and TCPStatsClient implement
120 // this method. They create the socket and connect to the server. 123 // this method. They create the socket and connect to the server.
121 virtual bool DoConnect(int result) = 0; 124 virtual bool DoConnect(int result) = 0;
122 125
123 // This method is called after socket connection is completed. It will send 126 // This method is called after socket connection is completed. It will send
124 // |bytes_to_send| bytes to |server| by calling SendData(). After successfully 127 // |bytes_to_send| bytes to |server| by calling SendData(). After successfully
125 // sending data to the |server|, it calls ReadData() to read/verify the data 128 // sending data to the |server|, it calls ReadData() to read/verify the data
126 // from the |server|. Returns true if successful. 129 // from the |server|. Returns true if successful.
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 encoded_message_ = message; 209 encoded_message_ = message;
207 } 210 }
208 211
209 // This method parses the "echo response" message in the |encoded_message_| to 212 // This method parses the "echo response" message in the |encoded_message_| to
210 // verify that the <payload> is same as what we had sent in "echo request" 213 // verify that the <payload> is same as what we had sent in "echo request"
211 // message. It returns SUCCESS, if all the bytes are verified. 214 // message. It returns SUCCESS, if all the bytes are verified.
212 NetworkStats::Status VerifyBytes(); 215 NetworkStats::Status VerifyBytes();
213 216
214 // Returns the histogram names for collecting network connectivity stats. 217 // Returns the histogram names for collecting network connectivity stats.
215 // This is called by RecordHistograms. It sets the histogram names in 218 // This is called by RecordHistograms. It sets the histogram names in
216 // |rtt_histogram_name| and |status_histogram_name|. 219 // |rtt_histogram_name| and |status_histogram_name|. It always returns
220 // "NetConnectivity.<protocol>.Status.<port>.<load_size>" as histogram name
221 // for status histogram in |status_histogram_name|.
217 // If |result| equals to net::OK, it returns 222 // If |result| equals to net::OK, it returns
218 // "NetConnectivity.<protocol>.Success.<port>.<load_size>.RTT" as histogram 223 // "NetConnectivity.<protocol>.Success.<port>.<load_size>.RTT" as histogram
219 // name for RTT histogram and 224 // name in |rtt_histogram_name|. If |has_no_proxy_server| is true, it returns
220 // "NetConnectivity.<protocol>.Status.<port>.<load_size>" as histogram name 225 // "NetConnectivity.<protocol>.NoProxy.Success.<port>.<load_size>.RTT" as
221 // for status histogram. |protocol| argument sets <protocol> in the histogram 226 // histogram name for RTT histogram in |rtt_no_proxy_histogram_name| and
222 // name. It would be either TCP or UDP. <port> is the string representation of 227 // "NetConnectivity.<protocol>.NoProxy.Status.<port>.<load_size>" as histogram
223 // |histogram_port|. |load_size| argument determines <load_size> in the 228 // name for status histogram in |status_no_proxy_histogram_name|.
224 // histogram name. It would be either 100B or 1K. 229 // |protocol| argument sets <protocol> in the histogram name. It would be
230 // either TCP or UDP. <port> is the string representation of |histogram_port|.
231 // |load_size| argument determines <load_size> in the histogram name. It would
232 // be either 100B or 1K.
225 static void GetHistogramNames(const ProtocolValue& protocol, 233 static void GetHistogramNames(const ProtocolValue& protocol,
226 HistogramPortSelector histogram_port, 234 HistogramPortSelector histogram_port,
235 bool has_no_proxy_server,
227 uint32 load_size, 236 uint32 load_size,
228 int result, 237 int result,
229 std::string* rtt_histogram_name, 238 std::string* rtt_histogram_name,
230 std::string* status_histogram_name); 239 std::string* rtt_no_proxy_histogram_name,
240 std::string* status_histogram_name,
241 std::string* status_no_proxy_histogram_name);
231 242
232 // The socket handle for this session. 243 // The socket handle for this session.
233 scoped_ptr<net::Socket> socket_; 244 scoped_ptr<net::Socket> socket_;
234 245
235 // The read buffer used to read data from the socket. 246 // The read buffer used to read data from the socket.
236 scoped_refptr<net::IOBuffer> read_buffer_; 247 scoped_refptr<net::IOBuffer> read_buffer_;
237 248
238 // The write buffer used to write data to the socket. 249 // The write buffer used to write data to the socket.
239 scoped_refptr<net::DrainableIOBuffer> write_buffer_; 250 scoped_refptr<net::DrainableIOBuffer> write_buffer_;
240 251
241 // Some counters for the session. 252 // Some counters for the session.
242 uint32 load_size_; 253 uint32 load_size_;
243 uint32 bytes_to_read_; 254 uint32 bytes_to_read_;
244 uint32 bytes_to_send_; 255 uint32 bytes_to_send_;
245 256
246 // The encoded message read from the server. 257 // The encoded message read from the server.
247 std::string encoded_message_; 258 std::string encoded_message_;
248 259
249 // |stream_| is used to generate data to be sent to the server and it is also 260 // |stream_| is used to generate data to be sent to the server and it is also
250 // used to verify the data received from the server. 261 // used to verify the data received from the server.
251 net::TestDataStream stream_; 262 net::TestDataStream stream_;
252 263
253 // |histogram_port_| specifies the port for which we are testing the network 264 // |histogram_port_| specifies the port for which we are testing the network
254 // connectivity. 265 // connectivity.
255 HistogramPortSelector histogram_port_; 266 HistogramPortSelector histogram_port_;
256 267
268 // |has_no_proxy_server_| specifies if there is a proxy server or not.
269 bool has_no_proxy_server_;
270
257 // HostResolver fills out the |addresses_| after host resolution is completed. 271 // HostResolver fills out the |addresses_| after host resolution is completed.
258 net::AddressList addresses_; 272 net::AddressList addresses_;
259 273
260 // Callback to call when echo protocol is successefully finished or whenever 274 // Callback to call when echo protocol is successefully finished or whenever
261 // there is an error (this allows unittests to wait until echo protocol's 275 // there is an error (this allows unittests to wait until echo protocol's
262 // round trip is finished). 276 // round trip is finished).
263 net::CompletionCallback finished_callback_; 277 net::CompletionCallback finished_callback_;
264 278
265 // The time when the session was started. 279 // The time when the session was started.
266 base::TimeTicks start_time_; 280 base::TimeTicks start_time_;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 // Collects stats for TCP connectivity. This is called when all the data from 331 // Collects stats for TCP connectivity. This is called when all the data from
318 // server is read or when there is a failure during connect/read/write. 332 // server is read or when there is a failure during connect/read/write.
319 virtual void Finish(Status status, int result) OVERRIDE; 333 virtual void Finish(Status status, int result) OVERRIDE;
320 334
321 private: 335 private:
322 // Callback that is called when connect is completed and calls 336 // Callback that is called when connect is completed and calls
323 // ConnectComplete() to start the echo protocol. 337 // ConnectComplete() to start the echo protocol.
324 void OnConnectComplete(int result); 338 void OnConnectComplete(int result);
325 }; 339 };
326 340
341 class ProxyClient {
342 public:
343 // Constructs a ProxyClient object that resolves if access to
344 // network_stats_server goes through a proxy server or not.
345 ProxyClient(const std::string& network_stats_server,
346 NetworkStats::HistogramPortSelector histogram_port,
347 IOThread* io_thread);
348 virtual ~ProxyClient();
349
350 // This method uses system ProxyService to resolve the proxy for the given
351 // |network_stats_server| and |histogram_port|.
352 void ResolveProxy();
353
354 // Collects the network connectivity stats for UDP and TCP protocols.
355 void OnResolveProxyComplete(int result);
356
357 private:
358 // |network_stats_server_| specifies the TCP/UDP echo server name.
359 std::string network_stats_server_;
360
361 // |histogram_port_| specifies the port for which we are testing the network
362 // connectivity.
363 NetworkStats::HistogramPortSelector histogram_port_;
364
365 // |proxy_info_| holds proxy information returned by ResolveProxy.
366 net::ProxyInfo proxy_info_;
367
368 // The IOThread for accessing global HostResolver to resolve
369 // network_stats_server_ host and for accessing global system ProxyService.
370 // |io_thread_| is accessed on IO thread and it is safe to access it on IO
371 // thread.
372 IOThread* io_thread_;
373 };
374
327 // This collects the network connectivity stats for UDP and TCP for small 375 // This collects the network connectivity stats for UDP and TCP for small
328 // percentage of users who are participating in the experiment. All users must 376 // percentage of users who are participating in the experiment. All users must
329 // have enabled "UMA upload". This method gets called only if UMA upload to the 377 // have enabled "UMA upload". This method gets called only if UMA upload to the
330 // server has succeeded. 378 // server has succeeded.
331 void CollectNetworkStats(const std::string& network_stats_server_url, 379 void CollectNetworkStats(const std::string& network_stats_server_url,
332 IOThread* io_thread); 380 IOThread* io_thread);
333 381
334 } // namespace chrome_browser_net 382 } // namespace chrome_browser_net
335 383
336 #endif // CHROME_BROWSER_NET_NETWORK_STATS_H_ 384 #endif // CHROME_BROWSER_NET_NETWORK_STATS_H_
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/net/network_stats.cc » ('j') | chrome/browser/net/network_stats.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698