check_db2_health

Posted on October 1st, 2009 by lausser

Beschreibung

check_db2_health ist ein Plugin, mit dem unterschiedliche Parameter eines IBM DB2-Servers überprüft werden können.

Dokumentation

Kommandozeilenparameter

  • –database <DB-Name> Der Name der Datenbank. (Falls diese lokal katalogisiert ist, reicht dieser Parameter. Ansonsten muss man database, hostname und port angeben)
  • –hostname <hostname> Der Datenbankserver
  • –port <port> Der Port, auf dem der Server lauscht
  • –username <username> Der Datenbankuser
  • –password <password> Dessen Passwort
  • –mode <modus> Mit dem mode-Parameter teilt man dem Plugin mit, was es tun soll. Siehe Liste der möglichen Werte weiter unten.
  • –name <objektname> Hier kann die Prüfung auf ein einziges Objekt begrenzt werden. (Momentan wird dieser Parameter nur für mode=sql verwendet)
  • –name2 <string> Verwendet man –mode=sql, dann erscheint das SQL-Statement in der Ausgabe und den Performancedaten. Mit dem Parameter name2 kann man dafür einen eigenen String vergeben.
  • –warning <range> Ermittelte Werte außerhalb dieses Bereichs lösen ein WARNING aus.
  • –critical <range> Ermittelte Werte außerhalb dieses Bereichs lösen ein CRITICAL aus.
  • –environment <variable>=<wert> Damit kann man dem Script Environmentvariablen mitgeben. Mehrfachnennungen sind möglich.
  • –method <connectmethode> Mit diesem Parameter teilt man dem Plugin mit, wie es sich zur Datenbank verbinden soll. (dbi für Verbindung per DBD::DB2 (default), derzeit keine Alternativen).
  • –units <%|KB|MB|GB> Die Angabe von Einheiten dient der "Verschönerung" von Ausgaben des mode=sql

Um dem Plugin mitzuteilen, welche Werte es ermitteln und prüfen soll, benutzt man die Option –mode mit verschiedenen Schlüsselwörtern.

Modi

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, 100)
synchronous-read-percentage Anteil der synchronous reads (SRP) 0%..100% (90:, 80:)
asynchronous-write-percentage Anteil der asynchronous writes (AWP) 0%..100% (90:, 80:)
bufferpool-hitratio Hitratio in Buffer Pools (kann mit –name auf bestimmte Pools eingegrenzt werden) 0%..100% (98:, 90:)
bufferpool-data-hitratio dto., berücksichtigt aber nur Data Pages 0%..100% (98:, 90:)
bufferpool-index-hitratio dto., berücksichtigt aber nur Index Pages 0%..100% (98:, 90:)
index-usage Anteil der SELECTs, die einen Index benutzen 0%..100% (98:, 90:)
deadlocks Anzahl der Deadlocks pro Sekunde 0..n (0, 1)
lock-waits Anzahl der Lock-Anforderungen pro Sekunde, die nicht befriedigt werden konnten 0..n (10, 100)
lock-waiting Zeit, die auf Locks gewartet werden muss 0%..100% (2%, 5%)
database-usage Belegter Speicherplatz in einer Datenbank 0%..100% (80%, 90%)
tablespace-usage Belegter Speicherplatz in einem Tablespace 0%..100% (90%, 98%)
tablespace-free Freier Speicherplatz in einem Tablespace. Im Gegensatz zum vorhergehenden Modus kann man hier Schwellwerte mit Hilfe der Option –units in MB und GB angeben. 0%..100% (5:, 2:)
log-utilization Belegter Speicherplatz in einem Datenbank-Log 0%..100% (80, 90)
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
list-databases Gibt eine Liste aller Datenbanken aus  
list-tablespaces Gibt eine Liste aller Tablespaces aus  
list-bufferpools Gibt eine Liste aller Bufferpools aus  

Es ist zu beachten, daß Schwellwerte entsprechend den Nagios Developer Guidelines anzugeben sind.

"10" bedeutet demzufolge "Alarm, wenn > 10" und

