blob: bcf3e46c413016a3533cf589d3fedd7ca2326a40 [file] [log] [blame]
// 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;