Skip to content

Commit a776c86

Browse files
committed
Tracing via dotnet ActivitySource
1 parent 80459f9 commit a776c86

File tree

11 files changed

+109
-262
lines changed

11 files changed

+109
-262
lines changed

src/Compiler/Checking/CheckDeclarations.fs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5173,7 +5173,12 @@ let CheckOneImplFile
51735173
let infoReader = InfoReader(g, amap)
51745174

51755175
cancellable {
5176-
use _ = Activity.instance.Start "CheckOneImplFile" [|"fileName", fileName; "qualifiedNameOfFile", qualNameOfFile.Text|]
5176+
use _ =
5177+
Activity.Start "CheckDeclarations.CheckOneImplFile"
5178+
[|
5179+
"fileName", fileName
5180+
"qualifiedNameOfFile", qualNameOfFile.Text
5181+
|]
51775182
let cenv =
51785183
cenv.Create (g, isScript, niceNameGen, amap, thisCcu, false, Option.isSome rootSigOpt,
51795184
conditionalDefines, tcSink, (LightweightTcValForUsingInBuildMethodCall g), isInternalTestSpanStackReferring,
@@ -5302,7 +5307,7 @@ let CheckOneImplFile
53025307
let CheckOneSigFile (g, niceNameGen, amap, thisCcu, checkForErrors, conditionalDefines, tcSink, isInternalTestSpanStackReferring) tcEnv (ParsedSigFileInput (fileName = fileName; qualifiedNameOfFile = qualNameOfFile; modules = sigFileFrags)) =
53035308
cancellable {
53045309
use _ =
5305-
Activity.instance.Start "CheckOneSigFile"
5310+
Activity.Start "CheckDeclarations.CheckOneSigFile"
53065311
[|
53075312
"fileName", fileName
53085313
"qualifiedNameOfFile", qualNameOfFile.Text

src/Compiler/Driver/CompilerOptions.fs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2304,13 +2304,13 @@ let PrintWholeAssemblyImplementation (tcConfig: TcConfig) outfile header expr =
23042304
//----------------------------------------------------------------------------
23052305

23062306
let mutable tPrev: (DateTime * DateTime * float * int[]) option = None
2307-
let mutable nPrev: string option = None
2308-
2309-
let ReportTime (tcConfig: TcConfig) descr =
2307+
let mutable nPrev: (string * IDisposable) option = None
23102308

2309+
let ReportTime (tcConfig: TcConfig) descr =
23112310
match nPrev with
23122311
| None -> ()
2313-
| Some prevDescr ->
2312+
| Some (prevDescr,prevActivity) ->
2313+
use _ = prevActivity // Finish the previous diagnostics activity by .Dispose() at the end of this block
23142314
if tcConfig.pause then
23152315
dprintf "[done '%s', entering '%s'] press <enter> to continue... " prevDescr descr
23162316
Console.ReadLine() |> ignore
@@ -2349,7 +2349,7 @@ let ReportTime (tcConfig: TcConfig) descr =
23492349

23502350
let tStart =
23512351
match tPrev, nPrev with
2352-
| Some (tStart, tPrev, utPrev, gcPrev), Some prevDescr ->
2352+
| Some (tStart, tPrev, utPrev, gcPrev), Some (prevDescr, _) ->
23532353
let spanGC = [| for i in 0..maxGen -> GC.CollectionCount i - gcPrev[i] |]
23542354
let t = tNow - tStart
23552355
let tDelta = tNow - tPrev
@@ -2376,7 +2376,7 @@ let ReportTime (tcConfig: TcConfig) descr =
23762376

23772377
tPrev <- Some(tStart, tNow, utNow, gcNow)
23782378

2379-
nPrev <- Some descr
2379+
nPrev <- Some (descr, Activity.StartNoTags descr)
23802380

23812381
let ignoreFailureOnMono1_1_16 f =
23822382
try

src/Compiler/Driver/ParseAndCheckInputs.fs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,7 +1138,7 @@ let CheckOneInput
11381138

11391139
cancellable {
11401140
try
1141-
use _ = Activity.instance.Start "CheckOneInput" [| "inputName", inp.FileName |]
1141+
use _ = Activity.Start "ParseAndCheckInputs.CheckOneInput" [| "inputName", inp.FileName |]
11421142

11431143
CheckSimulateException tcConfig
11441144

@@ -1320,10 +1320,8 @@ let CheckMultipleInputsFinish (results, tcState: TcState) =
13201320

13211321
let CheckOneInputAndFinish (checkForErrors, tcConfig: TcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, tcState, input) =
13221322
cancellable {
1323-
Logger.LogBlockStart LogCompilerFunctionId.CompileOps_TypeCheckOneInputAndFinishEventually
13241323
let! results, tcState = CheckOneInput(checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, tcState, input, false)
13251324
let result = CheckMultipleInputsFinish([ results ], tcState)
1326-
Logger.LogBlockStop LogCompilerFunctionId.CompileOps_TypeCheckOneInputAndFinishEventually
13271325
return result
13281326
}
13291327

@@ -1341,7 +1339,6 @@ let CheckClosedInputSetFinish (declaredImpls: CheckedImplFile list, tcState) =
13411339
tcState, declaredImpls, ccuContents
13421340

13431341
let CheckClosedInputSet (ctok, checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcState, inputs) =
1344-
use tcActivity = Activity.instance.StartNoTags("CheckClosedInputSet")
13451342
// tcEnvAtEndOfLastFile is the environment required by fsi.exe when incrementally adding definitions
13461343
let results, tcState =
13471344
(tcState, inputs)

src/Compiler/Driver/fsc.fs

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,6 @@ let TypeCheck
166166
inputs,
167167
exiter: Exiter
168168
) =
169-
use _ =
170-
Activity.instance.Start "typecheck_inputs" [| "assemblyName", assemblyName |]
171-
172169
try
173170
if isNil inputs then
174171
error (Error(FSComp.SR.fscNoImplementationFiles (), rangeStartup))
@@ -478,8 +475,6 @@ let main1
478475
disposables: DisposablesTracker
479476
) =
480477

481-
use mainActivity = new Activity("main")
482-
483478
// See Bug 735819
484479
let lcidFromCodePage =
485480
if
@@ -536,8 +531,6 @@ let main1
536531

537532
// Process command line, flags and collect filenames
538533
let sourceFiles =
539-
use parseActivity = Activity.instance.StartNoTags("determine_source_files")
540-
541534
// The ParseCompilerOptions function calls imperative function to process "real" args
542535
// Rather than start processing, just collect names, then process them.
543536
try
@@ -570,8 +563,6 @@ let main1
570563

571564
// If there's a problem building TcConfig, abort
572565
let tcConfig =
573-
use createConfigActivity = Activity.instance.StartNoTags("create_tc_config")
574-
575566
try
576567
TcConfig.Create(tcConfigB, validate = false)
577568
with e ->
@@ -596,14 +587,10 @@ let main1
596587
let foundationalTcConfigP = TcConfigProvider.Constant tcConfig
597588

598589
let sysRes, otherRes, knownUnresolved =
599-
use splitResolutionsActivity = Activity.instance.StartNoTags("split_resolutions")
600590
TcAssemblyResolutions.SplitNonFoundationalResolutions(tcConfig)
601591

602592
// Import basic assemblies
603593
let tcGlobals, frameworkTcImports =
604-
use frameworkImportsActivity =
605-
Activity.instance.StartNoTags("import_framework_references")
606-
607594
TcImports.BuildFrameworkTcImports(foundationalTcConfigP, sysRes, otherRes)
608595
|> NodeCode.RunImmediateWithoutCancellation
609596

@@ -656,9 +643,6 @@ let main1
656643
ReportTime tcConfig "Import non-system references"
657644

658645
let tcImports =
659-
use nonFrameworkImportsActivity =
660-
Activity.instance.StartNoTags("import_non_framework_references")
661-
662646
TcImports.BuildNonFrameworkTcImports(tcConfigP, frameworkTcImports, otherRes, knownUnresolved, dependencyProvider)
663647
|> NodeCode.RunImmediateWithoutCancellation
664648

@@ -677,7 +661,6 @@ let main1
677661
use unwindParsePhase = PushThreadBuildPhaseUntilUnwind BuildPhase.TypeCheck
678662

679663
let tcEnv0, openDecls0 =
680-
use initialTcEnvActivity = Activity.instance.StartNoTags("get_initial_tc_env")
681664
GetInitialTcEnv(assemblyName, rangeStartup, tcConfig, tcImports, tcGlobals)
682665

683666
// Type check the inputs
@@ -738,8 +721,6 @@ let main1OfAst
738721
inputs: ParsedInput list
739722
) =
740723

741-
use main1AstActivity = Activity.instance.StartNoTags("main1_of_ast")
742-
743724
let tryGetMetadataSnapshot = (fun _ -> None)
744725

745726
let directoryBuildingFrom = Directory.GetCurrentDirectory()
@@ -924,8 +905,6 @@ let main2
924905
exiter: Exiter,
925906
ilSourceDocs))
926907
=
927-
use main2Activity = Activity.instance.StartNoTags("main2")
928-
929908
if tcConfig.typeCheckOnly then
930909
exiter.Exit 0
931910

