63 lines
2.8 KiB
C#
63 lines
2.8 KiB
C#
// Redacted aggregate summary. Keep raw traces local.
|
|
using Microsoft.Diagnostics.Tracing;
|
|
using System.Text.Json;
|
|
|
|
var starts = new Dictionary<string, int>();
|
|
var tiers = new Dictionary<string, int>();
|
|
var nativeBytes = new Dictionary<string, long>();
|
|
var factoryNames = new Dictionary<string, int>();
|
|
var factoryTokens = new HashSet<int>();
|
|
var factoryModules = new HashSet<long>();
|
|
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 }));
|