Beschreibung

Das Plugin check_sap_health wurde mit dem Ziel entwickelt, ein leicht erweiterbares Werkzeug zu haben, mit dem sich sowohl technische Parameter aus dem CCMS als auch betriebswirtschaftliche Fakten per RFC/BAPI überwachen lassen.

Motivation

Die bisher verfügbaren Plugins sind in C geschrieben, wodurch man nicht mal eben ein neues Feature einbauen und ausprobieren kann. Des weiteren beschränken sich die Möglichkeiten dieser Plugins auf die Abfrage von CCMS-Metriken. Als es Mitte 2013 beim bis dahin eingesetzten check_sap zu Core-Dumps kam (irreparabel, da nach dem exit()-Aufruf) und offenbar die Kompatibilität zu neueren Netweaver-Versionen nicht mehr gewährleistet war, suchte ich nach Alternativen.
Zeitgleich gab es die Anforderung RFC- und BAPI-Aufrufe in das Monitoring aufzunehmen. Diese Aufrufe bezogen sich hauptsächlich auf firmenspezifische Erweiterungen und sollten im Endausbau die Überwachung aller SAP-basierten Versicherungs- und Banken-Geschäftsprozesse abdecken. Mit einem starr kompilierten Plugin ist so etwas nicht möglich, jedenfalls nicht wenn man das Ergebnis als Open Source veröffentlichen will.
Daher wurde mit check_sap_health ein neues Plugin auf Perl-Basis entwickelt. Es bietet die von den anderen check_*_health bekannte Erweiterbarkeit durch kleine selbstgeschriebene Perl-Schnippsel. Auf diese Weise kann das Plugin mit seinen Basisfunktionen veröffentlicht werden und gleichzeitig an spezielle Anforderungen eines Unternehmens angepasst werden.

Dokumentation

Kommandozeilenparameter

  • –ashost <hostname> Der Hostname bzw. die IP-Adresse des Application-Servers
  • –sysnr <nr> Die System Number
  • –username <username> Der Monitoring-User
  • –password <password> Dessen Passwort
  • –client <nr> Die Mandantennummer, Defaulteinstellung ist 001.
  • –lang <lang> Die Sprache, Defaulteinstellung ist EN.
  • –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 oder einen Oberbegriff begrenzt werden. (Siehe Beispiele, da die Bedeutung vom verwendeten Modus abhängt)
  • –name2 <objektname> Dito, zur genaueren Eingrenzung.
  • –name3 <objektname> Dito, zur genaueren Eingrenzung.
  • –regexp Ein Flag welches angibt, ob –name[2,3] als regulärer Ausdruck zu interpretieren ist.
  • –lookback <sekunden> Mit diesem Parameter kann man angeben, wie weit in die Vergangenheit geblickt werden soll (um z.B. die Anzahl best. Ereignisse zu zählen)
  • –report <short|long|html> Bei manchen Modi wird mehr als eine Zeile ausgegeben. Mit der html-Option erscheint dann ein farbiges Popup in der Thruk-GUI.
  • –separator <zeichen> MTE-Namen in ihrer Langform werden wie ein Pfad angegeben, wobei der Backslash defaultmäßig das Trennzeichen ist. Mit –separator kann hierfür ein anderes Zeichen angegeben werden, z.B. <em>#</em>.
  • –mtelong Ein Flag, welches angibt, daß der komplette Pfad eines MTE ausgegeben werden (auch im Performancedaten-Label) soll. Ansonsten kann es sein, daß man mehrere gleichnamige MTEs bekommt, die zu unterschiedlichen SIDs gehörenm, wenn man das Plugin gegen einen Solution Manager laufen lässt.
  • –criticalx <label=schwellwert> Mit diesem Parameter lassen sich die von SAP gelieferten Schwellwerte (bei Performance-MTEs) überschreiben.
  • –warningx <label=schwellwert> Dito.
  • –negate <level=level> Anstelle des Wrapper-Plugins negate kann dieser Parameter den Exitcode modifizieren. (–negate unknown=critical)
  • –with-mymodules-dyn-dir <verzeichnis> In diesem Verzeichnis wird nach selbstgeschriebenen Erweiterungen (Dateiname CheckSapHealth*.pm) gesucht.

