sqlinsight-pro/src/SQLInsight.Core/Data/MiscSnapshots.cs
Claude 63f23c4bbd
Some checks are pending
CI / Integration (mcr.microsoft.com/mssql/server:2017-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2019-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2022-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2025-latest) (push) Blocked by required conditions
CI / Build og unit tests (push) Waiting to run
Fase 1: collectors and rule pack (41 rules)
Collectors (SQL Server 2000+, version-specific SQL, least privilege):
server, configuration, trace flags, databases (settings, backups in UTC,
CHECKDB, VLFs, Query Store, files, tempdb), suspect pages, plan cache,
wait stats and file I/O as deltas with restart/clear detection,
performance counters, CPU from the scheduler monitor ring buffer,
blocking (sleeping head blockers with open transactions), and deadlocks
from system_health continuing from the last file offset.

Rules: configuration (memory, MAXDOP per Microsoft NUMA guidance, cost
threshold, ad hoc bloat, risky options, pending changes), databases
(state, settings, backups, log backups, CHECKDB, suspect pages, VLFs,
autogrowth, max size, Query Store, tempdb), waits (THREADPOOL, signal
waits, locks, I/O, WRITELOG, parallelism, PAGELATCH), I/O latency, CPU,
memory grants, blocking and deadlocks. Missing data makes a rule not
measurable with the collector's reason.

Integration tests run every collector as the least-privilege login and
reproduce real blocking and a real deadlock; green on 2017 and 2022.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E3EExwndy8Z22EK2Qpt6BK
2026-09-29 06:17:08 +00:00

36 lines
1.4 KiB
C#

namespace SQLInsight.Core.Data;
/// <summary>
/// Globally enabled trace flags (<c>DBCC TRACESTATUS(-1)</c>).
/// </summary>
public sealed record TraceFlagSnapshot(DateTimeOffset CapturedAt, IReadOnlyList<int> GlobalTraceFlags)
{
public bool IsEnabled(int flag) => GlobalTraceFlags.Contains(flag);
}
/// <summary>
/// Pages SQL Server has recorded as damaged (<c>msdb.dbo.suspect_pages</c>, 823/824/825 errors).
/// </summary>
public sealed record SuspectPageSnapshot(DateTimeOffset CapturedAt, IReadOnlyList<SuspectPage> Pages);
/// <param name="EventType">1: 823/824 error, 2: bad checksum, 3: torn page, 4: restored, 5: repaired, 7: deallocated.</param>
public sealed record SuspectPage(string DatabaseName, int FileId, long PageId, int EventType, int ErrorCount, DateTime LastUpdate)
{
/// <summary>Event types 4, 5 and 7 mean the page has been fixed.</summary>
public bool IsUnresolved => EventType is 1 or 2 or 3;
}
/// <summary>
/// Plan cache composition (<c>sys.dm_exec_cached_plans</c>).
/// </summary>
public sealed record PlanCacheSnapshot
{
public required DateTimeOffset CapturedAt { get; init; }
public required long TotalPlans { get; init; }
public required double TotalMb { get; init; }
/// <summary>Ad hoc plans used exactly once. A high share means plan cache bloat.</summary>
public required long SingleUseAdhocPlans { get; init; }
public required double SingleUseAdhocMb { get; init; }
}