// Redacted aggregate summary. Keep raw traces local. using Microsoft.Diagnostics.Tracing; using System.Text.Json; var starts = new Dictionary(); var tiers = new Dictionary(); var nativeBytes = new Dictionary(); var factoryNames = new Dictionary(); var factoryTokens = new HashSet(); var factoryModules = new HashSet(); var firstFactoryMs = double.PositiveInfinity; var lastFactoryMs = 0d; var factoryNativeBytes = 0L; var sdkAssemblyLoads = 0; using var source = new EventPipeEventSource(args[0]); source.Clr.MethodJittingStarted += data => { var name = data.MethodNamespace + "." + data.MethodName; starts[name] = starts.GetValueOrDefault(name) + 1; if (!name.StartsWith("Opc.Ua.OpcUaExtensions.", StringComparison.Ordinal)) return; factoryNames[name] = factoryNames.GetValueOrDefault(name) + 1; factoryTokens.Add(data.MethodToken); factoryModules.Add(data.ModuleID); firstFactoryMs = Math.Min(firstFactoryMs, data.TimeStampRelativeMSec); lastFactoryMs = Math.Max(lastFactoryMs, data.TimeStampRelativeMSec); }; source.Clr.MethodLoadVerbose += data => { var tier = data.OptimizationTier.ToString(); tiers[tier] = tiers.GetValueOrDefault(tier) + 1; nativeBytes[tier] = nativeBytes.GetValueOrDefault(tier) + data.MethodSize; if (data.MethodNamespace == "Opc.Ua.OpcUaExtensions") factoryNativeBytes += data.MethodSize; }; source.Clr.LoaderAssemblyLoad += data => { if (data.FullyQualifiedAssemblyName.StartsWith("Opc.Ua.", StringComparison.Ordinal)) sdkAssemblyLoads++; }; source.Process(); Console.WriteLine(JsonSerializer.Serialize(new { traceStartUtc = source.SessionStartTime.ToUniversalTime(), traceEndUtc = source.SessionEndTime.ToUniversalTime(), eventsLost = source.EventsLost, sdkAssemblyLoads, jittingStarts = starts.Values.Sum(), // Name keys omit generic signatures; token/module counts independently identify the factory set. distinctNameKeys = starts.Count, opcUaJittingStarts = starts.Where(x => x.Key.StartsWith("Opc.Ua.", StringComparison.Ordinal)).Sum(x => x.Value), invokeStubStarts = starts.Where(x => x.Key.StartsWith("dynamicClass.InvokeStub", StringComparison.Ordinal)).Sum(x => x.Value), tiers, summedLoadedNativeMethodBytes = nativeBytes, factory = new { starts = factoryNames.Values.Sum(), distinctNames = factoryNames.Count, distinctTokens = factoryTokens.Count, moduleCount = factoryModules.Count, everyNameOnce = factoryNames.Values.All(x => x == 1), firstMs = double.IsFinite(firstFactoryMs) ? (double?)firstFactoryMs : null, lastMs = factoryNames.Count == 0 ? (double?)null : lastFactoryMs, summedLoadedNativeMethodBytes = factoryNativeBytes, examples = factoryNames.Keys.Take(10).ToArray() } }, new JsonSerializerOptions { WriteIndented = true }));