Modi

Schlüsselwort Bedeutung Schwellwerte
connection-time Misst, wie lange Verbindungsaufbau und Login dauern 0..n Sekunden (Default: 1, 5)
list-ccms-monitor-sets Zeigt die im CCMS vorhandenen Monitor-Sets an.  
list-ccms-monitors Zeigt die in einem Monitor-Set vorhandenen Monitore an. (–name bestimmt das Monitor-Set).  
list-ccms-mtes Zeigt die in einem Monitor vorhandenen MTEs an. (–name bestimmt das Monitor-Set, –name2 den Monitor).  
ccms-mte-check Überprüft die in einem Monitor vorhandenen MTEs. Mit –name3 und ggf. –regexp kann eine Teilmenge ausgewählt werden. (Default: vom CCMS vorgegeben)
shortdumps-list Gibt alle in der SNAP-Tabelle gefundenen Short Dumps aus. Mit –lookback kann man eingrenzen, wie weit in der Vergangenheit die Events liegen dürfen. Per default ist das der Zeitpunkt des vorhergehenden Aufrufs des Plugins  
shortdumps-count Zählt die Short Dumps. Mit –name kann nach Username, mit –name2 nach Programm gefiltert werden. Auch hier kann mit –lookback ein Alterslimit angegeben werden.  
shortdumps-recurrence Zählt die Short Dumps, wobei diesmal das Aufkommen der einzelnen Events angezeigt wird.  
failed-updates Zählt die Einträge in der VHDR-Tabelle, die seit dem letzten Lauf des Plugins hinzugekommen sind (oder seit einem mit –lookback bestimmten Zeitpunkt in der Vergangenheit). Damit überwacht man Updates, die es aus welchem Grund auch immer nicht in die Datenbank geschafft haben.  
list-jobs Damit kann man sich einen Überblick verschaffen, welche Jobs existieren bzw. im lookback-Intervall gelaufen sind.  
failed-jobs überprüft, ob Jobs mit Fehlern beendet wurden  
exceeded-failed-jobs überprüft, ob Jobs mit Fehlern beendet wurden oder ob die Laufzeit einen Schwellwert überschritten hat  
count-processes Zählt die Prozesse der Typen DIA, UPD, UP2, BGD, ENQ und SPO. Alarmiert, wenn keiner (oder weniger als per warningx/criticalx angegebenen gewünschten Anzahl) mehr läuft 1:,1:
list-processes Gibt einfach die derzeit laufenden Prozesse mit ihren PIDs aus  
failed-idocs Sucht in der Tabelle EDIDS nach Statusmeldungen mit STATYP E oder W. Defaultmäßig wird der Zeitraum der vergangenen Stunde betrachtet. Mit --lookback kann dieser verändert werden  
list-idocs Listet einfach Statusmeldungen aus der Tabelle EDIDS auf  
workload-overview Prüft die durchschn. Antwortzeit von Tasktypen analog zu ST03 Workload der letzten Minuten  

Vorbereitung

Das Plugin check_sap_health setzt auf dem Perl-Modul sapnwrfc auf und dieses wiederum auf dem NW RFC SDK.
Zuerst lädt man das SDK von SAP herunter. Der Dateiname lautet (bitte die jeweils neueste Version verwenden) in etwa: NWRFC_20-20004565-Linux-x86_64.SAR
Um diese Datei entpacken zu können, braucht man noch das SAPCAR-Kommando. Dieses ist ebenfalls von SAP zum Download erhältlich oder man lässt es sich von einem SAP-Admin geben.
Man entpackt das SDK in ein temporäres Verzeichnis:

$ cd /tmp
$ SAPCAR -xf NWRFC_20-20004565-Linux-x86_64.SAR

Die extrahierten Dateien liegen dann in /tmp/nwrfcsdk.
Anschließend installiert man (als Site-Benutzer) das Perl-Modul sapnwrfc:

$ perl -MCPAN -e "install sapnwrfc"

