summaryrefslogtreecommitdiff
path: root/chromium/content/browser/service_worker/service_worker_metrics.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/service_worker/service_worker_metrics.cc')
-rw-r--r--chromium/content/browser/service_worker/service_worker_metrics.cc216
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);