Skip to content

Commit 28092f2

Browse files
author
Dave Bartolomeo
committed
Move more of log scanning into pure code
1 parent 8970ad7 commit 28092f2

3 files changed

Lines changed: 53 additions & 34 deletions

File tree

extensions/ql-vscode/src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ async function activateWithInstalledDistribution(
488488
void logger.log('Initializing evaluation log scanners.');
489489
const logScannerService = new LogScannerService(qhm);
490490
ctx.subscriptions.push(logScannerService);
491-
ctx.subscriptions.push(logScannerService.registerLogScannerProvider(new JoinOrderScannerProvider()));
491+
ctx.subscriptions.push(logScannerService.scanners.registerLogScannerProvider(new JoinOrderScannerProvider()));
492492

493493
void logger.log('Reading query history');
494494
await qhm.readQueryHistory();

extensions/ql-vscode/src/log-insights/log-scanner-service.ts

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import { Diagnostic, DiagnosticSeverity, Disposable, languages, Range, Uri } from 'vscode';
1+
import { Diagnostic, DiagnosticSeverity, languages, Range, Uri } from 'vscode';
22
import { DisposableObject } from '../pure/disposable-object';
33
import { QueryHistoryManager } from '../query-history';
44
import { QueryHistoryInfo } from '../query-results';
5-
import { EvaluationLogProblemReporter, EvaluationLogScannerProvider } from './log-scanner';
5+
import { EvaluationLogProblemReporter, EvaluationLogScannerSet } from './log-scanner';
66
import { PipelineInfo, SummarySymbols } from './summary-parser';
77
import * as fs from 'fs-extra';
8-
import { readJsonlFile } from './jsonl-reader';
98

109
/**
1110
* Compute the key used to find a predicate in the summary symbols.
@@ -43,8 +42,7 @@ class ProblemReporter implements EvaluationLogProblemReporter {
4342
}
4443

4544
export class LogScannerService extends DisposableObject {
46-
private readonly scannerProviders = new Map<number, EvaluationLogScannerProvider>();
47-
private nextScannerProviderId = 0;
45+
public readonly scanners = new EvaluationLogScannerSet();
4846
private readonly diagnosticCollection = this.push(languages.createDiagnosticCollection('ql-eval-log'));
4947
private currentItem: QueryHistoryInfo | undefined = undefined;
5048

@@ -84,24 +82,6 @@ export class LogScannerService extends DisposableObject {
8482
this.diagnosticCollection.set(uri, diagnostics);
8583
}
8684

87-
/**
88-
* Register a provider that can create instances of `EvaluationLogScanner` to scan evaluation logs
89-
* for problems.
90-
* @param provider The provider.
91-
* @returns A `Disposable` that, when disposed, will unregister the provider.
92-
*/
93-
public registerLogScannerProvider(provider: EvaluationLogScannerProvider): Disposable {
94-
const id = this.nextScannerProviderId;
95-
this.nextScannerProviderId++;
96-
97-
this.scannerProviders.set(id, provider);
98-
return {
99-
dispose: () => {
100-
this.scannerProviders.delete(id);
101-
}
102-
};
103-
}
104-
10585
/**
10686
* Scan the evaluator summary log for problems, using the scanners for all registered providers.
10787
* @param jsonSummaryLocation The file path of the JSON summary log.
@@ -113,18 +93,9 @@ export class LogScannerService extends DisposableObject {
11393
if (symbolsLocation !== undefined) {
11494
symbols = JSON.parse(await fs.readFile(symbolsLocation, { encoding: 'utf-8' }));
11595
}
116-
11796
const problemReporter = new ProblemReporter(symbols);
11897

119-
const scanners = [...this.scannerProviders.values()].map(p => p.createScanner(problemReporter));
120-
121-
await readJsonlFile(jsonSummaryLocation, async obj => {
122-
scanners.forEach(scanner => {
123-
scanner.onEvent(obj);
124-
});
125-
});
126-
127-
scanners.forEach(scanner => scanner.onDone());
98+
await this.scanners.scanLog(jsonSummaryLocation, problemReporter);
12899

129100
return problemReporter.diagnostics;
130101
}

extensions/ql-vscode/src/log-insights/log-scanner.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { SummaryEvent } from './log-summary';
2+
import { readJsonlFile } from './jsonl-reader';
23

34
/**
45
* Callback interface used to report diagnostics from a log scanner.
@@ -47,3 +48,50 @@ export interface EvaluationLogScannerProvider {
4748
*/
4849
createScanner(problemReporter: EvaluationLogProblemReporter): EvaluationLogScanner;
4950
}
51+
52+
/**
53+
* Same as VSCode's `Disposable`, but avoids a dependency on VS Code.
54+
*/
55+
export interface Disposable {
56+
dispose(): void;
57+
}
58+
59+
export class EvaluationLogScannerSet {
60+
private readonly scannerProviders = new Map<number, EvaluationLogScannerProvider>();
61+
private nextScannerProviderId = 0;
62+
63+
/**
64+
* Register a provider that can create instances of `EvaluationLogScanner` to scan evaluation logs
65+
* for problems.
66+
* @param provider The provider.
67+
* @returns A `Disposable` that, when disposed, will unregister the provider.
68+
*/
69+
public registerLogScannerProvider(provider: EvaluationLogScannerProvider): Disposable {
70+
const id = this.nextScannerProviderId;
71+
this.nextScannerProviderId++;
72+
73+
this.scannerProviders.set(id, provider);
74+
return {
75+
dispose: () => {
76+
this.scannerProviders.delete(id);
77+
}
78+
};
79+
}
80+
81+
/**
82+
* Scan the evaluator summary log for problems, using the scanners for all registered providers.
83+
* @param jsonSummaryLocation The file path of the JSON summary log.
84+
* @param problemReporter Callback interface for reporting any problems discovered.
85+
*/
86+
public async scanLog(jsonSummaryLocation: string, problemReporter: EvaluationLogProblemReporter): Promise<void> {
87+
const scanners = [...this.scannerProviders.values()].map(p => p.createScanner(problemReporter));
88+
89+
await readJsonlFile(jsonSummaryLocation, async obj => {
90+
scanners.forEach(scanner => {
91+
scanner.onEvent(obj);
92+
});
93+
});
94+
95+
scanners.forEach(scanner => scanner.onDone());
96+
}
97+
}

0 commit comments

Comments
 (0)