-- =================================================================================================================== -- SQLI-SYN-001: Et syntetisk tjek fejler -- =================================================================================================================== -- Regel-id: SQLI-SYN-001 -- Titel: Et syntetisk tjek fejler -- Alvor: High. -- Versioner: SQL: SQL Server 2005 og nyere (SqlClient, ODBC-fallback for 2005). AX-logon: AX 2009 (kræver Windows PowerShell -- 2.0-motoren) og AX 2012. Windows-tjenester: Windows Server 2008 R2 og nyere. -- -- Hvad tjekkes, og hvorfor: -- Agenten gør det, en bruger eller applikation ville gøre – forbinder til en port, henter en side, logger på SQL Server -- og kører en forespørgsel, slår et navn op, logger på Dynamics AX – og det fejler. Er tjekket knyttet til en tjeneste -- på en Windows-server, og kører tjenesten, siges det direkte: "… svarer ikke, selv om tjenesten kører" – den fejl, -- en tjenesteovervågning alene ikke ser. -- -- Vurdering (sker i C# ud fra de indsamlede data, ikke på den overvågede server): -- Har de seneste FailuresBeforeFinding kørsler alle fejlet, er det et fund. Titlen siger, om den tilknyttede tjeneste -- kører, er stoppet (eller i en anden tilstand) eller ikke findes, eller at tjekket fejler N gange i træk. Fejlteksten -- står aldrig i titlen (den sendes uredigeret til API og notifikationer), kun som måling (følsom). Er alle de -- resultater, agenten har givet reglen, fejl, siges "mindst N" gange, og "Fejler siden" er "… eller tidligere". -- -- Grænseværdier (agentens appsettings.json og tjekkets indstillinger): -- SQLInsight:SyntheticChecks:FailuresBeforeFinding standard 2 (fejl i træk før et fund: ét tabt svar er ingen alarm) -- Pr. tjek: interval (standard 300 s, 60–86400) og timeout (standard 15 s, AX 60 s, højst 120). -- -- Rettigheder: -- TCP, HTTP(S), DNS: ingen ud over netværksadgang fra agentens server. HTTP med Windows-godkendelse: agentens konto. -- SQL: login'et i tjekket (agentens Windows-konto eller et SQL-login, hvis adgangskode krypteres til agenten som i 1.3) -- skal kunne logge ind og køre forespørgslen; least-privilege-login'et fra grant-least-privilege.sql er nok til standardforespørgslen. -- AX-logon: agentens Windows-konto skal være AX-bruger (i firmaet), og .NET Business Connector skal være installeret på -- agentens server; ellers testes kun AOS-porten (og resultatet siger det). -- Tjenestens tilstand: WMI Remote Enable på root\cimv2 + læseret på Service Control Manager på tjenestens server. -- -- Data kommer fra (collector, fil – medlemmer, interval): -- src/SQLInsight.Servers/Synthetic/SyntheticCheckRunner.cs – SyntheticCheckRunner.RunAsync (TcpAsync, HttpAsync, SqlAsync, -- DnsAsync, AxAsync), AX-logon: src/SQLInsight.Servers/Synthetic/AxBusinessConnector.cs og ax-logon.ps1. Køres efter -- tjekkets interval af src/SQLInsight.Agent/Servers/SyntheticCheckService.cs – RunCheckAsync, som også slår den tilknyttede -- tjenestes tilstand op (CimQueries.SingleServiceQuery). -- Regelkode: src/SQLInsight.Rules/Servers/SyntheticCheckRules.cs : SyntheticCheckFailingRule -- -- Read-only: Ja. Ved et SQL-tjek valideres forespørgslen som én skrivebeskyttet SELECT, både når tjekket gemmes og -- før hver kørsel (src/SQLInsight.Core/CustomRules/ReadOnlyQuery.cs), og den køres i en transaktion, der -- altid rulles tilbage. Andre typer tjek sender ingen SQL og ændrer intet. -- Kørsel: Kør i SSMS som tjekkets login. Hver GO er en separat kommando på samme forbindelse; ret [msdb] til -- tjekkets database, eller udelad USE, hvis tjekket ingen database har. -- =================================================================================================================== -- SQL: Ved et SQL-tjek kører agenten præcis dette på den instans, tjekket peger på (ændrer intet: forespørgslen -- valideres som én skrivebeskyttet SELECT, både når den gemmes og før den køres, og køres i en transaktion, der altid -- rulles tilbage). Hver GO er en separat kommando på samme forbindelse. -- ------------------------------------------------------------------------------------------------------------------- -- SyntheticCheckRunner: SQL-tjekket (login, sessionsindstillinger, forespørgslen i en transaktion, der rulles tilbage) -- ------------------------------------------------------------------------------------------------------------------- -- Variant: Alle versioner: sættes på hver forbindelse, agenten åbner (også tjekkets) -- Kilde: SqlConnectionFactory.SessionSettings -- Kode: src/SQLInsight.Connectivity/SqlConnectionFactory.cs : SqlConnectionFactory.SessionSettings SET LOCK_TIMEOUT 5000; SET DEADLOCK_PRIORITY LOW; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; GO -- Variant: Kun når tjekket har en database (vist for msdb) -- Kilde: SyntheticCheckRunner.UseDatabaseSql -- Kode: src/SQLInsight.Servers/Synthetic/SyntheticCheckRunner.cs : SyntheticCheckRunner.UseDatabaseSql(database) USE [msdb]; GO -- Variant: Alle versioner fra SQL Server 2005: før forespørgslen -- Kilde: SyntheticCheckRunner.BeginTransactionSql -- Kode: src/SQLInsight.Servers/Synthetic/SyntheticCheckRunner.cs : SyntheticCheckRunner.BeginTransactionSql BEGIN TRANSACTION; GO -- Variant: Standardforespørgslen, når tjekket ikke har sin egen (en egen forespørgsel køres her i stedet, højst 10.000 rækker læses) -- Kilde: SyntheticCheckSettings.DefaultQuery -- Kode: src/SQLInsight.Core/SyntheticChecks/SyntheticCheckDefinitions.cs : SyntheticCheckSettings.DefaultQuery SELECT 1 GO -- Variant: Alle versioner fra SQL Server 2005: altid efter forespørgslen, også når den fejler -- Kilde: SyntheticCheckRunner.RollbackSql -- Kode: src/SQLInsight.Servers/Synthetic/SyntheticCheckRunner.cs : SyntheticCheckRunner.RollbackSql IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; GO -- Ikke-SQL-tjek, efterprøv med PowerShell (skrivebeskyttet; kør på agentens server som agentens konto): -- TCP: Test-NetConnection -ComputerName aos01 -Port 2712 -- HTTP: Invoke-WebRequest -Uri https://ep.firma.local/ -UseDefaultCredentials -UseBasicParsing | Select-Object StatusCode -- DNS: Resolve-DnsName aos01.firma.local -- AX: Test-NetConnection -ComputerName aos01 -Port 2712 (logon: se src/SQLInsight.Servers/Synthetic/ax-logon.ps1) -- Tjeneste: Get-CimInstance -ComputerName aos01 -Query "SELECT Name, DisplayName, State, StartMode, ExitCode FROM Win32_Service WHERE Name = 'AOS60`$01'"