Skip to content

Commit

Permalink
Merge pull request #265 from ryanluker/ryanluker/issue264
Browse files Browse the repository at this point in the history
Remove GA reporting and add sentry crash reporting
  • Loading branch information
ryanluker authored Jun 27, 2020
2 parents a9eee76 + 5c4fa93 commit a667181
Show file tree
Hide file tree
Showing 13 changed files with 366 additions and 313 deletions.
378 changes: 308 additions & 70 deletions package-lock.json

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "vscode-coverage-gutters",
"displayName": "Coverage Gutters",
"description": "Display test coverage generated by lcov or xml - works with many languages",
"version": "2.4.4",
"version": "2.5.0",
"license": "MIT",
"repository": {
"type": "git",
Expand Down Expand Up @@ -262,6 +262,7 @@
"@types/mocha": "5.2.6",
"@types/node": "10.14.6",
"@types/request": "2.48.1",
"@types/uuid": "8.0.0",
"chai": "4.2.0",
"cross-env": "5.2.0",
"mocha": "6.1.4",
Expand All @@ -271,11 +272,11 @@
},
"dependencies": {
"@cvrg-report/clover-json": "0.3.2",
"@sentry/node": "5.18.1",
"cobertura-parse": "github:vokal/cobertura-parse#53109a6",
"glob": "7.1.4",
"jacoco-parse": "2.0.1",
"lcov-parse": "1.0.0",
"lodash": "4.17.13",
"request": "2.88.0"
"uuid": "8.2.0"
}
}
19 changes: 3 additions & 16 deletions src/coverage-system/coverageservice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import {
} from "vscode";

