Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 1 | // Copyright (C) 2020 The Android Open Source Project |
| 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
Steve Golton | 278b7f0 | 2023-09-06 16:26:23 +0100 | [diff] [blame] | 15 | import {Duration} from '../../base/time'; |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 16 | import {ColumnDef} from '../../common/aggregation_data'; |
Isabelle Taylor | 797f483 | 2020-09-08 17:52:59 +0100 | [diff] [blame] | 17 | import {Area, Sorting} from '../../common/state'; |
Hector Dearman | 6fbcabd | 2023-02-10 12:26:59 +0000 | [diff] [blame] | 18 | import {globals} from '../../frontend/globals'; |
Hector Dearman | ea4719d | 2023-10-31 09:11:09 +0000 | [diff] [blame] | 19 | import {Engine} from '../../trace_processor/engine'; |
Steve Golton | 11c0c98 | 2023-10-03 08:30:15 +0100 | [diff] [blame] | 20 | import {COUNTER_TRACK_KIND} from '../../tracks/counter'; |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 21 | |
| 22 | import {AggregationController} from './aggregation_controller'; |
| 23 | |
| 24 | export class CounterAggregationController extends AggregationController { |
Isabelle Taylor | 797f483 | 2020-09-08 17:52:59 +0100 | [diff] [blame] | 25 | async createAggregateView(engine: Engine, area: Area) { |
Hector Dearman | 7514f30 | 2021-08-19 18:21:52 +0100 | [diff] [blame] | 26 | await engine.query(`drop view if exists ${this.kind};`); |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 27 | |
Steve Golton | 7e63f42 | 2024-03-18 14:17:32 +0000 | [diff] [blame] | 28 | const trackIds: (string | number)[] = []; |
Steve Golton | cfe3e3d | 2023-10-26 16:24:31 +0100 | [diff] [blame] | 29 | for (const trackKey of area.tracks) { |
| 30 | const track = globals.state.tracks[trackKey]; |
Steve Golton | 11c0c98 | 2023-10-03 08:30:15 +0100 | [diff] [blame] | 31 | if (track?.uri) { |
Steve Golton | 1ea8b9f | 2024-01-25 16:03:37 +0000 | [diff] [blame] | 32 | const trackInfo = globals.trackManager.resolveTrackInfo(track.uri); |
Steve Golton | 11c0c98 | 2023-10-03 08:30:15 +0100 | [diff] [blame] | 33 | if (trackInfo?.kind === COUNTER_TRACK_KIND) { |
| 34 | trackInfo.trackIds && trackIds.push(...trackInfo.trackIds); |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 35 | } |
| 36 | } |
| 37 | } |
Steve Golton | 11c0c98 | 2023-10-03 08:30:15 +0100 | [diff] [blame] | 38 | if (trackIds.length === 0) return false; |
Steve Golton | f3897e2 | 2023-05-11 14:18:30 +0100 | [diff] [blame] | 39 | const duration = area.end - area.start; |
Steve Golton | b3a389d | 2023-07-10 11:03:17 +0100 | [diff] [blame] | 40 | const durationSec = Duration.toSeconds(duration); |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 41 | |
| 42 | const query = `create view ${this.kind} as select |
| 43 | name, |
Isabelle Taylor | 9d335da | 2020-07-14 15:51:55 +0100 | [diff] [blame] | 44 | count(1) as count, |
Steve Golton | f3897e2 | 2023-05-11 14:18:30 +0100 | [diff] [blame] | 45 | round(sum(weighted_value)/${duration}, 2) as avg_value, |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 46 | last as last_value, |
| 47 | first as first_value, |
| 48 | max(last) - min(first) as delta_value, |
Steve Golton | f3897e2 | 2023-05-11 14:18:30 +0100 | [diff] [blame] | 49 | round((max(last) - min(first))/${durationSec}, 2) as rate, |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 50 | min(value) as min_value, |
| 51 | max(value) as max_value |
| 52 | from |
| 53 | (select *, |
Steve Golton | f3897e2 | 2023-05-11 14:18:30 +0100 | [diff] [blame] | 54 | (min(ts + dur, ${area.end}) - max(ts,${area.start})) |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 55 | * value as weighted_value, |
| 56 | first_value(value) over |
| 57 | (partition by track_id order by ts) as first, |
| 58 | last_value(value) over |
| 59 | (partition by track_id order by ts |
| 60 | range between unbounded preceding and unbounded following) as last |
| 61 | from experimental_counter_dur |
Steve Golton | 11c0c98 | 2023-10-03 08:30:15 +0100 | [diff] [blame] | 62 | where track_id in (${trackIds}) |
Steve Golton | f3897e2 | 2023-05-11 14:18:30 +0100 | [diff] [blame] | 63 | and ts + dur >= ${area.start} and |
| 64 | ts <= ${area.end}) |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 65 | join counter_track |
| 66 | on track_id = counter_track.id |
| 67 | group by track_id`; |
| 68 | |
Hector Dearman | 7514f30 | 2021-08-19 18:21:52 +0100 | [diff] [blame] | 69 | await engine.query(query); |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 70 | return true; |
| 71 | } |
| 72 | |
| 73 | getColumnDefinitions(): ColumnDef[] { |
| 74 | return [ |
| 75 | { |
| 76 | title: 'Name', |
| 77 | kind: 'STRING', |
| 78 | columnConstructor: Uint16Array, |
| 79 | columnId: 'name', |
| 80 | }, |
| 81 | { |
| 82 | title: 'Delta value', |
| 83 | kind: 'NUMBER', |
| 84 | columnConstructor: Float64Array, |
Hector Dearman | 23c078b | 2022-06-05 12:00:25 +0100 | [diff] [blame] | 85 | columnId: 'delta_value', |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 86 | }, |
| 87 | { |
| 88 | title: 'Rate /s', |
| 89 | kind: 'Number', |
| 90 | columnConstructor: Float64Array, |
Hector Dearman | 23c078b | 2022-06-05 12:00:25 +0100 | [diff] [blame] | 91 | columnId: 'rate', |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 92 | }, |
| 93 | { |
| 94 | title: 'Weighted avg value', |
| 95 | kind: 'Number', |
| 96 | columnConstructor: Float64Array, |
Hector Dearman | 23c078b | 2022-06-05 12:00:25 +0100 | [diff] [blame] | 97 | columnId: 'avg_value', |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 98 | }, |
| 99 | { |
Isabelle Taylor | 9d335da | 2020-07-14 15:51:55 +0100 | [diff] [blame] | 100 | title: 'Count', |
| 101 | kind: 'Number', |
| 102 | columnConstructor: Float64Array, |
Isabelle Taylor | 9e7b44e | 2020-09-15 11:51:30 +0100 | [diff] [blame] | 103 | columnId: 'count', |
| 104 | sum: true, |
Isabelle Taylor | 9d335da | 2020-07-14 15:51:55 +0100 | [diff] [blame] | 105 | }, |
| 106 | { |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 107 | title: 'First value', |
| 108 | kind: 'NUMBER', |
| 109 | columnConstructor: Float64Array, |
Hector Dearman | 23c078b | 2022-06-05 12:00:25 +0100 | [diff] [blame] | 110 | columnId: 'first_value', |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 111 | }, |
| 112 | { |
| 113 | title: 'Last value', |
| 114 | kind: 'NUMBER', |
| 115 | columnConstructor: Float64Array, |
Hector Dearman | 23c078b | 2022-06-05 12:00:25 +0100 | [diff] [blame] | 116 | columnId: 'last_value', |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 117 | }, |
| 118 | { |
| 119 | title: 'Min value', |
| 120 | kind: 'NUMBER', |
| 121 | columnConstructor: Float64Array, |
Hector Dearman | 23c078b | 2022-06-05 12:00:25 +0100 | [diff] [blame] | 122 | columnId: 'min_value', |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 123 | }, |
| 124 | { |
| 125 | title: 'Max value', |
| 126 | kind: 'NUMBER', |
| 127 | columnConstructor: Float64Array, |
Hector Dearman | 23c078b | 2022-06-05 12:00:25 +0100 | [diff] [blame] | 128 | columnId: 'max_value', |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 129 | }, |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 130 | ]; |
| 131 | } |
| 132 | |
Isabelle Taylor | 6c836a5 | 2020-07-31 12:45:20 +0100 | [diff] [blame] | 133 | async getExtra() {} |
| 134 | |
Isabelle Taylor | 4f93ced | 2020-07-03 18:26:43 +1200 | [diff] [blame] | 135 | getTabName() { |
| 136 | return 'Counters'; |
| 137 | } |
| 138 | |
| 139 | getDefaultSorting(): Sorting { |
| 140 | return {column: 'name', direction: 'DESC'}; |
| 141 | } |
| 142 | } |