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.
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.
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 | |
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 |
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
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)
$ 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
--mode shortdumps-recurrence in einer Service-Detail-Ansicht | |
--mode shortdumps-recurrence als Popup in der Service-Overview-Ansicht | |
--mode shortdumps-count als Popup |
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.
check_sap_health-3.1.0.1.tar.gz
Gerhard Laußer
Check_sap_health wird unter der GNU General Public License zur Verfügung gestellt.
Gerhard Laußer (gerhard.lausser@consol.de) beantwortet gerne Fragen zu diesem Plugin.
Nein, das ist gelogen. Er verkauft gern Consulting.