Open-source SQL Server performance monitoring using only SQL Server for storage. Collects query stats, wait times, and blocking chains every 30 seconds via .NET service. Pre-configured Grafana dashboards. Simple architecture: SQL Server → Collector → SQL Server → Grafana. MIT licensed.
Find a file
Søren Eggert Lundsteen Olsen 0dc7866808 Separate "check by hand" from "not relevant" for version-gated rules
A rule whose topic applies but whose way of measuring needs a newer
version or patch now gives the new outcome ManualCheck with concrete
Danish guidance, instead of NotApplicable. It is marked explicitly per
rule (IRule.ManualCheck) and only used when every missing capability is
a measurement capability (InstanceCapabilities.IsMeasurement): CHECKDB
status (SQLI-DB-009), VLFs (SQLI-DB-011), spills and memory grants
(SQLI-PLAN-004/005) and deadlocks on 2005 (SQLI-DLK-001). Query Store,
AG and Azure-managed topics stay "not relevant".

Shown in a visible "Skal tjekkes manuelt" section on the instance page,
a KPI on the overview, a "Tjek manuelt" column in the management
report's controls, manualChecks in /api/v1/instances and manualCheck in
rule-states; not counted as not measurable.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 09:59:50 +02:00
.forgejo Hub: support case numbers, customer case API, mail, support report 2026-10-01 11:33:55 +02:00
db/permissions Privilege audit: sysadmin and server roles with AD unfolding 2026-10-02 08:39:56 +02:00
deploy forum configure.py: survive nginx's 429 without a JSON body 2026-09-30 10:44:35 +02:00
docs Separate "check by hand" from "not relevant" for version-gated rules 2026-10-02 09:59:50 +02:00
installer Installer creates the repository database, logins and rights itself 2026-10-01 08:18:26 +02:00
rules/community Long operations, full-text rules and statement activity 2026-10-02 09:07:29 +02:00
src Separate "check by hand" from "not relevant" for version-gated rules 2026-10-02 09:59:50 +02:00
tests Separate "check by hand" from "not relevant" for version-gated rules 2026-10-02 09:59:50 +02:00
tools/SQLInsight.LicenseTool Community-websted og Discourse-forum 2026-09-29 13:45:06 +00:00
.dockerignore Fase 3: data processing, hub retention and deployment 2026-09-29 09:29:20 +00:00
.editorconfig Fase 0: solution structure, capability model, rule engine, least-privilege script 2026-09-29 05:40:49 +00:00
.gitignore MSI installer for Agent and Web 2026-09-29 11:31:28 +00:00
CODE_OF_CONDUCT.md Fase 0: solution structure, capability model, rule engine, least-privilege script 2026-09-29 05:40:49 +00:00
CONTRIBUTING.md Fase 4: community and local rules written as SQL 2026-09-29 10:23:01 +00:00
Directory.Build.props Version 1.0.4: own deadlocks fixed, AX rules find bmssa tables 2026-10-02 07:40:20 +02:00
Directory.Packages.props API v1: findings, rules, reports and page data as JSON, with OpenAPI 2026-10-02 09:27:10 +02:00
dotnet-tools.json Hub: support case numbers, customer case API, mail, support report 2026-10-01 11:33:55 +02:00
global.json Fase 0: solution structure, capability model, rule engine, least-privilege script 2026-09-29 05:40:49 +00:00
LICENSE Initial commit 2025-10-19 18:37:51 +02:00
README.md Long operations, full-text rules and statement activity 2026-10-02 09:07:29 +02:00
SQLInsight.slnx Community-websted og Discourse-forum 2026-09-29 13:45:06 +00:00

SQLInsight Pro

Gratis, on-prem overvågning af SQL Server med dyb ekspertise indbygget. Betalt support til dem der har brug for det.

SQLInsight Pro er et overvågningsværktøj til Microsoft SQL Server, skrevet i C# på .NET. Det kører hos kunden og forlader ikke netværket, medmindre kunden selv vælger det. Værktøjet nøjes ikke med at vise tal. Det forklarer, hvad der er galt, hvorfor det er et problem, og hvordan det løses. Rådene har samme niveau som dem, man får fra en erfaren DBA.

