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

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

Issue 2360813003: [Cronet] Pass metrics information from C++ BidirectionalStream to Java (Closed)
Patch Set: Rebased 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "cronet_bidirectional_stream_adapter.h" 5 #include "cronet_bidirectional_stream_adapter.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/location.h" 11 #include "base/location.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "components/cronet/android/cronet_url_request_context_adapter.h" 14 #include "components/cronet/android/cronet_url_request_context_adapter.h"
15 #include "components/cronet/android/io_buffer_with_byte_buffer.h" 15 #include "components/cronet/android/io_buffer_with_byte_buffer.h"
16 #include "components/cronet/android/metrics_util.h"
16 #include "components/cronet/android/url_request_error.h" 17 #include "components/cronet/android/url_request_error.h"
17 #include "jni/CronetBidirectionalStream_jni.h" 18 #include "jni/CronetBidirectionalStream_jni.h"
18 #include "net/base/net_errors.h" 19 #include "net/base/net_errors.h"
19 #include "net/base/request_priority.h" 20 #include "net/base/request_priority.h"
20 #include "net/http/bidirectional_stream_request_info.h" 21 #include "net/http/bidirectional_stream_request_info.h"
21 #include "net/http/http_network_session.h" 22 #include "net/http/http_network_session.h"
22 #include "net/http/http_response_headers.h" 23 #include "net/http/http_response_headers.h"
23 #include "net/http/http_status_code.h" 24 #include "net/http/http_status_code.h"
24 #include "net/http/http_transaction_factory.h" 25 #include "net/http/http_transaction_factory.h"
25 #include "net/http/http_util.h" 26 #include "net/http/http_util.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 // Reset global references. 67 // Reset global references.
67 jwrite_buffer_list.Reset(); 68 jwrite_buffer_list.Reset();
68 jwrite_buffer_pos_list.Reset(); 69 jwrite_buffer_pos_list.Reset();
69 jwrite_buffer_limit_list.Reset(); 70 jwrite_buffer_limit_list.Reset();
70 } 71 }
71 72
72 static jlong CreateBidirectionalStream( 73 static jlong CreateBidirectionalStream(
73 JNIEnv* env, 74 JNIEnv* env,
74 const base::android::JavaParamRef<jobject>& jbidi_stream, 75 const base::android::JavaParamRef<jobject>& jbidi_stream,
75 jlong jurl_request_context_adapter, 76 jlong jurl_request_context_adapter,
76 jboolean jsend_request_headers_automatically) { 77 jboolean jsend_request_headers_automatically,
78 jboolean jenable_metrics) {
77 CronetURLRequestContextAdapter* context_adapter = 79 CronetURLRequestContextAdapter* context_adapter =
78 reinterpret_cast<CronetURLRequestContextAdapter*>( 80 reinterpret_cast<CronetURLRequestContextAdapter*>(
79 jurl_request_context_adapter); 81 jurl_request_context_adapter);
80 DCHECK(context_adapter); 82 DCHECK(context_adapter);
81 83
82 CronetBidirectionalStreamAdapter* adapter = 84 CronetBidirectionalStreamAdapter* adapter =
83 new CronetBidirectionalStreamAdapter(context_adapter, env, jbidi_stream, 85 new CronetBidirectionalStreamAdapter(context_adapter, env, jbidi_stream,
84 jsend_request_headers_automatically); 86 jsend_request_headers_automatically,
87 jenable_metrics);
85 88
86 return reinterpret_cast<jlong>(adapter); 89 return reinterpret_cast<jlong>(adapter);
87 } 90 }
88 91
89 // static 92 // static
90 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) { 93 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) {
91 return RegisterNativesImpl(env); 94 return RegisterNativesImpl(env);
92 } 95 }
93 96
94 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter( 97 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter(
95 CronetURLRequestContextAdapter* context, 98 CronetURLRequestContextAdapter* context,
96 JNIEnv* env, 99 JNIEnv* env,
97 const base::android::JavaParamRef<jobject>& jbidi_stream, 100 const base::android::JavaParamRef<jobject>& jbidi_stream,
98 bool send_request_headers_automatically) 101 bool send_request_headers_automatically,
102 bool enable_metrics)
99 : context_(context), 103 : context_(context),
100 owner_(env, jbidi_stream), 104 owner_(env, jbidi_stream),
101 send_request_headers_automatically_(send_request_headers_automatically), 105 send_request_headers_automatically_(send_request_headers_automatically),
106 enable_metrics_(enable_metrics),
102 stream_failed_(false) {} 107 stream_failed_(false) {}
103 108
104 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() { 109 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() {
105 DCHECK(context_->IsOnNetworkThread()); 110 DCHECK(context_->IsOnNetworkThread());
106 } 111 }
107 112
108 void CronetBidirectionalStreamAdapter::SendRequestHeaders( 113 void CronetBidirectionalStreamAdapter::SendRequestHeaders(
109 JNIEnv* env, 114 JNIEnv* env,
110 const base::android::JavaParamRef<jobject>& jcaller) { 115 const base::android::JavaParamRef<jobject>& jcaller) {
111 context_->PostTaskToNetworkThread( 116 context_->PostTaskToNetworkThread(
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 } 409 }
405 } 410 }
406 411
407 void CronetBidirectionalStreamAdapter::DestroyOnNetworkThread( 412 void CronetBidirectionalStreamAdapter::DestroyOnNetworkThread(
408 bool send_on_canceled) { 413 bool send_on_canceled) {
409 DCHECK(context_->IsOnNetworkThread()); 414 DCHECK(context_->IsOnNetworkThread());
410 if (send_on_canceled) { 415 if (send_on_canceled) {
411 JNIEnv* env = base::android::AttachCurrentThread(); 416 JNIEnv* env = base::android::AttachCurrentThread();
412 cronet::Java_CronetBidirectionalStream_onCanceled(env, owner_.obj()); 417 cronet::Java_CronetBidirectionalStream_onCanceled(env, owner_.obj());
413 } 418 }
419 MaybeReportMetrics();
414 delete this; 420 delete this;
415 } 421 }
416 422
417 base::android::ScopedJavaLocalRef<jobjectArray> 423 base::android::ScopedJavaLocalRef<jobjectArray>
418 CronetBidirectionalStreamAdapter::GetHeadersArray( 424 CronetBidirectionalStreamAdapter::GetHeadersArray(
419 JNIEnv* env, 425 JNIEnv* env,
420 const net::SpdyHeaderBlock& header_block) { 426 const net::SpdyHeaderBlock& header_block) {
421 DCHECK(context_->IsOnNetworkThread()); 427 DCHECK(context_->IsOnNetworkThread());
422 428
423 std::vector<std::string> headers; 429 std::vector<std::string> headers;
424 for (const auto& header : header_block) { 430 for (const auto& header : header_block) {
425 headers.push_back(header.first.as_string()); 431 headers.push_back(header.first.as_string());
426 headers.push_back(header.second.as_string()); 432 headers.push_back(header.second.as_string());
427 } 433 }
428 return base::android::ToJavaArrayOfStrings(env, headers); 434 return base::android::ToJavaArrayOfStrings(env, headers);
429 } 435 }
430 436
437 void CronetBidirectionalStreamAdapter::MaybeReportMetrics() {
438 if (!enable_metrics_)
439 return;
440
441 if (!bidi_stream_)
442 return;
443 net::LoadTimingInfo load_timing_info;
444 bidi_stream_->GetLoadTimingInfo(&load_timing_info);
445 JNIEnv* env = base::android::AttachCurrentThread();
446 base::Time start_time = load_timing_info.request_start_time;
447 base::TimeTicks start_ticks = load_timing_info.request_start;
448 cronet::Java_CronetBidirectionalStream_onMetricsCollected(
449 env, owner_.obj(),
450 metrics_util::ConvertTime(start_ticks, start_ticks, start_time),
451 metrics_util::ConvertTime(load_timing_info.connect_timing.dns_start,
452 start_ticks, start_time),
453 metrics_util::ConvertTime(load_timing_info.connect_timing.dns_end,
454 start_ticks, start_time),
455 metrics_util::ConvertTime(load_timing_info.connect_timing.connect_start,
456 start_ticks, start_time),
457 metrics_util::ConvertTime(load_timing_info.connect_timing.connect_end,
458 start_ticks, start_time),
459 metrics_util::ConvertTime(load_timing_info.connect_timing.ssl_start,
460 start_ticks, start_time),
461 metrics_util::ConvertTime(load_timing_info.connect_timing.ssl_end,
462 start_ticks, start_time),
463 metrics_util::ConvertTime(load_timing_info.send_start, start_ticks,
464 start_time),
465 metrics_util::ConvertTime(load_timing_info.send_end, start_ticks,
466 start_time),
467 metrics_util::ConvertTime(load_timing_info.push_start, start_ticks,
468 start_time),
469 metrics_util::ConvertTime(load_timing_info.push_end, start_ticks,
470 start_time),
471 metrics_util::ConvertTime(load_timing_info.receive_headers_end,
472 start_ticks, start_time),
473 metrics_util::ConvertTime(base::TimeTicks::Now(), start_ticks,
474 start_time),
475 load_timing_info.socket_reused, bidi_stream_->GetTotalSentBytes(),
476 bidi_stream_->GetTotalReceivedBytes());
477 }
478
431 } // namespace cronet 479 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698