diff options
Diffstat (limited to 'chromium/content/browser/service_worker/service_worker_metrics.cc')
-rw-r--r-- | chromium/content/browser/service_worker/service_worker_metrics.cc | 216 |
1 files changed, 139 insertions, 77 deletions
diff --git a/chromium/content/browser/service_worker/service_worker_metrics.cc b/chromium/content/browser/service_worker/service_worker_metrics.cc index a481b8bf035..07585564f47 100644 --- a/chromium/content/browser/service_worker/service_worker_metrics.cc +++ b/chromium/content/browser/service_worker/service_worker_metrics.cc @@ -10,6 +10,7 @@ #include "base/metrics/histogram_macros.h" #include "base/metrics/sparse_histogram.h" #include "base/strings/string_util.h" +#include "content/browser/service_worker/embedded_worker_status.h" #include "content/common/service_worker/service_worker_types.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/content_browser_client.h" @@ -21,6 +22,8 @@ namespace { std::string StartSituationToSuffix( ServiceWorkerMetrics::StartSituation situation) { + // Don't change these returned strings. They are written (in hashed form) into + // logs. switch (situation) { case ServiceWorkerMetrics::StartSituation::DURING_STARTUP: return "_DuringStartup"; @@ -34,6 +37,73 @@ std::string StartSituationToSuffix( return "_Unknown"; } +std::string EventTypeToSuffix(ServiceWorkerMetrics::EventType event_type) { + // Don't change these returned strings. They are written (in hashed form) into + // logs. + switch (event_type) { + case ServiceWorkerMetrics::EventType::ACTIVATE: + return "_ACTIVATE"; + case ServiceWorkerMetrics::EventType::INSTALL: + return "_INSTALL"; + case ServiceWorkerMetrics::EventType::SYNC: + return "_SYNC"; + case ServiceWorkerMetrics::EventType::NOTIFICATION_CLICK: + return "_NOTIFICATION_CLICK"; + case ServiceWorkerMetrics::EventType::PUSH: + return "_PUSH"; + case ServiceWorkerMetrics::EventType::MESSAGE: + return "_MESSAGE"; + case ServiceWorkerMetrics::EventType::NOTIFICATION_CLOSE: + return "_NOTIFICATION_CLOSE"; + case ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME: + return "_FETCH_MAIN_FRAME"; + case ServiceWorkerMetrics::EventType::FETCH_SUB_FRAME: + return "_FETCH_SUB_FRAME"; + case ServiceWorkerMetrics::EventType::FETCH_SHARED_WORKER: + return "_FETCH_SHARED_WORKER"; + case ServiceWorkerMetrics::EventType::FETCH_SUB_RESOURCE: + return "_FETCH_SUB_RESOURCE"; + case ServiceWorkerMetrics::EventType::UNKNOWN: + return "_UNKNOWN"; + case ServiceWorkerMetrics::EventType::FOREIGN_FETCH: + return "_FOREIGN_FETCH"; + case ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL: + return "_FETCH_WAITUNTIL"; + case ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL: + return "_FOREIGN_FETCH_WAITUNTIL"; + case ServiceWorkerMetrics::EventType::NUM_TYPES: + NOTREACHED() << static_cast<int>(event_type); + } + return "_UNKNOWN"; +} + +std::string GetWorkerPreparationSuffix( + EmbeddedWorkerStatus initial_worker_status, + ServiceWorkerMetrics::StartSituation start_situation) { + switch (initial_worker_status) { + case EmbeddedWorkerStatus::STOPPED: { + switch (start_situation) { + case ServiceWorkerMetrics::StartSituation::DURING_STARTUP: + return "_StartWorkerDuringStartup"; + case ServiceWorkerMetrics::StartSituation::NEW_PROCESS: + return "_StartWorkerNewProcess"; + case ServiceWorkerMetrics::StartSituation::EXISTING_PROCESS: + return "_StartWorkerExistingProcess"; + default: + NOTREACHED() << static_cast<int>(start_situation); + } + } + case EmbeddedWorkerStatus::STARTING: + return "_StartingWorker"; + case EmbeddedWorkerStatus::RUNNING: + return "_RunningWorker"; + case EmbeddedWorkerStatus::STOPPING: + return "_StoppingWorker"; + } + NOTREACHED(); + return "_UNKNOWN"; +} + // Use this for histograms with dynamically generated names, which // otherwise can't use the UMA_HISTOGRAM macro without code duplication. void RecordSuffixedTimeHistogram(const std::string& name, @@ -48,6 +118,20 @@ void RecordSuffixedTimeHistogram(const std::string& name, histogram_pointer->AddTime(sample); } +// Use this for histograms with dynamically generated names, which +// otherwise can't use the UMA_HISTOGRAM macro without code duplication. +void RecordSuffixedStatusHistogram(const std::string& name, + const std::string& suffix, + ServiceWorkerStatusCode status) { + const std::string name_with_suffix = name + suffix; + // This unrolls UMA_HISTOGRAM_ENUMERATION. + base::HistogramBase* histogram_pointer = base::LinearHistogram::FactoryGet( + name_with_suffix, 1, SERVICE_WORKER_ERROR_MAX_VALUE, + SERVICE_WORKER_ERROR_MAX_VALUE + 1, + base::HistogramBase::kUmaTargetedHistogramFlag); + histogram_pointer->Add(status); +} + void RecordURLMetricOnUI(const GURL& url) { DCHECK_CURRENTLY_ON(BrowserThread::UI); GetContentClient()->browser()->RecordURLMetric( @@ -106,6 +190,10 @@ const char* ServiceWorkerMetrics::EventTypeToString(EventType event_type) { return "Unknown"; case EventType::FOREIGN_FETCH: return "Foreign Fetch"; + case EventType::FETCH_WAITUNTIL: + return "Fetch WaitUntil"; + case EventType::FOREIGN_FETCH_WAITUNTIL: + return "Foreign Fetch WaitUntil"; case EventType::NUM_TYPES: break; } @@ -172,10 +260,21 @@ void ServiceWorkerMetrics::RecordDeleteAndStartOverResult( result, NUM_DELETE_AND_START_OVER_RESULT_TYPES); } -void ServiceWorkerMetrics::CountControlledPageLoad(const GURL& url) { +void ServiceWorkerMetrics::CountControlledPageLoad(const GURL& url, + bool has_fetch_handler, + bool is_main_frame_load) { Site site = SiteFromURL(url); + if (site == Site::OTHER) { + site = (has_fetch_handler) ? Site::WITH_FETCH_HANDLER + : Site::WITHOUT_FETCH_HANDLER; + } UMA_HISTOGRAM_ENUMERATION("ServiceWorker.PageLoad", static_cast<int>(site), static_cast<int>(Site::NUM_TYPES)); + if (is_main_frame_load) { + UMA_HISTOGRAM_ENUMERATION("ServiceWorker.MainFramePageLoad", + static_cast<int>(site), + static_cast<int>(Site::NUM_TYPES)); + } if (ShouldExcludeSiteFromHistogram(site)) return; @@ -195,77 +294,8 @@ void ServiceWorkerMetrics::RecordStartWorkerStatus( UMA_HISTOGRAM_ENUMERATION("ServiceWorker.StartWorker.Status", status, SERVICE_WORKER_ERROR_MAX_VALUE); - switch (purpose) { - case EventType::ACTIVATE: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_ACTIVATE", status, - SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::INSTALL: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_INSTALL", status, - SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::SYNC: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_SYNC", status, - SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::NOTIFICATION_CLICK: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_NOTIFICATION_CLICK", - status, SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::PUSH: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_PUSH", status, - SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::MESSAGE: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_MESSAGE", status, - SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::NOTIFICATION_CLOSE: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_NOTIFICATION_CLOSE", - status, SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::FETCH_MAIN_FRAME: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_FETCH_MAIN_FRAME", status, - SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::FETCH_SUB_FRAME: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_FETCH_SUB_FRAME", status, - SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::FETCH_SHARED_WORKER: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_FETCH_SHARED_WORKER", - status, SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::FETCH_SUB_RESOURCE: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_FETCH_SUB_RESOURCE", - status, SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::UNKNOWN: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_UNKNOWN", status, - SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::FOREIGN_FETCH: - UMA_HISTOGRAM_ENUMERATION( - "ServiceWorker.StartWorker.StatusByPurpose_FOREIGN_FETCH", status, - SERVICE_WORKER_ERROR_MAX_VALUE); - break; - case EventType::NUM_TYPES: - NOTREACHED(); - break; - } - + RecordSuffixedStatusHistogram("ServiceWorker.StartWorker.StatusByPurpose", + EventTypeToSuffix(purpose), status); UMA_HISTOGRAM_ENUMERATION("ServiceWorker.StartWorker.Purpose", static_cast<int>(purpose), static_cast<int>(EventType::NUM_TYPES)); @@ -276,20 +306,36 @@ void ServiceWorkerMetrics::RecordStartWorkerStatus( } } -void ServiceWorkerMetrics::RecordStartWorkerTime( - base::TimeDelta time, - bool is_installed, - StartSituation start_situation) { +void ServiceWorkerMetrics::RecordStartWorkerTime(base::TimeDelta time, + bool is_installed, + StartSituation start_situation, + EventType purpose) { if (is_installed) { std::string name = "ServiceWorker.StartWorker.Time"; UMA_HISTOGRAM_MEDIUM_TIMES(name, time); RecordSuffixedTimeHistogram(name, StartSituationToSuffix(start_situation), time); + RecordSuffixedTimeHistogram( + "ServiceWorker.StartWorker.Time", + StartSituationToSuffix(start_situation) + EventTypeToSuffix(purpose), + time); } else { UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.StartNewWorker.Time", time); } } +void ServiceWorkerMetrics::RecordActivatedWorkerPreparationTimeForMainFrame( + base::TimeDelta time, + EmbeddedWorkerStatus initial_worker_status, + StartSituation start_situation) { + std::string name = + "ServiceWorker.ActivatedWorkerPreparationForMainFrame.Time"; + UMA_HISTOGRAM_MEDIUM_TIMES(name, time); + RecordSuffixedTimeHistogram( + name, GetWorkerPreparationSuffix(initial_worker_status, start_situation), + time); +} + void ServiceWorkerMetrics::RecordWorkerStopped(StopStatus status) { UMA_HISTOGRAM_ENUMERATION("ServiceWorker.WorkerStopped", static_cast<int>(status), @@ -301,9 +347,17 @@ void ServiceWorkerMetrics::RecordStopWorkerTime(base::TimeDelta time) { } void ServiceWorkerMetrics::RecordActivateEventStatus( - ServiceWorkerStatusCode status) { + ServiceWorkerStatusCode status, + bool is_shutdown) { UMA_HISTOGRAM_ENUMERATION("ServiceWorker.ActivateEventStatus", status, SERVICE_WORKER_ERROR_MAX_VALUE); + if (is_shutdown) { + UMA_HISTOGRAM_ENUMERATION("ServiceWorker.ActivateEventStatus_InShutdown", + status, SERVICE_WORKER_ERROR_MAX_VALUE); + } else { + UMA_HISTOGRAM_ENUMERATION("ServiceWorker.ActivateEventStatus_NotInShutdown", + status, SERVICE_WORKER_ERROR_MAX_VALUE); + } } void ServiceWorkerMetrics::RecordInstallEventStatus( @@ -371,6 +425,10 @@ void ServiceWorkerMetrics::RecordEventDuration(EventType event, time); } break; + case EventType::FETCH_WAITUNTIL: + UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.FetchEvent.WaitUntil.Time", + time); + break; case EventType::FOREIGN_FETCH: if (was_handled) { UMA_HISTOGRAM_MEDIUM_TIMES( @@ -380,6 +438,10 @@ void ServiceWorkerMetrics::RecordEventDuration(EventType event, "ServiceWorker.ForeignFetchEvent.Fallback.Time", time); } break; + case EventType::FOREIGN_FETCH_WAITUNTIL: + UMA_HISTOGRAM_MEDIUM_TIMES( + "ServiceWorker.ForeignFetchEvent.WaitUntil.Time", time); + break; case EventType::SYNC: UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.BackgroundSyncEvent.Time", time); |