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
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
68 lines
2.5 KiB
C#
68 lines
2.5 KiB
C#
using SQLInsight.Collectors.Concurrency;
|
||
using SQLInsight.Collectors.Databases;
|
||
using SQLInsight.Core.Instances;
|
||
|
||
namespace SQLInsight.Collectors.Tests;
|
||
|
||
/// <summary>
|
||
/// The version-specific SQL that cannot be run in CI (SQL Server 2000–2016 have no containers).
|
||
/// </summary>
|
||
public class SqlSelectionTests
|
||
{
|
||
private static InstanceInfo Instance(string version) => new()
|
||
{
|
||
ServerName = "x",
|
||
Version = SqlServerVersion.Parse(version),
|
||
Edition = "Standard",
|
||
EngineEdition = EngineEdition.Standard,
|
||
};
|
||
|
||
[Theory]
|
||
[InlineData("8.00.2039", "master.dbo.sysprocesses WHERE spid = 1")]
|
||
[InlineData("9.00.5000.00", "sys.databases WHERE database_id = 2")]
|
||
[InlineData("10.50.6000.34", "sqlserver_start_time")]
|
||
public void Start_time_source_per_version(string version, string expected)
|
||
{
|
||
Assert.Contains(expected, Db.StartTimeExpression(SqlServerVersion.Parse(version)), StringComparison.Ordinal);
|
||
}
|
||
|
||
[Fact]
|
||
public void Blocking_on_2008_counts_transactions_without_open_transaction_count()
|
||
{
|
||
var sql = BlockingCollector.BuildSql2005(SqlServerVersion.Parse("10.50.6000.34"));
|
||
|
||
Assert.Contains("sys.dm_tran_session_transactions", sql, StringComparison.Ordinal);
|
||
Assert.DoesNotContain("open_transaction_count", sql, StringComparison.Ordinal);
|
||
Assert.DoesNotContain("s.database_id", sql, StringComparison.Ordinal);
|
||
}
|
||
|
||
[Fact]
|
||
public void Databases_on_2012_detect_availability_groups_and_skip_checkdb_property()
|
||
{
|
||
var instance = Instance("11.0.7001.0");
|
||
|
||
var sql = DatabaseCollector.BuildSql2005(instance, InstanceCapabilities.From(instance));
|
||
|
||
Assert.Contains("sys.dm_hadr_database_replica_states", sql, StringComparison.Ordinal);
|
||
Assert.DoesNotContain("LastGoodCheckDbTime", sql, StringComparison.Ordinal);
|
||
}
|
||
|
||
[Fact]
|
||
public void Databases_on_2005_do_not_touch_hadr()
|
||
{
|
||
var instance = Instance("9.00.5000.00");
|
||
|
||
var sql = DatabaseCollector.BuildSql2005(instance, InstanceCapabilities.From(instance));
|
||
|
||
Assert.DoesNotContain("hadr", sql, StringComparison.OrdinalIgnoreCase);
|
||
Assert.DoesNotContain("replica_id", sql, StringComparison.Ordinal);
|
||
}
|
||
|
||
[Fact]
|
||
public void Deadlock_file_read_continues_from_last_position_with_escaped_literal()
|
||
{
|
||
var sql = DeadlockCollector.BuildFileSql("/var/opt/mssql/log/system_health_0_1'2.xel", 12345);
|
||
|
||
Assert.Contains("N'/var/opt/mssql/log/system_health_0_1''2.xel', 12345", sql, StringComparison.Ordinal);
|
||
}
|
||
}
|