diff --git a/src/VisualStudio/CSharp/Repl/CSharpVsInteractiveWindowProvider.cs b/src/VisualStudio/CSharp/Repl/CSharpVsInteractiveWindowProvider.cs index 860bf53ccaa9ad0b9a42ade3fdde5de139f68747..6c3215dbcde2397d927c0c50647fcbcbab373a01 100644 --- a/src/VisualStudio/CSharp/Repl/CSharpVsInteractiveWindowProvider.cs +++ b/src/VisualStudio/CSharp/Repl/CSharpVsInteractiveWindowProvider.cs @@ -5,11 +5,11 @@ using System.IO; using Microsoft.CodeAnalysis.Editor.CSharp.Interactive; using Microsoft.CodeAnalysis.Editor.Interactive; +using Microsoft.CodeAnalysis.Internal.Log; using Microsoft.VisualStudio.LanguageServices.Interactive; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Text.Classification; using Microsoft.VisualStudio.Utilities; -using Microsoft.VisualStudio.InteractiveWindow; using Microsoft.VisualStudio.InteractiveWindow.Commands; using Microsoft.VisualStudio.InteractiveWindow.Shell; using LanguageServiceGuids = Microsoft.VisualStudio.LanguageServices.Guids; @@ -63,5 +63,10 @@ protected override string Title Path.GetDirectoryName(typeof(CSharpVsInteractiveWindowPackage).Assembly.Location), CommonVsUtils.GetWorkingDirectory()); } + + protected override void LogSession(string key, string value) + { + Logger.Log(FunctionId.CSharp_Interactive_Window, KeyValueLogMessage.Create(m => m.Add(key, value))); + } } } diff --git a/src/VisualStudio/InteractiveServices/Interactive/LogMessage.cs b/src/VisualStudio/InteractiveServices/Interactive/LogMessage.cs new file mode 100644 index 0000000000000000000000000000000000000000..c5cf48ff587d11fcf5d22e770b3a6af5f5a1d6ae --- /dev/null +++ b/src/VisualStudio/InteractiveServices/Interactive/LogMessage.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.VisualStudio.LanguageServices.Interactive +{ + internal static class LogMessage + { + public const string Window = "InteractiveWindow"; + public const string Create = "Create"; + public const string Open = "Open"; + public const string Close = "Close"; + } +} diff --git a/src/VisualStudio/InteractiveServices/Interactive/VsInteractiveWindowPackage.cs b/src/VisualStudio/InteractiveServices/Interactive/VsInteractiveWindowPackage.cs index 7b070d4f11fd9b0dc0f912beb4b98a47d7f455fb..9874fd973c798283795d4462c57f6297581f65c9 100644 --- a/src/VisualStudio/InteractiveServices/Interactive/VsInteractiveWindowPackage.cs +++ b/src/VisualStudio/InteractiveServices/Interactive/VsInteractiveWindowPackage.cs @@ -6,6 +6,7 @@ using EnvDTE; using Microsoft.VisualStudio; using Microsoft.VisualStudio.ComponentModelHost; +using Microsoft.VisualStudio.LanguageServices.Setup; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; @@ -38,6 +39,12 @@ protected override void Initialize() var menuCommandService = (OleMenuCommandService)GetService(typeof(IMenuCommandService)); InitializeMenuCommands(menuCommandService); InitializeResetInteractiveFromProjectCommand(menuCommandService); + + var telemetrySetupExtensions = _componentModel.GetExtensions(); + foreach (var telemetrySetup in telemetrySetupExtensions) + { + telemetrySetup.Initialize(this); + } } protected TVsInteractiveWindowProvider InteractiveWindowProvider diff --git a/src/VisualStudio/InteractiveServices/Interactive/VsInteractiveWindowProvider.cs b/src/VisualStudio/InteractiveServices/Interactive/VsInteractiveWindowProvider.cs index e26f1abfa1dea86b570ca74c262b8a14d4a493e9..f2cbc8015d06511e3f379dae5fc18fd23578892a 100644 --- a/src/VisualStudio/InteractiveServices/Interactive/VsInteractiveWindowProvider.cs +++ b/src/VisualStudio/InteractiveServices/Interactive/VsInteractiveWindowProvider.cs @@ -54,6 +54,7 @@ internal abstract class VsInteractiveWindowProvider protected abstract Guid LanguageServiceGuid { get; } protected abstract Guid Id { get; } protected abstract string Title { get; } + protected abstract void LogSession(string key, string value); protected IInteractiveWindowCommandsFactory CommandsFactory { @@ -79,7 +80,11 @@ public IVsInteractiveWindow Create(int instanceId) vsWindow.SetLanguage(LanguageServiceGuid, evaluator.ContentType); // the tool window now owns the engine: - vsWindow.InteractiveWindow.TextView.Closed += new EventHandler((_, __) => evaluator.Dispose()); + vsWindow.InteractiveWindow.TextView.Closed += new EventHandler((_, __) => + { + LogSession(LogMessage.Window, LogMessage.Close); + evaluator.Dispose(); + }); // vsWindow.AutoSaveOptions = true; var window = vsWindow.InteractiveWindow; @@ -87,6 +92,8 @@ public IVsInteractiveWindow Create(int instanceId) // fire and forget: window.InitializeAsync(); + LogSession(LogMessage.Window, LogMessage.Create); + return vsWindow; } @@ -102,6 +109,8 @@ public IVsInteractiveWindow Open(int instanceId, bool focus) _vsInteractiveWindow.Show(focus); + LogSession(LogMessage.Window, LogMessage.Open); + return _vsInteractiveWindow; } diff --git a/src/VisualStudio/InteractiveServices/VisualStudioInteractiveServices.csproj b/src/VisualStudio/InteractiveServices/VisualStudioInteractiveServices.csproj index cead820559db5c15a9d6388db7ed577397628e83..034010dcf2533ebcbc355332082058e0098b6f7b 100644 --- a/src/VisualStudio/InteractiveServices/VisualStudioInteractiveServices.csproj +++ b/src/VisualStudio/InteractiveServices/VisualStudioInteractiveServices.csproj @@ -196,6 +196,7 @@ + diff --git a/src/VisualStudio/VisualBasic/Repl/VisualBasicVsInteractiveWindowProvider.vb b/src/VisualStudio/VisualBasic/Repl/VisualBasicVsInteractiveWindowProvider.vb index c0710af8ed6ffb92ad14a1ee90c6be66fa08ccbd..7cd227007bd04fca108c1d7cda10a96c0cb9add0 100644 --- a/src/VisualStudio/VisualBasic/Repl/VisualBasicVsInteractiveWindowProvider.vb +++ b/src/VisualStudio/VisualBasic/Repl/VisualBasicVsInteractiveWindowProvider.vb @@ -4,6 +4,7 @@ Imports System.ComponentModel.Composition Imports System.IO Imports Microsoft.CodeAnalysis.Editor.Interactive Imports Microsoft.CodeAnalysis.Editor.VisualBasic.Interactive +Imports Microsoft.CodeAnalysis.Internal.Log Imports Microsoft.VisualStudio.LanguageServices.Interactive Imports Microsoft.VisualStudio.Shell Imports Microsoft.VisualStudio.Text.Classification @@ -63,6 +64,10 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Interactive Path.GetDirectoryName(GetType(VisualBasicVsInteractiveWindowPackage).Assembly.Location), CommonVsUtils.GetWorkingDirectory()) End Function + + Protected Overrides Sub LogSession(key As String, value As String) + Logger.Log(FunctionId.VisualBasic_Interactive_Window, KeyValueLogMessage.Create(Sub(m) m.Add(key, value))) + End Sub End Class End Namespace diff --git a/src/Workspaces/Core/Portable/Log/FunctionId.cs b/src/Workspaces/Core/Portable/Log/FunctionId.cs index cba9b44e5196faaa8b789c8ae8ccb3b79c0d85e2..e27181abfd47729e722dd54d7aa8b42aedd4fe07 100644 --- a/src/Workspaces/Core/Portable/Log/FunctionId.cs +++ b/src/Workspaces/Core/Portable/Log/FunctionId.cs @@ -304,6 +304,9 @@ internal enum FunctionId VirtualMemory_MemoryLow, Extension_Exception, - WorkCoordinator_WaitForHigherPriorityOperationsAsync + WorkCoordinator_WaitForHigherPriorityOperationsAsync, + + CSharp_Interactive_Window, + VisualBasic_Interactive_Window } }