1*6777b538SAndroid Build Coastguard Worker// Copyright 2022 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Workerimport {sendWithPromise} from 'chrome://resources/js/cr.js'; 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker// <if expr="structured_metrics_enabled"> 8*6777b538SAndroid Build Coastguard Workerimport type {StructuredMetricEvent, StructuredMetricsSummary} from './structured/structured_utils.js'; 9*6777b538SAndroid Build Coastguard Worker// </if> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker/** 12*6777b538SAndroid Build Coastguard Worker * @fileoverview A helper object used by the chrome://metrics-internals page to 13*6777b538SAndroid Build Coastguard Worker * interact with the browser. 14*6777b538SAndroid Build Coastguard Worker */ 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker/** 17*6777b538SAndroid Build Coastguard Worker * A pair of strings representing a row in a summary table. For example, |key| 18*6777b538SAndroid Build Coastguard Worker * could be "Platform", with |value| being "Android". 19*6777b538SAndroid Build Coastguard Worker */ 20*6777b538SAndroid Build Coastguard Workerexport interface KeyValue { 21*6777b538SAndroid Build Coastguard Worker key: string; 22*6777b538SAndroid Build Coastguard Worker value: string; 23*6777b538SAndroid Build Coastguard Worker} 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker/** 26*6777b538SAndroid Build Coastguard Worker * An individual event that occurred on a log. Optionally, this may include a 27*6777b538SAndroid Build Coastguard Worker * message. For example, for a "Trimmed" event, the message could be "Log size 28*6777b538SAndroid Build Coastguard Worker * too large". 29*6777b538SAndroid Build Coastguard Worker */ 30*6777b538SAndroid Build Coastguard Workerexport interface LogEvent { 31*6777b538SAndroid Build Coastguard Worker event: string; 32*6777b538SAndroid Build Coastguard Worker timestampMs: number; 33*6777b538SAndroid Build Coastguard Worker message?: string; 34*6777b538SAndroid Build Coastguard Worker} 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker/** 37*6777b538SAndroid Build Coastguard Worker * A log and its data, including the events that occurred throughout its 38*6777b538SAndroid Build Coastguard Worker * lifetime. The |type| field is only set for UMA logs (i.e., ongoing, 39*6777b538SAndroid Build Coastguard Worker * independent, or stability). The |compressed_data| field (i.e., its proto 40*6777b538SAndroid Build Coastguard Worker * data) is only set when exporting. 41*6777b538SAndroid Build Coastguard Worker * TODO(crbug/1363747): Change name of |type| to something else, since it is 42*6777b538SAndroid Build Coastguard Worker * confusing and can be mistaken for |logType| in LogData (UMA or UKM). 43*6777b538SAndroid Build Coastguard Worker */ 44*6777b538SAndroid Build Coastguard Workerexport interface Log { 45*6777b538SAndroid Build Coastguard Worker type?: string; 46*6777b538SAndroid Build Coastguard Worker hash: string; 47*6777b538SAndroid Build Coastguard Worker timestamp: string; 48*6777b538SAndroid Build Coastguard Worker data?: string; 49*6777b538SAndroid Build Coastguard Worker size: number; 50*6777b538SAndroid Build Coastguard Worker events: LogEvent[]; 51*6777b538SAndroid Build Coastguard Worker} 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker/** 54*6777b538SAndroid Build Coastguard Worker * A list of logs, as well as their type (UMA or UKM). 55*6777b538SAndroid Build Coastguard Worker */ 56*6777b538SAndroid Build Coastguard Workerexport interface LogData { 57*6777b538SAndroid Build Coastguard Worker logType: string; 58*6777b538SAndroid Build Coastguard Worker logs: Log[]; 59*6777b538SAndroid Build Coastguard Worker} 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Workerexport interface MetricsInternalsBrowserProxy { 62*6777b538SAndroid Build Coastguard Worker /** 63*6777b538SAndroid Build Coastguard Worker * Gets UMA log data. |includeLogProtoData| determines whether or not the 64*6777b538SAndroid Build Coastguard Worker * fetched data should also include the protos of the logs. 65*6777b538SAndroid Build Coastguard Worker */ 66*6777b538SAndroid Build Coastguard Worker getUmaLogData(includeLogProtoData: boolean): Promise<string>; 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker /** 69*6777b538SAndroid Build Coastguard Worker * Fetches a summary of variations info. 70*6777b538SAndroid Build Coastguard Worker */ 71*6777b538SAndroid Build Coastguard Worker fetchVariationsSummary(): Promise<KeyValue[]>; 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker /** 74*6777b538SAndroid Build Coastguard Worker * Fetches a summary of UMA info. 75*6777b538SAndroid Build Coastguard Worker */ 76*6777b538SAndroid Build Coastguard Worker fetchUmaSummary(): Promise<KeyValue[]>; 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker /** 79*6777b538SAndroid Build Coastguard Worker * Fetches whether the logs observer being used is owned by the metrics 80*6777b538SAndroid Build Coastguard Worker * service or is owned by the page. 81*6777b538SAndroid Build Coastguard Worker */ 82*6777b538SAndroid Build Coastguard Worker isUsingMetricsServiceObserver(): Promise<boolean>; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker // <if expr="structured_metrics_enabled"> 85*6777b538SAndroid Build Coastguard Worker /** 86*6777b538SAndroid Build Coastguard Worker * Fetches recorded events from Structured Metrics Service. 87*6777b538SAndroid Build Coastguard Worker */ 88*6777b538SAndroid Build Coastguard Worker fetchStructuredMetricsEvents(): Promise<StructuredMetricEvent[]>; 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker /** 91*6777b538SAndroid Build Coastguard Worker * Fetches a summary of the Structured Metrics Service. 92*6777b538SAndroid Build Coastguard Worker */ 93*6777b538SAndroid Build Coastguard Worker fetchStructuredMetricsSummary(): Promise<StructuredMetricsSummary>; 94*6777b538SAndroid Build Coastguard Worker // </if> 95*6777b538SAndroid Build Coastguard Worker} 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Workerexport class MetricsInternalsBrowserProxyImpl implements 98*6777b538SAndroid Build Coastguard Worker MetricsInternalsBrowserProxy { 99*6777b538SAndroid Build Coastguard Worker getUmaLogData(includeLogProtoData: boolean): Promise<string> { 100*6777b538SAndroid Build Coastguard Worker return sendWithPromise('fetchUmaLogsData', includeLogProtoData); 101*6777b538SAndroid Build Coastguard Worker } 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker fetchVariationsSummary(): Promise<KeyValue[]> { 104*6777b538SAndroid Build Coastguard Worker return sendWithPromise('fetchVariationsSummary'); 105*6777b538SAndroid Build Coastguard Worker } 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker fetchUmaSummary(): Promise<KeyValue[]> { 108*6777b538SAndroid Build Coastguard Worker return sendWithPromise('fetchUmaSummary'); 109*6777b538SAndroid Build Coastguard Worker } 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard Worker isUsingMetricsServiceObserver(): Promise<boolean> { 112*6777b538SAndroid Build Coastguard Worker return sendWithPromise('isUsingMetricsServiceObserver'); 113*6777b538SAndroid Build Coastguard Worker } 114*6777b538SAndroid Build Coastguard Worker 115*6777b538SAndroid Build Coastguard Worker // <if expr="structured_metrics_enabled"> 116*6777b538SAndroid Build Coastguard Worker fetchStructuredMetricsEvents(): Promise<StructuredMetricEvent[]> { 117*6777b538SAndroid Build Coastguard Worker return sendWithPromise('fetchStructuredMetricsEvents'); 118*6777b538SAndroid Build Coastguard Worker } 119*6777b538SAndroid Build Coastguard Worker 120*6777b538SAndroid Build Coastguard Worker fetchStructuredMetricsSummary(): Promise<StructuredMetricsSummary> { 121*6777b538SAndroid Build Coastguard Worker return sendWithPromise('fetchStructuredMetricsSummary'); 122*6777b538SAndroid Build Coastguard Worker } 123*6777b538SAndroid Build Coastguard Worker // </if> 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker static getInstance(): MetricsInternalsBrowserProxy { 126*6777b538SAndroid Build Coastguard Worker return instance || (instance = new MetricsInternalsBrowserProxyImpl()); 127*6777b538SAndroid Build Coastguard Worker } 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker static setInstance(obj: MetricsInternalsBrowserProxy) { 130*6777b538SAndroid Build Coastguard Worker instance = obj; 131*6777b538SAndroid Build Coastguard Worker } 132*6777b538SAndroid Build Coastguard Worker} 133*6777b538SAndroid Build Coastguard Worker 134*6777b538SAndroid Build Coastguard Workerlet instance: MetricsInternalsBrowserProxy|null = null; 135