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

Side by Side Diff: content/browser/service_worker/service_worker_fetch_dispatcher.cc

Issue 2654663004: [Not for review] record detailed time breakdown of SW related requests.
Patch Set: add stream uma Created 3 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
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 "content/browser/service_worker/service_worker_fetch_dispatcher.h" 5 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/metrics/histogram_macros.h"
12 #include "base/time/time.h" 13 #include "base/time/time.h"
13 #include "base/trace_event/trace_event.h" 14 #include "base/trace_event/trace_event.h"
14 #include "content/browser/devtools/service_worker_devtools_agent_host.h" 15 #include "content/browser/devtools/service_worker_devtools_agent_host.h"
15 #include "content/browser/devtools/service_worker_devtools_manager.h" 16 #include "content/browser/devtools/service_worker_devtools_manager.h"
16 #include "content/browser/loader/resource_dispatcher_host_impl.h" 17 #include "content/browser/loader/resource_dispatcher_host_impl.h"
17 #include "content/browser/loader/resource_request_info_impl.h" 18 #include "content/browser/loader/resource_request_info_impl.h"
18 #include "content/browser/loader/resource_requester_info.h" 19 #include "content/browser/loader/resource_requester_info.h"
19 #include "content/browser/loader/url_loader_factory_impl.h" 20 #include "content/browser/loader/url_loader_factory_impl.h"
20 #include "content/browser/service_worker/embedded_worker_status.h" 21 #include "content/browser/service_worker/embedded_worker_status.h"
21 #include "content/browser/service_worker/service_worker_metrics.h" 22 #include "content/browser/service_worker/service_worker_metrics.h"
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 // ServiceWorkerFetchDispatcher has been destroyed. 274 // ServiceWorkerFetchDispatcher has been destroyed.
274 class ServiceWorkerFetchDispatcher::ResponseCallback { 275 class ServiceWorkerFetchDispatcher::ResponseCallback {
275 public: 276 public:
276 ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher, 277 ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher,
277 ServiceWorkerVersion* version) 278 ServiceWorkerVersion* version)
278 : fetch_dispatcher_(fetch_dispatcher), version_(version) {} 279 : fetch_dispatcher_(fetch_dispatcher), version_(version) {}
279 280
280 void Run(int request_id, 281 void Run(int request_id,
281 ServiceWorkerFetchEventResult fetch_result, 282 ServiceWorkerFetchEventResult fetch_result,
282 const ServiceWorkerResponse& response, 283 const ServiceWorkerResponse& response,
283 base::Time dispatch_event_time) { 284 base::Time dispatch_event_time,
285 base::TimeTicks response_time) {
284 const bool handled = 286 const bool handled =
285 (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); 287 (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE);
286 if (!version_->FinishRequest(request_id, handled, dispatch_event_time)) 288 if (!version_->FinishRequest(request_id, handled, dispatch_event_time))
287 NOTREACHED() << "Should only receive one reply per event"; 289 NOTREACHED() << "Should only receive one reply per event";
288 290
289 // |fetch_dispatcher| is null if the URLRequest was killed. 291 // |fetch_dispatcher| is null if the URLRequest was killed.
290 if (fetch_dispatcher_) 292 if (fetch_dispatcher_)
291 fetch_dispatcher_->DidFinish(request_id, fetch_result, response); 293 fetch_dispatcher_->DidFinish(request_id, fetch_result, response,
294 response_time);
292 } 295 }
293 296
294 private: 297 private:
295 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; 298 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_;
296 // Owns |this|. 299 // Owns |this|.
297 ServiceWorkerVersion* version_; 300 ServiceWorkerVersion* version_;
298 301
299 DISALLOW_COPY_AND_ASSIGN(ResponseCallback); 302 DISALLOW_COPY_AND_ASSIGN(ResponseCallback);
300 }; 303 };
301 304
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 DidFail(status); 414 DidFail(status);
412 } 415 }
413 416
414 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { 417 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() {
415 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()) 418 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status())
416 << "Worker stopped too soon after it was started."; 419 << "Worker stopped too soon after it was started.";
417 420
418 DCHECK(!prepare_callback_.is_null()); 421 DCHECK(!prepare_callback_.is_null());
419 base::Closure prepare_callback = prepare_callback_; 422 base::Closure prepare_callback = prepare_callback_;
420 prepare_callback.Run(); 423 prepare_callback.Run();
424 worker_ready_time_ = base::TimeTicks::Now();
421 425
422 net_log_.BeginEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT); 426 net_log_.BeginEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT);
423 int fetch_event_id; 427 int fetch_event_id;
424 int event_finish_id; 428 int event_finish_id;
425 if (timeout_) { 429 if (timeout_) {
426 fetch_event_id = version_->StartRequestWithCustomTimeout( 430 fetch_event_id = version_->StartRequestWithCustomTimeout(
427 GetEventType(), 431 GetEventType(),
428 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, 432 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch,
429 weak_factory_.GetWeakPtr()), 433 weak_factory_.GetWeakPtr()),
430 *timeout_, ServiceWorkerVersion::CONTINUE_ON_TIMEOUT); 434 *timeout_, ServiceWorkerVersion::CONTINUE_ON_TIMEOUT);
(...skipping 27 matching lines...) Expand all
458 } 462 }
459 463
460 // |event_dispatcher| is owned by |version_|. So it is safe to pass the 464 // |event_dispatcher| is owned by |version_|. So it is safe to pass the
461 // unretained raw pointer of |version_| to OnFetchEventFinished callback. 465 // unretained raw pointer of |version_| to OnFetchEventFinished callback.
462 // Pass |url_loader_assets_| to the callback to keep the URL loader related 466 // Pass |url_loader_assets_| to the callback to keep the URL loader related
463 // assets alive while the FetchEvent is ongoing in the service worker. 467 // assets alive while the FetchEvent is ongoing in the service worker.
464 version_->event_dispatcher()->DispatchFetchEvent( 468 version_->event_dispatcher()->DispatchFetchEvent(
465 fetch_event_id, *request_, std::move(preload_handle_), 469 fetch_event_id, *request_, std::move(preload_handle_),
466 base::Bind(&ServiceWorkerFetchDispatcher::OnFetchEventFinished, 470 base::Bind(&ServiceWorkerFetchDispatcher::OnFetchEventFinished,
467 base::Unretained(version_.get()), event_finish_id, 471 base::Unretained(version_.get()), event_finish_id,
468 url_loader_assets_)); 472 url_loader_assets_, renderer_request_time_,
473 handler_creation_time_, job_creation_time_, worker_start_time_,
474 worker_ready_time_));
469 } 475 }
470 476
471 void ServiceWorkerFetchDispatcher::DidFailToDispatch( 477 void ServiceWorkerFetchDispatcher::DidFailToDispatch(
472 ServiceWorkerStatusCode status) { 478 ServiceWorkerStatusCode status) {
473 EndNetLogEventWithServiceWorkerStatus( 479 EndNetLogEventWithServiceWorkerStatus(
474 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status); 480 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status);
475 DidFail(status); 481 DidFail(status);
476 } 482 }
477 483
478 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { 484 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) {
479 DCHECK_NE(SERVICE_WORKER_OK, status); 485 DCHECK_NE(SERVICE_WORKER_OK, status);
480 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, 486 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK,
481 ServiceWorkerResponse()); 487 ServiceWorkerResponse());
482 } 488 }
483 489
484 void ServiceWorkerFetchDispatcher::DidFinish( 490 void ServiceWorkerFetchDispatcher::DidFinish(
485 int request_id, 491 int request_id,
486 ServiceWorkerFetchEventResult fetch_result, 492 ServiceWorkerFetchEventResult fetch_result,
487 const ServiceWorkerResponse& response) { 493 const ServiceWorkerResponse& response,
494 base::TimeTicks response_time) {
495 base::TimeTicks now(base::TimeTicks::Now());
496 UMA_HISTOGRAM_TIMES("SWF.D1.Response.WorkerToBrowser", now - response_time);
497
488 net_log_.EndEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT); 498 net_log_.EndEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT);
489 Complete(SERVICE_WORKER_OK, fetch_result, response); 499 Complete(SERVICE_WORKER_OK, fetch_result, response);
490 } 500 }
491 501
492 void ServiceWorkerFetchDispatcher::Complete( 502 void ServiceWorkerFetchDispatcher::Complete(
493 ServiceWorkerStatusCode status, 503 ServiceWorkerStatusCode status,
494 ServiceWorkerFetchEventResult fetch_result, 504 ServiceWorkerFetchEventResult fetch_result,
495 const ServiceWorkerResponse& response) { 505 const ServiceWorkerResponse& response) {
496 DCHECK(!fetch_callback_.is_null()); 506 DCHECK(!fetch_callback_.is_null());
497 507
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 621 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
612 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 622 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
613 return ResourceTypeToEventType(resource_type_); 623 return ResourceTypeToEventType(resource_type_);
614 } 624 }
615 625
616 // static 626 // static
617 void ServiceWorkerFetchDispatcher::OnFetchEventFinished( 627 void ServiceWorkerFetchDispatcher::OnFetchEventFinished(
618 ServiceWorkerVersion* version, 628 ServiceWorkerVersion* version,
619 int event_finish_id, 629 int event_finish_id,
620 scoped_refptr<URLLoaderAssets> url_loader_assets, 630 scoped_refptr<URLLoaderAssets> url_loader_assets,
631 base::TimeTicks renderer_request_time,
632 base::TimeTicks handler_creation_time,
633 base::TimeTicks job_creation_time,
634 base::TimeTicks worker_start_time,
635 base::TimeTicks worker_ready_time,
636 base::TimeTicks dispatch_event_time_ticks,
621 ServiceWorkerStatusCode status, 637 ServiceWorkerStatusCode status,
622 base::Time dispatch_event_time) { 638 base::Time dispatch_event_time) {
639 UMA_HISTOGRAM_TIMES("SWF.A1.Request.RendererMainToBrowser",
640 handler_creation_time - renderer_request_time);
641 UMA_HISTOGRAM_TIMES("SWF.A2.Request.JobCreated",
642 job_creation_time - handler_creation_time);
643 UMA_HISTOGRAM_TIMES("SWF.A3.Request.WorkerFound",
644 worker_start_time - job_creation_time);
645 UMA_HISTOGRAM_TIMES("SWF.A4.Request.WorkerReady",
646 worker_ready_time - worker_start_time);
647 UMA_HISTOGRAM_TIMES("SWF.A5.Request.BrowserToWorker",
648 dispatch_event_time_ticks - worker_ready_time);
623 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, 649 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT,
624 dispatch_event_time); 650 dispatch_event_time);
625 } 651 }
626 652
627 } // namespace content 653 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698