Während dieser Installation wird man gefragt, wo das SAP SDK zu finden ist. An dieser Stelle gibt man /tmp/nwrfcsdk ein.
Zuletzt kopiert man die shared Libs des SDK aus dem temporären Verzeichnis in das local/lib-Verzeichnis der OMD-Site:

$ cd /tmp/nwrfcsdk
$ cp libicudata.so.34 libicudecnumber.so libicui18n.so.34 libicuuc.so.34 libsapnwrfc.so libsapucum.so $OMD_ROOT/local/lib

Installation

tar zxf check_sap_health...tar.gz; cd check_sap_health...; ./configure; make
cp plugins-scripts/check_sap_health sonstwohin

In OMD ist check_sap_health bereits enthalten. Eine extra Installation des Plugins ist nicht nötig. (SDK und nwrfcsdk hingegen schon. Wir können keine SAP-Software bei OMD beilegen)

Beispiele

$ check_sap_health --mode connection-time \
    --warning 10 --critical 20
OK - 0.07 seconds to connect as NAGIOS@NPL | 'connection_time'=0.07;10;20;;

$ check_sap_health --mode list-ccms-mtes \
    --name "SAP CCMS Monitor Templates" --name2 Enqueue
NPL\Enqueue\Enqueue 50
NPL\Enqueue\Enqueue Server\ 70
NPL\Enqueue\Enqueue Server\Backup Requests 100
NPL\Enqueue\Enqueue Server\CleanUp Requests 100
...
NPL\Enqueue\Enqueue Server\Granule Arguments 111
NPL\Enqueue\Enqueue Server\Granule Arguments Actual Utilisation 100
NPL\Enqueue\Enqueue Server\Granule Arguments Peak Utilisation 111
...

$ check_sap_health --mode list-ccms-mtes \
    --name "SAP CCMS Monitor Templates" --name2 Enqueue --separator '#'
NPL#Enqueue#Enqueue 50
NPL#Enqueue#Enqueue Server# 70
NPL#Enqueue#Enqueue Server#Backup Requests 100
NPL#Enqueue#Enqueue Server#CleanUp Requests 100
...
NPL#Enqueue#Enqueue Server#Granule Arguments 111
NPL#Enqueue#Enqueue Server#Granule Arguments Actual Utilisation 100
NPL#Enqueue#Enqueue Server#Granule Arguments Peak Utilisation 111
...

$ check_sap_health --mode ccms-mte-check \
    --name "SAP CCMS Monitor Templates" --name2 Enqueue \
    --name3 "NPL#Enqueue#Enqueue Server#Granule Arguments Actual Utilisation" \
    --separator '#'
OK - Enqueue Server Granule Arguments Actual Utilisation = 0% | 'Enqueue Server_Granule Arguments Actual Utilisation'=0%;50;80;0;100

$ check_sap_health --mode ccms-mte-check \
    --name "SAP CCMS Monitor Templates" --name2 Enqueue \
    --name3 "NPL#Enqueue#Enqueue Server#Granule Arguments Actual Utilisation" \
    --separator '#' --mtelong
OK - Enqueue Server NPL#Enqueue#Enqueue Server#Granule Arguments Actual Utilisation = 0.00% | 'Enqueue Server_NPL#Enqueue#Enqueue Server#Granule Arguments Actual Utilisation'=0.00%;50.00;80.00;0;100

$ check_sap_health --mode ccms-mte-check \
    --name "SAP CCMS Monitor Templates" --name2 Enqueue \
    --name3 "Granule.*Actual" --regexp
OK - Enqueue Server Granule Arguments Actual Utilisation = 0%, Enqueue Server Granule Entries Actual Utilisation = 0% | 'Enqueue Server_Granule Arguments Actual Utilisation'=0%;50;80;0;100 'Enqueue Server_Granule Entries Actual Utilisation'=0%;50;80;0;100

 # Nochmal. Man achte auf den Parameter --warningx
 # Damit setzt man gezielt Schwellwerte für einzelne Metriken
$ check_sap_health --mode ccms-mte-check \
    --name "SAP CCMS Monitor Templates" --name2 Enqueue \
    --name3 "Granule.*Actual" --regexp \
    --warningx 'Enqueue Server_Granule Arguments Actual Utilisation'=64
