From: David Mason Date: Fri, 16 Feb 2024 19:17:14 +0000 (-0800) Subject: Change provider defaults for dotnet-trace (#4512) X-Git-Tag: accepted/tizen/unified/20241231.014852~40^2~196 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5eb514a41f900ac1aa1e9a3e12b2931dcb064069;p=platform%2Fcore%2Fdotnet%2Fdiagnostics.git Change provider defaults for dotnet-trace (#4512) --- diff --git a/src/Tools/dotnet-trace/Extensions.cs b/src/Tools/dotnet-trace/Extensions.cs index 2eca2eeed..d73cadcb7 100644 --- a/src/Tools/dotnet-trace/Extensions.cs +++ b/src/Tools/dotnet-trace/Extensions.cs @@ -14,7 +14,9 @@ namespace Microsoft.Diagnostics.Tools.Trace { public static string CLREventProviderName = "Microsoft-Windows-DotNETRuntime"; - private static EventLevel defaultEventLevel = EventLevel.Verbose; + private const EventLevel defaultEventLevel = EventLevel.Informational; + private const long defaultKeywords = 0; + // Keep this in sync with runtime repo's clretwall.man private static Dictionary CLREventKeywords = new(StringComparer.InvariantCultureIgnoreCase) { @@ -55,15 +57,53 @@ namespace Microsoft.Diagnostics.Tools.Trace { "typediagnostic", 0x8000000000 }, }; - public static List ToProviders(string providers) + public static List ToProviders(string providersRawInput) { - if (providers == null) + if (providersRawInput == null) + { + throw new ArgumentNullException(nameof(providersRawInput)); + } + + if (string.IsNullOrWhiteSpace(providersRawInput)) { - throw new ArgumentNullException(nameof(providers)); + return new List(); } - return string.IsNullOrWhiteSpace(providers) ? - new List() : providers.Split(',').Select(ToProvider).ToList(); + IEnumerable providers = providersRawInput.Split(',').Select(ToProvider).ToList(); + + // Dedupe the entries + providers = providers.GroupBy(p => p.Name) + .Select(p => { + string providerName = p.Key; + EventLevel providerLevel = EventLevel.Critical; + long providerKeywords = 0; + IDictionary providerFilterArgs = null; + + foreach (EventPipeProvider currentProvider in p) + { + providerKeywords |= currentProvider.Keywords; + + if ((currentProvider.EventLevel == EventLevel.LogAlways) + || (providerLevel != EventLevel.LogAlways && currentProvider.EventLevel > providerLevel)) + { + providerLevel = currentProvider.EventLevel; + } + + if (currentProvider.Arguments != null) + { + if (providerFilterArgs != null) + { + throw new ArgumentException($"Provider \"{providerName}\" is declared multiple times with filter arguments."); + } + + providerFilterArgs = currentProvider.Arguments; + } + } + + return new EventPipeProvider(providerName, providerLevel, providerKeywords, providerFilterArgs); + }); + + return providers.ToList(); } public static EventPipeProvider ToCLREventPipeProvider(string clreventslist, string clreventlevel) @@ -151,7 +191,7 @@ namespace Microsoft.Diagnostics.Tools.Trace // Keywords long keywords = tokens.Length > 1 && !string.IsNullOrWhiteSpace(tokens[1]) ? - Convert.ToInt64(tokens[1], 16) : -1; + Convert.ToInt64(tokens[1], 16) : defaultKeywords; // Level EventLevel eventLevel = tokens.Length > 2 && !string.IsNullOrWhiteSpace(tokens[2]) ? diff --git a/src/tests/dotnet-trace/ProfileProviderMerging.cs b/src/tests/dotnet-trace/ProfileProviderMerging.cs index c01860810..606fa24e5 100644 --- a/src/tests/dotnet-trace/ProfileProviderMerging.cs +++ b/src/tests/dotnet-trace/ProfileProviderMerging.cs @@ -36,9 +36,9 @@ namespace Microsoft.Diagnostics.Tools.Trace EventPipeProvider enabledProvider = parsedProviders.SingleOrDefault(p => p.Name == "Microsoft-Windows-DotNETRuntime"); // Assert that our specified provider overrides the version in the profile - Assert.True(enabledProvider.Keywords == (long)(-1)); - Assert.True(enabledProvider.EventLevel == EventLevel.Verbose); - Assert.True(enabledBy[enabledProvider.Name] == "--providers"); + Assert.Equal((long)(0), enabledProvider.Keywords); + Assert.Equal(EventLevel.Informational, enabledProvider.EventLevel); + Assert.Equal("--providers", enabledBy[enabledProvider.Name]); } } } diff --git a/src/tests/dotnet-trace/ProviderParsing.cs b/src/tests/dotnet-trace/ProviderParsing.cs index c71167a3e..bab3b6fb0 100644 --- a/src/tests/dotnet-trace/ProviderParsing.cs +++ b/src/tests/dotnet-trace/ProviderParsing.cs @@ -71,18 +71,18 @@ namespace Microsoft.Diagnostics.Tools.Trace } [Theory] - [InlineData("VeryCoolProvider::5:FilterAndPayloadSpecs=\"QuotedValue\"")] + [InlineData("VeryCoolProvider::4:FilterAndPayloadSpecs=\"QuotedValue\"")] [InlineData("VeryCoolProvider:::FilterAndPayloadSpecs=\"QuotedValue\"")] public void ValidProviderEventLevel_CorrectlyParses(string providerToParse) { List parsedProviders = Extensions.ToProviders(providerToParse); - Assert.True(parsedProviders.Count == 1); + Assert.Equal(1, parsedProviders.Count); EventPipeProvider provider = parsedProviders.First(); - Assert.True(provider.Name == "VeryCoolProvider"); - Assert.True(provider.Keywords == (long)(-1)); - Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); - Assert.True(provider.Arguments.Count == 1); - Assert.True(provider.Arguments["FilterAndPayloadSpecs"] == "QuotedValue"); + Assert.Equal("VeryCoolProvider", provider.Name); + Assert.Equal(0, provider.Keywords); + Assert.Equal(System.Diagnostics.Tracing.EventLevel.Informational, provider.EventLevel); + Assert.Equal(1, provider.Arguments.Count); + Assert.Equal("QuotedValue", provider.Arguments["FilterAndPayloadSpecs"]); } [Theory] @@ -306,5 +306,36 @@ namespace Microsoft.Diagnostics.Tools.Trace { Assert.Throws(() => Extensions.ToProviders(providerToParse)); } + + [Theory] + [InlineData("DupeProvider,DupeProvider:0xF:LogAlways")] + public void DeDupeProviders_DefaultAndSpecified(string providersToParse) + { + List parsedProviders = Extensions.ToProviders(providersToParse); + Assert.Equal("DupeProvider", parsedProviders.First().Name); + Assert.Equal(1, parsedProviders.Count); + Assert.Equal(0xF, parsedProviders.First().Keywords); + Assert.Equal(System.Diagnostics.Tracing.EventLevel.LogAlways, parsedProviders.First().EventLevel); + Assert.Null(parsedProviders.First().Arguments); + } + + [Theory] + [InlineData("DupeProvider:0xF0:Informational,DupeProvider:0xF:Verbose")] + public void DeDupeProviders_BothSpecified(string providersToParse) + { + List parsedProviders = Extensions.ToProviders(providersToParse); + Assert.Equal("DupeProvider", parsedProviders.First().Name); + Assert.Equal(1, parsedProviders.Count); + Assert.Equal(0xFF, parsedProviders.First().Keywords); + Assert.Equal(System.Diagnostics.Tracing.EventLevel.Verbose, parsedProviders.First().EventLevel); + Assert.Null(parsedProviders.First().Arguments); + } + + [Theory] + [InlineData("DupeProvider:::key=value,DupeProvider:::key=value")] + public void DeDupeProviders_FilterDataThrows(string providersToParse) + { + Assert.Throws(() => Extensions.ToProviders(providersToParse)); + } } }