Skip to content

Commit f8170b8

Browse files
committed
Improve activity logging for the background checker
1 parent f72b570 commit f8170b8

File tree

7 files changed

+50
-18
lines changed

7 files changed

+50
-18
lines changed

src/Compiler/Checking/CheckDeclarations.fs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module internal FSharp.Compiler.CheckDeclarations
55
open System
66
open System.Collections.Generic
77

8+
open FSharp.Compiler.Diagnostics
89
open Internal.Utilities.Collections
910
open Internal.Utilities.Library
1011
open Internal.Utilities.Library.Extras
@@ -5167,11 +5168,14 @@ let CheckOneImplFile
51675168
env,
51685169
rootSigOpt: ModuleOrNamespaceType option,
51695170
synImplFile) =
5170-
5171-
let (ParsedImplFileInput (_, isScript, qualNameOfFile, scopedPragmas, _, implFileFrags, isLastCompiland, _)) = synImplFile
5171+
5172+
let (ParsedImplFileInput (fileName, isScript, qualNameOfFile, scopedPragmas, _, implFileFrags, isLastCompiland, _)) = synImplFile
51725173
let infoReader = InfoReader(g, amap)
51735174

51745175
cancellable {
5176+
use act = Activity.activitySource.StartActivity("CheckOneSigFile")
5177+
act.AddTag("fileName", fileName) |> ignore
5178+
act.AddTag("qualifiedNameOfFile", qualNameOfFile.Text) |> ignore
51755179
let cenv =
51765180
cenv.Create (g, isScript, niceNameGen, amap, thisCcu, false, Option.isSome rootSigOpt,
51775181
conditionalDefines, tcSink, (LightweightTcValForUsingInBuildMethodCall g), isInternalTestSpanStackReferring,
@@ -5297,8 +5301,12 @@ let CheckOneImplFile
52975301

52985302

52995303
/// Check an entire signature file
5300-
let CheckOneSigFile (g, niceNameGen, amap, thisCcu, checkForErrors, conditionalDefines, tcSink, isInternalTestSpanStackReferring) tcEnv (ParsedSigFileInput (qualifiedNameOfFile = qualNameOfFile; modules = sigFileFrags)) =
5301-
cancellable {
5304+
let CheckOneSigFile (g, niceNameGen, amap, thisCcu, checkForErrors, conditionalDefines, tcSink, isInternalTestSpanStackReferring) tcEnv (ParsedSigFileInput (fileName = fileName; qualifiedNameOfFile = qualNameOfFile; modules = sigFileFrags)) =
5305+
cancellable {
5306+
use act = Activity.activitySource.StartActivity("CheckOneSigFile")
5307+
act.AddTag("fileName", fileName) |> ignore
5308+
act.AddTag("qualifiedNameOfFile", qualNameOfFile.Text) |> ignore
5309+
53025310
let cenv =
53035311
cenv.Create
53045312
(g, false, niceNameGen, amap, thisCcu, true, false, conditionalDefines, tcSink,

src/Compiler/Driver/fsc.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ let TypeCheck
168168
exiter: Exiter
169169
) =
170170
use typecheckActivity = activitySource.StartActivity("typecheck_inputs")
171+
typecheckActivity.AddTag("assemblyName", assemblyName) |> ignore
171172

172173
try
173174
if isNil inputs then

src/Compiler/Facilities/BuildGraph.fs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,17 @@ type NodeCodeBuilder() =
9292
[<DebuggerHidden; DebuggerStepThrough>]
9393
member _.Combine(Node (p1): NodeCode<unit>, Node (p2): NodeCode<'T>) : NodeCode<'T> = Node(async.Combine(p1, p2))
9494

95+
[<DebuggerHidden; DebuggerStepThrough>]
96+
member _.Using(value: Activity, binder: Activity -> NodeCode<'U>) =
97+
Node(
98+
async {
99+
try
100+
return! binder value |> Async.AwaitNodeCode
101+
finally
102+
(value :> IDisposable).Dispose()
103+
}
104+
)
105+
95106
[<DebuggerHidden; DebuggerStepThrough>]
96107
member _.Using(value: CompilationGlobalsScope, binder: CompilationGlobalsScope -> NodeCode<'U>) =
97108
Node(

src/Compiler/Facilities/BuildGraph.fsi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
module internal FSharp.Compiler.BuildGraph
44

55
open System
6+
open System.Diagnostics
67
open System.Threading
78
open System.Threading.Tasks
89
open FSharp.Compiler.DiagnosticsLogger
@@ -46,6 +47,8 @@ type NodeCodeBuilder =
4647
/// A limited form 'use' for establishing the compilation globals. (Note
4748
/// that a proper generic 'use' could be implemented but has not currently been necessary)
4849
member Using: CompilationGlobalsScope * (CompilationGlobalsScope -> NodeCode<'T>) -> NodeCode<'T>
50+
51+
member Using: Activity * (Activity -> NodeCode<'T>) -> NodeCode<'T>
4952

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

src/Compiler/Service/FSharpCheckerResults.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2347,6 +2347,8 @@ module internal ParseAndCheckFile =
23472347

23482348
let parseFile (sourceText: ISourceText, fileName, options: FSharpParsingOptions, userOpName: string, suggestNamesForErrors: bool) =
23492349
Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "parseFile", fileName)
2350+
use act = Activity.activitySource.StartActivity("parseFile")
2351+
act.AddTag("fileName", fileName) |> ignore
23502352

23512353
let errHandler =
23522354
ErrorHandler(true, fileName, options.DiagnosticOptions, sourceText, suggestNamesForErrors)

src/Compiler/Service/IncrementalBuild.fs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,17 @@ module IncrementalBuildSyntaxTree =
116116
let mutable weakCache: WeakReference<_> option = None
117117

118118
let parse(sigNameOpt: QualifiedNameOfFile option) =
119+
use act = Activity.activitySource.StartActivity("SyntaxTree.parse")
120+
act.AddTag("fileName", source.FilePath) |> ignore
121+
act.AddTag("buildPhase", BuildPhase.Parse) |> ignore
119122
let diagnosticsLogger = CompilationDiagnosticLogger("Parse", tcConfig.diagnosticsOptions)
120123
// Return the disposable object that cleans up
121124
use _holder = new CompilationGlobalsScope(diagnosticsLogger, BuildPhase.Parse)
122125

123126
try
124127
IncrementalBuilderEventTesting.MRU.Add(IncrementalBuilderEventTesting.IBEParsed fileName)
125128
let canSkip = sigNameOpt.IsSome && FSharpImplFileSuffixes |> List.exists (FileSystemUtils.checkSuffix fileName)
129+
act.AddTag("canSkip", canSkip) |> ignore
126130
let input =
127131
if canSkip then
128132
ParsedInput.ImplFile(
@@ -465,6 +469,8 @@ type BoundModel private (tcConfig: TcConfig,
465469
let! res = defaultTypeCheck ()
466470
return res
467471
| Some syntaxTree ->
472+
use act = Activity.activitySource.StartActivity("TypeCheck")
473+
act.AddTag("fileName", syntaxTree.FileName) |> ignore
468474
let sigNameOpt =
469475
if partialCheck then
470476
this.BackingSignature
@@ -502,6 +508,7 @@ type BoundModel private (tcConfig: TcConfig,
502508
partialCheck)
503509
|> NodeCode.FromCancellable
504510

511+
use _ = Activity.activitySource.StartActivity("TypeCheck_BuildState")
505512
Logger.LogBlockMessageStop fileName LogCompilerFunctionId.IncrementalBuild_TypeCheck
506513

507514
fileChecked.Trigger fileName
@@ -1038,8 +1045,8 @@ module IncrementalBuilderStateHelpers =
10381045

10391046
let rec createFinalizeBoundModelGraphNode (initialState: IncrementalBuilderInitialState) (boundModels: ImmutableArray<GraphNode<BoundModel>>.Builder) =
10401047
GraphNode(node {
1041-
let act = Activity.activitySource.StartActivity("GetCheckResultsAndImplementationsForProject")
1042-
act.AddTag("projectName", initialState.outfile) |> ignore
1048+
use act = Activity.activitySource.StartActivity("GetCheckResultsAndImplementationsForProject")
1049+
act.AddTag("projectOutFile", initialState.outfile) |> ignore
10431050
// Compute last bound model then get all the evaluated models.
10441051
let! _ = boundModels[boundModels.Count - 1].GetOrComputeValue()
10451052
let boundModels =
@@ -1055,7 +1062,6 @@ module IncrementalBuilderStateHelpers =
10551062
initialState.outfile
10561063
boundModels
10571064
let result = (result, DateTime.UtcNow)
1058-
act.Dispose()
10591065
return result
10601066
})
10611067

@@ -1354,8 +1360,6 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc
13541360

13551361
member builder.GetCheckResultsAndImplementationsForProject() =
13561362
node {
1357-
// let act = Activity.activitySource.StartActivity("GetCheckResultsAndImplementationsForProject")
1358-
// act.AddTag("projectName", initialState.outfile) |> ignore
13591363
let cache = TimeStampCache(defaultTimeStamp)
13601364
do! checkFileTimeStamps cache
13611365
let! result = currentState.finalizedBoundModel.GetOrComputeValue()
@@ -1364,7 +1368,6 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc
13641368
let cache = TimeStampCache defaultTimeStamp
13651369
let projectTimeStamp = builder.GetLogicalTimeStampForProject(cache)
13661370
let res = PartialCheckResults (boundModel, timestamp, projectTimeStamp), ilAssemRef, tcAssemblyDataOpt, tcAssemblyExprOpt
1367-
act.Dispose()
13681371
return res
13691372
}
13701373

src/Compiler/Service/service.fs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -343,10 +343,7 @@ type BackgroundCompiler
343343
member x.EvaluateRawContents() =
344344
node {
345345
Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "GetAssemblyData", nm)
346-
//let act = Activity.activitySource.StartActivity("CheckReferencedProject")
347-
//act.AddTag("Project", nm) |> ignore
348346
let! x = self.GetAssemblyData(opts, userOpName + ".CheckReferencedProject(" + nm + ")")
349-
//act.Dispose()
350347
return x
351348
}
352349

@@ -396,6 +393,8 @@ type BackgroundCompiler
396393
/// creates an incremental builder used by the command line compiler.
397394
let CreateOneIncrementalBuilder (options: FSharpProjectOptions, userOpName) =
398395
node {
396+
use act = Activity.activitySource.StartActivity("CreateOneIncrementalBuilder")
397+
act.AddTag("project", options.ProjectFileName) |> ignore
399398
Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "CreateOneIncrementalBuilder", options.ProjectFileName)
400399
let projectReferences = getProjectReferences options userOpName
401400

@@ -776,10 +775,14 @@ type BackgroundCompiler
776775
/// Type-check the result obtained by parsing. Force the evaluation of the antecedent type checking context if needed.
777776
member bc.CheckFileInProject(parseResults: FSharpParseFileResults, fileName, fileVersion, sourceText: ISourceText, options, userOpName) =
778777
node {
778+
use act = Activity.activitySource.StartActivity("Service_CheckFileInProject")
779+
act.AddTag("project", options.ProjectFileName) |> ignore
780+
act.AddTag("fileName", fileName) |> ignore
779781
let! builderOpt, creationDiags = getOrCreateBuilder (options, userOpName)
780782

781783
match builderOpt with
782-
| None -> return FSharpCheckFileAnswer.Succeeded(FSharpCheckFileResults.MakeEmpty(fileName, creationDiags, keepAssemblyContents))
784+
| None ->
785+
return FSharpCheckFileAnswer.Succeeded(FSharpCheckFileResults.MakeEmpty(fileName, creationDiags, keepAssemblyContents))
783786
| Some builder ->
784787
// Check the cache. We can only use cached results when there is no work to do to bring the background builder up-to-date
785788
let! cachedResults = bc.GetCachedCheckFileResult(builder, fileName, sourceText, options)
@@ -795,6 +798,9 @@ type BackgroundCompiler
795798
/// Parses and checks the source file and returns untyped AST and check results.
796799
member bc.ParseAndCheckFileInProject(fileName: string, fileVersion, sourceText: ISourceText, options: FSharpProjectOptions, userOpName) =
797800
node {
801+
use act = Activity.activitySource.StartActivity("Service_ParseAndCheckFileInProject")
802+
act.AddTag("project", options.ProjectFileName) |> ignore
803+
act.AddTag("fileName", fileName) |> ignore
798804
let strGuid = "_ProjectId=" + (options.ProjectId |> Option.defaultValue "null")
799805
Logger.LogBlockMessageStart (fileName + strGuid) LogCompilerFunctionId.Service_ParseAndCheckFileInProject
800806

@@ -1600,16 +1606,14 @@ type FSharpChecker
16001606
?userOpName: string
16011607
) =
16021608
async {
1603-
let act = Activity.activitySource.StartActivity("ParseAndCheckFileInProject")
1609+
use act = Activity.activitySource.StartActivity("ParseAndCheckFileInProject")
16041610
act.AddTag("Project", options.ProjectFileName) |> ignore
16051611
act.AddTag("filename", fileName) |> ignore
16061612
act.AddTag("UserOpName", userOpName) |> ignore
16071613
let userOpName = defaultArg userOpName "Unknown"
1608-
let! x =
1614+
return!
16091615
backgroundCompiler.ParseAndCheckFileInProject(fileName, fileVersion, sourceText, options, userOpName)
16101616
|> Async.AwaitNodeCode
1611-
act.Dispose()
1612-
return x
16131617
}
16141618

16151619
member _.ParseAndCheckProject(options, ?userOpName: string) =

0 commit comments

Comments
 (0)