1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_METRICS_H_
#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_METRICS_H_
#include <stddef.h>
#include "base/time/time.h"
#include "content/common/content_export.h"
#include "content/public/browser/service_worker_context.h"
#include "third_party/blink/public/common/service_worker/embedded_worker_status.h"
#include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
#include "ui/base/page_transition_types.h"
namespace content {
class ServiceWorkerMetrics {
public:
// Used for UMA. Append-only.
enum ReadResponseResult {
READ_OK,
READ_HEADERS_ERROR,
READ_DATA_ERROR,
NUM_READ_RESPONSE_RESULT_TYPES,
};
// Used for UMA. Append-only.
enum WriteResponseResult {
WRITE_OK,
WRITE_HEADERS_ERROR,
WRITE_DATA_ERROR,
NUM_WRITE_RESPONSE_RESULT_TYPES,
};
// Used for UMA. Append-only.
// This class is used to indicate which event is fired/finished. Most events
// have only one request that starts the event and one response that finishes
// the event, but the fetch event has two responses, so there are two types of
// EventType to break down the measurement into two: FETCH and
// FETCH_WAITUNTIL. Moreover, FETCH is separated into the four: MAIN_FRAME,
// SUB_FRAME, SHARED_WORKER and SUB_RESOURCE for more detailed UMA.
enum class EventType {
ACTIVATE = 0,
INSTALL = 1,
// FETCH = 2, // Obsolete
SYNC = 3,
NOTIFICATION_CLICK = 4,
PUSH = 5,
// GEOFENCING = 6, // Obsolete
// SERVICE_PORT_CONNECT = 7, // Obsolete
MESSAGE = 8,
NOTIFICATION_CLOSE = 9,
FETCH_MAIN_FRAME = 10,
FETCH_SUB_FRAME = 11,
FETCH_SHARED_WORKER = 12,
FETCH_SUB_RESOURCE = 13,
UNKNOWN = 14, // Used when event type is not known.
// FOREIGN_FETCH = 15, // Obsolete
FETCH_WAITUNTIL = 16,
// FOREIGN_FETCH_WAITUNTIL = 17, // Obsolete
// NAVIGATION_HINT_LINK_MOUSE_DOWN = 18, // Obsolete
// NAVIGATION_HINT_LINK_TAP_UNCONFIRMED = 19, // Obsolete
// NAVIGATION_HINT_LINK_TAP_DOWN = 20, // Obsolete
// Used when external consumers want to add a request to
// ServiceWorkerVersion to keep it alive.
EXTERNAL_REQUEST = 21,
PAYMENT_REQUEST = 22,
BACKGROUND_FETCH_ABORT = 23,
BACKGROUND_FETCH_CLICK = 24,
BACKGROUND_FETCH_FAIL = 25,
// BACKGROUND_FETCHED = 26, // Obsolete
NAVIGATION_HINT = 27,
CAN_MAKE_PAYMENT = 28,
ABORT_PAYMENT = 29,
COOKIE_CHANGE = 30,
// LONG_RUNNING_MESSAGE = 31, // Obsolete
BACKGROUND_FETCH_SUCCESS = 32,
PERIODIC_SYNC = 33,
CONTENT_DELETE = 34,
PUSH_SUBSCRIPTION_CHANGE = 35,
FETCH_FENCED_FRAME = 36,
BYPASS_MAIN_RESOURCE = 37,
SKIP_EMPTY_FETCH_HANDLER = 38,
BYPASS_ONLY_IF_SERVICE_WORKER_NOT_STARTED = 39,
WARM_UP = 40,
STATIC_ROUTER = 41,
// Add new events to record here.
kMaxValue = STATIC_ROUTER,
};
// Not used for UMA.
enum class StartSituation {
// Failed to allocate a process.
UNKNOWN,
// The service worker started up during browser startup.
DURING_STARTUP,
// The service worker started up in a new process.
NEW_PROCESS,
// The service worker started up in an existing unready process. (Ex: The
// process was created for the navigation but the IPC connection is not
// established yet.)
EXISTING_UNREADY_PROCESS,
// The service worker started up in an existing ready process.
EXISTING_READY_PROCESS
};
// Used for UMA. Append only.
// Describes the outcome of a time measurement taken between processes.
enum class CrossProcessTimeDelta {
NORMAL,
NEGATIVE,
INACCURATE_CLOCK,
// Add new types here.
kMaxValue = INACCURATE_CLOCK,
};
// These are prefixed with "local" or "remote" to indicate whether the browser
// process or renderer process recorded the timing (browser is local).
struct StartTimes {
// The browser started the service worker startup sequence.
base::TimeTicks local_start;
// The browser sent the start worker IPC to the renderer.
base::TimeTicks local_start_worker_sent;
// The renderer received the start worker IPC.
base::TimeTicks remote_start_worker_received;
// The renderer started script evaluation on the worker thread.
base::TimeTicks remote_script_evaluation_start;
// The renderer finished script evaluation on the worker thread.
base::TimeTicks remote_script_evaluation_end;
// The browser received the worker started IPC.
base::TimeTicks local_end;
};
ServiceWorkerMetrics() = delete;
ServiceWorkerMetrics(const ServiceWorkerMetrics&) = delete;
ServiceWorkerMetrics& operator=(const ServiceWorkerMetrics&) = delete;
// Converts an event type to a string. Used for tracing.
static const char* EventTypeToString(EventType event_type);
// Converts a start situation to a string. Used for tracing.
static const char* StartSituationToString(StartSituation start_situation);
// Counts the result of reading a service worker script from storage.
static void CountReadResponseResult(ReadResponseResult result);
// Counts the result of writing a service worker script to storage.
static void CountWriteResponseResult(WriteResponseResult result);
// Records the result of trying to start an installed worker.
static void RecordStartInstalledWorkerStatus(
blink::ServiceWorkerStatusCode status,
EventType purpose);
// Records the running status of the worker to receive a task.
// Usually recorded for the fetch handler.
static void RecordRunAfterStartWorkerStatus(
blink::EmbeddedWorkerStatus running_status,
EventType purpose);
// Records the time taken to successfully start a worker. |is_installed|
// indicates whether the version has been installed.
//
// TODO(crbug.com/40582160): Replace this with RecordStartWorkerTiming().
static void RecordStartWorkerTime(base::TimeDelta time,
bool is_installed,
StartSituation start_situation,
EventType purpose);
static void RecordActivateEventStatus(blink::ServiceWorkerStatusCode status,
bool is_shutdown);
static void RecordInstallEventStatus(blink::ServiceWorkerStatusCode status,
uint32_t fetch_count);
// Records the amount of time spent handling an event.
static void RecordEventDuration(EventType event,
base::TimeDelta time,
bool was_handled,
uint32_t fetch_count);
// Records the result of dispatching a fetch event to a service worker.
static void RecordFetchEventStatus(bool is_main_resource,
blink::ServiceWorkerStatusCode status);
CONTENT_EXPORT static void RecordStartWorkerTiming(const StartTimes& times,
StartSituation situation);
static void RecordStartWorkerTimingClockConsistency(
CrossProcessTimeDelta type);
// Records the size of Service-Worker-Navigation-Preload header when the
// navigation preload request is to be sent.
static void RecordNavigationPreloadRequestHeaderSize(size_t size);
static void RecordSkipServiceWorkerOnNavigation(bool skip_service_worker);
static void RecordFindRegistrationForClientUrlTime(base::TimeDelta time);
};
} // namespace content
#endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_METRICS_H_
|