xref: /aosp_15_r20/external/cronet/components/metrics/debug/structured/app.ts (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker// Copyright 2024 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 {CustomElement} from 'chrome://resources/js/custom_element.js';
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Workerimport {getTemplate} from './app.html.js';
8*6777b538SAndroid Build Coastguard Workerimport {StructuredMetricsBrowserProxyImpl} from './structured_metrics_browser_proxy.js';
9*6777b538SAndroid Build Coastguard Workerimport type {StructuredMetricEvent, StructuredMetricsSummary} from './structured_utils.js';
10*6777b538SAndroid Build Coastguard Workerimport {updateStructuredMetricsEvents, updateStructuredMetricsSummary} from './structured_utils.js';
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Workerexport class StructuredMetricsInternalsAppElement extends CustomElement {
13*6777b538SAndroid Build Coastguard Worker  static get is(): string {
14*6777b538SAndroid Build Coastguard Worker    return 'structured-metrics-internals-app';
15*6777b538SAndroid Build Coastguard Worker  }
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker  static override get template() {
18*6777b538SAndroid Build Coastguard Worker    return getTemplate();
19*6777b538SAndroid Build Coastguard Worker  }
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker  private browserProxy_: StructuredMetricsBrowserProxyImpl =
22*6777b538SAndroid Build Coastguard Worker      StructuredMetricsBrowserProxyImpl.getInstance();
23*6777b538SAndroid Build Coastguard Worker  private summaryIntervalId_: ReturnType<typeof setInterval>;
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker  initPromise: Promise<void>;
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker  constructor() {
28*6777b538SAndroid Build Coastguard Worker    super();
29*6777b538SAndroid Build Coastguard Worker    this.initPromise = this.init_();
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker    // Create periodic callbacks.
32*6777b538SAndroid Build Coastguard Worker    this.summaryIntervalId_ =
33*6777b538SAndroid Build Coastguard Worker        setInterval(() => this.updateStructuredMetricsSummary_(), 5000);
34*6777b538SAndroid Build Coastguard Worker  }
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker  disconnectedCallback() {
37*6777b538SAndroid Build Coastguard Worker    clearInterval(this.summaryIntervalId_);
38*6777b538SAndroid Build Coastguard Worker  }
39*6777b538SAndroid Build Coastguard Worker
40*6777b538SAndroid Build Coastguard Worker  private async init_(): Promise<void> {
41*6777b538SAndroid Build Coastguard Worker    // Fetch Structured Metrics summary and events.
42*6777b538SAndroid Build Coastguard Worker    // TODO: Implement a push model as new events are recorded.
43*6777b538SAndroid Build Coastguard Worker    await this.updateStructuredMetricsSummary_();
44*6777b538SAndroid Build Coastguard Worker    await this.updateStructuredMetricsEvents_();
45*6777b538SAndroid Build Coastguard Worker
46*6777b538SAndroid Build Coastguard Worker    const eventRefreshButton =
47*6777b538SAndroid Build Coastguard Worker        this.getRequiredElement<HTMLElement>('#sm-refresh-events');
48*6777b538SAndroid Build Coastguard Worker    eventRefreshButton.addEventListener(
49*6777b538SAndroid Build Coastguard Worker        'click', () => this.updateStructuredMetricsEvents_());
50*6777b538SAndroid Build Coastguard Worker  }
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker  /**
53*6777b538SAndroid Build Coastguard Worker   * Fetches summary information of the Structured Metrics service and renders
54*6777b538SAndroid Build Coastguard Worker   * it.
55*6777b538SAndroid Build Coastguard Worker   */
56*6777b538SAndroid Build Coastguard Worker  private async updateStructuredMetricsSummary_(): Promise<void> {
57*6777b538SAndroid Build Coastguard Worker    const summary: StructuredMetricsSummary =
58*6777b538SAndroid Build Coastguard Worker        await this.browserProxy_.fetchStructuredMetricsSummary();
59*6777b538SAndroid Build Coastguard Worker    const template =
60*6777b538SAndroid Build Coastguard Worker        this.getRequiredElement<HTMLTemplateElement>('#summary-row-template');
61*6777b538SAndroid Build Coastguard Worker    const smSummaryBody =
62*6777b538SAndroid Build Coastguard Worker        this.getRequiredElement<HTMLElement>('#sm-summary-body');
63*6777b538SAndroid Build Coastguard Worker    updateStructuredMetricsSummary(smSummaryBody, summary, template);
64*6777b538SAndroid Build Coastguard Worker  }
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker  /**
67*6777b538SAndroid Build Coastguard Worker   * Fetches all events currently recorded by the Structured Metrics Service and
68*6777b538SAndroid Build Coastguard Worker   * renders them. It an event has been uploaded then it will not be shown
69*6777b538SAndroid Build Coastguard Worker   * again. This only shows Events recorded in Chromium. Platform2 events are
70*6777b538SAndroid Build Coastguard Worker   * not supported yet.
71*6777b538SAndroid Build Coastguard Worker   */
72*6777b538SAndroid Build Coastguard Worker  private async updateStructuredMetricsEvents_(): Promise<void> {
73*6777b538SAndroid Build Coastguard Worker    const events: StructuredMetricEvent[] =
74*6777b538SAndroid Build Coastguard Worker        await this.browserProxy_.fetchStructuredMetricsEvents();
75*6777b538SAndroid Build Coastguard Worker    const eventTemplate = this.getRequiredElement<HTMLTemplateElement>(
76*6777b538SAndroid Build Coastguard Worker        '#structured-metrics-event-row-template');
77*6777b538SAndroid Build Coastguard Worker    const eventDetailsTemplate = this.getRequiredElement<HTMLTemplateElement>(
78*6777b538SAndroid Build Coastguard Worker        '#structured-metrics-event-details-template');
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker    const kvTemplate =
81*6777b538SAndroid Build Coastguard Worker        this.getRequiredElement<HTMLTemplateElement>('#summary-row-template');
82*6777b538SAndroid Build Coastguard Worker    const eventTableBody =
83*6777b538SAndroid Build Coastguard Worker        this.getRequiredElement<HTMLElement>('#sm-event-body');
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker    updateStructuredMetricsEvents(
86*6777b538SAndroid Build Coastguard Worker        eventTableBody, events, eventTemplate, eventDetailsTemplate,
87*6777b538SAndroid Build Coastguard Worker        kvTemplate);
88*6777b538SAndroid Build Coastguard Worker  }
89*6777b538SAndroid Build Coastguard Worker}
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Workerdeclare global {
92*6777b538SAndroid Build Coastguard Worker  interface HTMLElementTagNameMap {
93*6777b538SAndroid Build Coastguard Worker    'structured-metrics-internals-app': StructuredMetricsInternalsAppElement;
94*6777b538SAndroid Build Coastguard Worker  }
95*6777b538SAndroid Build Coastguard Worker}
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard WorkercustomElements.define(
98*6777b538SAndroid Build Coastguard Worker    StructuredMetricsInternalsAppElement.is,
99*6777b538SAndroid Build Coastguard Worker    StructuredMetricsInternalsAppElement);
100