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
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {sendWithPromise} from 'chrome://resources/js/cr.js';
// <if expr="chromeos_ash">
import {StructuredMetricEvent, StructuredMetricsSummary} from './structured/structured_utils.js';
// </if>
/**
* @fileoverview A helper object used by the chrome://metrics-internals page to
* interact with the browser.
*/
/**
* A pair of strings representing a row in a summary table. For example, |key|
* could be "Platform", with |value| being "Android".
*/
export interface KeyValue {
key: string;
value: string;
}
/**
* An individual event that occurred on a log. Optionally, this may include a
* message. For example, for a "Trimmed" event, the message could be "Log size
* too large".
*/
export interface LogEvent {
event: string;
timestampMs: number;
message?: string;
}
/**
* A log and its data, including the events that occurred throughout its
* lifetime. The |type| field is only set for UMA logs (i.e., ongoing,
* independent, or stability). The |compressed_data| field (i.e., its proto
* data) is only set when exporting.
* TODO(crbug/1363747): Change name of |type| to something else, since it is
* confusing and can be mistaken for |logType| in LogData (UMA or UKM).
*/
export interface Log {
type?: string;
hash: string;
timestamp: string;
data?: string;
size: number;
events: LogEvent[];
}
/**
* A list of logs, as well as their type (UMA or UKM).
*/
export interface LogData {
logType: string;
logs: Log[];
}
export interface MetricsInternalsBrowserProxy {
/**
* Gets UMA log data. |includeLogProtoData| determines whether or not the
* fetched data should also include the protos of the logs.
*/
getUmaLogData(includeLogProtoData: boolean): Promise<string>;
/**
* Fetches a summary of variations info.
*/
fetchVariationsSummary(): Promise<KeyValue[]>;
/**
* Fetches a summary of UMA info.
*/
fetchUmaSummary(): Promise<KeyValue[]>;
/**
* Fetches whether the logs observer being used is owned by the metrics
* service or is owned by the page.
*/
isUsingMetricsServiceObserver(): Promise<boolean>;
// <if expr="chromeos_ash">
/**
* Fetches recorded events from Structured Metrics Service.
*/
fetchStructuredMetricsEvents(): Promise<StructuredMetricEvent[]>;
/**
* Fetches a summary of the Structured Metrics Service.
*/
fetchStructuredMetricsSummary(): Promise<StructuredMetricsSummary>;
// </if>
}
export class MetricsInternalsBrowserProxyImpl implements
MetricsInternalsBrowserProxy {
getUmaLogData(includeLogProtoData: boolean): Promise<string> {
return sendWithPromise('fetchUmaLogsData', includeLogProtoData);
}
fetchVariationsSummary(): Promise<KeyValue[]> {
return sendWithPromise('fetchVariationsSummary');
}
fetchUmaSummary(): Promise<KeyValue[]> {
return sendWithPromise('fetchUmaSummary');
}
isUsingMetricsServiceObserver(): Promise<boolean> {
return sendWithPromise('isUsingMetricsServiceObserver');
}
// <if expr="chromeos_ash">
fetchStructuredMetricsEvents(): Promise<StructuredMetricEvent[]> {
return sendWithPromise('fetchStructuredMetricsEvents');
}
fetchStructuredMetricsSummary(): Promise<StructuredMetricsSummary> {
return sendWithPromise('fetchStructuredMetricsSummary');
}
// </if>
static getInstance(): MetricsInternalsBrowserProxy {
return instance || (instance = new MetricsInternalsBrowserProxyImpl());
}
static setInstance(obj: MetricsInternalsBrowserProxy) {
instance = obj;
}
}
let instance: MetricsInternalsBrowserProxy|null = null;
|