aboutsummaryrefslogtreecommitdiff
path: root/ui/src/tracks/cpu_slices/controller.ts
diff options
context:
space:
mode:
Diffstat (limited to 'ui/src/tracks/cpu_slices/controller.ts')
-rw-r--r--ui/src/tracks/cpu_slices/controller.ts45
1 files changed, 30 insertions, 15 deletions
diff --git a/ui/src/tracks/cpu_slices/controller.ts b/ui/src/tracks/cpu_slices/controller.ts
index 278450e23..5917968be 100644
--- a/ui/src/tracks/cpu_slices/controller.ts
+++ b/ui/src/tracks/cpu_slices/controller.ts
@@ -12,9 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import {fromNs, toNs} from '../../common/time';
-import {LIMIT} from '../../common/track_data';
-
+import {fromNs} from '../../common/time';
import {
TrackController,
trackControllerRegistry
@@ -30,13 +28,22 @@ import {
class CpuSliceTrackController extends TrackController<Config, Data> {
static readonly kind = CPU_SLICE_TRACK_KIND;
+ private busy = false;
private setup = false;
- async onBoundsChange(start: number, end: number, resolution: number):
- Promise<Data> {
- const startNs = toNs(start);
- const endNs = toNs(end);
+ onBoundsChange(start: number, end: number, resolution: number): void {
+ this.update(start, end, resolution);
+ }
+
+ private async update(start: number, end: number, resolution: number):
+ Promise<void> {
+ // TODO: we should really call TraceProcessor.Interrupt() at this point.
+ if (this.busy) return;
+ const startNs = Math.round(start * 1e9);
+ const endNs = Math.round(end * 1e9);
+
+ this.busy = true;
if (this.setup === false) {
await this.query(
`create virtual table ${this.tableName('window')} using window;`);
@@ -62,18 +69,20 @@ class CpuSliceTrackController extends TrackController<Config, Data> {
where rowid = 0;`);
if (isQuantized) {
- return this.computeSummary(
- fromNs(windowStartNs), end, resolution, bucketSizeNs);
+ this.publish(await this.computeSummary(
+ fromNs(windowStartNs), end, resolution, bucketSizeNs));
} else {
- return this.computeSlices(fromNs(windowStartNs), end, resolution);
+ this.publish(
+ await this.computeSlices(fromNs(windowStartNs), end, resolution));
}
+ this.busy = false;
}
private async computeSummary(
start: number, end: number, resolution: number,
bucketSizeNs: number): Promise<SummaryData> {
- const startNs = toNs(start);
- const endNs = toNs(end);
+ const startNs = Math.round(start * 1e9);
+ const endNs = Math.round(end * 1e9);
const numBuckets = Math.ceil((endNs - startNs) / bucketSizeNs);
const query = `select
@@ -82,7 +91,7 @@ class CpuSliceTrackController extends TrackController<Config, Data> {
from ${this.tableName('span')}
where cpu = ${this.config.cpu}
and utid != 0
- group by quantum_ts limit ${LIMIT}`;
+ group by quantum_ts`;
const rawResult = await this.query(query);
const numRows = +rawResult.numRecords;
@@ -92,7 +101,6 @@ class CpuSliceTrackController extends TrackController<Config, Data> {
start,
end,
resolution,
- length: numRows,
bucketSizeSeconds: fromNs(bucketSizeNs),
utilizations: new Float64Array(numBuckets),
};
@@ -121,7 +129,6 @@ class CpuSliceTrackController extends TrackController<Config, Data> {
start,
end,
resolution,
- length: numRows,
ids: new Float64Array(numRows),
starts: new Float64Array(numRows),
ends: new Float64Array(numRows),
@@ -142,6 +149,14 @@ class CpuSliceTrackController extends TrackController<Config, Data> {
return slices;
}
+ private async query(query: string) {
+ const result = await this.engine.query(query);
+ if (result.error) {
+ console.error(`Query error "${query}": ${result.error}`);
+ throw new Error(`Query error "${query}": ${result.error}`);
+ }
+ return result;
+ }
onDestroy(): void {
if (this.setup) {