Skip to content
This repository has been archived by the owner on Oct 5, 2021. It is now read-only.

Commit

Permalink
Merge pull request #361 from IMS94/usage_stats_telemetry
Browse files Browse the repository at this point in the history
Add usage statistics collection support for LS features
  • Loading branch information
prabushi authored Apr 19, 2021
2 parents 7514769 + 16e2d4e commit 63f68a5
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 20 deletions.
62 changes: 42 additions & 20 deletions src/telemetry/activator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,41 +19,63 @@

import { BallerinaExtension, ExtendedLangClient } from "src/core";
import { window } from "vscode";
import { getTelemetryProperties, TM_ERROR_LANG_SERVER, TM_EVENT_LANG_SERVER } from ".";
import { getTelemetryProperties, TM_ERROR_LANG_SERVER, TM_FEATURE_USAGE_LANG_SERVER } from ".";

// Language server telemetry event types
const TM_EVENT_TYPE_ERROR = "ErrorTelemetryEvent";
const TM_EVENT_TYPE_FEATURE_USAGE= "FeatureUsageTelemetryEvent";

export function activate(ballerinaExtInstance: BallerinaExtension) {
const reporter = ballerinaExtInstance.telemetryReporter;
const langClient = <ExtendedLangClient>ballerinaExtInstance.langClient;

// Start listening telemtry events from language server
ballerinaExtInstance.onReady().then(() => {
langClient.onNotification('telemetry/event', (event: LSErrorTelemetryEvent | LSTelemetryEvent) => {
if ('errorMessage' in event) {
const errorEvent: LSErrorTelemetryEvent = event;
const props: { [key: string]: string; } = getTelemetryProperties(ballerinaExtInstance, event.component, event.message)
props["ballerina.langserver.error.stacktrace"] = errorEvent.errorStackTrace;
props["ballerina.langserver.error.message"] = errorEvent.errorMessage;
reporter.sendTelemetryEvent(TM_ERROR_LANG_SERVER, props);
} else {
reporter.sendTelemetryEvent(TM_EVENT_LANG_SERVER, getTelemetryProperties(ballerinaExtInstance, event.component, event.message));
}
});
})
ballerinaExtInstance.onReady()
.then(() => {
langClient.onNotification('telemetry/event', (event: LSTelemetryEvent) => {
let props: { [key: string]: string; };
switch (event.type) {
case TM_EVENT_TYPE_ERROR:
const errorEvent: LSErrorTelemetryEvent = <LSErrorTelemetryEvent>event;
props = getTelemetryProperties(ballerinaExtInstance, event.component, TM_EVENT_TYPE_ERROR);
props["ballerina.langserver.error.description"] = errorEvent.message;
props["ballerina.langserver.error.stacktrace"] = errorEvent.errorStackTrace;
props["ballerina.langserver.error.message"] = errorEvent.errorMessage;
reporter.sendTelemetryEvent(TM_ERROR_LANG_SERVER, props);
break;
case TM_EVENT_TYPE_FEATURE_USAGE:
const usageEvent: LSFeatureUsageTelemetryEvent = <LSFeatureUsageTelemetryEvent>event;
props = getTelemetryProperties(ballerinaExtInstance, event.component, TM_EVENT_TYPE_FEATURE_USAGE);
props["ballerina.langserver.feature.name"] = usageEvent.featureName;
props["ballerina.langserver.feature.class"] = usageEvent.featureClass;
props["ballerina.langserver.feature.message"] = usageEvent.featureMessage;
reporter.sendTelemetryEvent(TM_FEATURE_USAGE_LANG_SERVER, props);
break;
default:
// Do nothing
break;
}
});
})
.catch((e) => {
window.showErrorMessage('Could not start telemetry listener feature', e.message);
});
}

interface LSErrorTelemetryEvent {
interface LSTelemetryEvent {
type: string;
component: string;
version: string;
}

interface LSErrorTelemetryEvent extends LSTelemetryEvent {
message: string;
errorMessage: string;
errorStackTrace: string;
}

interface LSTelemetryEvent {
component: string;
version: string;
message: string;
}
interface LSFeatureUsageTelemetryEvent extends LSTelemetryEvent {
featureName: string;
featureClass: string;
featureMessage: string;
}
1 change: 1 addition & 0 deletions src/telemetry/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,4 @@ export const TM_EVENT_PROJECT_CLOUD = "execute.project.cloud";
// events for language server
export const TM_EVENT_LANG_SERVER = "ballerina.langserver.event";
export const TM_ERROR_LANG_SERVER = "ballerina.langserver.error";
export const TM_FEATURE_USAGE_LANG_SERVER = "ballerina.langserver.feature.usage";

0 comments on commit 63f68a5

Please sign in to comment.