import {Config} from "../extension/config";
import {Reporter} from "../extension/reporter";
import {CoverageParser} from "../files/coverageparser";
import {FilesLoader} from "../files/filesloader";
import {Renderer} from "./renderer";
Expand All @@ -26,7 +25,6 @@ enum Status {
export class CoverageService {
private configStore: Config;
private outputChannel: OutputChannel;
private eventReporter: Reporter;
private filesLoader: FilesLoader;
private renderer: Renderer;
private coverageParser: CoverageParser;
Expand All @@ -39,32 +37,26 @@ export class CoverageService {
constructor(
configStore: Config,
outputChannel: OutputChannel,
eventReporter: Reporter,
) {
this.configStore = configStore;
this.outputChannel = outputChannel;
this.eventReporter = eventReporter;
this.updateServiceState(Status.initializing);
this.cache = new Map();
this.filesLoader = new FilesLoader(configStore);
this.sectionFinder = new SectionFinder(
configStore,
this.outputChannel,
this.eventReporter,
);
this.renderer = new Renderer(
configStore,
this.sectionFinder,
);
this.coverageParser = new CoverageParser(
this.outputChannel,
this.eventReporter,
);
this.coverageParser = new CoverageParser(this.outputChannel);
}

public dispose() {
this.coverageWatcher.dispose();
this.editorWatcher.dispose();
if (this.coverageWatcher) { this.coverageWatcher.dispose(); }
if (this.editorWatcher) { this.editorWatcher.dispose(); }
this.cache = new Map(); // reset cache to empty
const visibleEditors = window.visibleTextEditors;
this.renderer.renderCoverage(this.cache, visibleEditors);
Expand Down Expand Up @@ -171,10 +163,5 @@ export class CoverageService {
window.showWarningMessage(message.toString());
this.outputChannel.appendLine(`[${Date.now()}][gutters]: Error ${message}`);
this.outputChannel.appendLine(`[${Date.now()}][gutters]: Stacktrace ${stackTrace}`);
this.eventReporter.sendEvent(
"error",
message.toString(),
stackTrace ? stackTrace.toString() : undefined,
);
}
}
6 changes: 0 additions & 6 deletions src/coverage-system/sectionfinder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,18 @@ import {extname} from "path";
import {TextEditor, Uri, workspace} from "vscode";
import {OutputChannel} from "vscode";
import {Config} from "../extension/config";
import {Reporter} from "../extension/reporter";
import {isPathAbsolute, makePathSearchable, normalizeFileName} from "../helpers";

export class SectionFinder {
private configStore: Config;
private outputChannel: OutputChannel;
private eventReporter: Reporter;

constructor(
configStore: Config,
outputChannel: OutputChannel,
eventReporter: Reporter,
) {
this.configStore = configStore;
this.outputChannel = outputChannel;
this.eventReporter = eventReporter;
}

/**
Expand Down Expand Up @@ -57,8 +53,6 @@ export class SectionFinder {
const filePath = section.file;
const filePathMessage = `[${Date.now()}][renderer][section file path]: ${filePath}`;
this.outputChannel.appendLine(filePathMessage);
// log file type
this.eventReporter.sendEvent("system", "renderer-fileType", extname(filePath));
}

/**
Expand Down
23 changes: 18 additions & 5 deletions src/extension.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,36 @@
import * as Sentry from "@sentry/node";
import { v4 as uuidv4 } from "uuid";
import * as vscode from "vscode";
import { Coverage } from "./coverage-system/coverage";
import { Config } from "./extension/config";
import { emptyLastCoverage, getLastCoverageLines } from "./extension/exportsapi";
import { Gutters } from "./extension/gutters";
import { Reporter } from "./extension/reporter";
import { StatusBarToggler } from "./extension/statusbartoggler";

export function activate(context: vscode.ExtensionContext) {
const enableMetrics = vscode.workspace.getConfiguration("telemetry").get("enableTelemetry") as boolean;
const reporter = new Reporter(vscode.env.machineId, enableMetrics);
const configStore = new Config(context, reporter);
const telemetry = vscode.workspace.getConfiguration("telemetry");
const enableCrashReporting = telemetry.get("enableCrashReporter");
if (enableCrashReporting) {
const options = {
dsn: "https://[email protected]/5288283",
release: "[email protected]",
};
Sentry.init(options);
Sentry.configureScope(function(scope) {
// Generate a random string for this session
// Note: for privacy reason, we cannot fingerprint across sessions
scope.setUser({id: uuidv4()});
});
}

const configStore = new Config(context);
const statusBarToggler = new StatusBarToggler(configStore);
const coverage = new Coverage(configStore);
const outputChannel = vscode.window.createOutputChannel("coverage-gutters");
const gutters = new Gutters(
configStore,
coverage,
outputChannel,
reporter,
statusBarToggler,
);

Expand Down
14 changes: 1 addition & 13 deletions src/extension/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import {
window,
workspace,
} from "vscode";
import {Reporter} from "./reporter";

export class Config {
public coverageFileNames: string[];
Expand All @@ -21,11 +20,9 @@ export class Config {
public manualCoverageFilePaths: string[];

private context: ExtensionContext;
private reporter: Reporter;

constructor(context: ExtensionContext, reporter: Reporter) {
constructor(context: ExtensionContext) {
this.context = context;
this.reporter = reporter;
this.setup();

// Reload the cached values if the configuration changes
Expand Down Expand Up @@ -80,9 +77,6 @@ export class Config {
const showGutterCoverage = rootConfig.get("showGutterCoverage") as string;
const showLineCoverage = rootConfig.get("showLineCoverage") as string;
const showRulerCoverage = rootConfig.get("showRulerCoverage") as string;
this.reporter.sendEvent("config", "showGutterCoverage", showGutterCoverage);
this.reporter.sendEvent("config", "showLineCoverage", showLineCoverage);
this.reporter.sendEvent("config", "showRulerCoverage", showRulerCoverage);

// Setup info for decorations
const fullDecoration: DecorationRenderOptions = {
Expand Down Expand Up @@ -140,16 +134,10 @@ export class Config {
// Assign the key and resolved fragment
this.remotePathResolve = rootConfig.get("remotePathResolve") as string[];
const hasRemotePathResolve = !!this.remotePathResolve.length;
this.reporter.sendEvent("config", "remotePathResolve", hasRemotePathResolve.toString());

// Add the manual coverage file path(s) if present
this.manualCoverageFilePaths = rootConfig.get("manualCoverageFilePaths") as string[];
const hasManualCoverageFilePaths = !!this.manualCoverageFilePaths.length;
this.reporter.sendEvent(
"config",
"hasManualCoverageFilePaths",
hasManualCoverageFilePaths.toString(),
);
}

/**
Expand Down
51 changes: 21 additions & 30 deletions src/extension/gutters.ts
Original file line number Diff line number Diff line change
@@ -1,54 +1,41 @@
import * as Sentry from "@sentry/node";
import {
OutputChannel,
Uri,
version,
ViewColumn,
window,
workspace,
} from "vscode";

import { Coverage } from "../coverage-system/coverage";
import { CoverageService } from "../coverage-system/coverageservice";
import { Config } from "./config";
import { Reporter } from "./reporter";
import { StatusBarToggler } from "./statusbartoggler";

export class Gutters {
private coverage: Coverage;
private outputChannel: OutputChannel;
private reporter: Reporter;
private statusBar: StatusBarToggler;
private coverageService: CoverageService;

constructor(
configStore: Config,
coverage: Coverage,
outputChannel: OutputChannel,
reporter: Reporter,
statusBar: StatusBarToggler,
) {
this.coverage = coverage;
this.outputChannel = outputChannel;
this.statusBar = statusBar;
this.reporter = reporter;

this.coverageService = new CoverageService(
configStore,
this.outputChannel,
this.reporter,
);

this.reporter.sendEvent("user", "start", version, 1);
}

public async previewCoverageReport() {
try {
const coverageReports = await this.coverage.findReports();
this.reporter.sendEvent(
"user",
"preview-coverage-report-findCoverageFiles",
`${coverageReports.length}`,
);
const pickedReport = await this.coverage.pickFile(
coverageReports,
"Choose a Coverage Report to preview.",
Expand All @@ -66,8 +53,6 @@ export class Gutters {
const reportUri = Uri.file(pickedReport);
const reportHtml = await workspace.openTextDocument(reportUri);
previewPanel.webview.html = reportHtml.getText();

this.reporter.sendEvent("user", "preview-coverage-report", undefined, 25);
} catch (error) {
this.handleError("previewCoverageReport", error);
}
Expand All @@ -76,7 +61,6 @@ export class Gutters {
public async displayCoverageForActiveFile() {
try {
await this.coverageService.displayForFile();
this.reporter.sendEvent("user", "display-coverage", undefined, 50);
} catch (error) {
this.handleError("displayCoverageForActiveFile", error);
}
Expand All @@ -86,7 +70,6 @@ export class Gutters {
try {
this.statusBar.toggle(true);
await this.coverageService.watchWorkspace();
this.reporter.sendEvent("user", "watch-coverage-editors", undefined, 75);
} catch (error) {
this.handleError("watchCoverageAndVisibleEditors", error);
}
Expand All @@ -97,22 +80,26 @@ export class Gutters {
this.coverageService.removeCoverageForCurrentEditor();
this.statusBar.toggle(false);
this.coverageService.dispose();

this.reporter.sendEvent("user", "remove-watch", undefined, 25);
} catch (error) {
this.handleError("removeWatch", error, false);
}
}

public removeCoverageForActiveFile() {
this.coverageService.removeCoverageForCurrentEditor();
this.reporter.sendEvent("user", "remove-coverage", undefined, 25);
try {
this.coverageService.removeCoverageForCurrentEditor();
} catch (error) {
this.handleError("removeCoverageForActiveFile", error, false);
}
}

public dispose() {
this.coverageService.dispose();
this.statusBar.dispose();
this.reporter.sendEvent("cleanup", "dispose");
try {
this.coverageService.dispose();
this.statusBar.dispose();
} catch (error) {
this.handleError("dispose", error, false);
}
}

private handleError(area: string, error: Error, showMessage: boolean = true) {
Expand All @@ -123,10 +110,14 @@ export class Gutters {
}
this.outputChannel.appendLine(`[${Date.now()}][${area}]: ${message}`);
this.outputChannel.appendLine(`[${Date.now()}][${area}]: ${stackTrace}`);
this.reporter.sendEvent(
"error",
message.toString(),
stackTrace ? stackTrace.toString() : undefined,
);

// Only send crash reports if the user allows this from their global settings.
const telemetry = workspace.getConfiguration("telemetry");
const enableCrashReporting = telemetry.get("enableCrashReporter");
if (enableCrashReporting) {
const sentryId = Sentry.captureException(error);
const sentryPrompt = "Please post this in the github issue if you submit one. Sentry Event ID:";
this.outputChannel.appendLine(`[${Date.now()}][${area}]: ${sentryPrompt} ${sentryId}`);
}
}
}
43 changes: 0 additions & 43 deletions src/extension/reporter.ts

This file was deleted.

Loading

0 comments on commit a667181

Please sign in to comment.