OK - Enqueue Server Granule Arguments Actual Utilisation = 0%, Enqueue Server Granule Entries Actual Utilisation = 0% | 'Enqueue Server_Granule Arguments Actual Utilisation'=0%;64;80;0;100 'Enqueue Server_Granule Entries Actual Utilisation'=0%;50;80;0;100

 # Alarm wenn
 #  - mehr als 1000 Short Dumps insgesamt
 #  - mehr als 15/150 Short Dumps der gleichen Sorte
 # in den letzten zwei Tagen aufgetreten sind.
$ check_sap_health --mode shortdumps-recurrence \
    --report html --lookback $((3600*24*2))  \
    --warningx shortdumps=1000 --criticalx shortdumps=1000 \
    --warningx max_unique_shortdumps=15 --criticalx max_unique_shortdumps=150
WARNING - the most frequent error appeared 95 times | 'shortdumps'=108;1000;1000;; 'max_unique_shortdumps'=95;15;150;;
....HTML-Code für dir Thruk-GUI....
....und ASCII-Code für die Notification.....
ASCII_NOTIFICATION_START
WARNING - the most frequent error appeared 95 times
   count            ahost    uname   mandt                        error      program
      95   nplhost_NPL_42     SAP*     001     SAPSQL_INVALID_FIELDNAME     SAPLSDTX
       9   nplhost_NPL_42   NAGIOS     001             RFC_NO_AUTHORITY     SAPLSDTX
       3   nplhost_NPL_42   NAGIOS     001             RFC_NO_AUTHORITY   SAPLBUBA_5
       1   nplhost_NPL_42     SAP*     001   SAPSQL_WHERE_ILLEGAL_VALUE     SAPLSDTX
ASCII_NOTIFICATION_END

 # Nochmal. Diesmal interessieren aber ausschließlich Dumps, die auf das Konto
 # des Benutzers NAGIOS gehen (--name <benutzer>)
 # Mit --name2 <program> könnte man das Ergebnis noch weiter eingrenzen.
$ check_sap_health --mode shortdumps-recurrence \
    --report html --lookback $((3600*24*2))  \
    --warningx shortdumps=1000 --criticalx shortdumps=1000 \
    --warningx max_unique_shortdumps=15 --criticalx max_unique_shortdumps=150 \
    --name NAGIOS
OK - 12 new shortdumps appeared between 20140306 135353 and 20140308 145352 the most frequent error appeared 9 times | 'shortdumps'=12;1000;1000;; 'max_unique_shortdumps'=9;15;150;;
....HTML-Code für dir Thruk-GUI....
....und ASCII-Code für die Notification.....
ASCII_NOTIFICATION_START
OK - 12 new shortdumps appeared between 20140306 135353 and 20140614 145352 the most frequent error appeared 9 times
   count            ahost    uname   mandt              error      program
       9   nplhost_NPL_42   NAGIOS     001   RFC_NO_AUTHORITY     SAPLSDTX
       3   nplhost_NPL_42   NAGIOS     001   RFC_NO_AUTHORITY   SAPLBUBA_5
ASCII_NOTIFICATION_END

$ check_sap_health --mode count-processes
OK - 4 DIA processes, 1 UPD process, 1 UP2 process, 2 BGD processes, 1 ENQ process, 1 SPO process | 'num_dia'=4;1:;1:;; 'num_upd'=1;1:;1:;; 'num_up2'=1;1:;1:;; 'num_bgd'=2;1:;1:;; 'num_enq'=1;1:;1:;; 'num_spo'=1;1:;1:;;

$ check_sap_health --mode count-processes --warningx num_dia=10: --criticalx num_dia=:3
WARNING - 4 DIA processes, 1 UPD process, 1 UP2 process, 2 BGD processes, 1 ENQ process, 1 SPO process | 'num_dia'=4;10:;:3;; 'num_upd'=1;1:;1:;; 'num_up2'=1;1:;1:;; 'num_bgd'=2;1:;1:;; 'num_enq'=1;1:;1:;; 'num_spo'=1;1:;1:;;

