-
Notifications
You must be signed in to change notification settings - Fork 831
Closed
Labels
Description
Please provide a succinct description of the issue.
👋 I'm trying to use the tracing information inside FSC for FSAC to provide feedback when something is being typechecked. I'm using an ActivityListener like so:
let mutable inflightEvents = ConcurrentDictionary<_, ServerProgressReport>()
let shouldListenTo (act : ActivitySource) =
act.Name = "fsc"
let activityStarted (act : Activity) =
let progressReport = new ServerProgressReport(lspClient)
if inflightEvents.TryAdd(act.Id, progressReport) then
progressReport.Begin($"Dependent Typecheck {act.DisplayName}")
|> Async.StartImmediate
()
let activityStopped (act : Activity) =
match inflightEvents.TryRemove(act.Id) with
| true, v -> v.End() |> Async.StartImmediate
| _ -> ()
let listener = new ActivityListener(
ShouldListenTo = shouldListenTo,
Sample = (fun _ -> ActivitySamplingResult.AllData),
ActivityStarted = activityStarted,
ActivityStopped = activityStopped
)
do ActivitySource.AddActivityListener listenerThe activityStarted does get messages for the name like BackgroundCompiler.CreateOneIncrementalBuilder. However, this request is missing the associated tags. Which means we can't tell the user which file is being type checked currently.
This is because the Activity is started and created before tags are added:
fsharp/src/Compiler/Utilities/Activity.fs
Lines 65 to 74 in cd2babe
| let start (name: string) (tags: (string * string) seq) : IDisposable = | |
| let activity = activitySource.StartActivity(name) | |
| match activity with | |
| | null -> () | |
| | activity -> | |
| for key, value in tags do | |
| activity.AddTag(key, value) |> ignore | |
| activity |
I think the change would be rather straightforward:
let start (name: string) (tags: (string * string) seq) : IDisposable =
let activity = activitySource.CreateActivity(name, ActivityKind.Internal)
match activity with
| null -> ()
| activity ->
for key, value in tags do
activity.AddTag(key, value) |> ignore
activity.Start()or possibly
let start (name: string) (tags: (string * string) seq) : IDisposable =
let tags = tags |> Seq.map (fun (k,v) -> KeyValuePair(k, box v))
let activity = activitySource.StartActivity(ActivityKind.Internal, name = name, tags = tags)
activityMetadata
Metadata
Assignees
Labels
Type
Projects
Status
Done