check_mssql_health ist ein Plugin, mit dem unterschiedliche Parameter eines MS SQL-Servers überprüft werden können.
Um dem Plugin mitzuteilen, welche Werte es ermitteln und prüfen soll, benutzt man die Option –mode mit verschiedenen Schlüsselwörtern.
Schlüsselwort | Bedeutung | Wertebereich |
---|---|---|
connection-time | Misst, wie lange Verbindungsaufbau und Login dauern | 0..n Sekunden (1, 5) |
connected-users | Anzahl der verbundenen Benutzer | 0..n (50, 80) |
cpu-busy | CPU Busy Time | 0%..100% (80, 90) |
io-busy | IO Busy Time | 0%..100% (80, 90) |
full-scans | Anzahl von Full Table Scans pro Sekunde | 0..n (100, 500) |
transactions | Anzahl der Transactionen pro Sekunde | 0..n (10000, 50000) |
batch-requests | Anzahl der Batch Requests pro Sekunde | 0..n (100, 200) |
latches-waits | Anzahl der Latch-Anforderungen pro Sekunde, die nicht befriedigt werden konnten | 0..n (10, 50) |
latches-wait-time | Durchschnittliche Zeit, die nach einer abgewiesenen Latch-Anforderung gewartet werden muss | 0..n ms (1, 5) |
locks-waits | Anzahl der Lock-Anforderungen pro Sekunde, die nicht befriedigt werden konnten | 0..n (100, 500) |
locks-timeouts | Anzahl der Lock-Anforderungen pro Sekunde, die auf Timeout gelaufen sind | 0..n (1, 5) |
locks-deadlocks | Anzahl der Deadlocks pro Sekunde | 0..n (1, 5) |
sql-recompilations | Anzahl der Re-Compilations pro Sekunde | 0..n (1, 10) |
sql-initcompilations | Anzahl der Initial Compilations pro Sekunde | 0..n (100, 200) |
total-server-memory | Der Hauptspeicher, den der SQL Server für sich reserviert hat | 0..n (nearly1G, 1G) |
mem-pool-data-buffer-hit-ratio | Data Buffer Cache Hit Ratio | 0%..100% (90, 80:) |
lazy-writes | Anzahl der Lazy Writes pro Sekunde | 0..n (20, 40) |
page-life-expectancy | Durchschnittliche Verweildauer einer Page im Hauptspeicher | 0..n (300:, 180:) |
free-list-stalls | Free List Stalls pro Sekunde | 0..n (4, 10) |
checkpoint-pages | Anzahl der dirty Pages, die pro Sekunde geflushed werden | 0..n () |
database-online | Prüft, ob eine Datenbank online ist und Verbindungen akzeptiert | - |
database-free | Freier Speicherplatz in einer Datenbank | 0%..100% (5%, 2%) |
database-backup-age | Verstrichene Zeit seit dem letzten Backup einer Datenbank (in Stunden). Die Performancedaten beinhalten auch die Dauer des Backups (in Minuten). | 0..n |
database-logbackup-age | Verstrichene Zeit seit dem letzten Backup der Logs einer Datenbank (in Stunden). Die Performancedaten beinhalten auch die Dauer des Backups (in Minuten). | 0..n |
database-file-auto-growths | Anzahl der File Auto Grow Events (Data oder Log) während der letzten <n> Minuten (–lookback) | 0..n (1, 5) |
database-logfile-auto-growths | Anzahl der Data File Auto Grow Events während der letzten <n> Minuten (–lookback) | 0..n (1, 5) |
database-datafile-auto-growths | Anzahl der Log File Auto Grow Events während der letzten <n> Minuten (–lookback) | 0..n (1, 5) |
database-file-auto-shrinks | Anzahl der File Auto Shrink Events (Data oder Log) während der letzten <n> Minuten (–lookback) | 0..n (1, 5) |
database-logfile-auto-shrinks | Anzahl der Data File Auto Shrink Events während der letzten <n> Minuten (–lookback) | 0..n (1, 5) |
database-datafile-auto-shrinks | Anzahl der Log File Auto Shrink Events während der letzten <n> Minuten (–lookback) | 0..n (1, 5) |
database-file-dbcc-shrinks | Anzahl der DBCC File Shrink Events (Data oder Log) während der letzten <n> Minuten (–lookback) | 0..n (1, 5) |
failed-jobs | Anzahl der fehlgeschlagenen Jobs während der letzten <n> Minuten (–lookback) | 0..n (1, 5) |
sql | Ergebnis eines beliebigen SQL-Befehls, der eine Zahl zurückliefert. Der Befehl selbst wird mit dem Parameter –name übergeben. Ein Label für Performncedaten kann mit dem Parameter –name2 übergeben werden. Mit dem Parameter –units kann die Ausgabe um Einheiten ergänzt werden (%, c, s, MB, GB,.. Wenn der SQL-Befehl Sonder- und Leerzeichen enthält, kann er mit dem mode encode zuerst encodiert werden. | 0..n |
sql-runtime | Laufzeit eines beliebigen SQL-Befehls in Sekunden. Der Befehl selbst wird mit dem Parameter –name übergeben. | 0..n (1, 5) |
list-databases | Gibt eine Liste aller Datenbanken aus | - |
list-locks | Gibt eine Liste aller Locks aus | - |
Es ist zu beachten, daß Schwellwerte entsprechend den Nagios Developer Guidelines anzugeben sind.
Damit sich das Plugin die benötigten Informationen aus der Datenbank holen kann, muss ein Benutzer angelegt werden, der über gewisse Privilegien verfügt.
Am einfachsten ist es, dem Nagios-Benutzer die Rolle “serveradmin” zuzuweisen. Alternativ kann man sich auch gleich als Benutzer “sa” an der Datenbank anmelden. Allerdings stellt diese Methode ein grosses Sicherheitsrisiko dar, da in den Konfigurationsdateien von Nagios das Administratorpasswort des SQL Servers im Klartext vorliegt.
Von Birk Bohne stammt das folgende Script, mit dem die Einrichtung eines minimal, aber ausreichend privilegierten Monitoring-Users automatisiert werden kann.
declare @dbname varchar(255)
declare @check_mssql_health_USER varchar(255)
declare @check_mssql_health_PASS varchar(255)
declare @check_mssql_health_ROLE varchar(255)
declare @source varchar(255)
declare @options varchar(255)
declare @backslash int
/*******************************************************************/
SET @check_mssql_health_USER = '"[Servername|Domainname]\Username"'
SET @check_mssql_health_PASS = 'Password'
SET @check_mssql_health_ROLE = 'Rolename'
/******************************************************************
PLEASE CHANGE THE ABOVE VALUES ACCORDING TO YOUR REQUIREMENTS
- Example for Windows authentication:
SET @check_mssql_health_USER = '"[Servername|Domainname]\Username"'
SET @check_mssql_health_ROLE = 'Rolename'
- Example for SQL Server authentication:
SET @check_mssql_health_USER = 'Username'
SET @check_mssql_health_PASS = 'Password'
SET @check_mssql_health_ROLE = 'Rolename'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
It is strongly recommended to use Windows authentication. Otherwise
you will get no reliable results for database usage.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*********** NO NEED TO CHANGE ANYTHING BELOW THIS LINE *************/
SET @options = 'DEFAULT_DATABASE=MASTER, DEFAULT_LANGUAGE=English'
SET @backslash = (SELECT CHARINDEX('\', @check_mssql_health_USER))
IF @backslash > 0
BEGIN
SET @source = ' FROM WINDOWS'
SET @options = ' WITH ' + @options
END
ELSE
BEGIN
SET @source = ''
SET @options = ' WITH PASSWORD=''' + @check_mssql_health_PASS + ''',' + @options
END
PRINT 'create Nagios plugin user ' + @check_mssql_health_USER
EXEC ('CREATE LOGIN ' + @check_mssql_health_USER + @source + @options)
EXEC ('USE MASTER GRANT VIEW SERVER STATE TO ' + @check_mssql_health_USER)
EXEC ('USE MASTER GRANT ALTER trace TO ' + @check_mssql_health_USER)
EXEC ('USE MSDB CREATE USER ' + @check_mssql_health_USER + ' FOR LOGIN ' + @check_mssql_health_USER)
EXEC ('USE MSDB GRANT SELECT ON sysjobhistory TO ' + @check_mssql_health_USER)
EXEC ('USE MSDB GRANT SELECT ON sysjobschedules TO ' + @check_mssql_health_USER)
EXEC ('USE MSDB GRANT SELECT ON sysjobs TO ' + @check_mssql_health_USER)
PRINT 'User ' + @check_mssql_health_USER + ' created.'
PRINT ''
declare dblist cursor for
select name from sysdatabases WHERE name NOT IN ('master', 'tempdb', 'msdb') open dblist
fetch next from dblist into @dbname
while @@fetch_status = 0 begin
EXEC ('USE [' + @dbname + '] print ''GRANT permissions IN the db '' + ''"'' + DB_NAME() + ''"''')
EXEC ('USE [' + @dbname + '] CREATE ROLE ' + @check_mssql_health_ROLE)
EXEC ('USE [' + @dbname + '] GRANT EXECUTE TO ' + @check_mssql_health_ROLE)
EXEC ('USE [' + @dbname + '] GRANT VIEW DATABASE STATE TO ' + @check_mssql_health_ROLE)
EXEC ('USE [' + @dbname + '] GRANT VIEW DEFINITION TO ' + @check_mssql_health_ROLE)
EXEC ('USE [' + @dbname + '] CREATE USER ' + @check_mssql_health_USER + ' FOR LOGIN ' + @check_mssql_health_USER)
EXEC ('USE [' + @dbname + '] EXEC sp_addrolemember ' + @check_mssql_health_ROLE + ' , ' + @check_mssql_health_USER)
EXEC ('USE [' + @dbname + '] print ''Permissions IN the db '' + ''"'' + DB_NAME() + ''" GRANTED.''')
fetch next from dblist into @dbname
end
close dblist
deallocate dblist
Es ist zu beachten, dass bei Verwendung von “SQL Server authentication” check_mssql_health nur noch eingeschränkt verwendet werden kann. Von dieser Authentifizierungsmethode wird daher dringend abgeraten. Üblicherweise gibt es auf dem Datenbankserver sowieso einen Nagios-(Windows-)Benutzer (z.B. für die Installation von NSClient++ o.ä.), so dass man diesen für die “Windows authentication” verwenden kann.
Ein weiteres Script vom selben Autor entfernt den Monitoring-User wieder aus der Datenbank.
declare @dbname varchar(255)
declare @check_mssql_health_USER varchar(255)
declare @check_mssql_health_ROLE varchar(255)
SET @check_mssql_health_USER = '"[Servername|Domainname]\Username"'
SET @check_mssql_health_ROLE = 'Rolename'
declare dblist cursor for
select name from sysdatabases WHERE name NOT IN ('master', 'tempdb', 'msdb') open dblist
fetch next from dblist into @dbname
while @@fetch_status = 0 begin
EXEC ('USE [' + @dbname + '] print ''Revoke permissions in the db '' + ''"'' + DB_NAME() + ''"''')
EXEC ('USE [' + @dbname + '] EXEC sp_droprolemember ' + @check_mssql_health_ROLE + ' , ' + @check_mssql_health_USER)
EXEC ('USE [' + @dbname + '] DROP USER ' + @check_mssql_health_USER)
EXEC ('USE [' + @dbname + '] REVOKE VIEW DEFINITION TO ' + @check_mssql_health_ROLE)
EXEC ('USE [' + @dbname + '] REVOKE VIEW DATABASE STATE TO ' + @check_mssql_health_ROLE)
EXEC ('USE [' + @dbname + '] REVOKE EXECUTE TO ' + @check_mssql_health_ROLE)
EXEC ('USE [' + @dbname + '] DROP ROLE ' + @check_mssql_health_ROLE)
EXEC ('USE [' + @dbname + '] print ''Permissions in the db '' + ''"'' + DB_NAME() + ''" revoked.''')
fetch next from dblist into @dbname
end
close dblist
deallocate dblist
PRINT ''
PRINT 'drop Nagios plugin user ' + @check_mssql_health_USER
EXEC ('USE MSDB DROP USER ' + @check_mssql_health_USER)
EXEC ('USE MASTER REVOKE VIEW SERVER STATE TO ' + @check_mssql_health_USER)
EXEC ('DROP LOGIN ' + @check_mssql_health_USER)
PRINT 'User ' + @check_mssql_health_USER + ' dropped.'
An dieser Stelle nochmals herzlichen Dank an Birk Bohne für diese praktischen Scripts.
nagsrv$ check_mssql_health --mode mem-pool-data-buffer-hit-ratio
CRITICAL - buffer cache hit ratio is 71.21% | buffer_cache_hit_ratio=71.21%;90:;80:
nagsrv$ check_mssql_health --mode batch-requests
OK - 9.00 batch requests / sec | batch_requests_per_sec=9.00;100;200
nagsrv$ check_mssql_health --mode full-scans
OK - 6.14 full table scans / sec | full_scans_per_sec=6.14;100;500
nagsrv$ check_mssql_health --mode cpu-busy
OK - CPU busy 55.00% | cpu_busy=55.00;80;90
nagsrv$ check_mssql_health --mode database-free --name AdventureWorks
OK - database AdventureWorks has 21.59% free space left | 'db_adventureworks_free_pct'=21.59%;5:;2: 'db_adventureworks_free'=703MB;4768371582.03:;1907348632.81:;0;95367431640.62
nagsrv$ check_mssql_health --mode database-free --name AdventureWorks \
--warning 700: --critical 200: --units MB
WARNING - database AdventureWorks has 694.12MB free space left | 'db_adventureworks_free_pct'=21.31%;0.00:;0.00: 'db_adventureworks_free'=694.12MB;700.00:;200.00:;0;95367431640.62
nagsrv$ check_mssql_health --mode page-life-expectancy
OK - page life expectancy is 8950 seconds | page_life_expectancy=8950;300:;180:
nagsrv$ check_mssql_health --mode database-backup-age --name AHLE_WORSCHT \
--warning 72 --critical 120
WARNING - AHLE_WORSCHT backupped 102h ago | 'AHLE_WORSCHT_bck_age'=102;72;120 'AHLE_WORSCHT_bck_time'=12
Man kann die Parameter –hostname, –port (oder die Alternative –server), –username und –password ganz weglassen, wenn man die entsprechenden Daten in Environmentvariablen bereitstellt. Seit der Version 3.x kann man Servicedefinitionen in Nagios um eigene Attribute (custom object variables) erweitern. Diese tauchen dann bei der Ausführung des Checkcommands im Environment auf.
Die Environmentvariablen heissen:
Dieses Plugin setzt die Installation des Perl-Moduls DBD::Sybase voraus.
Nach dem Auspacken des Archivs wird ./configure aufgerufen. Mit ./configure –help können Optionen angezeigt werden, die für den Bau des Plugins einige Defaulteinstellungen liefern.
Das Perl-Modul DBD::Sybase setzt auf einer Installation von FreeTDS auf. Dieses Paket wickelt die Kommunikation mit dem Datenbankserver ab. In der Defaulteinstellung wird dabei leider eine Protokolversion 4.x benutzt, bei der Passwörter im Klartext über das Netzwerk geschickt werden. Bitte ändern sie daher unbedingt folgenden Parameter in der Datei /etc/freetds.conf
[global]
# TDS protocol version
# tds version = 4.2
tds version = 8.0
Befinden sich mehrere named instances auf demselben Port eines Datenbankservers, so muss man diese in der /etc/freetds.conf einzeln registrieren.
[dbsrv1instance01]
host = 192.168.1.19
port = 1433
instance = instance01
[dbsrv1instance02]
host = 192.168.1.19
port = 1433
instance = instance02
Danach adressiert man die Instanzen z.B. mit --server dbsrv1instance02. Ansonsten würde man mit --host 192.168.1.19 --port 1433 die Defaultinstanz erreichen.
Neuerdings kann man sich den Weg über die freetds.conf sparen. Mit --server <FQDN>\<Instanz> sollte die Verbindung auch klappen. Voraussetzung ist ein laufender Service Browser auf dem DB-Server.
check_mssql_health-2.7.6.1.tar.gz
2011-3000 Gerhard Laußer
Check_nwc_health wird unter der GNU General Public License zur Verfügung gestellt. GPL
Gerhard Laußer (gerhard.lausser@consol.de) stellt dieses Plugin kostenlos zur Verfügung. Gratis Consulting hingegen gibt’s nur im Märchen, in der realen Welt hält der Laußer die Hand auf. Es gibt Leute, die finden das unverschämt, weil das ist doch Open Source und Open Source ist gratis. Solchen Leuten schenkt man ein Auto und die wollen noch den Führerschein spendiert bekommen. Tut man sowas? Nein!