Skip to content

Commit

Permalink
Move kernel telemetry into kernel folder
Browse files Browse the repository at this point in the history
  • Loading branch information
rebornix committed Jun 13, 2022
1 parent dd47927 commit bcd44ef
Show file tree
Hide file tree
Showing 21 changed files with 340 additions and 9,814 deletions.
9,495 changes: 0 additions & 9,495 deletions TELEMETRY.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/interactive-window/interactiveWindow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ import {
} from '../kernels/types';
import { INotebookControllerManager } from '../notebooks/types';
import { generateMarkdownFromCodeLines, parseForComments } from '../webviews/webview-side/common';
import { initializeInteractiveOrNotebookTelemetryBasedOnUserAction } from '../telemetry/telemetry';
import { chainable } from '../platform/common/utils/decorators';
import { InteractiveCellResultError } from '../platform/errors/interactiveCellResultError';
import { DataScience } from '../platform/common/utils/localize';
Expand Down Expand Up @@ -74,6 +73,7 @@ import { IInteractiveWindowDebuggingManager } from '../kernels/debugger/types';
import { CellExecutionCreator } from '../kernels/execution/cellExecutionCreator';
import { updateNotebookMetadata } from '../kernels/execution/helpers';
import { chainWithPendingUpdates } from '../kernels/execution/notebookUpdater';
import { initializeInteractiveOrNotebookTelemetryBasedOnUserAction } from '../kernels/telemetry/helper';

