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

Side by Side Diff: components/cronet/android/cronet_url_request_adapter.cc

Issue 2351793003: Implement timing metrics for UrlRequest (Closed)
Patch Set: add more testing, and other comments Created 4 years, 3 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "components/cronet/android/cronet_url_request_adapter.h" 5 #include "components/cronet/android/cronet_url_request_adapter.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 26 matching lines...) Expand all
37 bool CronetUrlRequestAdapterRegisterJni(JNIEnv* env) { 37 bool CronetUrlRequestAdapterRegisterJni(JNIEnv* env) {
38 return RegisterNativesImpl(env); 38 return RegisterNativesImpl(env);
39 } 39 }
40 40
41 static jlong CreateRequestAdapter(JNIEnv* env, 41 static jlong CreateRequestAdapter(JNIEnv* env,
42 const JavaParamRef<jobject>& jurl_request, 42 const JavaParamRef<jobject>& jurl_request,
43 jlong jurl_request_context_adapter, 43 jlong jurl_request_context_adapter,
44 const JavaParamRef<jstring>& jurl_string, 44 const JavaParamRef<jstring>& jurl_string,
45 jint jpriority, 45 jint jpriority,
46 jboolean jdisable_cache, 46 jboolean jdisable_cache,
47 jboolean jdisable_connection_migration) { 47 jboolean jdisable_connection_migration,
48 jboolean jenable_metrics) {
48 CronetURLRequestContextAdapter* context_adapter = 49 CronetURLRequestContextAdapter* context_adapter =
49 reinterpret_cast<CronetURLRequestContextAdapter*>( 50 reinterpret_cast<CronetURLRequestContextAdapter*>(
50 jurl_request_context_adapter); 51 jurl_request_context_adapter);
51 DCHECK(context_adapter); 52 DCHECK(context_adapter);
52 53
53 GURL url(base::android::ConvertJavaStringToUTF8(env, jurl_string)); 54 GURL url(base::android::ConvertJavaStringToUTF8(env, jurl_string));
54 55
55 VLOG(1) << "New chromium network request_adapter: " 56 VLOG(1) << "New chromium network request_adapter: "
56 << url.possibly_invalid_spec(); 57 << url.possibly_invalid_spec();
57 58
58 CronetURLRequestAdapter* adapter = new CronetURLRequestAdapter( 59 CronetURLRequestAdapter* adapter = new CronetURLRequestAdapter(
59 context_adapter, env, jurl_request, url, 60 context_adapter, env, jurl_request, url,
60 static_cast<net::RequestPriority>(jpriority), jdisable_cache, 61 static_cast<net::RequestPriority>(jpriority), jdisable_cache,
61 jdisable_connection_migration); 62 jdisable_connection_migration, jenable_metrics);
62 63
63 return reinterpret_cast<jlong>(adapter); 64 return reinterpret_cast<jlong>(adapter);
64 } 65 }
65 66
66 CronetURLRequestAdapter::CronetURLRequestAdapter( 67 CronetURLRequestAdapter::CronetURLRequestAdapter(
67 CronetURLRequestContextAdapter* context, 68 CronetURLRequestContextAdapter* context,
68 JNIEnv* env, 69 JNIEnv* env,
69 jobject jurl_request, 70 jobject jurl_request,
70 const GURL& url, 71 const GURL& url,
71 net::RequestPriority priority, 72 net::RequestPriority priority,
72 jboolean jdisable_cache, 73 jboolean jdisable_cache,
73 jboolean jdisable_connection_migration) 74 jboolean jdisable_connection_migration,
75 jboolean jenable_metrics)
74 : context_(context), 76 : context_(context),
75 initial_url_(url), 77 initial_url_(url),
76 initial_priority_(priority), 78 initial_priority_(priority),
77 initial_method_("GET"), 79 initial_method_("GET"),
78 load_flags_(context->default_load_flags()) { 80 load_flags_(context->default_load_flags()) {
79 DCHECK(!context_->IsOnNetworkThread()); 81 DCHECK(!context_->IsOnNetworkThread());
80 owner_.Reset(env, jurl_request); 82 owner_.Reset(env, jurl_request);
81 if (jdisable_cache == JNI_TRUE) 83 if (jdisable_cache == JNI_TRUE)
82 load_flags_ |= net::LOAD_DISABLE_CACHE; 84 load_flags_ |= net::LOAD_DISABLE_CACHE;
83 if (jdisable_connection_migration == JNI_TRUE) 85 if (jdisable_connection_migration == JNI_TRUE)
84 load_flags_ |= net::LOAD_DISABLE_CONNECTION_MIGRATION; 86 load_flags_ |= net::LOAD_DISABLE_CONNECTION_MIGRATION;
87 enable_metrics_ = (jenable_metrics == JNI_TRUE);
85 } 88 }
86 89
87 CronetURLRequestAdapter::~CronetURLRequestAdapter() { 90 CronetURLRequestAdapter::~CronetURLRequestAdapter() {
88 DCHECK(context_->IsOnNetworkThread()); 91 DCHECK(context_->IsOnNetworkThread());
89 } 92 }
90 93
91 jboolean CronetURLRequestAdapter::SetHttpMethod( 94 jboolean CronetURLRequestAdapter::SetHttpMethod(
92 JNIEnv* env, 95 JNIEnv* env,
93 const JavaParamRef<jobject>& jcaller, 96 const JavaParamRef<jobject>& jcaller,
94 const JavaParamRef<jstring>& jmethod) { 97 const JavaParamRef<jstring>& jmethod) {
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 } 228 }
226 229
227 void CronetURLRequestAdapter::OnSSLCertificateError( 230 void CronetURLRequestAdapter::OnSSLCertificateError(
228 net::URLRequest* request, 231 net::URLRequest* request,
229 const net::SSLInfo& ssl_info, 232 const net::SSLInfo& ssl_info,
230 bool fatal) { 233 bool fatal) {
231 DCHECK(context_->IsOnNetworkThread()); 234 DCHECK(context_->IsOnNetworkThread());
232 request->Cancel(); 235 request->Cancel();
233 int net_error = net::MapCertStatusToNetError(ssl_info.cert_status); 236 int net_error = net::MapCertStatusToNetError(ssl_info.cert_status);
234 JNIEnv* env = base::android::AttachCurrentThread(); 237 JNIEnv* env = base::android::AttachCurrentThread();
238 MaybeReportMetrics(request);
235 cronet::Java_CronetUrlRequest_onError( 239 cronet::Java_CronetUrlRequest_onError(
236 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error, 240 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error,
237 net::QUIC_NO_ERROR, 241 net::QUIC_NO_ERROR,
238 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(), 242 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(),
239 request->GetTotalReceivedBytes()); 243 request->GetTotalReceivedBytes());
240 } 244 }
241 245
242 void CronetURLRequestAdapter::OnResponseStarted(net::URLRequest* request) { 246 void CronetURLRequestAdapter::OnResponseStarted(net::URLRequest* request) {
243 DCHECK(context_->IsOnNetworkThread()); 247 DCHECK(context_->IsOnNetworkThread());
244 if (MaybeReportError(request)) 248 if (MaybeReportError(request))
(...skipping 21 matching lines...) Expand all
266 if (bytes_read != 0) { 270 if (bytes_read != 0) {
267 JNIEnv* env = base::android::AttachCurrentThread(); 271 JNIEnv* env = base::android::AttachCurrentThread();
268 cronet::Java_CronetUrlRequest_onReadCompleted( 272 cronet::Java_CronetUrlRequest_onReadCompleted(
269 env, owner_.obj(), read_buffer_->byte_buffer(), bytes_read, 273 env, owner_.obj(), read_buffer_->byte_buffer(), bytes_read,
270 read_buffer_->initial_position(), read_buffer_->initial_limit(), 274 read_buffer_->initial_position(), read_buffer_->initial_limit(),
271 request->GetTotalReceivedBytes()); 275 request->GetTotalReceivedBytes());
272 // Free the read buffer. This lets the Java ByteBuffer be freed, if the 276 // Free the read buffer. This lets the Java ByteBuffer be freed, if the
273 // embedder releases it, too. 277 // embedder releases it, too.
274 read_buffer_ = nullptr; 278 read_buffer_ = nullptr;
275 } else { 279 } else {
280 MaybeReportMetrics(request);
276 JNIEnv* env = base::android::AttachCurrentThread(); 281 JNIEnv* env = base::android::AttachCurrentThread();
277 cronet::Java_CronetUrlRequest_onSucceeded( 282 cronet::Java_CronetUrlRequest_onSucceeded(
278 env, owner_.obj(), url_request_->GetTotalReceivedBytes()); 283 env, owner_.obj(), url_request_->GetTotalReceivedBytes());
279 } 284 }
280 } 285 }
281 286
282 void CronetURLRequestAdapter::StartOnNetworkThread() { 287 void CronetURLRequestAdapter::StartOnNetworkThread() {
283 DCHECK(context_->IsOnNetworkThread()); 288 DCHECK(context_->IsOnNetworkThread());
284 VLOG(1) << "Starting chromium request: " 289 VLOG(1) << "Starting chromium request: "
285 << initial_url_.possibly_invalid_spec().c_str() 290 << initial_url_.possibly_invalid_spec().c_str()
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 // If IO is pending, wait for the URLRequest to call OnReadCompleted. 354 // If IO is pending, wait for the URLRequest to call OnReadCompleted.
350 if (url_request_->status().is_io_pending()) 355 if (url_request_->status().is_io_pending())
351 return; 356 return;
352 357
353 OnReadCompleted(url_request_.get(), bytes_read); 358 OnReadCompleted(url_request_.get(), bytes_read);
354 } 359 }
355 360
356 void CronetURLRequestAdapter::DestroyOnNetworkThread(bool send_on_canceled) { 361 void CronetURLRequestAdapter::DestroyOnNetworkThread(bool send_on_canceled) {
357 DCHECK(context_->IsOnNetworkThread()); 362 DCHECK(context_->IsOnNetworkThread());
358 if (send_on_canceled) { 363 if (send_on_canceled) {
364 MaybeReportMetrics(url_request_.get());
xunjieli 2016/09/22 18:05:15 This will be invoked after the Java destroyRequest
mgersh 2016/09/30 23:47:14 Wow, yeah, thanks for catching that. Wrote a test.
xunjieli 2016/10/01 13:43:49 Instead of doing "Thread.sleep(1000)," how about w
mgersh 2016/10/04 21:14:58 Done, thanks for the help.
359 JNIEnv* env = base::android::AttachCurrentThread(); 365 JNIEnv* env = base::android::AttachCurrentThread();
360 cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj()); 366 cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj());
361 } 367 }
362 delete this; 368 delete this;
363 } 369 }
364 370
365 bool CronetURLRequestAdapter::MaybeReportError(net::URLRequest* request) const { 371 bool CronetURLRequestAdapter::MaybeReportError(net::URLRequest* request) const {
366 DCHECK_NE(net::URLRequestStatus::IO_PENDING, url_request_->status().status()); 372 DCHECK_NE(net::URLRequestStatus::IO_PENDING, url_request_->status().status());
367 DCHECK_EQ(request, url_request_.get()); 373 DCHECK_EQ(request, url_request_.get());
368 if (url_request_->status().is_success()) 374 if (url_request_->status().is_success())
369 return false; 375 return false;
370 int net_error = url_request_->status().error(); 376 int net_error = url_request_->status().error();
371 net::NetErrorDetails net_error_details; 377 net::NetErrorDetails net_error_details;
372 url_request_->PopulateNetErrorDetails(&net_error_details); 378 url_request_->PopulateNetErrorDetails(&net_error_details);
373 VLOG(1) << "Error " << net::ErrorToString(net_error) 379 VLOG(1) << "Error " << net::ErrorToString(net_error)
374 << " on chromium request: " << initial_url_.possibly_invalid_spec(); 380 << " on chromium request: " << initial_url_.possibly_invalid_spec();
381 MaybeReportMetrics(request);
375 JNIEnv* env = base::android::AttachCurrentThread(); 382 JNIEnv* env = base::android::AttachCurrentThread();
376 cronet::Java_CronetUrlRequest_onError( 383 cronet::Java_CronetUrlRequest_onError(
377 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error, 384 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error,
378 net_error_details.quic_connection_error, 385 net_error_details.quic_connection_error,
379 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(), 386 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(),
380 request->GetTotalReceivedBytes()); 387 request->GetTotalReceivedBytes());
381 return true; 388 return true;
382 } 389 }
383 390
391 void CronetURLRequestAdapter::MaybeReportMetrics(
392 net::URLRequest* request) const {
393 if (!enable_metrics_) {
394 return;
395 }
396 net::LoadTimingInfo metrics;
397 request->GetLoadTimingInfo(&metrics);
398 JNIEnv* env = base::android::AttachCurrentThread();
399 base::Time start_time = metrics.request_start_time;
400 base::TimeTicks start_ticks = metrics.request_start;
xunjieli 2016/09/20 21:53:33 Are we sure that |start_ticks| is not null? If so
mgersh 2016/09/30 23:47:14 Good catch. I checked and it's very unlikely but p
xunjieli 2016/10/01 13:43:49 Acknowledged.
401 cronet::Java_CronetUrlRequest_onMetricsCollected(
xunjieli 2016/09/22 18:28:58 nit: "cronet::" is not necessary.
mgersh 2016/09/30 23:47:14 Done.
402 env, owner_.obj(), start_time.ToJavaTime(),
403 ConvertTime(metrics.connect_timing.dns_start, start_time, start_ticks),
404 ConvertTime(metrics.connect_timing.dns_end, start_time, start_ticks),
405 ConvertTime(metrics.connect_timing.connect_start, start_time,
406 start_ticks),
407 ConvertTime(metrics.connect_timing.connect_end, start_time, start_ticks),
408 ConvertTime(metrics.connect_timing.ssl_start, start_time, start_ticks),
409 ConvertTime(metrics.connect_timing.ssl_end, start_time, start_ticks),
410 ConvertTime(metrics.send_start, start_time, start_ticks),
411 ConvertTime(metrics.send_end, start_time, start_ticks),
412 ConvertTime(metrics.push_start, start_time, start_ticks),
413 ConvertTime(metrics.push_end, start_time, start_ticks),
414 ConvertTime(metrics.receive_headers_end, start_time, start_ticks),
415 ConvertTime(base::TimeTicks::Now(), start_time, start_ticks),
416 metrics.socket_reused, 0, request->GetTotalReceivedBytes());
xunjieli 2016/09/22 18:28:59 Can we add a TODO here to support GetTotalSentByte
mgersh 2016/09/30 23:47:14 Done.
417 }
418
419 int64_t CronetURLRequestAdapter::ConvertTime(
xunjieli 2016/09/22 18:28:59 This can be a non-member function in the anonymous
mgersh 2016/09/30 23:47:14 Done.
420 base::TimeTicks ticks,
421 base::Time start_time,
422 base::TimeTicks start_ticks) const {
423 if (ticks.is_null()) {
424 return -1;
425 }
426 return (start_time + (ticks - start_ticks)).ToJavaTime();
427 }
428
384 net::URLRequest* CronetURLRequestAdapter::GetURLRequestForTesting() { 429 net::URLRequest* CronetURLRequestAdapter::GetURLRequestForTesting() {
385 return url_request_.get(); 430 return url_request_.get();
386 } 431 }
387 432
388 } // namespace cronet 433 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698