From 0a5e7a048d1e5e031768f65585fb63d574000e2f Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Mon, 23 Nov 2020 13:47:14 +0200 Subject: [PATCH] Report enabled extensions (#1451) * Report enabled extensions Signed-off-by: Lauri Nevala * Add missing semicolons Signed-off-by: Lauri Nevala * Refactoring Signed-off-by: Lauri Nevala * Add missing semicolon Signed-off-by: Lauri Nevala --- extensions/telemetry/main.ts | 1 + extensions/telemetry/src/tracker.ts | 25 ++++++++++++++++++++++++- src/extensions/core-api/app.ts | 6 +++++- src/extensions/extensions-store.ts | 15 ++++++++++++++- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/extensions/telemetry/main.ts b/extensions/telemetry/main.ts index 0b6b13f568..15a5d68f9b 100644 --- a/extensions/telemetry/main.ts +++ b/extensions/telemetry/main.ts @@ -8,6 +8,7 @@ export default class TelemetryMainExtension extends LensMainExtension { console.log("telemetry main extension activated"); tracker.start(); tracker.reportPeriodically(); + tracker.watchExtensions(); await telemetryPreferencesStore.loadExtension(this); } diff --git a/extensions/telemetry/src/tracker.ts b/extensions/telemetry/src/tracker.ts index 9837f4a98b..d6fadf4ee4 100644 --- a/extensions/telemetry/src/tracker.ts +++ b/extensions/telemetry/src/tracker.ts @@ -3,6 +3,8 @@ import ua from "universal-analytics"; import Analytics from "analytics-node"; import { machineIdSync } from "node-machine-id"; import { telemetryPreferencesStore } from "./telemetry-preferences-store"; +import { reaction, IReactionDisposer } from "mobx"; +import { comparer } from "mobx"; export class Tracker extends Util.Singleton { static readonly GA_ID = "UA-159377374-1" @@ -18,6 +20,7 @@ export class Tracker extends Util.Singleton { protected userAgent: string; protected anonymousId: string; protected os: string + protected disposers: IReactionDisposer[] protected reportInterval: NodeJS.Timeout @@ -35,6 +38,7 @@ export class Tracker extends Util.Singleton { this.analytics = new Analytics(Tracker.SEGMENT_KEY, { flushAt: 1 }); this.visitor.set("dl", "https://telemetry.k8slens.dev"); this.visitor.set("ua", this.userAgent); + this.disposers = []; } start() { @@ -49,6 +53,21 @@ export class Tracker extends Util.Singleton { EventBus.appEventBus.addListener(handler); } + watchExtensions() { + let previousExtensions = App.getEnabledExtensions(); + this.disposers.push(reaction(() => App.getEnabledExtensions(), (currentExtensions) => { + const removedExtensions = previousExtensions.filter(x => !currentExtensions.includes(x)); + removedExtensions.forEach(ext => { + this.event("extension", "disable", { extension: ext }); + }); + const newExtensions = currentExtensions.filter(x => !previousExtensions.includes(x)); + newExtensions.forEach(ext => { + this.event("extension", "enable", { extension: ext }); + }) + previousExtensions = currentExtensions; + }, { equals: comparer.structural })); + } + reportPeriodically() { this.reportInterval = setInterval(() => { this.reportData(); @@ -66,6 +85,9 @@ export class Tracker extends Util.Singleton { if (this.reportInterval) { clearInterval(this.reportInterval); } + this.disposers.forEach(disposer => { + disposer(); + }); } protected async isTelemetryAllowed(): Promise { @@ -79,7 +101,8 @@ export class Tracker extends Util.Singleton { appVersion: App.version, os: this.os, clustersCount: clustersList.length, - workspacesCount: Store.workspaceStore.enabledWorkspacesList.length + workspacesCount: Store.workspaceStore.enabledWorkspacesList.length, + extensions: App.getEnabledExtensions() }); clustersList.forEach((cluster) => { diff --git a/src/extensions/core-api/app.ts b/src/extensions/core-api/app.ts index fdd9425b47..2664711db4 100644 --- a/src/extensions/core-api/app.ts +++ b/src/extensions/core-api/app.ts @@ -1,4 +1,8 @@ import { getAppVersion } from "../../common/utils"; +import { extensionsStore } from "../extensions-store"; export const version = getAppVersion(); -export { isSnap, isWindows, isMac, isLinux, appName, slackUrl, issuesTrackerUrl } from "../../common/vars"; \ No newline at end of file +export { isSnap, isWindows, isMac, isLinux, appName, slackUrl, issuesTrackerUrl } from "../../common/vars"; +export function getEnabledExtensions(): string[] { + return extensionsStore.enabledExtensions; +} diff --git a/src/extensions/extensions-store.ts b/src/extensions/extensions-store.ts index 1669dd4bcc..731a599eef 100644 --- a/src/extensions/extensions-store.ts +++ b/src/extensions/extensions-store.ts @@ -1,7 +1,7 @@ import type { LensExtensionId } from "./lens-extension"; import type { ExtensionLoader } from "./extension-loader"; import { BaseStore } from "../common/base-store"; -import { action, observable, reaction, toJS } from "mobx"; +import { action, computed, observable, reaction, toJS } from "mobx"; export interface LensExtensionsStoreModel { extensions: Record; @@ -9,6 +9,7 @@ export interface LensExtensionsStoreModel { export interface LensExtensionState { enabled?: boolean; + name: string; } export class ExtensionsStore extends BaseStore { @@ -18,6 +19,17 @@ export class ExtensionsStore extends BaseStore { }); } + @computed + get enabledExtensions() { + const extensions: string[] = []; + this.state.forEach((state, id) => { + if (state.enabled) { + extensions.push(state.name); + } + }); + return extensions; + } + protected state = observable.map(); protected getState(extensionLoader: ExtensionLoader) { @@ -25,6 +37,7 @@ export class ExtensionsStore extends BaseStore { return Array.from(extensionLoader.userExtensions).reduce((state, [extId, ext]) => { state[extId] = { enabled: ext.isEnabled, + name: ext.manifest.name, }; return state; }, state);