export class InteractiveWindow implements IInteractiveWindowLoadable {
public get onDidChangeViewState(): Event<void> {
Expand Down
3 changes: 2 additions & 1 deletion src/kernels/execution/kernelExecution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import { traceInfo, traceInfoIfCI, traceWarning } from '../../platform/logging';
import { IDisposable, IExtensionContext } from '../../platform/common/types';
import { createDeferred, waitForPromise } from '../../platform/common/utils/async';
import { StopWatch } from '../../platform/common/utils/stopWatch';
import { trackKernelResourceInformation, sendKernelTelemetryEvent } from '../../telemetry/telemetry';
import { sendKernelTelemetryEvent } from '../telemetry/sendKernelTelemetryEvent';
import { trackKernelResourceInformation } from '../telemetry/helper';
import { captureTelemetry } from '../../telemetry';
import { Telemetry } from '../../webviews/webview-side/common/constants';
import { CellOutputDisplayIdTracker } from './cellDisplayIdTracker';
Expand Down
2 changes: 1 addition & 1 deletion src/kernels/helpers.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { traceError, traceVerbose } from '../platform/logging';
import { getDisplayPath } from '../platform/common/platform/fs-paths';
import { IPythonExecutionFactory } from '../platform/common/process/types.node';
import { Resource } from '../platform/common/types';
import { trackKernelResourceInformation } from '../telemetry/telemetry';
import { trackKernelResourceInformation } from './telemetry/helper';
import { areInterpreterPathsSame } from '../platform/pythonEnvironments/info/interpreter';
import { sendTelemetryEvent } from '../telemetry';
import { concatMultilineString } from '../webviews/webview-side/common';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import { createDeferred, sleep } from '../../../../platform/common/utils/async';
import { DataScience } from '../../../../platform/common/utils/localize';
import { StopWatch } from '../../../../platform/common/utils/stopWatch';
import { SessionDisposedError } from '../../../../platform/errors/sessionDisposedError';
import { sendKernelTelemetryEvent } from '../../../../telemetry/telemetry';
import { sendKernelTelemetryEvent } from '../../../telemetry/sendKernelTelemetryEvent';
import { Telemetry } from '../../../../webviews/webview-side/common/constants';
import {
KernelConnectionMetadata,
Expand Down
3 changes: 2 additions & 1 deletion src/kernels/jupyter/launcher/notebookProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import { inject, injectable, optional } from 'inversify';
import { IPythonExtensionChecker } from '../../../platform/api/types';
import { trackKernelResourceInformation, sendKernelTelemetryWhenDone } from '../../../telemetry/telemetry';
import { trackKernelResourceInformation } from '../../telemetry/helper';
import { Telemetry } from '../../../webviews/webview-side/common/constants';
import {
ConnectNotebookProviderOptions,
Expand All @@ -21,6 +21,7 @@ import { DisplayOptions } from '../../displayOptions';
import { IRawNotebookProvider } from '../../raw/types';
import { IJupyterNotebookProvider } from '../types';
import { ServerConnectionType } from './serverConnectionType';
import { sendKernelTelemetryWhenDone } from '../../telemetry/sendKernelTelemetryEvent';

@injectable()
export class NotebookProvider implements INotebookProvider {
Expand Down
4 changes: 2 additions & 2 deletions src/kernels/kernel.base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ import { DataScience } from '../platform/common/utils/localize';
import { noop } from '../platform/common/utils/misc';
import { StopWatch } from '../platform/common/utils/stopWatch';
import { JupyterConnectError } from '../platform/errors/jupyterConnectError';
import { sendKernelTelemetryEvent } from './telemetry/sendKernelTelemetryEvent';
import {
sendKernelTelemetryEvent,
initializeInteractiveOrNotebookTelemetryBasedOnUserAction,
trackKernelResourceInformation
} from '../telemetry/telemetry';
} from './telemetry/helper';
import { sendTelemetryEvent } from '../telemetry';
import { concatMultilineString } from '../webviews/webview-side/common';
import { Telemetry, Identifiers, CodeSnippets } from '../webviews/webview-side/common/constants';
Expand Down
2 changes: 1 addition & 1 deletion src/kernels/kernelCrashMonitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { Telemetry } from '../platform/common/constants';
import { IDisposableRegistry } from '../platform/common/types';
import { DataScience } from '../platform/common/utils/localize';
import { noop } from '../platform/common/utils/misc';
import { sendKernelTelemetryEvent } from '../telemetry/telemetry';
import { sendKernelTelemetryEvent } from './telemetry/sendKernelTelemetryEvent';
import { endCellAndDisplayErrorsInCell } from './execution/helpers';
import { getDisplayNameOrNameOfKernelConnection } from './helpers';
import { IKernel, IKernelProvider } from './types';
Expand Down
2 changes: 1 addition & 1 deletion src/kernels/raw/launcher/kernelLauncher.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import { JupyterPaths } from '../finder/jupyterPaths.node';
import { isTestExecution } from '../../../platform/common/constants';
import { getDisplayPathFromLocalFile } from '../../../platform/common/platform/fs-paths.node';
import { noop } from '../../../platform/common/utils/misc';
import { sendKernelTelemetryWhenDone } from '../../../telemetry/telemetry';
import { sendKernelTelemetryWhenDone } from '../../telemetry/sendKernelTelemetryEvent';

const PortFormatString = `kernelLauncherPortStart_{0}.tmp`;
// Launches and returns a kernel process given a resource or python interpreter.
Expand Down
2 changes: 1 addition & 1 deletion src/kernels/raw/session/hostRawNotebookProvider.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import {
} from '../../../platform/common/types';
import { createDeferred } from '../../../platform/common/utils/async';
import { DataScience } from '../../../platform/common/utils/localize';
import { trackKernelResourceInformation } from '../../../telemetry/telemetry';
import { trackKernelResourceInformation } from '../../telemetry/helper';
import { captureTelemetry, sendTelemetryEvent } from '../../../telemetry';
import { Telemetry } from '../../../webviews/webview-side/common/constants';
import { isPythonKernelConnection } from '../../helpers';
Expand Down
3 changes: 2 additions & 1 deletion src/kernels/raw/session/rawJupyterSession.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ import { IDisplayOptions, IDisposable, Resource } from '../../../platform/common
import { TimedOutError, createDeferred, sleep } from '../../../platform/common/utils/async';
import { DataScience } from '../../../platform/common/utils/localize';
import { StopWatch } from '../../../platform/common/utils/stopWatch';
import { trackKernelResourceInformation, sendKernelTelemetryEvent } from '../../../telemetry/telemetry';
import { sendKernelTelemetryEvent } from '../../telemetry/sendKernelTelemetryEvent';
import { trackKernelResourceInformation } from '../../telemetry/helper';
import { sendTelemetryEvent, captureTelemetry } from '../../../telemetry';
import { Telemetry } from '../../../webviews/webview-side/common/constants';
import { getDisplayNameOrNameOfKernelConnection } from '../../../kernels/helpers';
Expand Down
163 changes: 163 additions & 0 deletions src/kernels/telemetry/helper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
import { Resource } from '../../platform/common/types';
import { WorkspaceInterpreterTracker } from '../../telemetry/workspaceInterpreterTracker';
import { PYTHON_LANGUAGE } from '../../platform/common/constants';
import { InterpreterCountTracker } from '../../telemetry/interpreterCountTracker';
import { getTelemetrySafeHashedString, getTelemetrySafeLanguage } from '../../telemetry/helpers';
import { getNormalizedInterpreterPath } from '../../platform/pythonEnvironments/info/interpreter';
import { getResourceType } from '../../platform/common/utils';
import { getComparisonKey } from '../../platform/vscode-path/resources';
import { getFilePath } from '../../platform/common/platform/fs-paths';
import { trackedInfo, pythonEnvironmentsByHash, updatePythonPackages } from '../../telemetry/telemetry';
import { KernelConnectionMetadata } from '../types';
import { setSharedProperty } from '../../telemetry';

/**
* This information is sent with each telemetry event.
*/
export type ContextualTelemetryProps = {
/**
* Whether we're starting the preferred kernel or not.
* If false, then the user chose a different kernel when starting the notebook.
* Doesn't really apply to Interactive Window, as we always pick the current interpreter.
*/
isPreferredKernel?: boolean;
kernelConnection: KernelConnectionMetadata;
startFailed: boolean;
kernelDied: boolean;
interruptKernel: boolean;
restartKernel: boolean;
kernelSpecCount: number; // Total number of kernel specs in list of kernels.
kernelInterpreterCount: number; // Total number of interpreters in list of kernels
kernelLiveCount: number; // Total number of live kernels in list of kernels.
/**
* When we start local Python kernels, this property indicates whether the interpreter matches the kernel. If not this means we've started the wrong interpreter or the mapping is wrong.
*/
interpreterMatchesKernel: boolean;
};

export function trackKernelResourceInformation(resource: Resource, information: Partial<ContextualTelemetryProps>) {
if (!resource) {
return;
}
const key = getComparisonKey(resource);
const [currentData, context] = trackedInfo.get(key) || [
{
resourceType: getResourceType(resource),
resourceHash: resource ? getTelemetrySafeHashedString(resource.toString()) : undefined,
kernelSessionId: getTelemetrySafeHashedString(Date.now().toString())
},
{ previouslySelectedKernelConnectionId: '' }
];

if (information.restartKernel) {
currentData.kernelSessionId = getTelemetrySafeHashedString(Date.now().toString());
currentData.interruptCount = 0;
currentData.restartCount = (currentData.restartCount || 0) + 1;
}
if (information.interruptKernel) {
currentData.interruptCount = (currentData.interruptCount || 0) + 1;
}
if (information.startFailed) {
currentData.startFailureCount = (currentData.startFailureCount || 0) + 1;
}
currentData.kernelSpecCount = information.kernelSpecCount || currentData.kernelSpecCount || 0;
currentData.kernelLiveCount = information.kernelLiveCount || currentData.kernelLiveCount || 0;
currentData.kernelInterpreterCount = information.kernelInterpreterCount || currentData.kernelInterpreterCount || 0;
currentData.pythonEnvironmentCount = InterpreterCountTracker.totalNumberOfInterpreters;

const kernelConnection = information.kernelConnection;
if (kernelConnection) {
const newKernelConnectionId = kernelConnection.id;
// If we have selected a whole new kernel connection for this,
// Then reset some of the data
if (context.previouslySelectedKernelConnectionId !== newKernelConnectionId) {
clearInterruptCounter(resource);
clearRestartCounter(resource);
}
if (
context.previouslySelectedKernelConnectionId &&
context.previouslySelectedKernelConnectionId !== newKernelConnectionId
) {
currentData.kernelSessionId = getTelemetrySafeHashedString(Date.now().toString());
currentData.switchKernelCount = (currentData.switchKernelCount || 0) + 1;
}
let language: string | undefined;
switch (kernelConnection.kind) {
case 'connectToLiveRemoteKernel':
language = kernelConnection.kernelModel.language;
break;
case 'startUsingRemoteKernelSpec':
case 'startUsingLocalKernelSpec':
language = kernelConnection.kernelSpec.language;
break;
case 'startUsingPythonInterpreter':
language = PYTHON_LANGUAGE;
break;
default:
break;
}
currentData.kernelLanguage = getTelemetrySafeLanguage(language);
// Keep track of the kernel that was last selected.
context.previouslySelectedKernelConnectionId = kernelConnection.id;

const interpreter = kernelConnection.interpreter;
if (interpreter) {
currentData.isUsingActiveInterpreter = WorkspaceInterpreterTracker.isActiveWorkspaceInterpreter(
resource,
interpreter
);
currentData.pythonEnvironmentType = interpreter.envType;
currentData.pythonEnvironmentPath = getTelemetrySafeHashedString(
getFilePath(getNormalizedInterpreterPath(interpreter.uri))
);
pythonEnvironmentsByHash.set(currentData.pythonEnvironmentPath, interpreter);
if (interpreter.version) {
const { major, minor, patch } = interpreter.version;
currentData.pythonEnvironmentVersion = `${major}.${minor}.${patch}`;
} else {
currentData.pythonEnvironmentVersion = undefined;
}

updatePythonPackages(currentData);
}

currentData.kernelConnectionType = currentData.kernelConnectionType || kernelConnection?.kind;
} else {
context.previouslySelectedKernelConnectionId = '';
}

trackedInfo.set(key, [currentData, context]);
}

/**
* Initializes the Interactive/Notebook telemetry as a result of user action.
*/
export function initializeInteractiveOrNotebookTelemetryBasedOnUserAction(
resourceUri: Resource,
kernelConnection: KernelConnectionMetadata
) {
setSharedProperty('userExecutedCell', 'true');
trackKernelResourceInformation(resourceUri, { kernelConnection });
}

export function clearInterruptCounter(resource: Resource) {
if (!resource) {
return;
}
const key = getComparisonKey(resource);
const currentData = trackedInfo.get(key);
if (currentData) {
currentData[0].interruptCount = 0;
}
}
export function clearRestartCounter(resource: Resource) {
if (!resource) {
return;
}
const key = getComparisonKey(resource);
const currentData = trackedInfo.get(key);
if (currentData) {
currentData[0].restartCount = 0;
currentData[0].startFailureCount = 0;
}
}
Loading

0 comments on commit bcd44ef

Please sign in to comment.