Status: Fase 1–4 er implementeret: agent, 66 indbyggede regler plus community-regler, notifikationer, lokalt repository og web-UI, licenser, signerede opdateringer, SQLInsight Hub med portal, erfaring på tværs af kunder, PDF-rapporter og integration med Prometheus, Grafana og SCOM, plus MSI-installer, community-websted og Discourse-forum. Se installation, opdateringer, integration, rapporter, egne regler, databehandling, community, Roadmap og CONTRIBUTING.md.


Vision

De fleste gratis værktøjer til SQL Server kan vise, at noget er galt, fx blocking, høj CPU eller lange ventetider. Men de siger sjældent hvorfor, og endnu sjældnere hvad man skal gøre. De kommercielle værktøjer er dyre og låser ofte den vigtigste viden bag en licens.

SQLInsight Pro vil gøre det anderledes:

  1. Hele produktet er gratis. Overvågning, analyse og anbefalinger koster ikke noget. Vi fjerner ikke funktioner for at sælge en betalt version.
  2. Dyb SQL Server-ekspertise. Hvert fund kommer med en forklaring, en vurdering af alvor, konkret evidens og et forslag til løsning, fx et script, en konfiguration eller en ændring af et index.
  3. On-prem først. Agenten, databasen og web-UI'et kører i kundens eget miljø. Der sendes ingen data ud, uden at kunden aktivt har slået det til.
  4. Altid opdateret. Selve værktøjet og regel-/vidensbasen opdateres løbende, så nye SQL Server-versioner, CU'er og kendte fejl bliver dækket.
  5. Betalt support er en service, ikke en funktion. Kunder, der betaler, får adgang til mennesker med prioritet, og ikke til flere knapper i programmet.

Forretningsmodel

Community Professional Enterprise
Pris Gratis Abonnement Abonnement
Al overvågning og analyse ✅ ✅ ✅
Opdateringer af værktøj og regelpakker ✅ ✅ ✅
Community support (forum) ✅ ✅ ✅
Prioriteret mailsupport med svartidsgaranti – ✅ ✅
Telefonsupport – – ✅
Findings-sync til SQLInsight Hub (proaktiv opfølgning) – Valgfrit ✅
Hjælp til fortolkning af fund og tuning – Begrænset ✅

Professional og Enterprise låser ikke op for funktioner i softwaren. De giver adgang til ekspertise og svartid. Når en betalende kunde slår findings-sync til, kan supportteamet se kundens aktuelle problemer, før kunden ringer.


Hvad analyseres? (dyb ekspertise, ikke kun låsninger)

Blocking og deadlocks er kun ét område. Regelmotoren dækker hele SQL Server-instansen:

Performance

  • Wait statistics med fortolkning (hvilke waits er normale, og hvilke peger på et reelt problem)
  • Blocking-kæder, head blockers og deadlock-grafer med analyse af årsagen
  • Query Store: plan-regressioner, forcerede planer der fejler, og queries med høj varians
  • Parameter sniffing og planer, der er følsomme over for parametre
  • Plan cache-analyse: implicitte konverteringer, key lookups, spills, manglende statistikker og for store memory grants
  • CPU-pres, scheduler-pres og worker thread exhaustion
  • Memory grants, RESOURCE_SEMAPHORE og buffer pool-pres
  • I/O-latens pr. fil og pr. database
  • TempDB-contention (PFS/GAM/SGAM) og konfiguration af TempDB

Indexes og statistikker

  • Manglende indexes, vurderet kritisk (ikke bare DMV-forslagene ukritisk videregivet)
  • Ubrugte, duplikerede og overlappende indexes
  • Forældede statistikker og ascending key-problemer
  • Heaps med forwarded records

Konfiguration og best practice

  • MAXDOP, cost threshold for parallelism, max server memory og optimize for ad hoc workloads
  • Database scoped configurations og compatibility level
  • Antal VLF'er, autogrowth-indstillinger og placering af filer
  • Trace flags og deres relevans for den aktuelle version