"90:" bedeutet "Alarm, wenn < 90"

Vorbereitung der Datenbank

Damit sich das Plugin die benötigten Informationen aus der Datenbank holen kann, legt man einen (Betriebssystem-)Benutzer “nagios” (mit gleichnamiger Gruppe) an. Eventuell gibt es diesen bereits, weil der Datenbankserver mit check_nrpe oder check_by_ssh überwacht wird.

Danach schaltet man die Monitoring Switches ein:

update dbm cfg using dft_mon_bufpool on
update dbm cfg using dft_mon_lock on
update dbm cfg using dft_mon_timestamp on

Der nagios-Benutzer (bzw. die nagios-Gruppe) bekommt noch die nötigen Privilegien und nach einem Neustart der Datenbank kann’s dann losgehen.

db2inst1$ db2 update dbm cfg using sysmon_group nagios
db2inst1$ db2stop; db2start

Beispiele

nagsrv$ check_db2_health --mode connection-time
WARNING - 1.61 seconds to connect as DB2INST1 | connection_time=1.6084;1;5
 
nagsrv$ check_db2_health --mode connected-users
OK - 3 connected users | connected_users=3;50;100
 
nagsrv$ check_db2_health --mode list-databases
TOOLSDB
OK - have fun
 
nagsrv$ check_db2_health --mode database-usage
OK - database usage is 31.29% | 'db_toolsdb_usage'=31.29%;80;90
 
nagsrv$ check_db2_health --mode tablespace-usage
CRITICAL - tbs TEMPSPACE1 usage is 100.00%, tbs TBSP32KTMP0000 usage is 100.00%, tbs TBSP32K0000 usage is 100.00%, tbs USERSPACE1 usage is 5.08%, tbs SYSTOOLSPACE usage is 1.86%, tbs SYSCATSPACE usage is 80.37% | 'tbs_userspace1_usage_pct'=5.08%;90;98 'tbs_userspace1_usage'=16MB;288;313;0;320 'tbs_tempspace1_usage_pct'=100.00%;90;98 'tbs_tempspace1_usage'=0MB;0;0;0;0 'tbs_tbsp32ktmp0000_usage_pct'=100.00%;90;98 'tbs_tbsp32ktmp0000_usage'=0MB;0;0;0;0 'tbs_tbsp32k0000_usage_pct'=100.00%;90;98 'tbs_tbsp32k0000_usage'=61MB;55;60;0;61 'tbs_systoolspace_usage_pct'=1.86%;90;98 'tbs_systoolspace_usage'=0MB;28;31;0;32 'tbs_syscatspace_usage_pct'=80.37%;90;98 'tbs_syscatspace_usage'=51MB;57;62;0;64
 
nagsrv$ check_db2_health --mode list-tablespaces
SYSCATSPACE
SYSTOOLSPACE
TBSP32K0000
TBSP32KTMP0000
TEMPSPACE1
USERSPACE1
OK - have fun
 
nagsrv$ check_db2_health --mode tablespace-usage --name SYSCATSPACE
OK - tbs SYSCATSPACE usage is 80.37% | 'tbs_syscatspace_usage_pct'=80.37%;90;98 'tbs_syscatspace_usage'=51MB;57;62;0;64
 
nagsrv$ check_db2_health --mode tablespace-free --name SYSCATSPACE
OK - tbs SYSCATSPACE has 19.63% free space left | 'tbs_syscatspace_free_pct'=19.63%;5:;2: 'tbs_syscatspace_free'=12MB;3.20:;1.28:;0;64.00
 
nagsrv$ check_db2_health --mode tablespace-free --name SYSCATSPACE --units MB
OK - tbs SYSCATSPACE has 12.55MB free space left | 'tbs_syscatspace_free_pct'=19.63%;7.81:;3.12: 'tbs_syscatspace_free'=12.55MB;5.00:;2.00:;0;64.00
 
