xref: /aosp_15_r20/external/perfetto/ui/src/public/plugin.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2024 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker//
3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker//
7*6dbdd20aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker//
9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Workerimport {Trace} from './trace';
16*6dbdd20aSAndroid Build Coastguard Workerimport {App} from './app';
17*6dbdd20aSAndroid Build Coastguard Worker
18*6dbdd20aSAndroid Build Coastguard Worker/**
19*6dbdd20aSAndroid Build Coastguard Worker * This interface defines the shape of the plugins's class constructor (i.e. the
20*6dbdd20aSAndroid Build Coastguard Worker * the constructor and all static members of the plugin's class.
21*6dbdd20aSAndroid Build Coastguard Worker *
22*6dbdd20aSAndroid Build Coastguard Worker * This class constructor is registered with the core.
23*6dbdd20aSAndroid Build Coastguard Worker *
24*6dbdd20aSAndroid Build Coastguard Worker * On trace load, the core will create a new class instance by calling new on
25*6dbdd20aSAndroid Build Coastguard Worker * this constructor and then call its onTraceLoad() function.
26*6dbdd20aSAndroid Build Coastguard Worker */
27*6dbdd20aSAndroid Build Coastguard Workerexport interface PerfettoPluginStatic<T extends PerfettoPlugin> {
28*6dbdd20aSAndroid Build Coastguard Worker  readonly id: string;
29*6dbdd20aSAndroid Build Coastguard Worker  readonly dependencies?: ReadonlyArray<PerfettoPluginStatic<PerfettoPlugin>>;
30*6dbdd20aSAndroid Build Coastguard Worker  onActivate?(app: App): void;
31*6dbdd20aSAndroid Build Coastguard Worker  metricVisualisations?(): MetricVisualisation[];
32*6dbdd20aSAndroid Build Coastguard Worker  new (trace: Trace): T;
33*6dbdd20aSAndroid Build Coastguard Worker}
34*6dbdd20aSAndroid Build Coastguard Worker
35*6dbdd20aSAndroid Build Coastguard Worker/**
36*6dbdd20aSAndroid Build Coastguard Worker * This interface defines the shape of a plugin's trace-scoped instance, which
37*6dbdd20aSAndroid Build Coastguard Worker * is created from the class constructor above at trace load time.
38*6dbdd20aSAndroid Build Coastguard Worker */
39*6dbdd20aSAndroid Build Coastguard Workerexport interface PerfettoPlugin {
40*6dbdd20aSAndroid Build Coastguard Worker  onTraceLoad?(ctx: Trace): Promise<void>;
41*6dbdd20aSAndroid Build Coastguard Worker}
42*6dbdd20aSAndroid Build Coastguard Worker
43*6dbdd20aSAndroid Build Coastguard Workerexport interface MetricVisualisation {
44*6dbdd20aSAndroid Build Coastguard Worker  // The name of the metric e.g. 'android_camera'
45*6dbdd20aSAndroid Build Coastguard Worker  metric: string;
46*6dbdd20aSAndroid Build Coastguard Worker
47*6dbdd20aSAndroid Build Coastguard Worker  // A vega or vega-lite visualisation spec.
48*6dbdd20aSAndroid Build Coastguard Worker  // The data from the metric under path will be exposed as a
49*6dbdd20aSAndroid Build Coastguard Worker  // datasource named "metric" in Vega(-Lite)
50*6dbdd20aSAndroid Build Coastguard Worker  spec: string;
51*6dbdd20aSAndroid Build Coastguard Worker
52*6dbdd20aSAndroid Build Coastguard Worker  // A path index into the metric.
53*6dbdd20aSAndroid Build Coastguard Worker  // For example if the metric returns the folowing protobuf:
54*6dbdd20aSAndroid Build Coastguard Worker  // {
55*6dbdd20aSAndroid Build Coastguard Worker  //   foo {
56*6dbdd20aSAndroid Build Coastguard Worker  //     bar {
57*6dbdd20aSAndroid Build Coastguard Worker  //       baz: { name: "a" }
58*6dbdd20aSAndroid Build Coastguard Worker  //       baz: { name: "b" }
59*6dbdd20aSAndroid Build Coastguard Worker  //       baz: { name: "c" }
60*6dbdd20aSAndroid Build Coastguard Worker  //     }
61*6dbdd20aSAndroid Build Coastguard Worker  //   }
62*6dbdd20aSAndroid Build Coastguard Worker  // }
63*6dbdd20aSAndroid Build Coastguard Worker  // That becomes the following json:
64*6dbdd20aSAndroid Build Coastguard Worker  // { "foo": { "bar": { "baz": [
65*6dbdd20aSAndroid Build Coastguard Worker  //  {"name": "a"},
66*6dbdd20aSAndroid Build Coastguard Worker  //  {"name": "b"},
67*6dbdd20aSAndroid Build Coastguard Worker  //  {"name": "c"},
68*6dbdd20aSAndroid Build Coastguard Worker  // ]}}}
69*6dbdd20aSAndroid Build Coastguard Worker  // And given path = ["foo", "bar", "baz"]
70*6dbdd20aSAndroid Build Coastguard Worker  // We extract:
71*6dbdd20aSAndroid Build Coastguard Worker  // [ {"name": "a"}, {"name": "b"}, {"name": "c"} ]
72*6dbdd20aSAndroid Build Coastguard Worker  // And pass that to the vega(-lite) visualisation.
73*6dbdd20aSAndroid Build Coastguard Worker  path: string[];
74*6dbdd20aSAndroid Build Coastguard Worker}
75*6dbdd20aSAndroid Build Coastguard Worker
76*6dbdd20aSAndroid Build Coastguard Workerexport interface PluginManager {
77*6dbdd20aSAndroid Build Coastguard Worker  getPlugin<T extends PerfettoPlugin>(plugin: PerfettoPluginStatic<T>): T;
78*6dbdd20aSAndroid Build Coastguard Worker  metricVisualisations(): MetricVisualisation[];
79*6dbdd20aSAndroid Build Coastguard Worker}
80