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
content / browser / service_worker / service_worker_metrics.h [blame]
// 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_