Drift og sikkerhed for data

  • Backup-dækning og RPO i forhold til recovery model
  • Status for DBCC CHECKDB og tegn på korruption (suspect pages, 823/824/825)
  • Sundhed for Always On Availability Groups (send/redo queue, synkroniseringsstatus)
  • SQL Agent-jobs der fejler, og vigtige fejl i error log

Version og patch-niveau

  • Registrering af SQL Server-version, edition og CU-niveau
  • Advarsel ved manglende CU'er eller sikkerhedsopdateringer og ved versioner, der ikke længere supporteres
  • Kendte fejl, der rammer den installerede build, med link til Microsofts dokumentation

Hvert finding indeholder:

  • Titel og alvor (Info / Lav / Middel / Høj / Kritisk)
  • Evidens: de konkrete målinger, queries eller objekter, der udløste fundet
  • Forklaring: hvorfor det er et problem, skrevet så både DBA'er og udviklere kan følge med
  • Anbefaling: konkrete trin og, hvor det giver mening, et script (som aldrig køres automatisk)
  • Referencer: Microsoft Learn og anden anerkendt dokumentation

Arkitektur

 ┌──────────────────────── Kundens netværk (on-prem) ────────────────────────┐
 │                                                                           │
 │  ┌───────────────┐   DMV'er, Query Store,   ┌──────────────────────────┐  │
 │  │ SQL Server(e) │◄──Extended Events───────►│  SQLInsight Agent        │  │
 │  └───────────────┘                          │  (Windows Service /      │  │
 │                                             │   Linux systemd)         │  │
 │                                             │  • Collectors            │  │
 │                                             │  • Regelmotor + regelpak.│  │
 │                                             └────────────┬─────────────┘  │
 │                                                          │                │
 │                                             ┌────────────▼─────────────┐  │
 │                                             │  Lokalt repository       │  │
 │                                             │  (SQL Server-database)   │  │
 │                                             └────────────┬─────────────┘  │
 │                                                          │                │
 │                                             ┌────────────▼─────────────┐  │
 │                                             │  SQLInsight Web          │  │
 │                                             │  (ASP.NET Core + Blazor) │  │
 │                                             └────────────┬─────────────┘  │
 └──────────────────────────────────────────────────────────┼────────────────┘
                                                            │ HTTPS (opt-in,
                                                            │ kun betalende)
                                               ┌────────────▼─────────────┐
                                               │  SQLInsight Hub          │
                                               │  Ingestion API           │
                                               │  (ASP.NET Core)          │
                                               └────────────┬─────────────┘
                                                            │
                                               ┌────────────▼─────────────┐
                                               │  PostgreSQL              │
                                               │  Findings fra alle       │
                                               │  betalende kunder        │
                                               └──────────────────────────┘

Komponenter

Komponent Teknologi Ansvar
SQLInsight.Agent .NET Worker Service Indsamler data, kører regelmotoren og gemmer fund lokalt
SQLInsight.Rules C#-bibliotek + versionerede regelpakker Den samlede SQL Server-ekspertise som testbare regler
SQLInsight.Web ASP.NET Core + Blazor Dashboard, fund, historik, trends og administration
SQLInsight.Updates .NET-bibliotek Signeret opdateringsfeed: regelpakker, programpakker, verifikation og installation med tilbagerulning (SQLInsight.Agent update …)
SQLInsight.Licensing .NET-bibliotek Signerede licenser og manifester (ECDSA P-256), verificeret offline
SQLInsight.Hub ASP.NET Core + EF Core (Npgsql) + Blazor Centralt API, der modtager fund fra betalende kunder og skriver dem til PostgreSQL, og den interne portal: hvilke kunder har hvilke problemer, og hvor alvorlige er de?
SQLInsight.LicenseTool .NET-konsol (kun hos SEOSoft) Nøglepar, licenser, regelpakker og udgivelse af opdateringsfeedet