@@ -1033,7 +1012,6 @@ let main3
10331012
exiter: Exiter,
10341013
ilSourceDocs))
10351014
=
1036-
use main3Activity = Activity.instance.StartNoTags("main3")
10371015
// Encode the signature data
10381016
ReportTime tcConfig "Encode Interface Data"
10391017
let exportRemapping = MakeExportRemapping generatedCcu generatedCcu.Contents
@@ -1129,8 +1107,6 @@ let main4
11291107
exiter: Exiter,
11301108
ilSourceDocs))
11311109
=
1132-
use main4Activity = Activity.instance.StartNoTags("main4")
1133-
11341110
match tcImportsCapture with
11351111
| None -> ()
11361112
| Some f -> f tcImports
@@ -1233,8 +1209,6 @@ let main5
12331209
exiter: Exiter,
12341210
ilSourceDocs))
12351211
=
1236-
use main5Activity = Activity.instance.StartNoTags("main5")
1237-
12381212
use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Output
12391213

12401214
// Static linking, if any
@@ -1266,8 +1240,6 @@ let main6
12661240
exiter: Exiter,
12671241
ilSourceDocs))
12681242
=
1269-
use main6Activity = Activity.instance.StartNoTags("main6")
1270-
12711243
ReportTime tcConfig "Write .NET Binary"
12721244

