From 53380fe30553ecaa832f46a5012d0230099f9c91 Mon Sep 17 00:00:00 2001 From: Struan Judd Date: Sat, 6 Jan 2024 08:55:12 +1300 Subject: [PATCH] OTEL for all tests --- .gitignore | 3 +- GqlPlus.sln | 19 +++++++++-- otel-tests.ps1 | 18 ++++++++++ otel.runsettings | 34 +++++++++++++++++++ test/Directory.Build.targets | 7 ---- .../Ast/AstBaseTests.cs | 1 + .../BaseTestWithOpenTelemetry.cs | 9 ----- .../Merging/TestBase.cs | 2 ++ .../Parse/ClassTestBase.cs | 2 ++ .../Result/BaseResultTests.cs | 1 + .../TokenizerTests.cs | 2 +- .../GqlPlus.Verifier.ComponentTests.csproj | 2 +- .../GqlPlus.Verifier.TestBase.csproj | 4 +++ .../TracePerTestAttribute.cs | 28 ++++++++++++--- 14 files changed, 106 insertions(+), 26 deletions(-) create mode 100644 otel-tests.ps1 create mode 100644 otel.runsettings delete mode 100644 test/GqlPlus.Verifier.ClassTests/BaseTestWithOpenTelemetry.cs diff --git a/.gitignore b/.gitignore index 17f8755f..f2793584 100644 --- a/.gitignore +++ b/.gitignore @@ -487,6 +487,7 @@ _site/ _exported_templates/ test/**/*.received.* +publish/ activities.yml -per-class +per-class/ runs-*.yml diff --git a/GqlPlus.sln b/GqlPlus.sln index 7193c288..3f5b1a16 100644 --- a/GqlPlus.sln +++ b/GqlPlus.sln @@ -20,8 +20,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .editorconfig = .editorconfig .gitignore = .gitignore .prettierrc.yml = .prettierrc.yml - coverage.ps1 = coverage.ps1 - coverage.runsettings = coverage.runsettings .github\dependabot.yml = .github\dependabot.yml Directory.Build.props = Directory.Build.props .github\workflows\dotnet-test.yml = .github\workflows\dotnet-test.yml @@ -31,6 +29,21 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GqlPlus.Verifier.ComponentT EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GqlPlus.Verifier.TestBase", "test\GqlPlus.Verifier.TestBase\GqlPlus.Verifier.TestBase.csproj", "{B73CDEC7-3F67-444E-8A06-16C20DF56DFB}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Coverage", "Coverage", "{B152D8E1-AD02-4204-8E0D-A475F2A14183}" + ProjectSection(SolutionItems) = preProject + class-combine.ps1 = class-combine.ps1 + class-coverage.ps1 = class-coverage.ps1 + class.runsettings = class.runsettings + coverage.ps1 = coverage.ps1 + coverage.runsettings = coverage.runsettings + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Otel", "Otel", "{90C6E29D-04F6-427C-8E57-27C57664AC04}" + ProjectSection(SolutionItems) = preProject + otel-tests.ps1 = otel-tests.ps1 + otel.runsettings = otel.runsettings + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -62,6 +75,8 @@ Global {B6FDD7DD-6C32-4A87-8304-8DA0A2718E50} = {3B90AC37-1A6B-41AF-8490-E9D48E429ACD} {D97ABCF2-E6C4-4384-AFB7-C55943EBE1E2} = {3B90AC37-1A6B-41AF-8490-E9D48E429ACD} {B73CDEC7-3F67-444E-8A06-16C20DF56DFB} = {3B90AC37-1A6B-41AF-8490-E9D48E429ACD} + {B152D8E1-AD02-4204-8E0D-A475F2A14183} = {4E1645F9-6194-4B1F-B93D-5B2CDDE5E6DE} + {90C6E29D-04F6-427C-8E57-27C57664AC04} = {4E1645F9-6194-4B1F-B93D-5B2CDDE5E6DE} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {148B651C-DFAA-434F-B1ED-51E535FC2DE8} diff --git a/otel-tests.ps1 b/otel-tests.ps1 new file mode 100644 index 00000000..c2ef5393 --- /dev/null +++ b/otel-tests.ps1 @@ -0,0 +1,18 @@ +[CmdletBinding()] +param ( + [switch]$Keep = $false +) + +dotnet publish -r win-x64 -o .\publish + +if (!$Keep) { + Remove-Item .\auto-logs\ -Force -Recurse -ErrorAction Ignore +} + +Push-Location .\publish +try { + dotnet vstest .\GqlPlus.Verifier.*Tests.dll /settings:../otel.runsettings +} +finally { + Pop-Location +} \ No newline at end of file diff --git a/otel.runsettings b/otel.runsettings new file mode 100644 index 00000000..5d6e6370 --- /dev/null +++ b/otel.runsettings @@ -0,0 +1,34 @@ + + + + + x64 + + + 1 + {918728DD-259F-4A6A-AC2B-B85E1B658318} + C:\Dev\graphql-plus\publish\OpenTelemetry.AutoInstrumentation.Native.dll + + C:\Dev\graphql-plus\publish\OpenTelemetry.AutoInstrumentation.StartupHook.dll + OpenTelemetry.AutoInstrumentation.AspNetCoreBootstrapper + + + C:\Dev\graphql-plus\publish\ + false + Xunit.* + true + always_on + 1500 + 2500 + + ..\auto-logs + + + + true + true + + + \ No newline at end of file diff --git a/test/Directory.Build.targets b/test/Directory.Build.targets index aa0be985..224d09aa 100644 --- a/test/Directory.Build.targets +++ b/test/Directory.Build.targets @@ -1,17 +1,10 @@  - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/test/GqlPlus.Verifier.ClassTests/Ast/AstBaseTests.cs b/test/GqlPlus.Verifier.ClassTests/Ast/AstBaseTests.cs index 1b305f2e..8e241ad7 100644 --- a/test/GqlPlus.Verifier.ClassTests/Ast/AstBaseTests.cs +++ b/test/GqlPlus.Verifier.ClassTests/Ast/AstBaseTests.cs @@ -4,6 +4,7 @@ public abstract class AstBaseTests : AstBaseTests { } +[TracePerTest] public abstract class AstBaseTests { [Fact] diff --git a/test/GqlPlus.Verifier.ClassTests/BaseTestWithOpenTelemetry.cs b/test/GqlPlus.Verifier.ClassTests/BaseTestWithOpenTelemetry.cs deleted file mode 100644 index 79f13ab6..00000000 --- a/test/GqlPlus.Verifier.ClassTests/BaseTestWithOpenTelemetry.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Xunit.Extensions.AssemblyFixture; - -[assembly: TestFramework(AssemblyFixtureFramework.TypeName, AssemblyFixtureFramework.AssemblyName)] - -namespace GqlPlus.Verifier; - -public class BaseTestWithOpenTelemetry : IAssemblyFixture -{ -} diff --git a/test/GqlPlus.Verifier.ClassTests/Merging/TestBase.cs b/test/GqlPlus.Verifier.ClassTests/Merging/TestBase.cs index 74d684ed..91628edc 100644 --- a/test/GqlPlus.Verifier.ClassTests/Merging/TestBase.cs +++ b/test/GqlPlus.Verifier.ClassTests/Merging/TestBase.cs @@ -3,6 +3,8 @@ namespace GqlPlus.Verifier.Merging; +[TracePerTest] + public abstract class TestBase where TItem : AstBase { diff --git a/test/GqlPlus.Verifier.ClassTests/Parse/ClassTestBase.cs b/test/GqlPlus.Verifier.ClassTests/Parse/ClassTestBase.cs index a2f1f920..012d78f3 100644 --- a/test/GqlPlus.Verifier.ClassTests/Parse/ClassTestBase.cs +++ b/test/GqlPlus.Verifier.ClassTests/Parse/ClassTestBase.cs @@ -5,6 +5,8 @@ namespace GqlPlus.Verifier.Parse; +[TracePerTest] + public class ClassTestBase { protected static Tokenizer Tokens(string input) diff --git a/test/GqlPlus.Verifier.ClassTests/Result/BaseResultTests.cs b/test/GqlPlus.Verifier.ClassTests/Result/BaseResultTests.cs index 0640feba..6a395993 100644 --- a/test/GqlPlus.Verifier.ClassTests/Result/BaseResultTests.cs +++ b/test/GqlPlus.Verifier.ClassTests/Result/BaseResultTests.cs @@ -1,5 +1,6 @@ namespace GqlPlus.Verifier.Result; +[TracePerTest] public class BaseResultTests { protected const string Sample = "Sample"; diff --git a/test/GqlPlus.Verifier.ClassTests/TokenizerTests.cs b/test/GqlPlus.Verifier.ClassTests/TokenizerTests.cs index 0a5233ed..8aa2ed7c 100644 --- a/test/GqlPlus.Verifier.ClassTests/TokenizerTests.cs +++ b/test/GqlPlus.Verifier.ClassTests/TokenizerTests.cs @@ -3,7 +3,7 @@ namespace GqlPlus.Verifier; [TracePerTest] -public class TokenizerTests : BaseTestWithOpenTelemetry +public class TokenizerTests { private static Tokenizer PrepareTokens(string input) { diff --git a/test/GqlPlus.Verifier.ComponentTests/GqlPlus.Verifier.ComponentTests.csproj b/test/GqlPlus.Verifier.ComponentTests/GqlPlus.Verifier.ComponentTests.csproj index 6cf8a800..5c906da9 100644 --- a/test/GqlPlus.Verifier.ComponentTests/GqlPlus.Verifier.ComponentTests.csproj +++ b/test/GqlPlus.Verifier.ComponentTests/GqlPlus.Verifier.ComponentTests.csproj @@ -5,7 +5,7 @@ - + diff --git a/test/GqlPlus.Verifier.TestBase/GqlPlus.Verifier.TestBase.csproj b/test/GqlPlus.Verifier.TestBase/GqlPlus.Verifier.TestBase.csproj index 576d3307..77d91877 100644 --- a/test/GqlPlus.Verifier.TestBase/GqlPlus.Verifier.TestBase.csproj +++ b/test/GqlPlus.Verifier.TestBase/GqlPlus.Verifier.TestBase.csproj @@ -5,7 +5,11 @@ + + + + diff --git a/test/GqlPlus.Verifier.TestBase/TracePerTestAttribute.cs b/test/GqlPlus.Verifier.TestBase/TracePerTestAttribute.cs index 858f6e28..5ff192b3 100644 --- a/test/GqlPlus.Verifier.TestBase/TracePerTestAttribute.cs +++ b/test/GqlPlus.Verifier.TestBase/TracePerTestAttribute.cs @@ -12,12 +12,30 @@ public override void Before(MethodInfo methodUnderTest) { ActivityLink[]? links = OpenTelemetryFixture.TestRun is not null ? [new(OpenTelemetryFixture.TestRun.Context, new() { - ["test.run_id"] = OpenTelemetryFixture.TestRunId - })] + ["test.run_id"] = OpenTelemetryFixture.TestRunId + })] : null; - Map? tags = new() { ["namespace"] = methodUnderTest.DeclaringType?.Namespace }; - var name = methodUnderTest.DeclaringType?.ExpandTypeName().Suffixed(".") + methodUnderTest.Name; - _activity = OpenTelemetryFixture.ActivitySource.StartActivity(ActivityKind.Internal, name: name, links: links, tags: tags, parentContext: new ActivityContext()); + + var testClass = methodUnderTest.ReflectedType?.ExpandTypeName(); + var testNamespace = methodUnderTest.ReflectedType?.Namespace; + var testMethod = methodUnderTest.Name; + + Map? tags = new() { + ["namespace"] = testNamespace, + ["class"] = testClass, + ["method"] = testMethod, + }; + + if (methodUnderTest.DeclaringType != methodUnderTest.ReflectedType) { + tags["declared-in"] = methodUnderTest.DeclaringType?.FullTypeName(testNamespace); + } + + _activity = OpenTelemetryFixture.ActivitySource.StartActivity( + ActivityKind.Internal, + name: testClass.Suffixed(".") + testMethod, + links: links, + tags: tags, + parentContext: new ActivityContext()); base.Before(methodUnderTest); }