$ check_sap_health --mode count-processes --name enq
OK - 1 ENQ process | 'num_enq'=1;1:;1:;;

$ check_sap_health --mode list-processes 
DIA 22136 Running
DIA 22137 Waiting
DIA 22138 Waiting
DIA 22139 Waiting
UPD 22140 Waiting
ENQ 22141 Waiting
BGD 22142 Waiting
BGD 24011 Waiting
SPO 22144 Waiting
UP2 22145 Waiting
OK - have fun

$ check_sap_health --mode failed-idocs
OK - idoc 0000000000143130 has status "Data passed to port OK" (Information) at Tue Jun  7 05:02:42 2016, idoc 0000000000143131 has status "Data passed to port OK" (Information) at Tue Jun  7 05:02:42 2016, idoc 0000000000143132 has status "IDoc generated" (Information) at Tue Jun  7 05:02:48 2016

$ check_sap_health --mode failed-idocs --report short
OK - no idoc problems

$ check_sap_health --mode failed-idocs --report short
CRITICAL - idoc 0000000000143133 has status "Error passing data to port" (Error) at Tue Jun  7 05:08:11 2016

Bildchen

check_sap_health_shortdumps-recurrence-1

--mode shortdumps-recurrence in einer Service-Detail-Ansicht

check_sap_health_shortdumps-recurrence-2

--mode shortdumps-recurrence als Popup in der Service-Overview-Ansicht

check_sap_health_shortdumps-count-1

--mode shortdumps-count als Popup

Berechtigungen

nagios/check_sap_health/check_sap_health-permissions.png

Erweiterungen

Im Verzeichnis $HOME/etc/check_sap_health legt man Perl-Dateien ab, die den selbstgeschriebenen Code enthalten. Beispiel: CheckSapHealthTest.pm

package MyTest;
our @ISA = qw(Classes::SAP::Netweaver::Item);
use Time::HiRes;

sub init {
  my $self = shift;
  my $bapi_tic = Time::HiRes::time();
  if ($self->mode =~ /my::test::rfcping/) {
    my $ping = $self->session->function_lookup("RFC_PING");
    my $fc = $ping->create_function_call;
    my $frc = $fc->invoke();
    $self->add_ok("pong");
    # $fc kann jetzt ausgewertet werden
  }
  my $bapi_tac = Time::HiRes::time();
  my $bapi_duration = $bapi_tac - $bapi_tic;
  $self->set_thresholds(warning => 5, critical => 10);
  $self->add_message($self->check_thresholds($bapi_duration),
       sprintf "runtime was %.2fs", $bapi_duration);
  $self->add_perfdata(
      label => 'runtime',
      value => $bapi_duration,
  );
}

Wichtig ist der Dateiname, der mit CheckSapHealth beginnen und die Dateiendung .pm haben muss.

Die darin enthaltene Klasse muss mit My beginnen. Aufgerufen wird das Plugin dann mit –mode my-test-modus, wobei das Argument mit dem Bindestrich als Trennzeichen zerlegt und mit doppelten Doppelpunkt wieder zusammengesetzt wird. (Aus my-test-modus wird die interne Darstellung my::test::modus).
In der Methode init() kann dann zwischen den einzelnen Modi unterschieden werden. Dabei ist zu beachten, daß Teil1 my lauten muss und Teil 2 dem Klassennamen entsprechen muss.

check_sap_health --mode my-test-rfcping \
    --with-mymodules-dyn-dir $HOME/etc/check_sap_health
OK - pong, runtime was 0.03s | 'runtime'=0.03;5;10;;

ACHTUNG!!!! Seit der Version 2.0 muss dieses My-Package von Classes::SAP::Netweaver oder besser noch von Classes::SAP::Netweaver::Item erben. Siehe obiges Beispiel.

Download

check_sap_health-3.1.0.1.tar.gz

