Skip to content

Commit

Permalink
Adding telemetry utility
Browse files Browse the repository at this point in the history
  • Loading branch information
PauliusJaskutelis committed Mar 5, 2025
1 parent e56ecdb commit bf95077
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { AblDebugHoverProvider } from "./providers/AblDebugHoverProvider";
import { ConfigurationManager } from "./utils/ConfigurationManager";
import { enableFormatterDecorators } from "./formatterFramework/enableFormatterDecorators";
import { DebugManager } from "./providers/DebugManager";
import { Telemetry } from "./utils/telemetry";

export async function activate(context: vscode.ExtensionContext) {
const debugManager = DebugManager.getInstance(context);
Expand All @@ -16,6 +17,9 @@ export async function activate(context: vscode.ExtensionContext) {
ConfigurationManager.getInstance();
enableFormatterDecorators();

Telemetry.initialize();
context.subscriptions.push(Telemetry.getInstance());

const parserHelper = new AblParserHelper(
context.extensionPath,
debugManager
Expand All @@ -34,6 +38,7 @@ export async function activate(context: vscode.ExtensionContext) {

const hoverProvider = new AblDebugHoverProvider(parserHelper);
vscode.languages.registerHoverProvider(Constants.ablId, hoverProvider);
Telemetry.sendExtensionSettings();
}

// This method is called when your extension is deactivated
Expand Down
5 changes: 5 additions & 0 deletions src/providers/AblFormatterProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { FormattingEngine } from "../formatterFramework/FormattingEngine";
import { ConfigurationManager } from "../utils/ConfigurationManager";
import { EOL } from "../model/EOL";
import { DebugManager } from "./DebugManager";
import { Telemetry } from "../utils/telemetry";

export class AblFormatterProvider
implements
Expand All @@ -22,6 +23,8 @@ export class AblFormatterProvider
options: vscode.FormattingOptions
): vscode.ProviderResult<vscode.TextEdit[]> {
console.log("AblFormatterProvider.provideDocumentFormattingEdits");
Telemetry.increaseFormattingActions("Document");
Telemetry.addLinesOfCodeFormatted(document.lineCount);

const configurationManager = ConfigurationManager.getInstance();
const debugManager = DebugManager.getInstance();
Expand Down Expand Up @@ -65,6 +68,8 @@ export class AblFormatterProvider
range: vscode.Range
): vscode.ProviderResult<vscode.TextEdit[]> {
console.log("AblFormatterProvider.provideDocumentFormattingEdits");
Telemetry.increaseFormattingActions("Selection");
Telemetry.addLinesOfCodeFormatted(range.end.line - range.start.line);

const configurationManager = ConfigurationManager.getInstance();
const debugManager = DebugManager.getInstance();
Expand Down
2 changes: 2 additions & 0 deletions src/providers/DebugManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { SyntaxNode, Tree } from "web-tree-sitter";
import { SyntaxNodeType } from "../model/SyntaxNodeType";
import { ConfigurationManager } from "../utils/ConfigurationManager";
import { IDebugManager } from "./IDebugManager";
import { Telemetry } from "../utils/telemetry";

export class DebugManager implements IDebugManager {
private static instance: DebugManager;
Expand Down Expand Up @@ -60,6 +61,7 @@ export class DebugManager implements IDebugManager {
public handleErrors(tree: Tree): void {
const nodes = this.getNodesWithErrors(tree.rootNode, true);

Telemetry.addTreeSitterErrors(nodes.length);
this.errorRanges = [];

if (nodes.length > 0) {
Expand Down
114 changes: 114 additions & 0 deletions src/utils/telemetry.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import TelemetryReporter from "@vscode/extension-telemetry";
import * as vscode from "vscode";
export class Telemetry {
private static instance: TelemetryReporter;
private static treeSitterErrors: number = 0;
private static linesOfCodeFormatted: number = 0;
private static fullFormattingActions: number = 0;
private static selectionFormattingActions: number = 0;
private static sendThreshold: number = 5;
private static readonly TELEMETRY_KEY =
"46efa758-98ee-417f-88bb-397d4f2ca82b";

private constructor() {}

public static initialize(): void {
if (!Telemetry.instance) {
Telemetry.instance = new TelemetryReporter(this.TELEMETRY_KEY);
}
}

public static getInstance(): TelemetryReporter {
if (!Telemetry.instance) {
throw new Error(
"TelemetryReporter is not initialized. Call initialize() first."
);
}
return Telemetry.instance;
}

public static addTreeSitterErrors(errorCount: number): void {
this.treeSitterErrors += errorCount;
}

public static addLinesOfCodeFormatted(lines: number): void {
this.linesOfCodeFormatted += lines;
}

public static increaseFormattingActions(type: string): void {
switch (type) {
case "Document":
this.fullFormattingActions++;
break;
case "Selection":
this.selectionFormattingActions++;
break;
}

this.sendAllTelemetry();
}

public static sendTreeSitterErrors(): void {
let errorsPerLocf = 0;
if (this.treeSitterErrors !== 0)
errorsPerLocf =
(this.treeSitterErrors * 1.0) / this.linesOfCodeFormatted;

Telemetry.instance.sendTelemetryEvent(
"TreeSitterErrors",
{},
{
errorsPerLocf,
linesOfCodeFormatted: this.linesOfCodeFormatted,
treeSitterErrors: this.treeSitterErrors,
}
);
}

public static sendFormattingActions(): void {
if (!this.fullFormattingActions && !this.selectionFormattingActions) {
return;
}

Telemetry.instance.sendTelemetryEvent(
"FormattingActions",
{},
{
fullFormat: this.fullFormattingActions,
selectionFormat: this.selectionFormattingActions,
}
);
}

public static sendExtensionSettings(): void {
const configuration = vscode.workspace.getConfiguration("AblFormatter");
const settings = configuration.inspect("");
console.log("Sending Extension Settings", configuration);
if (settings) {
Telemetry.instance.sendTelemetryEvent(
"ExtensionSettings",
{ settings: configuration } as { [key: string]: any },
{}
);
}
}

public static sendAllTelemetry(): void {
if (
this.fullFormattingActions + this.selectionFormattingActions <
this.sendThreshold
)
return;

this.sendTreeSitterErrors();
this.sendFormattingActions();
this.resetVariables();
}

private static resetVariables(): void {
this.treeSitterErrors = 0;
this.linesOfCodeFormatted = 0;
this.fullFormattingActions = 0;
this.selectionFormattingActions = 0;
}
}

0 comments on commit bf95077

Please sign in to comment.