Skip to content

Commit ba79a51

Browse files
dcbartlettellipsis-dev[bot]saoudrizwan
authored
Error Service Respects Telemetry (RooCodeInc#2780)
* Refactor Service to be able to be disabled based on telemetry settings * Add telemetryService enabled check * Create wet-avocados-kiss.md * Update src/services/error/ErrorService.ts Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update src/services/error/ErrorService.ts * Update src/services/error/ErrorService.ts * Update src/services/error/ErrorService.ts * Update src/services/error/ErrorService.ts * Update src/services/error/ErrorService.ts * Apply suggestions from code review * Add comment about opt in * Fixes --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Saoud Rizwan <[email protected]>
1 parent 4e5cc92 commit ba79a51

File tree

3 files changed

+88
-7
lines changed

3 files changed

+88
-7
lines changed

.changeset/wet-avocados-kiss.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"claude-dev": patch
3+
---
4+
5+
Error Service Respects Telemetry

src/extension.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import assert from "node:assert"
1010
import { telemetryService } from "./services/telemetry/TelemetryService"
1111
import { WebviewProvider } from "./core/webview"
1212
import { createTestServer, shutdownTestServer } from "./services/test/TestServer"
13+
import { ErrorService } from "./services/error/ErrorService"
1314

1415
/*
1516
Built using https://github.com/microsoft/vscode-webview-ui-toolkit
@@ -28,6 +29,7 @@ export function activate(context: vscode.ExtensionContext) {
2829
outputChannel = vscode.window.createOutputChannel("Cline")
2930
context.subscriptions.push(outputChannel)
3031

32+
ErrorService.initialize()
3133
Logger.initialize(outputChannel)
3234
Logger.log("Cline extension activated")
3335

src/services/error/ErrorService.ts

Lines changed: 81 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,96 @@
11
import * as Sentry from "@sentry/browser"
2+
import * as vscode from "vscode"
3+
import { telemetryService } from "../telemetry/TelemetryService"
24
import * as pkg from "../../../package.json"
35

4-
// Initialize sentry
5-
Sentry.init({
6-
dsn: "https://7936780e3f0f0290fcf8d4a395c249b7@o4509028819664896.ingest.us.sentry.io/4509052955983872",
7-
environment: process.env.NODE_ENV,
8-
release: `cline@${pkg.version}`,
9-
integrations: [Sentry.browserTracingIntegration(), Sentry.replayIntegration()],
6+
let telemetryLevel = vscode.workspace.getConfiguration("telemetry").get<string>("telemetryLevel", "all")
7+
let isTelemetryEnabled = ["all", "error"].includes(telemetryLevel)
8+
9+
vscode.workspace.onDidChangeConfiguration(() => {
10+
telemetryLevel = vscode.workspace.getConfiguration("telemetry").get<string>("telemetryLevel", "all")
11+
isTelemetryEnabled = ["all", "error"].includes(telemetryLevel)
12+
ErrorService.toggleEnabled(isTelemetryEnabled)
13+
if (isTelemetryEnabled) {
14+
ErrorService.setLevel(telemetryLevel as "error" | "all")
15+
}
1016
})
1117

1218
export class ErrorService {
19+
private static serviceEnabled: boolean
20+
private static serviceLevel: string
21+
22+
static initialize() {
23+
// Initialize sentry
24+
Sentry.init({
25+
dsn: "https://7936780e3f0f0290fcf8d4a395c249b7@o4509028819664896.ingest.us.sentry.io/4509052955983872",
26+
environment: process.env.NODE_ENV,
27+
release: `cline@${pkg.version}`,
28+
integrations: [Sentry.browserTracingIntegration(), Sentry.replayIntegration()],
29+
beforeSend(event) {
30+
// TelemetryService keeps track of whether the user has opted in to telemetry/error reporting
31+
const isUserManuallyOptedIn = telemetryService.isTelemetryEnabled()
32+
if (isUserManuallyOptedIn && ErrorService.isEnabled()) {
33+
return event
34+
}
35+
return null
36+
},
37+
})
38+
39+
ErrorService.toggleEnabled(true)
40+
ErrorService.setLevel("error")
41+
}
42+
43+
static toggleEnabled(state: boolean) {
44+
if (state === false) {
45+
ErrorService.serviceEnabled = false
46+
return
47+
}
48+
// If we are trying to enable the service, check that we are allowed to.
49+
if (isTelemetryEnabled) {
50+
ErrorService.serviceEnabled = true
51+
}
52+
}
53+
54+
static setLevel(level: "error" | "all") {
55+
switch (telemetryLevel) {
56+
case "error": {
57+
if (level === "error") {
58+
ErrorService.serviceLevel = level
59+
}
60+
break
61+
}
62+
default: {
63+
ErrorService.serviceLevel = level
64+
}
65+
}
66+
}
67+
1368
static logException(error: Error): void {
69+
// Don't log if telemetry is off
70+
const isUserManuallyOptedIn = telemetryService.isTelemetryEnabled()
71+
if (!isUserManuallyOptedIn || !ErrorService.isEnabled()) {
72+
return
73+
}
1474
// Log the error to Sentry
1575
Sentry.captureException(error)
1676
}
1777

1878
static logMessage(message: string, level: "error" | "warning" | "log" | "debug" | "info" = "log"): void {
19-
// Log a message to Sentry
79+
// Don't log if telemetry is off
80+
const isUserManuallyOptedIn = telemetryService.isTelemetryEnabled()
81+
if (!isUserManuallyOptedIn || !ErrorService.serviceEnabled) {
82+
return
83+
}
84+
if (ErrorService.serviceLevel === "error" && level === "error") {
85+
// Log the message if allowed
86+
Sentry.captureMessage(message, { level })
87+
return
88+
}
89+
// Log the message if allowed
2090
Sentry.captureMessage(message, { level })
2191
}
92+
93+
static isEnabled(): boolean {
94+
return ErrorService.serviceEnabled
95+
}
2296
}

0 commit comments

Comments
 (0)