Skip to content

Commit 26a6e14

Browse files
committed
Fire lsp_binary_resolved telemetry on server start
The `lsp_binary_resolved` event type was defined but never captured. This adds `reportBinaryResolved` to the `Telemetry` service and calls it from both `RuffLanguageServer` and `TyLanguageServer` after the server starts successfully. The event includes the server name, the `BinarySource._tag` discriminant, the companion extension `kind` when applicable, and the resolved server version — enough to see the distribution of resolution paths across users. ```ts telemetry.reportBinaryResolved("ruff", resolved, serverVersion) ```
1 parent 69187df commit 26a6e14

File tree

4 files changed

+36
-0
lines changed

4 files changed

+36
-0
lines changed

extension/src/__mocks__/TestTelemetry.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export const TestTelemetryLive = Layer.succeed(
99
Telemetry,
1010
Telemetry.make({
1111
capture: () => Effect.void,
12+
reportBinaryResolved: () => Effect.void,
1213
identify: () => Effect.void,
1314
}),
1415
);

extension/src/services/Telemetry.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Effect, Option, Ref, Schema, Stream } from "effect";
22
import { PostHog } from "posthog-node";
33

4+
import { type BinarySource } from "../utils/binaryResolution.ts";
45
import { getExtensionVersion } from "../utils/getExtensionVersion.ts";
56
import { createStorageKey, Storage } from "./Storage.ts";
67
import { VsCode } from "./VsCode.ts";
@@ -171,6 +172,22 @@ export class Telemetry extends Effect.Service<Telemetry>()("Telemetry", {
171172
});
172173
},
173174

175+
/**
176+
* Report which binary source was resolved for a language server.
177+
*/
178+
reportBinaryResolved(
179+
server: "ruff" | "ty",
180+
source: BinarySource,
181+
version: string,
182+
): Effect.Effect<void> {
183+
return this.capture("lsp_binary_resolved", {
184+
server,
185+
source: source._tag,
186+
...("kind" in source ? { kind: source.kind } : {}),
187+
version,
188+
});
189+
},
190+
174191
identify: (properties?: Record<string, unknown>): Effect.Effect<void> =>
175192
Effect.gen(function* () {
176193
const telemetryEnabled = yield* Ref.get(telemetryEnabledRef);

extension/src/services/completions/RuffLanguageServer.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { Config } from "../Config.ts";
2929
import { OutputChannel } from "../OutputChannel.ts";
3030
import { Sentry } from "../Sentry.ts";
3131
import { ExtensionContext } from "../Storage.ts";
32+
import { Telemetry } from "../Telemetry.ts";
3233
import { Uv } from "../Uv.ts";
3334
import { VariablesService } from "../variables/VariablesService.ts";
3435
import { VsCode } from "../VsCode.ts";
@@ -80,6 +81,7 @@ export class RuffLanguageServer extends Effect.Service<RuffLanguageServer>()(
8081
const code = yield* VsCode;
8182
const sync = yield* NotebookSyncService;
8283
const sentry = yield* Effect.serviceOption(Sentry);
84+
const telemetry = yield* Effect.serviceOption(Telemetry);
8385

8486
const statusRef = yield* Ref.make<RuffLanguageServerStatus>(
8587
RuffLanguageServerStatus.Starting(),
@@ -199,6 +201,13 @@ export class RuffLanguageServer extends Effect.Service<RuffLanguageServer>()(
199201
if (Option.isSome(sentry)) {
200202
yield* sentry.value.setTag("ruff.version", serverVersion);
201203
}
204+
if (Option.isSome(telemetry)) {
205+
yield* telemetry.value.reportBinaryResolved(
206+
"ruff",
207+
resolved,
208+
serverVersion,
209+
);
210+
}
202211

203212
yield* Ref.set(
204213
statusRef,

extension/src/services/completions/TyLanguageServer.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import { OutputChannel } from "../OutputChannel.ts";
3434
import { PythonExtension } from "../PythonExtension.ts";
3535
import { Sentry } from "../Sentry.ts";
3636
import { ExtensionContext } from "../Storage.ts";
37+
import { Telemetry } from "../Telemetry.ts";
3738
import { Uv } from "../Uv.ts";
3839
import { VariablesService } from "../variables/VariablesService.ts";
3940
import { VsCode } from "../VsCode.ts";
@@ -92,6 +93,7 @@ export class TyLanguageServer extends Effect.Service<TyLanguageServer>()(
9293
const pyExt = yield* PythonExtension;
9394
const sync = yield* NotebookSyncService;
9495
const sentry = yield* Effect.serviceOption(Sentry);
96+
const telemetry = yield* Effect.serviceOption(Telemetry);
9597

9698
const statusRef = yield* Ref.make<TyLanguageServerStatus>(
9799
TyLanguageServerStatus.Starting(),
@@ -198,6 +200,13 @@ export class TyLanguageServer extends Effect.Service<TyLanguageServer>()(
198200
if (Option.isSome(sentry)) {
199201
yield* sentry.value.setTag("ty.version", serverVersion);
200202
}
203+
if (Option.isSome(telemetry)) {
204+
yield* telemetry.value.reportBinaryResolved(
205+
"ty",
206+
resolved,
207+
serverVersion,
208+
);
209+
}
201210

202211
const updateRunningStatus = Effect.fn(function* () {
203212
const activePath = yield* pyExt.getActiveEnvironmentPath();

0 commit comments

Comments
 (0)