Designprincipper

  • Least privilege, aldrig sysadmin. Agenten ændrer aldrig noget på de overvågede servere. Rettighederne leveres som ét versionsafhængigt script:
    • VIEW SERVER STATE. På SQL Server 2022+ bruges de mere granulære VIEW SERVER PERFORMANCE STATE og VIEW SERVER SECURITY STATE.
    • VIEW DATABASE STATE i hver database, som Query Store-data skal læses fra.
    • Læseadgang til msdb, som giver backup-historik og SQL Agent-jobs.
    • Seneste gode CHECKDB læses med DATABASEPROPERTYEX(..., 'LastGoodCheckDbTime') og ikke med DBCC DBINFO, som kræver sysadmin.
    • Tjenesten kører som gMSA med Windows-autentificering. SQL-login understøttes kun, hvor det er nødvendigt.
  • Lav overhead, målt og ikke antaget.
    • Alle DMV-queries kører med SET LOCK_TIMEOUT, SET DEADLOCK_PRIORITY LOW, korte command timeouts og READ UNCOMMITTED.
    • Tunge kilder hentes i trin med en grænse for rækker og bytes. Det gælder især plan cache med showplan-XML og sys.dm_db_index_physical_stats, der altid bruges i LIMITED-mode.
    • Kumulative tællere som wait stats, file stats og query stats lagres som deltaer mellem snapshots. Tidspunktet for genstart af instansen gemmes, så en genstart ikke giver fejlagtige tal.
    • Deadlocks hentes fra den eksisterende system_health-session, før der oprettes egne Extended Events-sessioner.
  • Repository på en separat instans. Overvågningsdata bør ikke ligge på den instans, der overvåges. SQL Server Express kan bruges til små installationer, men har en grænse på 10 GB pr. database. Der er derfor en fast retention-politik og aggregering af ældre data.
  • Krypterede forbindelser som standard. Microsoft.Data.SqlClient bruger Encrypt=True. Installeren validerer certifikaterne, og TrustServerCertificate kræver et bevidst valg.
  • Findings-sync er opt-in og gennemsigtig. Kunden kan se præcis, hvad der sendes. Som standard sendes kun fund og metadata, ikke data fra tabellerne. Querytekst kan anonymiseres eller udelades. Forbindelsen er TLS-krypteret og autentificeret med kundens licensnøgle.
  • Hub'en er aldrig en direkte databaseforbindelse. Agenten taler med et HTTPS-API og aldrig direkte med PostgreSQL.
  • Regler er data med tests. Hver regel har unit tests med kendte input og forventede fund, så ekspertisen kan udbygges uden regressioner.
  • Opdateringer er signerede og kontrollerede. Både binære filer og regelpakker er kodesignerede og verificeres, før de installeres. On-prem-kunder vælger selv mellem automatisk opdatering, opdatering efter godkendelse og offline-pakker til air-gapped miljøer. Hver opdatering af databaseskemaet kan rulles tilbage.
  • Build- og CU-katalog er data. Oversigten over SQL Server-builds, CU'er, support-livscyklus og kendte fejl ligger i regelpakken. Den kan derfor opdateres, uden at der skal frigives en ny version af selve værktøjet.

Roadmap

Fase 0: Fundament

  • Solution-struktur (.NET 10 LTS): Agent, Rules, Web, Hub, fælles domænemodel
  • CI-pipeline til Forgejo Actions (build, test, statisk analyse). Endnu ikke kørt på en runner
  • Integrationstests mod rigtige SQL Server-containere (2017, 2019, 2022 og 2025) med Testcontainers. Indtil videre verificeret på 2022. Versionerne 2000–2016 findes ikke som containere og testes på VM'er
  • Least-privilege-script til opsætning af rettigheder og en test, der verificerer det
  • Capability-model: collectors og regler angiver, hvilken minimumsversion, edition og funktion de kræver
  • Spike: forbindelse til SQL Server 2000, 2005 og 2008 (driver, TLS 1.0 og ODBC-fallback). Resultatet afgør, om legacy-laget er et separat modul. ODBC-fallback er bygget, men ikke verificeret. Se docs/legacy-versions.md
  • Testmiljø med VM'er til de legacy-versioner, der ikke findes som containere (2000–2016)
  • Datamodel for findings (fælles kontrakt mellem Agent og Hub)
  • Bidragsguide, code of conduct og issue templates