nagsrv$ check_db2_health --mode tablespace-free --name SYSCATSPACE --units MB --warning 15: --critical 10:
WARNING - tbs SYSCATSPACE has 12.55MB free space left | 'tbs_syscatspace_free_pct'=19.63%;23.44:;15.62: 'tbs_syscatspace_free'=12.55MB;15.00:;10.00:;0;64.00
 
nagsrv$ check_db2_health --mode bufferpool-hitratio
CRITICAL - bufferpool IBMDEFAULTBP hitratio is 53.60%, bufferpool BP32K0000 hitratio is 100.00% | 'bp_ibmdefaultbp_hitratio'=53.60%;98:;90: 'bp_ibmdefaultbp_hitratio_now'=100.00% 'bp_bp32k0000_hitratio'=100.00%;98:;90: 'bp_bp32k0000_hitratio_now'=100.00%
 
nagsrv$ check_db2_health --mode list-bufferpools
BP32K0000
IBMDEFAULTBP
OK - have fun
 
nagsrv$ check_db2_health --mode bufferpool-hitratio --name IBMDEFAULTBP
CRITICAL - bufferpool IBMDEFAULTBP hitratio is 53.60% | 'bp_ibmdefaultbp_hitratio'=53.60%;98:;90: 'bp_ibmdefaultbp_hitratio_now'=100.00%
 
nagsrv$ check_db2_health --mode bufferpool-data-hitratio --name IBMDEFAULTBP
CRITICAL - bufferpool IBMDEFAULTBP data page hitratio is 64.35% | 'bp_ibmdefaultbp_hitratio'=64.35%;98:;90: 'bp_ibmdefaultbp_hitratio_now'=100.00%
 
nagsrv$ check_db2_health --mode bufferpool-index-hitratio --name IBMDEFAULTBP
CRITICAL - bufferpool IBMDEFAULTBP index hitratio is 38.89% | 'bp_ibmdefaultbp_hitratio'=38.89%;98:;90: 'bp_ibmdefaultbp_hitratio_now'=100.00%
 
nagsrv$ check_db2_health --mode index-usage
CRITICAL - index usage is 0.71% | index_usage=0.71%;98:;90:
 
nagsrv$ check_db2_health --mode synchronous-read-percentage
OK - synchronous read percentage is 100.00% | srp=100.00%;90:;80:
 
nagsrv$ check_db2_health --mode asynchronous-write-percentage
CRITICAL - asynchronous write percentage is 0.00% | awp=0.00%;90:;80:
 
nagsrv$ check_db2_health --mode deadlocks
OK - 0.000000 deadlocs / sec | deadlocks_per_sec=0.000000;0;1
 
nagsrv$ check_db2_health --mode lock-waits
OK - 0.000000 lock waits / sec | lock_waits_per_sec=0.000000;10;100
 
nagsrv$ check_db2_health --mode lock-waiting
OK - 0.000000% of the time was spent waiting for locks | lock_percent_waiting=0.000000%;2;5
Verwendung von Environmentvariablen

Man kann die Parameter –hostname, –username, –password und –port 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:

  • NAGIOS__SERVICEDB2_HOST (_db2_host in der Servicedefinition)
  • NAGIOS__SERVICEDB2_USER (_db2_user in der Servicedefinition)
  • NAGIOS__SERVICEDB2_PASS (_db2_pass in der Servicedefinition)
  • NAGIOS__SERVICEDB2_PORT (_db2_port in der Servicedefinition)
  • NAGIOS__SERVICEDB2_DATABASE (_db2_database in der Servicedefinition)

Installation

Dieses Plugin setzt die Installation des Perl-Moduls DBD::DB2 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.

  • –prefix=BASEDIRECTORY Geben Sie hier das Verzeichnis an, in dem check_db2_health liegen soll. (default: /usr/local/nagios)
  • –with-nagios-user=SOMEUSER Dieser User wird der Eigentümer der Datei check_db2_health sein. (default: nagios)
  • –with-nagios-group=SOMEGROUP Die Gruppe des check_db2_health Binaries. (default: nagios)
  • –with-perl=PATHTOPERL Geben sie hier den Pfad zum Perl-Interpreter an, den sie benutzen möchten. (default: perl im PATH)

