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

Side by Side Diff: content/browser/loader/detachable_resource_handler.cc

Issue 148573002: Add some histograms for <a ping> requests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Throw in a newline Created 6 years, 10 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 #include "content/browser/loader/detachable_resource_handler.h" 5 #include "content/browser/loader/detachable_resource_handler.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/metrics/histogram.h"
8 #include "base/time/time.h" 9 #include "base/time/time.h"
9 #include "content/browser/loader/resource_request_info_impl.h" 10 #include "content/browser/loader/resource_request_info_impl.h"
10 #include "net/base/io_buffer.h" 11 #include "net/base/io_buffer.h"
11 #include "net/base/net_errors.h" 12 #include "net/base/net_errors.h"
12 #include "net/url_request/url_request_status.h" 13 #include "net/url_request/url_request_status.h"
13 14
14 namespace { 15 namespace {
16
15 // This matches the maximum allocation size of AsyncResourceHandler. 17 // This matches the maximum allocation size of AsyncResourceHandler.
16 const int kReadBufSize = 32 * 1024; 18 const int kReadBufSize = 32 * 1024;
19
20 // Enum type for <a ping> result.
mmenke 2014/01/27 22:51:54 Think you should mention histograms, and new resul
davidben 2014/01/28 19:52:41 Done.
21 enum UMAPingResultType {
22 // The ping request received a response.
23 UMA_PING_RESULT_TYPE_RESPONSE_STARTED = 0,
24 // The ping request was canceled due to the internal timeout.
25 UMA_PING_RESULT_TYPE_TIMEDOUT = 1,
26 // The ping request was canceled for some other reason.
27 UMA_PING_RESULT_TYPE_CANCELED = 2,
28 // The ping request failed for some reason.
29 UMA_PING_RESULT_TYPE_FAILED = 3,
30 // The ping request was aborted before OnResponseCompleted.
31 UMA_PING_RESULT_TYPE_UNCOMPLETED = 4,
32
33 UMA_PING_RESULT_TYPE_MAX,
34 };
35
17 } 36 }
mmenke 2014/01/27 22:51:54 nit: "} // namespace"
davidben 2014/01/28 19:52:41 Done.
18 37
19 namespace content { 38 namespace content {
20 39
21 DetachableResourceHandler::DetachableResourceHandler( 40 DetachableResourceHandler::DetachableResourceHandler(
22 net::URLRequest* request, 41 net::URLRequest* request,
23 base::TimeDelta cancel_delay, 42 base::TimeDelta cancel_delay,
24 scoped_ptr<ResourceHandler> next_handler) 43 scoped_ptr<ResourceHandler> next_handler)
25 : ResourceHandler(request), 44 : ResourceHandler(request),
26 next_handler_(next_handler.Pass()), 45 next_handler_(next_handler.Pass()),
27 cancel_delay_(cancel_delay), 46 cancel_delay_(cancel_delay),
28 is_deferred_(false), 47 is_deferred_(false),
29 is_finished_(false) { 48 is_finished_(false),
49 timed_out_(false),
50 response_started_(false),
51 response_completed_(false) {
30 GetRequestInfo()->set_detachable_handler(this); 52 GetRequestInfo()->set_detachable_handler(this);
31 } 53 }
32 54
33 DetachableResourceHandler::~DetachableResourceHandler() { 55 DetachableResourceHandler::~DetachableResourceHandler() {
34 // Cleanup back-pointer stored on the request info. 56 // Cleanup back-pointer stored on the request info.
35 GetRequestInfo()->set_detachable_handler(NULL); 57 GetRequestInfo()->set_detachable_handler(NULL);
58
59 // Record the status of <a ping> requests.
60 // http://crbug.com/302816
61 if (GetRequestInfo()->GetResourceType() == ResourceType::PING) {
62 UMAPingResultType result_type = UMA_PING_RESULT_TYPE_MAX;
63 if (response_started_) {
mmenke 2014/01/27 22:51:54 optional: Just out of curiousity/paranoia / whate
davidben 2014/01/28 19:52:41 Done.
64 result_type = UMA_PING_RESULT_TYPE_RESPONSE_STARTED;
65 } else if (timed_out_) {
66 result_type = UMA_PING_RESULT_TYPE_TIMEDOUT;
mmenke 2014/01/27 22:51:54 Shouldn't we end up in the CANCELED bucket here?
davidben 2014/01/28 19:52:41 Done.
67 } else if (!response_completed_) {
mmenke 2014/01/27 22:51:54 I think response_completed_ is a confusing name he
davidben 2014/01/28 19:52:41 Added a comment.
68 result_type = UMA_PING_RESULT_TYPE_UNCOMPLETED;
69 } else if (status_ == net::URLRequestStatus::CANCELED) {
70 result_type = UMA_PING_RESULT_TYPE_CANCELED;
71 } else if (status_ == net::URLRequestStatus::FAILED) {
72 result_type = UMA_PING_RESULT_TYPE_FAILED;
73 }
74
75 if (result_type < UMA_PING_RESULT_TYPE_MAX) {
76 UMA_HISTOGRAM_ENUMERATION("Net.Ping_Result", result_type,
77 UMA_PING_RESULT_TYPE_MAX);
78 } else {
79 // This shouldn't happen. If the request succeeds, |response_started_|
80 // will be true.
81 NOTREACHED();
82 }
83 }
36 } 84 }
37 85
38 void DetachableResourceHandler::Detach() { 86 void DetachableResourceHandler::Detach() {
39 if (is_detached()) 87 if (is_detached())
40 return; 88 return;
41 89
42 if (!is_finished_) { 90 if (!is_finished_) {
43 // Simulate a cancel on the next handler before destroying it. 91 // Simulate a cancel on the next handler before destroying it.
44 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, 92 net::URLRequestStatus status(net::URLRequestStatus::CANCELED,
45 net::ERR_ABORTED); 93 net::ERR_ABORTED);
(...skipping 12 matching lines...) Expand all
58 // OnWillRead passes back a scoped_refptr, so downstream handler's buffer will 106 // OnWillRead passes back a scoped_refptr, so downstream handler's buffer will
59 // survive long enough to complete that read. From there, future reads will 107 // survive long enough to complete that read. From there, future reads will
60 // drain into |read_buffer_|. (If |next_handler_| is an AsyncResourceHandler, 108 // drain into |read_buffer_|. (If |next_handler_| is an AsyncResourceHandler,
61 // the net::IOBuffer takes a reference to the ResourceBuffer which owns the 109 // the net::IOBuffer takes a reference to the ResourceBuffer which owns the
62 // shared memory.) 110 // shared memory.)
63 next_handler_.reset(); 111 next_handler_.reset();
64 112
65 // Time the request out if it takes too long. 113 // Time the request out if it takes too long.
66 detached_timer_.reset(new base::OneShotTimer<DetachableResourceHandler>()); 114 detached_timer_.reset(new base::OneShotTimer<DetachableResourceHandler>());
67 detached_timer_->Start( 115 detached_timer_->Start(
68 FROM_HERE, cancel_delay_, this, &DetachableResourceHandler::Cancel); 116 FROM_HERE, cancel_delay_, this, &DetachableResourceHandler::TimedOut);
69 117
70 // Resume if necessary. The request may have been deferred, say, waiting on a 118 // Resume if necessary. The request may have been deferred, say, waiting on a
71 // full buffer in AsyncResourceHandler. Now that it has been detached, resume 119 // full buffer in AsyncResourceHandler. Now that it has been detached, resume
72 // and drain it. 120 // and drain it.
73 if (is_deferred_) 121 if (is_deferred_)
74 Resume(); 122 Resume();
75 } 123 }
76 124
77 void DetachableResourceHandler::SetController(ResourceController* controller) { 125 void DetachableResourceHandler::SetController(ResourceController* controller) {
78 ResourceHandler::SetController(controller); 126 ResourceHandler::SetController(controller);
(...skipping 25 matching lines...) Expand all
104 bool ret = next_handler_->OnRequestRedirected(request_id, url, response, 152 bool ret = next_handler_->OnRequestRedirected(request_id, url, response,
105 &is_deferred_); 153 &is_deferred_);
106 *defer = is_deferred_; 154 *defer = is_deferred_;
107 return ret; 155 return ret;
108 } 156 }
109 157
110 bool DetachableResourceHandler::OnResponseStarted(int request_id, 158 bool DetachableResourceHandler::OnResponseStarted(int request_id,
111 ResourceResponse* response, 159 ResourceResponse* response,
112 bool* defer) { 160 bool* defer) {
113 DCHECK(!is_deferred_); 161 DCHECK(!is_deferred_);
162 DCHECK(!response_started_);
163 response_started_ = true;
164
165 // Record how long it takes for <a ping> to respond.
166 // http://crbug.com/302816
167 if (GetRequestInfo()->GetResourceType() == ResourceType::PING) {
168 UMA_HISTOGRAM_MEDIUM_TIMES("Net.Ping_ResponseStartedTime",
169 time_since_start_.Elapsed());
170 }
114 171
115 if (!next_handler_) 172 if (!next_handler_)
116 return true; 173 return true;
117 174
118 bool ret = 175 bool ret =
119 next_handler_->OnResponseStarted(request_id, response, &is_deferred_); 176 next_handler_->OnResponseStarted(request_id, response, &is_deferred_);
120 *defer = is_deferred_; 177 *defer = is_deferred_;
121 return ret; 178 return ret;
122 } 179 }
123 180
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 } 234 }
178 235
179 void DetachableResourceHandler::OnResponseCompleted( 236 void DetachableResourceHandler::OnResponseCompleted(
180 int request_id, 237 int request_id,
181 const net::URLRequestStatus& status, 238 const net::URLRequestStatus& status,
182 const std::string& security_info, 239 const std::string& security_info,
183 bool* defer) { 240 bool* defer) {
184 // No DCHECK(!is_deferred_) as the request may have been cancelled while 241 // No DCHECK(!is_deferred_) as the request may have been cancelled while
185 // deferred. 242 // deferred.
186 243
244 response_completed_ = true;
245 status_ = status.status();
246
187 if (!next_handler_) 247 if (!next_handler_)
188 return; 248 return;
189 249
190 is_finished_ = true; 250 is_finished_ = true;
191 251
192 next_handler_->OnResponseCompleted(request_id, status, security_info, 252 next_handler_->OnResponseCompleted(request_id, status, security_info,
193 &is_deferred_); 253 &is_deferred_);
194 *defer = is_deferred_; 254 *defer = is_deferred_;
195 } 255 }
196 256
(...skipping 16 matching lines...) Expand all
213 } 273 }
214 274
215 void DetachableResourceHandler::CancelAndIgnore() { 275 void DetachableResourceHandler::CancelAndIgnore() {
216 controller()->CancelAndIgnore(); 276 controller()->CancelAndIgnore();
217 } 277 }
218 278
219 void DetachableResourceHandler::CancelWithError(int error_code) { 279 void DetachableResourceHandler::CancelWithError(int error_code) {
220 controller()->CancelWithError(error_code); 280 controller()->CancelWithError(error_code);
221 } 281 }
222 282
283 void DetachableResourceHandler::TimedOut() {
284 timed_out_ = true;
285 controller()->Cancel();
286 }
287
223 } // namespace content 288 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/detachable_resource_handler.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698