Fase 1: Community MVP

  • Agent som Windows Service (og systemd) med forbindelse til en eller flere SQL Server-instanser, parallelt og isoleret
  • Collectors: wait stats, blocking, deadlocks (system_health), CPU, hukommelse, I/O-latens, konfiguration, databaser, backups, CHECKDB, VLF'er, Query Store, tempdb, trace flags, suspect pages og plan cache
  • Regelmotor med 42 regler, som hver har forklaring, evidens, anbefaling og eventuelt et fix-script
  • Lokalt repository med migrationer, sporing af fund (set første gang, senest, løst), timeaggregering og retention
  • Web-UI: oversigt, fund, detaljer, trends, ventetider, I/O, blocking og deadlocks (.xdl). Kan køre på IIS eller som Windows-tjeneste, med Windows-login
  • Registrering af version og CU-niveau med advarsel om manglende opdateringer (katalog pr. september 2026)
  • Legacy-collectors til 2000/2005/2008: versionsspecifik SQL er skrevet og unit-testet, men ikke kørt mod rigtige instanser (kræver VM'er, se Fase 0)
  • Installationsvejledning (docs/installation.md)
  • MSI-installer: agent og web som Windows-tjenester, indbygget .NET, installationsguide eller stille installation med parametre, opgradering, der bevarer indstillinger, og valgfri opdateringsopgave. Bygges på Linux (wixl) og i CI. Afprøvet under Wine, endnu ikke på en rigtig Windows Server

Fase 2: Dyb analyse

  • Query Store: planregressioner (med script til at forcere den gode plan), forcerede planer der fejler, og parameterfølsomme forespørgsler
  • Plananalyse af de tungeste statements: implicitte konverteringer, joins uden betingelse, skalare UDF'er, spills og overdimensionerede memory grants
  • Indexes og statistik: manglende indexes (vurderet mod eksisterende), ubrugte, duplikerede, heaps med forwarded records, forældede statistikker og slået-fra auto-statistik
  • Always On availability groups (sundhed, datatab, redo-tid) og SQL Agent-jobs (fejl med trinbesked, Agent stoppet)
  • Baselines pr. time på ugen og anomalier (CPU, trafik der stiger eller falder bort, page life expectancy)
  • Notifikationer via e-mail, Microsoft Teams (Workflows) og signeret webhook
  • Linux-agent (systemd) og Azure SQL Managed Instance (evergreen, Entra ID-login, Azure-håndterede områder vises som sådan). MI er ikke testet mod en rigtig instans

Fase 3: Kommerciel platform

  • Licensmodel: signerede licensnøgler (ECDSA P-256), der verificeres offline, og et værktøj til at udstede dem
  • Auto-update af regelpakker (uden genstart) og af værktøjet, med stable- og preview-kanal. Feedet er signeret og kan ligge på https eller et fildrev (offline). Installationen er privilegeret, med backup, sundhedstjek og tilbagerulning. Se docs/opdatering.md. Afprøvet på Linux; Windows-stien (tjenester, IIS app_offline, planlagt opgave) er ikke kørt på Windows endnu
  • Findings-sync fra Agent til Hub API med kø, retry og backoff. Følsomme målinger udelades som standard, og kunden kan se præcis det sendte
  • SQLInsight Hub med PostgreSQL: modtagelse, deduplikering (idempotent), historik pr. kunde, spærring af licenser og Docker Compose. Se docs/hub.md
  • Hub-portal: overblik over kunder, kritiske fund og de mest udbredte problemer på tværs af kunder. Grafer over tendenser over tid mangler endnu
  • Integration med support-flowet: fund kan knyttes til en supportsag (sagsnummer fra supportsystemet). Der er endnu ingen direkte kobling til et bestemt supportsystem
  • Dokumentation til databehandleraftale (GDPR), opbevaringsfrister og sletning af kunder i hubben. Se docs/databehandling.md
  • Log over medarbejderes adgang og tofaktorlogin i portalen

Fase 4: Videre

  • Anbefalinger på tværs af kunder: Hubben ser, hvilke fund der forsvinder efter en opdatering, og agenterne viser "hos 4 kunder forsvandt dette efter CU21" på fundet. Deles kun samlet og anonymt fra mindst 3 kunder. Se docs/hub.md
  • Rapporter (PDF) til ledelse og compliance: nøgletal, sammenfatning i almindeligt sprog, kontroller, instanser og alvorlige fund. Kan hentes i webbrugerfladen og sendes månedligt på mail. Se docs/rapporter.md
  • Rettighedsrevision: sysadmin og øvrige serverroller med Windows-grupper foldet ud via AD, ændringer med hvem/hvornår fra default trace, fund ved nye medlemmer og revisionsrapport (PDF). Se docs/rettigheder.md
  • Mulighed for, at community selv bidrager med regler: regler som SQL i JSON (community via pull request og signeret regelpakke, lokale regler hos kunden), med validering og rules test mod en instans. Se docs/regler.md
  • API til integration med eksisterende monitorering: JSON-API og Prometheus-endpoint med API-tokens, Grafana-dashboard, og Windows' hændelseslog med faste event-id'er til SCOM. Se docs/integration.md
  • Community-websted (download af signerede udgivelser, dokumentation, SQL Server-versioner, regler, support) og Discourse-forum på dansk med kategorier, løste svar og opsætning som kode. Se docs/community.md

Understøttede versioner

SQLInsight Pro overvåger alle SQL Server-versioner fra SQL Server 2000 og frem. Ikke alt kan måles på alle versioner. Agenten registrerer derfor, hvad instansen kan (version, edition og funktioner), og vælger de collectors og regler, der passer til den. Hvis en regel ikke kan vurderes på en given version, vises den som "ikke målbar på denne version". Den må aldrig fremstå som "OK".

Version Datakilder Hvad kan analyseres Begrænsninger
2000 (8.0) sysprocesses, DBCC SQLPERF(WAITSTATS), sysindexes, sp_configure, msdb, error log Blocking, waits, konfiguration, backup, filstørrelser og version Ingen DMV'er og ingen granulære rettigheder. Deadlocks kun via trace flag 1204 i error log. Ingen plananalyse.
2005 (9.0) DMV'er, default trace Waits, query stats, plan cache, missing/unused indexes, I/O-latens, blocking-kæder Ingen Extended Events. Deadlocks via trace flag 1222 og error log.
2008 / 2008 R2 (10.x) + Extended Events, system_health Deadlock-grafer fra ring buffer og Resource Governor system_health har kun ring buffer. Deadlock-XML er ufuldstændig før 2008 R2.
2012 / 2014 (11–12) + system_health med file target, AlwaysOn-DMV'er Always On AG, historik over deadlocks, udvidede query-metrikker
2016 (13) + Query Store, LastGoodCheckDbTime (SP2) Planregressioner og CHECKDB uden sysadmin
2017 / 2019 (14–15) + automatic tuning, dm_exec_query_plan_stats Tilgængelighed af seneste faktiske plan og Linux-instanser
2022 / 2025 (16–17) + granulære rettigheder, Query Store hints, PSP optimization Fuld dækning

Livscyklus: Alle versioner til og med SQL Server 2016 er uden for Microsofts support (extended support for 2016 sluttede i juli 2026). De bliver overvåget, men versionen vises altid som et kritisk fund med en anbefalet opgraderingssti.

Legacy-forbindelser: Moderne .NET-drivere og TLS 1.2 er ikke kompatible med de ældste versioner. Uopdaterede 2005/2008-instanser understøtter typisk kun TLS 1.0, og Microsoft.Data.SqlClient understøtter ikke SQL Server 2000. Agenten har derfor et separat forbindelseslag til legacy-versioner (ODBC-baseret), som bruges automatisk ved behov. Kunden får en tydelig advarsel om den svagere kryptering.

Rettigheder på ældre versioner: På SQL Server 2000 findes VIEW SERVER STATE ikke, så nogle checks kræver forhøjede rettigheder. Det er dokumenteret pr. regel, og kunden vælger selv, hvilke checks der slås til.

Øvrige mål: Standard, Enterprise, Developer og Express edition. Senere kommer Azure SQL Managed Instance.


Bidrag

Projektet er i en tidlig fase. Idéer til regler, eller eksempler på SQL Server-problemer du gerne vil have værktøjet til at fange, er meget velkomne som issues.

Licens

MIT