Download

check_db2_health-1.0.tar.gz

check_db2_health-1.0.shar.gz

Changelog

  • 2009-10-01 1.0 Erste öffentliche Version

Copyright

Gerhard Laußer

Check_db2_health wird unter der GNU General Public License zur Verfügung gestellt. GPL

Autor

Gerhard Laußer (gerhard.lausser@consol.de) beantwortet gerne Fragen zu diesem Plugin.

18 Responses to “check_db2_health”

  1. Juan Says:
    January 8th, 2010 at 13:07

    What version of DB2 is this plugin compatible with?

    [Reply]

    lausser Reply:

    I use it with 9.x, but you might try it with 8.x and tell me wether it works.

    [Reply]

  2. Christoph Says:
    January 22nd, 2010 at 15:22

    Hallo, das Plugin ist echt Klasse. Nur wie frage ich in einem SQL nach einer character ab: check_db2_health –mode sql –name ’select count(*) from sysibmadm.tbsp_utilization where tbsp_state’='NORMAL” -warning 1 -critical 1

    Use of uninitialized value $value in numeric gt (>) at ./check_db2_health line 1262

    Und bei ein paar Sachen (asynchronous-write-percentage) bekomme ich die Meldung: CRITICAL – unable to aquire awp info Grüße Christoph

    [Reply]

  3. lausser Says:
    January 23rd, 2010 at 14:42

    Leg eine Datei /tmp/check_db2_health.trace an, lass das Plugin laufen und schau in einem anderen Fenster mit “tail -f /tmp/check_db2_health.trace” zu, was da hinter den Kulissen passiert. Die in der Tracedatei auftauchenden SQL-Statements danach bitte manuell eingeben. Sie müssen ein sinnvolles Ergebnis liefern.

    [Reply]

  4. Christoph Says:
    January 26th, 2010 at 10:52

    Danke, damit kann ich das wunderbar tracen.

    [Reply]

  5. Giovanni Says:
    February 22nd, 2010 at 17:35

    Hallo, I installed check_db2_health plugin and it works fine from command line. Anyway, when I run it from Nagios, I get this error:

    “CRITICAL – cannot connect to MyHost. Total Environment allocation failure! Did you set up your DB2 client environment?”

    Below the Nagios command definition

    define command{ command_name check_db2_health_connection_time command_line $USER1$/check_db2_health –hostname $HOSTADDRESS$ –database $_SERVICEDB2_DATABASE$ –port $_SERVICEDB2_PORT$ –username=$_SERVICEDB2_USER$ –password=$_SERVICEDB2_PASS$ –mode connection-time }

    $_SERVICEDB2_xxxx$ macros have been defined in my template and service configuration files (as _db2_xxxx). I tried to force DB2_HOME environment variable in /etc/init.d/nagios script, but it doesn’t work.

    Thanks in advance for any help. Giovanni

    [Reply]

    lausser Reply:

    What about this? http://archive.netbsd.se/?ml=perl-dbi-users&a=2009-11&t=11921001 Does it solve your problem?

    [Reply]

    Giovanni Reply:

    @lausser, I made confusion with .bash_profile and .bashrc, so the environment variables have been overwritten. Now it works perfectly. Thanks a lot, Giovanni

    [Reply]

  6. Max Says:
    March 4th, 2010 at 17:34

    Ich habe folgenden Fehler:

    CRITICAL – cannot connect to 10.29.234.123. [IBM][CLI Driver] SQL30081N A communication error has been detected. Communication protocol being used: “TCP/IP”. Communication API being used: “SOCKETS”. Location where the error was detected: “10.29.234.123″. Communication function detecting the error: “recv”. Protocol specific error code(s): ““, ““, “0″. SQLSTATE=08001 # Komme nicht weiter… Gruss

    [Reply]

    lausser Reply:

    Alles überprüft? Die IP-Adresse? Den Port? Das Passwort? SQLSTATE=08001 findet man x-mal bei Google und weist auf einen Fehler bei der Angabe dieser Verbindungsdaten hin.

    [Reply]

    Max Reply:

    @lausser, Ja, soweit alles überprüft… da ich keinen Catalog verwende gebe ich alles mit: /usr/local/nagios/libexec/check_db2_health –hostname 10.29.234.xxx –port 5900 –database xx –username name –password pass –mode database-usage

    [Reply]

    lausser Reply:

    Probiers mit dem folgenden Mini-Script. Damit lässt sich der Fehler eingrenzen.

    # fill in your parameters
    #
    my $database = '';
    #
    # if the database is not in the catalogue, add host + port
    #
    my $hostname = '';
    my $port = '';
     
    my $username = '';
    my $password = '';
     
    use strict;
    use warnings;
    my $dsn = "DBI:DB2:";
    if (! $hostname) {
      # catalog tcpip node <host-nickname> remote <hostname> server <port>
      # catalog database <remote-db> as <local-nick> at node <host-nickname>
      $dsn .= $database;
    } else {
      $dsn .= sprintf "DATABASE=%s; ", $database;
      $dsn .= sprintf "HOSTNAME=%s; ", $hostname;
      $dsn .= sprintf "PORT=%d; ", $port;
      $dsn .= sprintf "PROTOCOL=TCPIP; ";
      $dsn .= sprintf "UID=%s; ", $username;
      $dsn .= sprintf "PWD=%s;", $password;
    }
     
    eval {
      require DBI;
      if (my $dbh = DBI->connect(
          $dsn,
          $username,
          $password,
          { RaiseError => 0, AutoCommit => 1, PrintError => 0 })) {
        printf "OK - connected\n";
      } else {
        die DBI::errstr();
      }
    };
    if ($@) {
      printf "%s\n", $@;
    }

    Danach steht fest, ob die Verbindung mut dem Perl-Modul DBD::DB2 grundsätzlich hinhaut.

    [Reply]

    Max Reply:

    @lausser, Danke für die schnelle Antwort.

    Also hab ich die Catalog-Befehle mal ausgeführt, dann alles im Script ergänzt, und ausgeführt, bekomme folgendes:

    [IBM][CLI Driver] SQL30081N A communication error has been detected. Communication protocol being used: “TCP/IP”. Communication API being used: “SOCKETS”. Location where the error was detected: “10.29.234.123″. Communication function detecting the error: “recv”. Protocol specific error code(s): ““, ““, “0″. SQLSTATE=08001

    [Reply]

    Max Reply:

    @lausser,

    Hier der Weg “zu Fuss”: db2 => connect to c14 SQL30081N A communication error has been detected. Communication protocol being used: “TCP/IP”. Communication API being used: “SOCKETS”. Location where the error was detected: “10.29.234.123″. Communication function detecting the error: “recv”. Protocol specific error code(s): ““, ““, “0″. SQLSTATE=08001

    [Reply]

    Max Reply:

    @lausser, Bekomme auch noch teilweise Fehler 104, als würde die Verbindung vom DB-Host abgelehnt…

    [Reply]

    Max Reply:

    @Max, Problem liegt an der Config der DB, hab eine andere versucht, Login 1A… <>

  7. Max Says:
    March 9th, 2010 at 10:16

    Jetzt habe ich ein anderes Problem: zu Fuss auf der shell funzt es, aber wenn Nagios die Scripte ausführt, bekomme ich: “Total Environment allocation failure! Did you set up your DB2 client environment? ” Aus dem Artikel hier http://archive.netbsd.se/?ml=perl-dbi-users&a=2009-11&t=11921001 werde ich aber nicht schlau, ich habe wie im Buch von Herrn Laußer die Pfade als export in die .bashrc vom User Nagios und in das Startscript von Nagios (init.d) eingetragen, bringt aber nix… Gruss Maximilian

    [Reply]

    lausser Reply:

    Ich würde mal schauen, welche mit DB2 zusammenhängenden Environmentvariablen in der Shell vorhanden sind.

    env | grep -i db2
    Vermutlich reicht es, die LD_LIBRARY_PATH im Initscript einzutragen.

    [Reply]

Leave a Reply