Skip to content

Commit dfffae6

Browse files
authored
OpenTelemetry instrumentation for xUnit tests (#18230)
* otel instrumentation for xunit test runs * wip * sort out deps version conflict * disable for desktop
1 parent b204f87 commit dfffae6

File tree

5 files changed

+23
-30
lines changed

5 files changed

+23
-30
lines changed

tests/FSharp.Compiler.ComponentTests/FSharpChecker/CommonWorkflows.fs

-11
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,6 @@ let ``Using getSource and notifications instead of filesystem`` () =
143143

144144
[<Fact>]
145145
let GetAllUsesOfAllSymbols() =
146-
let traceProvider =
147-
Sdk.CreateTracerProviderBuilder()
148-
.AddSource("fsc")
149-
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(serviceName="F#", serviceVersion = "1"))
150-
.AddJaegerExporter()
151-
.Build()
152-
153-
use _ = Activity.start "GetAllUsesOfAllSymbols" [ ]
154146

155147
let result =
156148
async {
@@ -162,9 +154,6 @@ let GetAllUsesOfAllSymbols() =
162154
return checkProjectResults.GetAllUsesOfAllSymbols()
163155
} |> Async.RunSynchronously
164156

165-
traceProvider.ForceFlush() |> ignore
166-
traceProvider.Dispose()
167-
168157
if result.Length <> 79 then failwith $"Expected 81 symbolUses, got {result.Length}:\n%A{result}"
169158

170159
[<Fact>]

tests/FSharp.Compiler.ComponentTests/FSharpChecker/TransparentCompiler.fs

-7
Original file line numberDiff line numberDiff line change
@@ -556,13 +556,6 @@ let fuzzingTest seed (project: SyntheticProject) = task {
556556
do! Task.Delay (rng.Next maxCheckingDelayMs)
557557
}
558558
559-
use _tracerProvider =
560-
Sdk.CreateTracerProviderBuilder()
561-
.AddSource("fsc")
562-
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(serviceName="F# Fuzzing", serviceVersion = "1"))
563-
.AddJaegerExporter()
564-
.Build()
565-
566559
use _ = Activity.start $"Fuzzing {project.Name}" [ Activity.Tags.project, project.Name; "seed", seed.ToString() ]
567560
568561
do! task {

tests/FSharp.Test.Utilities/FSharp.Test.Utilities.fsproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="$(MicrosoftCodeAnalysisCSharpVersion)" />
109109
<PackageReference Include="Microsoft.CodeAnalysis.Test.Resources.Proprietary" Version="$(MicrosoftCodeAnalysisTestResourcesProprietaryVersion)" />
110110
<PackageReference Include="Microsoft.NETCore.App.Ref" Version="6.0.0" IncludeAssets="none" PrivateAssets="all" GeneratePathProperty="true" />
111-
<PackageReference Include="OpenTelemetry.Exporter.Jaeger" Version="1.4.0" />
111+
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.9.0" />
112112
<PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
113113
</ItemGroup>
114114

tests/FSharp.Test.Utilities/ProjectGeneration.fs

-11
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,6 @@ type ProjectWorkflowBuilder
961961

962962
let mutable latestProject = initialProject
963963
let mutable activity = None
964-
let mutable tracerProvider = None
965964

966965
let getSource f = f |> getSourceText latestProject :> ISourceText |> Some |> async.Return
967966

@@ -1010,13 +1009,6 @@ type ProjectWorkflowBuilder
10101009

10111010
member this.Yield _ = async {
10121011
let! ctx = getInitialContext()
1013-
tracerProvider <-
1014-
Sdk.CreateTracerProviderBuilder()
1015-
.AddSource("fsc")
1016-
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(serviceName="F#", serviceVersion = "1"))
1017-
.AddJaegerExporter()
1018-
.Build()
1019-
|> Some
10201012
activity <- Activity.start ctx.Project.Name [ Activity.Tags.project, ctx.Project.Name; "UsingTransparentCompiler", useTransparentCompiler.ToString() ] |> Some
10211013
return ctx
10221014
}
@@ -1032,9 +1024,6 @@ type ProjectWorkflowBuilder
10321024
if initialContext.IsNone && not isExistingProject then
10331025
this.DeleteProjectDir()
10341026
activity |> Option.iter (fun x -> if not (isNull x) then x.Dispose())
1035-
tracerProvider |> Option.iter (fun x ->
1036-
x.ForceFlush() |> ignore
1037-
x.Dispose())
10381027

10391028
member this.Run(workflow: Async<WorkflowContext>) =
10401029
if autoStart then

tests/FSharp.Test.Utilities/XunitHelpers.fs

+22
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ open Xunit.Abstractions
1010

1111
open TestFramework
1212

13+
open FSharp.Compiler.Diagnostics
14+
15+
open OpenTelemetry
16+
open OpenTelemetry.Resources
17+
open OpenTelemetry.Trace
18+
1319
/// Disables custom internal parallelization added with XUNIT_EXTRAS.
1420
/// Execute test cases in a class or a module one by one instead of all at once. Allow other collections to run simultaneously.
1521
[<AttributeUsage(AttributeTargets.Class ||| AttributeTargets.Method, AllowMultiple = false)>]
@@ -45,6 +51,7 @@ type ConsoleCapturingTestRunner(test, messageBus, testClass, constructorArgument
4551
override this.InvokeTestAsync (aggregator: ExceptionAggregator) =
4652
task {
4753
use capture = new TestConsole.ExecutionCapture()
54+
use _ = Activity.start test.DisplayName [ ]
4855
let! executionTime = this.BaseInvokeTestMethodAsync aggregator
4956
let output =
5057
seq {
@@ -139,9 +146,24 @@ type FSharpXunitFramework(sink: IMessageSink) =
139146
log "FSharpXunitFramework with XUNIT_EXTRAS installing TestConsole redirection"
140147
TestConsole.install()
141148

149+
// TODO: Currently does not work with Desktop .NET Framework. Upcoming OpenTelemetry 1.11.0 may change it.
150+
#if NETCOREAPP
151+
let traceProvider =
152+
Sdk.CreateTracerProviderBuilder()
153+
.AddSource(ActivityNames.FscSourceName)
154+
.SetResourceBuilder(
155+
ResourceBuilder.CreateDefault().AddService(serviceName="F#", serviceVersion = "1.0.0"))
156+
.AddOtlpExporter()
157+
.Build()
158+
#endif
159+
142160
interface IDisposable with
143161
member _.Dispose() =
144162
cleanUpTemporaryDirectoryOfThisTestRun ()
163+
#if NETCOREAPP
164+
traceProvider.ForceFlush() |> ignore
165+
traceProvider.Dispose()
166+
#endif
145167
base.Dispose()
146168

147169
override this.CreateDiscoverer (assemblyInfo) =

0 commit comments

Comments
 (0)