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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: components/cronet/android/cronet_url_request_adapter.cc
diff --git a/components/cronet/android/cronet_url_request_adapter.cc b/components/cronet/android/cronet_url_request_adapter.cc
index 6e79bb5d431f7f296ae374228bbe1d7bfa25fb02..0ef0415210e6438cb3ba7e7d5f82375b9b31fbf8 100644
--- a/components/cronet/android/cronet_url_request_adapter.cc
+++ b/components/cronet/android/cronet_url_request_adapter.cc
@@ -33,6 +33,22 @@ using base::android::JavaParamRef;
namespace cronet {
+namespace {
+
+// Converts timing metrics stored as TimeTicks into the format expected by the
+// Java layer: ms since Unix epoch, or -1 for null
+int64_t ConvertTime(const base::TimeTicks& ticks,
+ const base::TimeTicks& start_ticks,
+ const base::Time& start_time) {
+ if (ticks.is_null() || start_ticks.is_null()) {
+ return -1;
+ }
+ DCHECK(!start_time.is_null());
+ return (start_time + (ticks - start_ticks)).ToJavaTime();
+}
+
+} // namespace
+
// Explicitly register static JNI functions.
bool CronetUrlRequestAdapterRegisterJni(JNIEnv* env) {
return RegisterNativesImpl(env);
@@ -44,7 +60,8 @@ static jlong CreateRequestAdapter(JNIEnv* env,
const JavaParamRef<jstring>& jurl_string,
jint jpriority,
jboolean jdisable_cache,
- jboolean jdisable_connection_migration) {
+ jboolean jdisable_connection_migration,
+ jboolean jenable_metrics) {
CronetURLRequestContextAdapter* context_adapter =
reinterpret_cast<CronetURLRequestContextAdapter*>(
jurl_request_context_adapter);
@@ -58,7 +75,7 @@ static jlong CreateRequestAdapter(JNIEnv* env,
CronetURLRequestAdapter* adapter = new CronetURLRequestAdapter(
context_adapter, env, jurl_request, url,
static_cast<net::RequestPriority>(jpriority), jdisable_cache,
- jdisable_connection_migration);
+ jdisable_connection_migration, jenable_metrics);
return reinterpret_cast<jlong>(adapter);
}
@@ -70,12 +87,14 @@ CronetURLRequestAdapter::CronetURLRequestAdapter(
const GURL& url,
net::RequestPriority priority,
jboolean jdisable_cache,
- jboolean jdisable_connection_migration)
+ jboolean jdisable_connection_migration,
+ jboolean jenable_metrics)
: context_(context),
initial_url_(url),
initial_priority_(priority),
initial_method_("GET"),
- load_flags_(context->default_load_flags()) {
+ load_flags_(context->default_load_flags()),
+ enable_metrics_(jenable_metrics == JNI_TRUE) {
DCHECK(!context_->IsOnNetworkThread());
owner_.Reset(env, jurl_request);
if (jdisable_cache == JNI_TRUE)
@@ -362,15 +381,16 @@ void CronetURLRequestAdapter::ReadDataOnNetworkThread(
void CronetURLRequestAdapter::DestroyOnNetworkThread(bool send_on_canceled) {
DCHECK(context_->IsOnNetworkThread());
+ JNIEnv* env = base::android::AttachCurrentThread();
if (send_on_canceled) {
- JNIEnv* env = base::android::AttachCurrentThread();
cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj());
}
+ MaybeReportMetrics(env);
delete this;
}
void CronetURLRequestAdapter::ReportError(net::URLRequest* request,
- int net_error) const {
+ int net_error) {
DCHECK_NE(net::ERR_IO_PENDING, net_error);
DCHECK_LT(net_error, 0);
DCHECK_EQ(request, url_request_.get());
@@ -387,6 +407,33 @@ void CronetURLRequestAdapter::ReportError(net::URLRequest* request,
request->GetTotalReceivedBytes());
}
+void CronetURLRequestAdapter::MaybeReportMetrics(JNIEnv* env) const {
+ if (!enable_metrics_) {
+ return;
+ }
+ net::LoadTimingInfo metrics;
+ url_request_->GetLoadTimingInfo(&metrics);
+ base::Time start_time = metrics.request_start_time;
+ base::TimeTicks start_ticks = metrics.request_start;
+ Java_CronetUrlRequest_onMetricsCollected(
+ env, owner_.obj(), ConvertTime(start_ticks, start_ticks, start_time),
+ ConvertTime(metrics.connect_timing.dns_start, start_ticks, start_time),
+ ConvertTime(metrics.connect_timing.dns_end, start_ticks, start_time),
+ ConvertTime(metrics.connect_timing.connect_start, start_ticks,
+ start_time),
+ ConvertTime(metrics.connect_timing.connect_end, start_ticks, start_time),
+ ConvertTime(metrics.connect_timing.ssl_start, start_ticks, start_time),
+ ConvertTime(metrics.connect_timing.ssl_end, start_ticks, start_time),
+ ConvertTime(metrics.send_start, start_ticks, start_time),
+ ConvertTime(metrics.send_end, start_ticks, start_time),
+ ConvertTime(metrics.push_start, start_ticks, start_time),
+ ConvertTime(metrics.push_end, start_ticks, start_time),
+ ConvertTime(metrics.receive_headers_end, start_ticks, start_time),
+ ConvertTime(base::TimeTicks::Now(), start_ticks, start_time),
+ // TODO(mgersh): report total bytes sent
+ metrics.socket_reused, 0, url_request_->GetTotalReceivedBytes());
+}
+
net::URLRequest* CronetURLRequestAdapter::GetURLRequestForTesting() {
return url_request_.get();
}

Powered by Google App Engine
This is Rietveld 408576698