OLD | NEW |
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_metrics.h" | 5 #include "content/browser/service_worker/service_worker_metrics.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/metrics/histogram_macros.h" | 10 #include "base/metrics/histogram_macros.h" |
11 #include "base/metrics/sparse_histogram.h" | 11 #include "base/metrics/sparse_histogram.h" |
12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 13 #include "base/time/time.h" |
13 #include "content/browser/service_worker/embedded_worker_status.h" | 14 #include "content/browser/service_worker/embedded_worker_status.h" |
14 #include "content/common/service_worker/service_worker_types.h" | 15 #include "content/common/service_worker/service_worker_types.h" |
15 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
16 #include "content/public/browser/content_browser_client.h" | 17 #include "content/public/browser/content_browser_client.h" |
17 #include "content/public/common/content_client.h" | 18 #include "content/public/common/content_client.h" |
18 | 19 |
19 namespace content { | 20 namespace content { |
20 | 21 |
21 namespace { | 22 namespace { |
22 | 23 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 return "_StartingWorker"; | 104 return "_StartingWorker"; |
104 case EmbeddedWorkerStatus::RUNNING: | 105 case EmbeddedWorkerStatus::RUNNING: |
105 return "_RunningWorker"; | 106 return "_RunningWorker"; |
106 case EmbeddedWorkerStatus::STOPPING: | 107 case EmbeddedWorkerStatus::STOPPING: |
107 return "_StoppingWorker"; | 108 return "_StoppingWorker"; |
108 } | 109 } |
109 NOTREACHED(); | 110 NOTREACHED(); |
110 return "_UNKNOWN"; | 111 return "_UNKNOWN"; |
111 } | 112 } |
112 | 113 |
| 114 std::string GetSiteSuffix(ServiceWorkerMetrics::Site site) { |
| 115 switch (site) { |
| 116 case ServiceWorkerMetrics::Site::OTHER: |
| 117 case ServiceWorkerMetrics::Site::WITH_FETCH_HANDLER: |
| 118 case ServiceWorkerMetrics::Site::WITHOUT_FETCH_HANDLER: |
| 119 return ""; |
| 120 case ServiceWorkerMetrics::Site::NEW_TAB_PAGE: |
| 121 return ".ntp"; |
| 122 case ServiceWorkerMetrics::Site::PLUS: |
| 123 return ".plus"; |
| 124 case ServiceWorkerMetrics::Site::INBOX: |
| 125 return ".inbox"; |
| 126 case ServiceWorkerMetrics::Site::DOCS: |
| 127 return ".docs"; |
| 128 case ServiceWorkerMetrics::Site::NUM_TYPES: |
| 129 NOTREACHED() << static_cast<int>(site); |
| 130 } |
| 131 NOTREACHED(); |
| 132 return ""; |
| 133 } |
| 134 |
113 // Use this for histograms with dynamically generated names, which | 135 // Use this for histograms with dynamically generated names, which |
114 // otherwise can't use the UMA_HISTOGRAM macro without code duplication. | 136 // otherwise can't use the UMA_HISTOGRAM macro without code duplication. |
115 void RecordSuffixedTimeHistogram(const std::string& name, | 137 void RecordSuffixedTimeHistogram(const std::string& name, |
116 const std::string& suffix, | 138 const std::string& suffix, |
117 base::TimeDelta sample) { | 139 base::TimeDelta sample) { |
118 const std::string name_with_suffix = name + suffix; | 140 const std::string name_with_suffix = name + suffix; |
| 141 // This unrolls UMA_HISTOGRAM_TIMES. |
| 142 base::HistogramBase* histogram_pointer = base::Histogram::FactoryTimeGet( |
| 143 name_with_suffix, base::TimeDelta::FromMilliseconds(1), |
| 144 base::TimeDelta::FromSeconds(10), 50, |
| 145 base::HistogramBase::kUmaTargetedHistogramFlag); |
| 146 histogram_pointer->AddTime(sample); |
| 147 } |
| 148 |
| 149 // Use this for histograms with dynamically generated names, which |
| 150 // otherwise can't use the UMA_MEDIUM_HISTOGRAM macro without code duplication. |
| 151 void RecordSuffixedMediumTimeHistogram(const std::string& name, |
| 152 const std::string& suffix, |
| 153 base::TimeDelta sample) { |
| 154 const std::string name_with_suffix = name + suffix; |
119 // This unrolls UMA_HISTOGRAM_MEDIUM_TIMES. | 155 // This unrolls UMA_HISTOGRAM_MEDIUM_TIMES. |
120 base::HistogramBase* histogram_pointer = base::Histogram::FactoryTimeGet( | 156 base::HistogramBase* histogram_pointer = base::Histogram::FactoryTimeGet( |
121 name_with_suffix, base::TimeDelta::FromMilliseconds(10), | 157 name_with_suffix, base::TimeDelta::FromMilliseconds(10), |
122 base::TimeDelta::FromMinutes(3), 50, | 158 base::TimeDelta::FromMinutes(3), 50, |
123 base::HistogramBase::kUmaTargetedHistogramFlag); | 159 base::HistogramBase::kUmaTargetedHistogramFlag); |
124 histogram_pointer->AddTime(sample); | 160 histogram_pointer->AddTime(sample); |
125 } | 161 } |
126 | 162 |
127 // Use this for histograms with dynamically generated names, which | 163 // Use this for histograms with dynamically generated names, which |
128 // otherwise can't use the UMA_HISTOGRAM macro without code duplication. | 164 // otherwise can't use the UMA_HISTOGRAM macro without code duplication. |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 } | 359 } |
324 } | 360 } |
325 | 361 |
326 void ServiceWorkerMetrics::RecordStartWorkerTime(base::TimeDelta time, | 362 void ServiceWorkerMetrics::RecordStartWorkerTime(base::TimeDelta time, |
327 bool is_installed, | 363 bool is_installed, |
328 StartSituation start_situation, | 364 StartSituation start_situation, |
329 EventType purpose) { | 365 EventType purpose) { |
330 if (is_installed) { | 366 if (is_installed) { |
331 std::string name = "ServiceWorker.StartWorker.Time"; | 367 std::string name = "ServiceWorker.StartWorker.Time"; |
332 UMA_HISTOGRAM_MEDIUM_TIMES(name, time); | 368 UMA_HISTOGRAM_MEDIUM_TIMES(name, time); |
333 RecordSuffixedTimeHistogram(name, StartSituationToSuffix(start_situation), | 369 RecordSuffixedMediumTimeHistogram( |
334 time); | 370 name, StartSituationToSuffix(start_situation), time); |
335 RecordSuffixedTimeHistogram( | 371 RecordSuffixedMediumTimeHistogram( |
336 "ServiceWorker.StartWorker.Time", | 372 "ServiceWorker.StartWorker.Time", |
337 StartSituationToSuffix(start_situation) + EventTypeToSuffix(purpose), | 373 StartSituationToSuffix(start_situation) + EventTypeToSuffix(purpose), |
338 time); | 374 time); |
339 } else { | 375 } else { |
340 UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.StartNewWorker.Time", time); | 376 UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.StartNewWorker.Time", time); |
341 } | 377 } |
342 } | 378 } |
343 | 379 |
344 void ServiceWorkerMetrics::RecordActivatedWorkerPreparationTimeForMainFrame( | 380 void ServiceWorkerMetrics::RecordActivatedWorkerPreparationTimeForMainFrame( |
345 base::TimeDelta time, | 381 base::TimeDelta time, |
346 EmbeddedWorkerStatus initial_worker_status, | 382 EmbeddedWorkerStatus initial_worker_status, |
347 StartSituation start_situation) { | 383 StartSituation start_situation) { |
348 std::string name = | 384 std::string name = |
349 "ServiceWorker.ActivatedWorkerPreparationForMainFrame.Time"; | 385 "ServiceWorker.ActivatedWorkerPreparationForMainFrame.Time"; |
350 UMA_HISTOGRAM_MEDIUM_TIMES(name, time); | 386 UMA_HISTOGRAM_MEDIUM_TIMES(name, time); |
351 RecordSuffixedTimeHistogram( | 387 RecordSuffixedMediumTimeHistogram( |
352 name, GetWorkerPreparationSuffix(initial_worker_status, start_situation), | 388 name, GetWorkerPreparationSuffix(initial_worker_status, start_situation), |
353 time); | 389 time); |
354 } | 390 } |
355 | 391 |
356 void ServiceWorkerMetrics::RecordWorkerStopped(StopStatus status) { | 392 void ServiceWorkerMetrics::RecordWorkerStopped(StopStatus status) { |
357 UMA_HISTOGRAM_ENUMERATION("ServiceWorker.WorkerStopped", | 393 UMA_HISTOGRAM_ENUMERATION("ServiceWorker.WorkerStopped", |
358 static_cast<int>(status), | 394 static_cast<int>(status), |
359 static_cast<int>(StopStatus::NUM_TYPES)); | 395 static_cast<int>(StopStatus::NUM_TYPES)); |
360 } | 396 } |
361 | 397 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 UMA_HISTOGRAM_ENUMERATION( | 456 UMA_HISTOGRAM_ENUMERATION( |
421 "ServiceWorker.EventHandledRatioType.ForeignFetch", type, | 457 "ServiceWorker.EventHandledRatioType.ForeignFetch", type, |
422 NUM_EVENT_HANDLED_RATIO_TYPE); | 458 NUM_EVENT_HANDLED_RATIO_TYPE); |
423 break; | 459 break; |
424 default: | 460 default: |
425 // Do nothing. | 461 // Do nothing. |
426 break; | 462 break; |
427 } | 463 } |
428 } | 464 } |
429 | 465 |
| 466 void ServiceWorkerMetrics::RecordEventDispatchingDelay(EventType event_type, |
| 467 base::TimeDelta time, |
| 468 Site site_for_metrics) { |
| 469 const std::string name = "ServiceWorker.EventDispatchingDelay"; |
| 470 UMA_HISTOGRAM_TIMES(name, time); |
| 471 const std::string event_type_suffix = EventTypeToSuffix(event_type); |
| 472 const std::string site_suffix = GetSiteSuffix(site_for_metrics); |
| 473 RecordSuffixedTimeHistogram(name, event_type_suffix + site_suffix, time); |
| 474 } |
| 475 |
430 void ServiceWorkerMetrics::RecordNavigationHintPrecision( | 476 void ServiceWorkerMetrics::RecordNavigationHintPrecision( |
431 EventType start_worker_purpose, | 477 EventType start_worker_purpose, |
432 bool frame_fetch_event_fired) { | 478 bool frame_fetch_event_fired) { |
433 DCHECK(IsNavigationHintEvent(start_worker_purpose)); | 479 DCHECK(IsNavigationHintEvent(start_worker_purpose)); |
434 UMA_HISTOGRAM_BOOLEAN("ServiceWorker.NavigationHintPrecision", | 480 UMA_HISTOGRAM_BOOLEAN("ServiceWorker.NavigationHintPrecision", |
435 frame_fetch_event_fired); | 481 frame_fetch_event_fired); |
436 switch (start_worker_purpose) { | 482 switch (start_worker_purpose) { |
437 case EventType::NAVIGATION_HINT_LINK_MOUSE_DOWN: | 483 case EventType::NAVIGATION_HINT_LINK_MOUSE_DOWN: |
438 UMA_HISTOGRAM_BOOLEAN( | 484 UMA_HISTOGRAM_BOOLEAN( |
439 "ServiceWorker.NavigationHintPrecision.LINK_MOUSE_DOWN", | 485 "ServiceWorker.NavigationHintPrecision.LINK_MOUSE_DOWN", |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 void ServiceWorkerMetrics::RecordProcessCreated(bool is_new_process) { | 627 void ServiceWorkerMetrics::RecordProcessCreated(bool is_new_process) { |
582 UMA_HISTOGRAM_BOOLEAN("EmbeddedWorkerInstance.ProcessCreated", | 628 UMA_HISTOGRAM_BOOLEAN("EmbeddedWorkerInstance.ProcessCreated", |
583 is_new_process); | 629 is_new_process); |
584 } | 630 } |
585 | 631 |
586 void ServiceWorkerMetrics::RecordTimeToSendStartWorker( | 632 void ServiceWorkerMetrics::RecordTimeToSendStartWorker( |
587 base::TimeDelta duration, | 633 base::TimeDelta duration, |
588 StartSituation situation) { | 634 StartSituation situation) { |
589 std::string name = "EmbeddedWorkerInstance.Start.TimeToSendStartWorker"; | 635 std::string name = "EmbeddedWorkerInstance.Start.TimeToSendStartWorker"; |
590 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); | 636 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); |
591 RecordSuffixedTimeHistogram(name, StartSituationToSuffix(situation), | 637 RecordSuffixedMediumTimeHistogram(name, StartSituationToSuffix(situation), |
592 duration); | 638 duration); |
593 } | 639 } |
594 | 640 |
595 void ServiceWorkerMetrics::RecordTimeToURLJob(base::TimeDelta duration, | 641 void ServiceWorkerMetrics::RecordTimeToURLJob(base::TimeDelta duration, |
596 StartSituation situation) { | 642 StartSituation situation) { |
597 std::string name = "EmbeddedWorkerInstance.Start.TimeToURLJob"; | 643 std::string name = "EmbeddedWorkerInstance.Start.TimeToURLJob"; |
598 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); | 644 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); |
599 RecordSuffixedTimeHistogram(name, StartSituationToSuffix(situation), | 645 RecordSuffixedMediumTimeHistogram(name, StartSituationToSuffix(situation), |
600 duration); | 646 duration); |
601 } | 647 } |
602 | 648 |
603 void ServiceWorkerMetrics::RecordTimeToLoad(base::TimeDelta duration, | 649 void ServiceWorkerMetrics::RecordTimeToLoad(base::TimeDelta duration, |
604 LoadSource source, | 650 LoadSource source, |
605 StartSituation situation) { | 651 StartSituation situation) { |
606 std::string name; | 652 std::string name; |
607 switch (source) { | 653 switch (source) { |
608 case LoadSource::NETWORK: | 654 case LoadSource::NETWORK: |
609 name = "EmbeddedWorkerInstance.Start.TimeToLoad.Network"; | 655 name = "EmbeddedWorkerInstance.Start.TimeToLoad.Network"; |
610 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); | 656 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); |
611 RecordSuffixedTimeHistogram(name, StartSituationToSuffix(situation), | 657 RecordSuffixedMediumTimeHistogram(name, StartSituationToSuffix(situation), |
612 duration); | 658 duration); |
613 break; | 659 break; |
614 case LoadSource::HTTP_CACHE: | 660 case LoadSource::HTTP_CACHE: |
615 name = "EmbeddedWorkerInstance.Start.TimeToLoad.HttpCache"; | 661 name = "EmbeddedWorkerInstance.Start.TimeToLoad.HttpCache"; |
616 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); | 662 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); |
617 RecordSuffixedTimeHistogram(name, StartSituationToSuffix(situation), | 663 RecordSuffixedMediumTimeHistogram(name, StartSituationToSuffix(situation), |
618 duration); | 664 duration); |
619 break; | 665 break; |
620 case LoadSource::SERVICE_WORKER_STORAGE: | 666 case LoadSource::SERVICE_WORKER_STORAGE: |
621 name = "EmbeddedWorkerInstance.Start.TimeToLoad.InstalledScript"; | 667 name = "EmbeddedWorkerInstance.Start.TimeToLoad.InstalledScript"; |
622 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); | 668 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); |
623 RecordSuffixedTimeHistogram(name, StartSituationToSuffix(situation), | 669 RecordSuffixedMediumTimeHistogram(name, StartSituationToSuffix(situation), |
624 duration); | 670 duration); |
625 break; | 671 break; |
626 default: | 672 default: |
627 NOTREACHED() << static_cast<int>(source); | 673 NOTREACHED() << static_cast<int>(source); |
628 } | 674 } |
629 } | 675 } |
630 | 676 |
631 void ServiceWorkerMetrics::RecordTimeToStartThread(base::TimeDelta duration, | 677 void ServiceWorkerMetrics::RecordTimeToStartThread(base::TimeDelta duration, |
632 StartSituation situation) { | 678 StartSituation situation) { |
633 std::string name = "EmbeddedWorkerInstance.Start.TimeToStartThread"; | 679 std::string name = "EmbeddedWorkerInstance.Start.TimeToStartThread"; |
634 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); | 680 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); |
635 RecordSuffixedTimeHistogram(name, StartSituationToSuffix(situation), | 681 RecordSuffixedMediumTimeHistogram(name, StartSituationToSuffix(situation), |
636 duration); | 682 duration); |
637 } | 683 } |
638 | 684 |
639 void ServiceWorkerMetrics::RecordTimeToEvaluateScript( | 685 void ServiceWorkerMetrics::RecordTimeToEvaluateScript( |
640 base::TimeDelta duration, | 686 base::TimeDelta duration, |
641 StartSituation situation) { | 687 StartSituation situation) { |
642 std::string name = "EmbeddedWorkerInstance.Start.TimeToEvaluateScript"; | 688 std::string name = "EmbeddedWorkerInstance.Start.TimeToEvaluateScript"; |
643 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); | 689 UMA_HISTOGRAM_MEDIUM_TIMES(name, duration); |
644 RecordSuffixedTimeHistogram(name, StartSituationToSuffix(situation), | 690 RecordSuffixedMediumTimeHistogram(name, StartSituationToSuffix(situation), |
645 duration); | 691 duration); |
646 } | 692 } |
647 | 693 |
648 const char* ServiceWorkerMetrics::LoadSourceToString(LoadSource source) { | 694 const char* ServiceWorkerMetrics::LoadSourceToString(LoadSource source) { |
649 switch (source) { | 695 switch (source) { |
650 case LoadSource::NETWORK: | 696 case LoadSource::NETWORK: |
651 return "Network"; | 697 return "Network"; |
652 case LoadSource::HTTP_CACHE: | 698 case LoadSource::HTTP_CACHE: |
653 return "HTTP cache"; | 699 return "HTTP cache"; |
654 case LoadSource::SERVICE_WORKER_STORAGE: | 700 case LoadSource::SERVICE_WORKER_STORAGE: |
655 return "Service worker storage"; | 701 return "Service worker storage"; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 } else if (failure_count == 2) { | 733 } else if (failure_count == 2) { |
688 UMA_HISTOGRAM_ENUMERATION("ServiceWorker.StartWorker.AfterFailureStreak_2", | 734 UMA_HISTOGRAM_ENUMERATION("ServiceWorker.StartWorker.AfterFailureStreak_2", |
689 status, SERVICE_WORKER_ERROR_MAX_VALUE); | 735 status, SERVICE_WORKER_ERROR_MAX_VALUE); |
690 } else if (failure_count == 3) { | 736 } else if (failure_count == 3) { |
691 UMA_HISTOGRAM_ENUMERATION("ServiceWorker.StartWorker.AfterFailureStreak_3", | 737 UMA_HISTOGRAM_ENUMERATION("ServiceWorker.StartWorker.AfterFailureStreak_3", |
692 status, SERVICE_WORKER_ERROR_MAX_VALUE); | 738 status, SERVICE_WORKER_ERROR_MAX_VALUE); |
693 } | 739 } |
694 } | 740 } |
695 | 741 |
696 } // namespace content | 742 } // namespace content |
OLD | NEW |