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

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

Issue 2351793003: Implement timing metrics for UrlRequest (Closed)
Patch Set: Small cleanups Created 4 years, 2 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 15 matching lines...) Expand all
26 #include "net/quic/core/quic_protocol.h" 26 #include "net/quic/core/quic_protocol.h"
27 #include "net/ssl/ssl_info.h" 27 #include "net/ssl/ssl_info.h"
28 #include "net/url_request/redirect_info.h" 28 #include "net/url_request/redirect_info.h"
29 #include "net/url_request/url_request_context.h" 29 #include "net/url_request/url_request_context.h"
30 30
31 using base::android::ConvertUTF8ToJavaString; 31 using base::android::ConvertUTF8ToJavaString;
32 using base::android::JavaParamRef; 32 using base::android::JavaParamRef;
33 33
34 namespace cronet { 34 namespace cronet {
35 35
36 namespace {
37
38 // Converts timing metrics stored as TimeTicks into the format expected by the
39 // Java layer: ms since Unix epoch, or -1 for null
40 int64_t ConvertTime(const base::TimeTicks& ticks,
41 const base::TimeTicks& start_ticks,
42 const base::Time& start_time) {
43 if (ticks.is_null() || start_ticks.is_null()) {
44 return -1;
45 }
46 DCHECK(!start_time.is_null());
47 return (start_time + (ticks - start_ticks)).ToJavaTime();
48 }
49
50 } // namespace
51
36 // Explicitly register static JNI functions. 52 // Explicitly register static JNI functions.
37 bool CronetUrlRequestAdapterRegisterJni(JNIEnv* env) { 53 bool CronetUrlRequestAdapterRegisterJni(JNIEnv* env) {
38 return RegisterNativesImpl(env); 54 return RegisterNativesImpl(env);
39 } 55 }
40 56
41 static jlong CreateRequestAdapter(JNIEnv* env, 57 static jlong CreateRequestAdapter(JNIEnv* env,
42 const JavaParamRef<jobject>& jurl_request, 58 const JavaParamRef<jobject>& jurl_request,
43 jlong jurl_request_context_adapter, 59 jlong jurl_request_context_adapter,
44 const JavaParamRef<jstring>& jurl_string, 60 const JavaParamRef<jstring>& jurl_string,
45 jint jpriority, 61 jint jpriority,
46 jboolean jdisable_cache, 62 jboolean jdisable_cache,
47 jboolean jdisable_connection_migration) { 63 jboolean jdisable_connection_migration,
64 jboolean jenable_metrics) {
48 CronetURLRequestContextAdapter* context_adapter = 65 CronetURLRequestContextAdapter* context_adapter =
49 reinterpret_cast<CronetURLRequestContextAdapter*>( 66 reinterpret_cast<CronetURLRequestContextAdapter*>(
50 jurl_request_context_adapter); 67 jurl_request_context_adapter);
51 DCHECK(context_adapter); 68 DCHECK(context_adapter);
52 69
53 GURL url(base::android::ConvertJavaStringToUTF8(env, jurl_string)); 70 GURL url(base::android::ConvertJavaStringToUTF8(env, jurl_string));
54 71
55 VLOG(1) << "New chromium network request_adapter: " 72 VLOG(1) << "New chromium network request_adapter: "
56 << url.possibly_invalid_spec(); 73 << url.possibly_invalid_spec();
57 74
58 CronetURLRequestAdapter* adapter = new CronetURLRequestAdapter( 75 CronetURLRequestAdapter* adapter = new CronetURLRequestAdapter(
59 context_adapter, env, jurl_request, url, 76 context_adapter, env, jurl_request, url,
60 static_cast<net::RequestPriority>(jpriority), jdisable_cache, 77 static_cast<net::RequestPriority>(jpriority), jdisable_cache,
61 jdisable_connection_migration); 78 jdisable_connection_migration, jenable_metrics);
62 79
63 return reinterpret_cast<jlong>(adapter); 80 return reinterpret_cast<jlong>(adapter);
64 } 81 }
65 82
66 CronetURLRequestAdapter::CronetURLRequestAdapter( 83 CronetURLRequestAdapter::CronetURLRequestAdapter(
67 CronetURLRequestContextAdapter* context, 84 CronetURLRequestContextAdapter* context,
68 JNIEnv* env, 85 JNIEnv* env,
69 jobject jurl_request, 86 jobject jurl_request,
70 const GURL& url, 87 const GURL& url,
71 net::RequestPriority priority, 88 net::RequestPriority priority,
72 jboolean jdisable_cache, 89 jboolean jdisable_cache,
73 jboolean jdisable_connection_migration) 90 jboolean jdisable_connection_migration,
91 jboolean jenable_metrics)
74 : context_(context), 92 : context_(context),
75 initial_url_(url), 93 initial_url_(url),
76 initial_priority_(priority), 94 initial_priority_(priority),
77 initial_method_("GET"), 95 initial_method_("GET"),
78 load_flags_(context->default_load_flags()) { 96 load_flags_(context->default_load_flags()),
97 enable_metrics_(jenable_metrics == JNI_TRUE) {
79 DCHECK(!context_->IsOnNetworkThread()); 98 DCHECK(!context_->IsOnNetworkThread());
80 owner_.Reset(env, jurl_request); 99 owner_.Reset(env, jurl_request);
81 if (jdisable_cache == JNI_TRUE) 100 if (jdisable_cache == JNI_TRUE)
82 load_flags_ |= net::LOAD_DISABLE_CACHE; 101 load_flags_ |= net::LOAD_DISABLE_CACHE;
83 if (jdisable_connection_migration == JNI_TRUE) 102 if (jdisable_connection_migration == JNI_TRUE)
84 load_flags_ |= net::LOAD_DISABLE_CONNECTION_MIGRATION; 103 load_flags_ |= net::LOAD_DISABLE_CONNECTION_MIGRATION;
85 } 104 }
86 105
87 CronetURLRequestAdapter::~CronetURLRequestAdapter() { 106 CronetURLRequestAdapter::~CronetURLRequestAdapter() {
88 DCHECK(context_->IsOnNetworkThread()); 107 DCHECK(context_->IsOnNetworkThread());
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 int result = url_request_->Read(read_buffer_.get(), buffer_size); 374 int result = url_request_->Read(read_buffer_.get(), buffer_size);
356 // If IO is pending, wait for the URLRequest to call OnReadCompleted. 375 // If IO is pending, wait for the URLRequest to call OnReadCompleted.
357 if (result == net::ERR_IO_PENDING) 376 if (result == net::ERR_IO_PENDING)
358 return; 377 return;
359 378
360 OnReadCompleted(url_request_.get(), result); 379 OnReadCompleted(url_request_.get(), result);
361 } 380 }
362 381
363 void CronetURLRequestAdapter::DestroyOnNetworkThread(bool send_on_canceled) { 382 void CronetURLRequestAdapter::DestroyOnNetworkThread(bool send_on_canceled) {
364 DCHECK(context_->IsOnNetworkThread()); 383 DCHECK(context_->IsOnNetworkThread());
384 JNIEnv* env = base::android::AttachCurrentThread();
365 if (send_on_canceled) { 385 if (send_on_canceled) {
366 JNIEnv* env = base::android::AttachCurrentThread();
367 cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj()); 386 cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj());
368 } 387 }
388 MaybeReportMetrics(env);
369 delete this; 389 delete this;
370 } 390 }
371 391
372 void CronetURLRequestAdapter::ReportError(net::URLRequest* request, 392 void CronetURLRequestAdapter::ReportError(net::URLRequest* request,
373 int net_error) const { 393 int net_error) {
374 DCHECK_NE(net::ERR_IO_PENDING, net_error); 394 DCHECK_NE(net::ERR_IO_PENDING, net_error);
375 DCHECK_LT(net_error, 0); 395 DCHECK_LT(net_error, 0);
376 DCHECK_EQ(request, url_request_.get()); 396 DCHECK_EQ(request, url_request_.get());
377 397
378 net::NetErrorDetails net_error_details; 398 net::NetErrorDetails net_error_details;
379 url_request_->PopulateNetErrorDetails(&net_error_details); 399 url_request_->PopulateNetErrorDetails(&net_error_details);
380 VLOG(1) << "Error " << net::ErrorToString(net_error) 400 VLOG(1) << "Error " << net::ErrorToString(net_error)
381 << " on chromium request: " << initial_url_.possibly_invalid_spec(); 401 << " on chromium request: " << initial_url_.possibly_invalid_spec();
382 JNIEnv* env = base::android::AttachCurrentThread(); 402 JNIEnv* env = base::android::AttachCurrentThread();
383 cronet::Java_CronetUrlRequest_onError( 403 cronet::Java_CronetUrlRequest_onError(
384 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error, 404 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error,
385 net_error_details.quic_connection_error, 405 net_error_details.quic_connection_error,
386 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(), 406 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(),
387 request->GetTotalReceivedBytes()); 407 request->GetTotalReceivedBytes());
388 } 408 }
389 409
410 void CronetURLRequestAdapter::MaybeReportMetrics(JNIEnv* env) const {
411 if (!enable_metrics_) {
412 return;
413 }
414 net::LoadTimingInfo metrics;
415 url_request_->GetLoadTimingInfo(&metrics);
416 base::Time start_time = metrics.request_start_time;
417 base::TimeTicks start_ticks = metrics.request_start;
418 Java_CronetUrlRequest_onMetricsCollected(
419 env, owner_.obj(), ConvertTime(start_ticks, start_ticks, start_time),
420 ConvertTime(metrics.connect_timing.dns_start, start_ticks, start_time),
421 ConvertTime(metrics.connect_timing.dns_end, start_ticks, start_time),
422 ConvertTime(metrics.connect_timing.connect_start, start_ticks,
423 start_time),
424 ConvertTime(metrics.connect_timing.connect_end, start_ticks, start_time),
425 ConvertTime(metrics.connect_timing.ssl_start, start_ticks, start_time),
426 ConvertTime(metrics.connect_timing.ssl_end, start_ticks, start_time),
427 ConvertTime(metrics.send_start, start_ticks, start_time),
428 ConvertTime(metrics.send_end, start_ticks, start_time),
429 ConvertTime(metrics.push_start, start_ticks, start_time),
430 ConvertTime(metrics.push_end, start_ticks, start_time),
431 ConvertTime(metrics.receive_headers_end, start_ticks, start_time),
432 ConvertTime(base::TimeTicks::Now(), start_ticks, start_time),
433 // TODO(mgersh): report total bytes sent
434 metrics.socket_reused, 0, url_request_->GetTotalReceivedBytes());
435 }
436
390 net::URLRequest* CronetURLRequestAdapter::GetURLRequestForTesting() { 437 net::URLRequest* CronetURLRequestAdapter::GetURLRequestForTesting() {
391 return url_request_.get(); 438 return url_request_.get();
392 } 439 }
393 440
394 } // namespace cronet 441 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698