From acbc02b288a9a9ac26e3e9f04765952b42fbb574 Mon Sep 17 00:00:00 2001 From: Jakub Majocha <1760221+majocha@users.noreply.github.com> Date: Fri, 26 Sep 2025 11:51:36 +0200 Subject: [PATCH 1/2] show cache metrics in output pane --- .../src/FSharp.Editor/Common/DebugHelpers.fs | 35 +++++++++---------- .../LanguageService/LanguageService.fs | 8 +++++ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Common/DebugHelpers.fs b/vsintegration/src/FSharp.Editor/Common/DebugHelpers.fs index 6ffb3cd7d95..51cdd83f8fa 100644 --- a/vsintegration/src/FSharp.Editor/Common/DebugHelpers.fs +++ b/vsintegration/src/FSharp.Editor/Common/DebugHelpers.fs @@ -31,6 +31,7 @@ open Config open System.Diagnostics.Metrics open System.Text open Microsoft.VisualStudio.Threading +open Microsoft.VisualStudio.FSharp.Editor.CancellableTasks module FSharpOutputPane = @@ -56,29 +57,17 @@ module FSharpOutputPane = let private log logType msg = task { System.Diagnostics.Trace.TraceInformation(msg) - let time = DateTime.Now.ToString("hh:mm:ss tt") - let! pane = pane.GetValueAsync() do! ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync() match logType with - | LogType.Message -> - String.Format("[{0}{1}] {2}{3}", "", time, msg, Environment.NewLine) - |> pane.OutputStringThreadSafe - |> ignore - | LogType.Info -> - String.Format("[{0}{1}] {2}{3}", "INFO ", time, msg, Environment.NewLine) - |> pane.OutputStringThreadSafe - |> ignore - | LogType.Warn -> - String.Format("[{0}{1}] {2}{3}", "WARN ", time, msg, Environment.NewLine) - |> pane.OutputStringThreadSafe - |> ignore - | LogType.Error -> - String.Format("[{0}{1}] {2}{3}", "ERROR ", time, msg, Environment.NewLine) - |> pane.OutputStringThreadSafe - |> ignore + | LogType.Message -> $"{msg}" + | LogType.Info -> $"[INFO] {msg}" + | LogType.Warn -> $"[WARN] {msg}" + | LogType.Error -> $"[ERROR] {msg}" + |> pane.OutputStringThreadSafe + |> ignore } |> ignore @@ -102,6 +91,7 @@ module FSharpOutputPane = module FSharpServiceTelemetry = open FSharp.Compiler.Caches + open System.Threading.Tasks let listen filter = let indent (activity: Activity) = @@ -130,6 +120,15 @@ module FSharpServiceTelemetry = ActivitySource.AddActivityListener(listener) + let periodicallyDisplayCacheStats = + cancellableTask { + use _ = CacheMetrics.ListenToAll() + + while true do + do! Task.Delay(TimeSpan.FromSeconds 10.0) + FSharpOutputPane.logMsg (CacheMetrics.StatsToString()) + } + #if DEBUG open OpenTelemetry.Resources open OpenTelemetry.Trace diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 08318997477..6ceafb3eae8 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -411,6 +411,14 @@ type internal FSharpPackage() as this = |> CancellableTask.startAsTask cancellationToken) ) +#if DEBUG + override _.RegisterOnAfterPackageLoadedAsyncWork (afterPackageLoadedTasks: PackageLoadTasks) = + afterPackageLoadedTasks.AddTask(false, fun _ _ -> task { + DebugHelpers.FSharpServiceTelemetry.periodicallyDisplayCacheStats + |> CancellableTask.start this.DisposalToken |> ignore + }) +#endif + override _.RoslynLanguageName = FSharpConstants.FSharpLanguageName (*override this.CreateWorkspace() = this.ComponentModel.GetService() *) override this.CreateLanguageService() = FSharpLanguageService(this) From 0be850b50689a14e7547b7a572d7cf814808e416 Mon Sep 17 00:00:00 2001 From: Jakub Majocha <1760221+majocha@users.noreply.github.com> Date: Fri, 26 Sep 2025 12:25:27 +0200 Subject: [PATCH 2/2] format --- .../LanguageService/LanguageService.fs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 6ceafb3eae8..92b6979883a 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -412,11 +412,16 @@ type internal FSharpPackage() as this = ) #if DEBUG - override _.RegisterOnAfterPackageLoadedAsyncWork (afterPackageLoadedTasks: PackageLoadTasks) = - afterPackageLoadedTasks.AddTask(false, fun _ _ -> task { - DebugHelpers.FSharpServiceTelemetry.periodicallyDisplayCacheStats - |> CancellableTask.start this.DisposalToken |> ignore - }) + override _.RegisterOnAfterPackageLoadedAsyncWork(afterPackageLoadedTasks: PackageLoadTasks) = + afterPackageLoadedTasks.AddTask( + false, + fun _ _ -> + task { + DebugHelpers.FSharpServiceTelemetry.periodicallyDisplayCacheStats + |> CancellableTask.start this.DisposalToken + |> ignore + } + ) #endif override _.RoslynLanguageName = FSharpConstants.FSharpLanguageName