using SQLInsight.Core.Data; namespace SQLInsight.Collectors.Performance; public sealed class WaitStatsCollector : Collector> { internal const string Sql2005 = """ SELECT wait_type, waiting_tasks_count, wait_time_ms, signal_wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_time_ms > 0 """; // SQL Server 2000: Wait Type, Requests, Wait Time, Signal Wait Time. Needs elevated rights; see docs/legacy-versions.md. internal const string Sql2000 = "DBCC SQLPERF(WAITSTATS) WITH NO_INFOMSGS"; public override string Name => "wait-stats"; public override TimeSpan DefaultInterval => TimeSpan.FromMinutes(5); protected override async Task> CollectAsync( CollectorContext context, CumulativeSample? previous) { var version = context.Instance.Version; var ct = context.CancellationToken; var startTime = await Db.StartTimeAsync(context.Connection, version, ct).ConfigureAwait(false); var waits = await Db.QueryAsync( context.Connection, version.Major >= 9 ? Sql2005 : Sql2000, r => new WaitStat(r.String(0), r.Long(1), r.Long(2), r.Long(3)), ct).ConfigureAwait(false); var snapshot = new WaitStatsSnapshot { CapturedAt = context.Now, SqlServerStartTime = startTime, Waits = waits }; return new(snapshot, WaitStatsDelta.Compute(previous?.Snapshot, snapshot)); } }