From 66a03ede221017fdb71792de6b2d5270e11f5f5c Mon Sep 17 00:00:00 2001 From: Pavel Grivachev Date: Thu, 28 Oct 2021 23:37:03 +0300 Subject: [PATCH] add telemetry --- client/package-lock.json | 14 ++++++++++++++ client/package.json | 5 +++-- client/src/TelemetryClient.ts | 33 +++++++++++++++++++++++++++++++++ client/src/extension.ts | 16 +++++++++++++++- package.json | 1 + server/src/LspServer.ts | 6 ++++++ 6 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 client/src/TelemetryClient.ts diff --git a/client/package-lock.json b/client/package-lock.json index 3f9f9fc4..9ef89b75 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,6 +8,7 @@ "name": "dbt-language-server", "version": "0.0.1", "dependencies": { + "vscode-extension-telemetry": "^0.4.2", "vscode-languageclient": "^7.0.0" }, "devDependencies": { @@ -998,6 +999,14 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/vscode-extension-telemetry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.2.tgz", + "integrity": "sha512-y0f51mVoFxHIzULQNCC26TBFIKdEC7uckS3tFoK++OOOl8mU2LlOxgmbd52T/SXoXNg5aI7xqs+4V2ug5ITvKw==", + "engines": { + "vscode": "^1.60.0" + } + }, "node_modules/vscode-jsonrpc": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", @@ -1847,6 +1856,11 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, + "vscode-extension-telemetry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.2.tgz", + "integrity": "sha512-y0f51mVoFxHIzULQNCC26TBFIKdEC7uckS3tFoK++OOOl8mU2LlOxgmbd52T/SXoXNg5aI7xqs+4V2ug5ITvKw==" + }, "vscode-jsonrpc": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", diff --git a/client/package.json b/client/package.json index 2631f2c1..b1244655 100644 --- a/client/package.json +++ b/client/package.json @@ -5,11 +5,12 @@ "vscode": "^1.52.0" }, "dependencies": { + "vscode-extension-telemetry": "^0.4.2", "vscode-languageclient": "^7.0.0" }, "devDependencies": { + "@google-cloud/bigquery": "^5.9.1", "@types/vscode": "^1.61.0", - "@vscode/test-electron": "^1.6.2", - "@google-cloud/bigquery": "^5.9.1" + "@vscode/test-electron": "^1.6.2" } } diff --git a/client/src/TelemetryClient.ts b/client/src/TelemetryClient.ts new file mode 100644 index 00000000..c52457c8 --- /dev/null +++ b/client/src/TelemetryClient.ts @@ -0,0 +1,33 @@ +import path = require('path'); +import * as fs from 'fs'; +import { ExtensionContext } from 'vscode'; +import TelemetryReporter from 'vscode-extension-telemetry'; + +export class TelemetryClient { + private static client: TelemetryReporter; + + static sendEvent(eventName: string, properties?: { [key: string]: string }): void { + if (TelemetryClient.client) { + TelemetryClient.client.sendTelemetryEvent(eventName, properties); + } + } + + static sendException(error: Error, properties?: { [key: string]: string }) { + if (TelemetryClient.client) { + TelemetryClient.client.sendTelemetryException(error, properties); + } + } + + static activate(context: ExtensionContext): TelemetryReporter { + var extensionPath = path.join(context.extensionPath, 'package.json'); + var packageJson = JSON.parse(fs.readFileSync(extensionPath, 'utf8')); + + // const packageJson = extensions.getExtension('dbt-language-server').packageJSON; + if (packageJson.name && packageJson.version && packageJson.aiKey) { + TelemetryClient.client = new TelemetryReporter(packageJson.name, packageJson.version, packageJson.aiKey); + } else { + console.log('Telemetry was not activated'); + } + return TelemetryClient.client; + } +} diff --git a/client/src/extension.ts b/client/src/extension.ts index 926f06fa..20024cec 100644 --- a/client/src/extension.ts +++ b/client/src/extension.ts @@ -4,6 +4,7 @@ import { LanguageClient, LanguageClientOptions, ServerOptions, State, TransportK import { ProgressHandler } from './ProgressHandler'; import { PythonExtension } from './PythonExtension'; import SqlPreviewContentProvider from './SqlPreviewContentProvider'; +import { TelemetryClient } from './TelemetryClient'; let client: LanguageClient; @@ -27,7 +28,6 @@ export function activate(context: ExtensionContext): void { }; const clientOptions: LanguageClientOptions = { - // Register the server for sql documents documentSelector: [ { scheme: 'file', language: 'sql' }, { scheme: 'file', language: 'jinja-sql' }, @@ -44,8 +44,15 @@ export function activate(context: ExtensionContext): void { const progressHandler = new ProgressHandler(); progressHandler.begin(); + + client.onTelemetry(([name, properties]) => { + TelemetryClient.sendEvent(name, properties); + }); + client.onDidChangeState(e => { if (e.newState === State.Running) { + TelemetryClient.sendEvent('activate'); + client.onNotification('custom/updateQueryPreview', ([uri, text]) => { SqlPreviewContentProvider.update(uri, text); }); @@ -63,6 +70,12 @@ export function activate(context: ExtensionContext): void { } }); + client.onReady().catch(reason => { + if (reason && reason.name && reason.message) { + TelemetryClient.sendException(reason); + } + }); + window.onDidChangeActiveTextEditor(e => { if (!e || e.document.uri.toString() === SqlPreviewContentProvider.uri.toString()) { return; @@ -98,6 +111,7 @@ export function activate(context: ExtensionContext): void { }); commands.executeCommand('editor.action.triggerParameterHints'); }), + TelemetryClient.activate(context), ); // Start the client. This will also launch the server diff --git a/package.json b/package.json index cd504e9c..a544b6b2 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ ] } }, + "aiKey": "0a32611a-7944-4c4d-93c9-5c260a61395b", "scripts": { "vscode:prepublish": "npm run compile", "compile": "tsc -b", diff --git a/server/src/LspServer.ts b/server/src/LspServer.ts index 39bfc204..34bc9fd9 100644 --- a/server/src/LspServer.ts +++ b/server/src/LspServer.ts @@ -16,6 +16,7 @@ import { ResponseError, SignatureHelp, SignatureHelpParams, + TelemetryEventNotification, TextDocumentSyncKind, _Connection, } from 'vscode-languageserver'; @@ -93,9 +94,14 @@ export class LspServer { this.updateModels(); } + sendTelemetry(name: string, properties?: { [key: string]: string }): void { + this.connection.sendNotification(TelemetryEventNotification.type, [name, properties]); + } + async startDbtRpc(): Promise { try { await this.dbtServer.startDbtRpc(() => this.connection.sendRequest('custom/getPython')); + this.sendTelemetry('log', { dbt_version: this.dbtServer.dbtVersion ?? 'undefined', python: this.dbtServer.python ?? 'undefined' }); } catch (e) { console.log(e); this.connection.window.showErrorMessage(