Changelog

  • 2023-03-06 3.1.0.1
    bugfix in backgroundjob time select. (Thanks Ysincit)
  • 2022-11-22 3.1
    check only the last status of an idoc
    fix a bug in ccms, THRESHDIR=0 found
  • 2022-07-22 3.0.1
    bugfix in background-jobs
  • 2022-07-07 3.0.0.3
    refresh the cache if no mtes are found with –refresh-mtes
  • 2022-01-10 3.0.0.2
    fix the fix
  • 2022-01-10 3.0.0.1
    bugfix in shortdumps. (Thanks Alessandro Calia)
  • 2021-11-16 3.0
    use Monitoring::GLPlugin for the MTE cache
  • 2020-07-02 2.1.0.4
    again rm the mte cache, if there was an OK earlier
  • 2020-06-14 2.1.0.3
    fix another bug, rm all tree-caches after connection problem
  • 2020-04-30 2.1.0.2
    fix another bug in the connect-fail-flag-file and mte-cache refresh
  • 2020-04-21 2.1.0.1
    fix a bug in the connect-fail-flag-file
  • 2020-04-18 2.1
    improve ccms caching, rebuild the cache after a connection problem
  • 2018-01-29 2.0.0.5
    update glplugin (–environment)
  • 2018-01-09 2.0.0.4
    fix a bug in st mtes with units
  • 2017-05-12 2.0.0.3
    update GLPlugin
  • 2017-03-07 2.0.0.2
    fix a bug in count-processes & lang=DE. (Thanks Maximilian Scharsich)
  • 2017-03-07 2.0.0.1
    add mitigation for “no mtes”
    clean statefile from special characters
  • 2017-03-04 2.0
    add workload-overview
  • 2016-10-23 1.9.0.2
    fix a bug in idoc date output
  • 2016-07-25 1.9.0.1
    fix output of list-idocs
  • 2016-07-22 1.9
    add idocs
  • 2016-07-11 1.8
    add processes
  • 2016-06-03 1.7.0.1
    update GLPlugin
  • 2016-05-06 1.7
    add –mtelong
  • 2015-07-13 1.6
    new directory layout, standalone
  • 2015-05-13 1.5.1.2
    allow the weirdest characters in passeord with rfc-encoding
  • 2015-04-23 1.5.1.1
    update GLPlugin
  • 2015-03-31 1.5.1
    add mode exceeded-failed-jobs
  • 2015-03-23 1.5
    add mode failed-jobs
    Implementation of this really useful feature was sponsored by
    XIT cross information technologies GmbH, http://www.crossit.at
    Thanks a lot!
  • 2015-01-30 1.4
    add message server connections
  • 2014-12-16 1.3.3.4
    update GLPlugin
  • 2014-10-01 1.3.3.3
    update GLPlugin
    fix epn bug
    +epn
  • 2014-08-19 1.3.3.2
    GLPlugin update, destructor bugfix
  • 2014-07-28 1.3.3.1
    GLPlugin update
  • 2014-07-26 1.3.3
    add a mte cache
    bugfix in st perfdata
    update GLPlugin
  • 2014-06-17 1.3.2
    fix precision of float values and thresholds
  • 2014-06-16 1.3.1.1
    update GLPlugin
  • 2014-06-13 1.3.1
    bugfix in failed-updates
    remove duplicate mtes in BAPI_SYSTEM_MON_GETTREE
  • 2014-06-12 1.3
    bugfix in MT_CLASS_PERFORMANCE ALRELEVVAL and Thresholds.
    This means: throw away your rrd-files. The metrics you collected are mostly wrong.
    You should also throw away your old sap-plugins and use check_sap_health :-)
    Many thanks to Silvan Hunkirchen who provided me with the virtual clue.
    add mode failed-updates
  • 2014-06-05 1.2
    add modes shortdumps-list, shortdumps-count, shortdumps-recurrence
    add report html
    add warningx/criticalx for mtes
  • 2014-04-16 1.1.1
    add cleanup of dev_rfc-Traces
  • 2014-02-28 1.1
    fix threshold-driven perormance mtes
  • 2014-02-07 1.0.1
    bugfix in mode sapinfo
    single-message mtes

Gerhard Laußer
Check_sap_health wird unter der GNU General Public License zur Verfügung gestellt.

Autor

Gerhard Laußer (gerhard.lausser@consol.de) beantwortet gerne Fragen zu diesem Plugin.
Nein, das ist gelogen. Er verkauft gern Consulting.