12731245
use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Output

src/Compiler/Facilities/BuildGraph.fs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ open System.Threading
77
open System.Threading.Tasks
88
open System.Diagnostics
99
open System.Globalization
10-
open FSharp.Compiler.Diagnostics.Activity
1110
open FSharp.Compiler.DiagnosticsLogger
1211
open Internal.Utilities.Library
1312

@@ -108,13 +107,11 @@ type NodeCodeBuilder() =
108107
)
109108

110109
[<DebuggerHidden; DebuggerStepThrough>]
111-
member _.Using(value: ActivityFacade, binder: ActivityFacade -> NodeCode<'U>) =
110+
member _.Using(value: IDisposable, binder: IDisposable -> NodeCode<'U>) =
112111
Node(
113112
async {
114-
try
115-
return! binder value |> Async.AwaitNodeCode
116-
finally
117-
(value :> IDisposable).Dispose()
113+
use _ = value
114+
return! binder value |> Async.AwaitNodeCode
118115
}
119116
)
120117

src/Compiler/Facilities/BuildGraph.fsi

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ open System
66
open System.Diagnostics
77
open System.Threading
88
open System.Threading.Tasks
9-
open FSharp.Compiler.Diagnostics.Activity
109
open FSharp.Compiler.DiagnosticsLogger
1110
open Internal.Utilities.Library
1211

@@ -49,7 +48,7 @@ type NodeCodeBuilder =
4948
/// that a proper generic 'use' could be implemented but has not currently been necessary)
5049
member Using: CompilationGlobalsScope * (CompilationGlobalsScope -> NodeCode<'T>) -> NodeCode<'T>
5150

52-
member Using: ActivityFacade * (ActivityFacade -> NodeCode<'T>) -> NodeCode<'T>
51+
member Using: IDisposable * (IDisposable -> NodeCode<'T>) -> NodeCode<'T>
5352

5453
/// Specifies code that can be run as part of the build graph.
5554
val node: NodeCodeBuilder

src/Compiler/Facilities/Logger.fs

Lines changed: 8 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -6,113 +6,15 @@ open System
66
open System.Diagnostics
77
open System.Diagnostics.Tracing
88

9-
module Activity =
10-
11-
type ActivityFacade(activity : Activity option) =
12-
member this.AddTag key (value : #obj) = match activity with | Some activity -> activity.AddTag(key, value) |> ignore | None -> ()
13-
member this.Perform action = match activity with | Some activity -> action activity | None -> ()
14-
member this.Dispose() = match activity with | Some activity -> activity.Dispose() | None -> ()
15-
interface IDisposable with
16-
member this.Dispose() = this.Dispose()
17-
18-
let start (source : ActivitySource) (activityName : string) (tags : (string * #obj) seq) =
19-
let activity = source.StartActivity(activityName) |> Option.ofObj
20-
let facade = new ActivityFacade(activity)
21-
for key, value in tags do
22-
facade.AddTag key value
23-
facade
24-
25-
let startNoTags (source : ActivitySource) (activityName : string) = start source activityName []
26-
27-
type ActivitySourceFacade(source : ActivitySource) =
28-
member this.Start (name : string) (tags : (string * #obj) seq) = start source name tags
29-
member this.StartNoTags name = startNoTags source name
30-
member this.Name = source.Name
31-
member this.Dispose() = source.Dispose()
32-
interface IDisposable with
33-
member this.Dispose() = this.Dispose()
34-
35-
let private activitySourceName = "fsc"
36-
let private activitySource = new ActivitySource(activitySourceName)
37-
let instance = new ActivitySourceFacade(activitySource)
38-
39-
type LogCompilerFunctionId =
40-
| Service_ParseAndCheckFileInProject = 1
41-
| Service_CheckOneFile = 2
42-
| Service_IncrementalBuildersCache_BuildingNewCache = 3
43-
| Service_IncrementalBuildersCache_GettingCache = 4
44-
| CompileOps_TypeCheckOneInputAndFinishEventually = 5
45-
| IncrementalBuild_CreateItemKeyStoreAndSemanticClassification = 6
46-
| IncrementalBuild_TypeCheck = 7
47-
48-
/// This is for ETW tracing across FSharp.Compiler.
49-
[<Sealed; EventSource(Name = "FSharpCompiler")>]
50-
type FSharpCompilerEventSource() =
51-
inherit EventSource()
52-
53-
static let instance = new FSharpCompilerEventSource()
54-
static member Instance = instance
55-
56-
[<Event(1)>]
57-
member this.Log(functionId: LogCompilerFunctionId) =
58-
if this.IsEnabled() then this.WriteEvent(1, int functionId)
59-
60-
[<Event(2)>]
61-
member this.LogMessage(message: string, functionId: LogCompilerFunctionId) =
62-
if this.IsEnabled() then
63-
this.WriteEvent(2, message, int functionId)
64-
65-
[<Event(3)>]
66-
member this.BlockStart(functionId: LogCompilerFunctionId) =
67-
if this.IsEnabled() then this.WriteEvent(3, int functionId)
68-
69-
[<Event(4)>]
70-
member this.BlockStop(functionId: LogCompilerFunctionId) =
71-
if this.IsEnabled() then this.WriteEvent(4, int functionId)
72-
73-
[<Event(5)>]
74-
member this.BlockMessageStart(message: string, functionId: LogCompilerFunctionId) =
75-
if this.IsEnabled() then
76-
this.WriteEvent(5, message, int functionId)
77-
78-
[<Event(6)>]
79-
member this.BlockMessageStop(message: string, functionId: LogCompilerFunctionId) =
80-
if this.IsEnabled() then
81-
this.WriteEvent(6, message, int functionId)
82-
839
[<RequireQualifiedAccess>]
84-
module Logger =
85-
86-
let Log functionId =
87-
FSharpCompilerEventSource.Instance.Log(functionId)
88-
89-
let LogMessage message functionId =
90-
FSharpCompilerEventSource.Instance.LogMessage(message, functionId)
91-
92-
let LogBlockStart functionId =
93-
FSharpCompilerEventSource.Instance.BlockStart(functionId)
94-
95-
let LogBlockStop functionId =
96-
FSharpCompilerEventSource.Instance.BlockStop(functionId)
97-
98-
let LogBlockMessageStart message functionId =
99-
FSharpCompilerEventSource.Instance.BlockMessageStart(message, functionId)
100-
101-
let LogBlockMessageStop message functionId =
102-
FSharpCompilerEventSource.Instance.BlockMessageStop(message, functionId)
103-
104-
let LogBlock functionId =
105-
FSharpCompilerEventSource.Instance.BlockStart(functionId)
10+
module Activity =
10611

107-
{ new IDisposable with
108-
member _.Dispose() =
109-
FSharpCompilerEventSource.Instance.BlockStop(functionId)
110-
}
12+
let private activitySource = new ActivitySource("fsc")
11113

112-
let LogBlockMessage message functionId =
113-
FSharpCompilerEventSource.Instance.BlockMessageStart(message, functionId)
14+
let Start name (tags:(string * #obj) seq) : IDisposable =
15+
let act = activitySource.StartActivity(name)
16+
for key,value in tags do
17+
act.AddTag(key,value) |> ignore
18+
act
11419

115-
{ new IDisposable with
116-
member _.Dispose() =
117-
FSharpCompilerEventSource.Instance.BlockMessageStop(message, functionId)
118-
}
20+
let StartNoTags name: IDisposable = activitySource.StartActivity(name)

0 commit comments

Comments
 (0)