mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-19 01:25:36 -05:00
Add perf marks for query execution (#22082)
This commit is contained in:
@@ -7,6 +7,7 @@ import QueryRunner from 'sql/workbench/services/query/common/queryRunner';
|
||||
import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement';
|
||||
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||
import * as perf from 'vs/base/common/performance';
|
||||
import * as azdata from 'azdata';
|
||||
import * as TelemetryKeys from 'sql/platform/telemetry/common/telemetryKeys';
|
||||
import { Event, Emitter } from 'vs/base/common/event';
|
||||
@@ -234,6 +235,7 @@ export class QueryManagementService implements IQueryManagementService {
|
||||
|
||||
public runQuery(ownerUri: string, range?: IRange, runOptions?: ExecutionPlanOptions): Promise<void> {
|
||||
this.addTelemetry(TelemetryKeys.TelemetryAction.RunQuery, ownerUri, runOptions);
|
||||
perf.mark(`sql/query/${ownerUri}/runQuery`);
|
||||
return this._runAction(ownerUri, (runner) => {
|
||||
return runner.runQuery(ownerUri, rangeToSelectionData(range), runOptions);
|
||||
});
|
||||
@@ -241,6 +243,7 @@ export class QueryManagementService implements IQueryManagementService {
|
||||
|
||||
public runQueryStatement(ownerUri: string, line: number, column: number): Promise<void> {
|
||||
this.addTelemetry(TelemetryKeys.TelemetryAction.RunQueryStatement, ownerUri);
|
||||
perf.mark(`sql/query/${ownerUri}/runQueryStatement`);
|
||||
return this._runAction(ownerUri, (runner) => {
|
||||
return runner.runQueryStatement(ownerUri, line - 1, column - 1); // we are taking in a vscode IRange which is 1 indexed, but our api expected a 0 index
|
||||
});
|
||||
@@ -248,6 +251,7 @@ export class QueryManagementService implements IQueryManagementService {
|
||||
|
||||
public runQueryString(ownerUri: string, queryString: string): Promise<void> {
|
||||
this.addTelemetry(TelemetryKeys.TelemetryAction.RunQueryString, ownerUri);
|
||||
perf.mark(`sql/query/${ownerUri}/runQueryString`);
|
||||
return this._runAction(ownerUri, (runner) => {
|
||||
return runner.runQueryString(ownerUri, queryString);
|
||||
});
|
||||
|
||||
@@ -19,6 +19,7 @@ import { Emitter, Event } from 'vs/base/common/event';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import * as perf from 'vs/base/common/performance';
|
||||
import { mssqlProviderName } from 'sql/platform/connection/common/constants';
|
||||
import { IGridDataProvider, getResultsString, getTableHeaderString } from 'sql/workbench/services/query/common/gridDataProvider';
|
||||
import { getErrorMessage } from 'vs/base/common/errors';
|
||||
@@ -243,6 +244,9 @@ export default class QueryRunner extends Disposable {
|
||||
// this also isn't exact but its the best we can do
|
||||
this._queryEndTime = new Date();
|
||||
|
||||
perf.mark(`sql/query/${this.uri}/handleQueryComplete`);
|
||||
this.logPerfMarks();
|
||||
|
||||
// Store the batch sets we got back as a source of "truth"
|
||||
this._isExecuting = false;
|
||||
this._hasCompleted = true;
|
||||
@@ -513,6 +517,25 @@ export default class QueryRunner extends Disposable {
|
||||
};
|
||||
this._onVisualize.fire(result);
|
||||
}
|
||||
|
||||
private logPerfMarks(): void {
|
||||
let marks = perf.getMarks().filter(mark => mark.name.startsWith(`sql/query/${this.uri}`));
|
||||
// One query editor can have one set of marks for each query gets executed,
|
||||
// we only log the latest set of marks for the latest query.
|
||||
let reverseIdx = marks.slice().reverse().findIndex(m => m.name.startsWith(`sql/query/${this.uri}/runQuery`));
|
||||
marks = marks.slice(-(reverseIdx + 1));
|
||||
let head = `Name\tTimestamp\tDelta\tTotal\n`;
|
||||
let traceMsg = '';
|
||||
let lastStartTime = -1;
|
||||
let total = 0;
|
||||
for (const { name, startTime } of marks) {
|
||||
let delta = lastStartTime !== -1 ? startTime - lastStartTime : 0;
|
||||
total += delta;
|
||||
traceMsg += `${name}\t${startTime}\t${delta}\t${total}\n`;
|
||||
lastStartTime = startTime;
|
||||
}
|
||||
this.logService.debug(`Traces for sql/query/${this.uri}:\n${head}${traceMsg}`);
|
||||
}
|
||||
}
|
||||
|
||||
export class QueryGridDataProvider implements IGridDataProvider {
|
||||
|
||||
Reference in New Issue
Block a user