Wenn Sie sich die Auslastungsdaten der Automation Engine ansehen wollen, haben Sie ein Problem: in der Systemübersicht werden nur die letzten 24h angezeigt. Dabei wären die älteren Daten für Analysen und Statistiken oft sehr nützlich.
Deshalb fragen mich auch immer wieder AE User: Wo in der Datenbank finde ich denn die historischen Workload-Werte?
Und ich muss Ihnen die enttäuschende Antwort geben: Nirgends. Diese Daten stehen nicht in der Datenbank.
Es gibt aber zum Glück Funktionen in der Skriptsprache, mit denen Sie die Daten ermitteln können. Ich will Ihnen eine Methode zeigen, um damit ganz elegant die Daten zu sammeln.
Die relevanten Scriptfunktionen
Die Automation Engine beitet vier Funktionen, um die Auslastung abzufragen (Links verweisen auf die öffentliche Dokumentation der AE Version 11.2):
SYS_BUSY_01() – Liefert die durchschnittliche Auslastung eines Automation Engine Prozesses während der letzten Minute.
SYS_BUSY_10() – Liefert die durchschnittliche Auslastung eines Automation Engine Prozesses während der letzten 10 Minuten.
SYS_BUSY_60() – Liefert die durchschnittliche Auslastung eines Automation Engine Prozesses während der letzten Stunde.
SYS_INFO( […] ) – Liest die Systeminformationen.
Für unser Beispiel verwenden wir die ersten drei Funktionen sowie die letzte Funktion mit den Argumenten:
SYS_INFO(Nachrichten-Warteschlange, COUNT)
Uns interessieren diese drei Nachrichten-Warteschlangen:
- MQPWP (Nachrichten-Warteschlange des primären Arbeitsprozesses)
- MQWP (Nachrichten-Warteschlange der Arbeitsprozesse)
- MQDWP (Nachrichten-Warteschlange der Dialogprozesse )
Genauere Informationen zu den Funktionen finden Sie unter den Dokumentationslinks.
So nutzen Sie die Archive Values aus
Klar, wir könnten jetzt eine VARA oder einen ähnlichen Datencontainer erstellen und darin in regelmäßigen Abständen die Daten speichern. Das wäre aber umständlich und ineffektiv. Ich greife stattdessen auf einen kleinen Trick zurück: Ich benutze die Archive Values.
AV (kurz für Archive Values) heißt eine Tabelle in der AE Datenbank. Die gibt es seit der AE Version 9 und darin werden für jeden historischen Lauf Ihrer Objekte die Werte von PromptSet-Variablen und Objekt-Variablen gespeichert.
Das ist ziemlich geschickt: Wir können einfach die Auslastungswerte in regelmäßigen Abständen in Objektvariablen schreiben und sie danach aus der Tabelle AV auslesen.
Wir erstellen also ein SCRI-Objekt, das regelmäßig läuft und die nötigen Werte als Objektvariablen abspeichert.
SCRI-Objekt zum Speichern der Daten
Mit den Funktionen von oben erstellen Sie ein einfaches SCRI-Objekt, das Sie regelmäßig ausführen:
:PSET &LOAD_01# = SYS_BUSY_01() :PSET &LOAD_10# = SYS_BUSY_10() :PSET &LOAD_60# = SYS_BUSY_60() :PSET &COUNT_PWP# = SYS_INFO(MQPWP,COUNT) :PSET &COUNT_WP# = SYS_INFO(MQWP,COUNT) :PSET &COUNT_DWP# = SYS_INFO(MQDWP,COUNT)
Das Objekt speichert die Auslastungsdaten der letzen 1, 10 und 60 Minuten, außerdem die aktuelle Anzahl Nachrichten in MQPWP, MQWP und MQDWP.
Führen Sie dieses SCRI-Objekt periodisch aus, zum Beispiel alle 10 Minuten. Die Daten werden automatisch in der Tabelle AV gespeichert und Sie können per SQL darauf zugreifen.
Per SQL auf die Daten in der Tabelle AV zugreifen
Die Tabelle AV enhält für jede RunID die Variablennamen und Werte aller Objektvariablen. In der Tabelle AH (Archive Header) finden Sie Objektname, RunID und den Zeitstempel (und noch viele andere nützliche Informationen).
Im folgenden SQL-Skript bennutzen wir das SELECT-Statement und wählen mit “INNER JOIN” alle Zeilen der Tabelle AH, deren RunID auch in der Tabelle AV steht. Wir suchen uns darauf die Werte Timestamp, Variablenname und Wert heraus. Hinweis am Rande: Timestamps sind immer in UTC!
Dabei interessieren uns natürlich nur die Werte aus dem oben erstellten SCRI Objekt und für den gewünschten Client. Denken Sie also daran, AH_CLIENT und AH_NAME im Skript entsprechend anzupassen. Das Ergebnis sortieren wir nach dem Zeitstempel.
select AH_TIMESTAMP1, AV_VName, AV_Value from AH inner join AV on AH_IDNR = AV_AH_Idnr --!Modify Client and SCRI-Name according to your system! where AH_CLIENT = 1 and AH_NAME = 'SCRI_WORKLOAD' order by AH_TIMESTAMP1;
Die Ausgabe des Skripts könnte nach zwei Ausführungen des SCRI-Objekts ungefähr so aussehen:
AH_TIMESTAMP1 | AV_VName | AV_Value |
---|---|---|
2016-01-19 16:01:57.000 | &COUNT_DWP# | 0 |
2016-01-19 16:01:57.000 | &COUNT_PWP# | 1 |
2016-01-19 16:01:57.000 | &COUNT_WP# | 18 |
2016-01-19 16:01:57.000 | &LOAD_01# | 15 |
2016-01-19 16:01:57.000 | &LOAD_10# | 11 |
2016-01-19 16:01:57.000 | &LOAD_60# | 15 |
2016-01-19 16:02:07.000 | &COUNT_DWP# | 1 |
2016-01-19 16:02:07.000 | &COUNT_PWP# | 1 |
2016-01-19 16:02:07.000 | &COUNT_WP# | 21 |
2016-01-19 16:02:07.000 | &LOAD_01# | 8 |
2016-01-19 16:02:07.000 | &LOAD_10# | 4 |
2016-01-19 16:02:07.000 | &LOAD_60# | 4 |
Visualisierung der Daten in Excel
Excel kann, wie auch alle professionellen Reporting-Tools, Daten per SQL driekt aus der ODBC-Quelle lesen. Dadurch kann man sehr schnell kleine Visualisierungen erstellen.
Für eine schöne Darstellung schreiben wir unser SQL Query ein wenig um. Jede Zeile der Ausgabe des folgenden SQL-Codes ist ein Zeitpunkt mit Timestamp und jede Spalte eine der sechs Variablen.
select AH_TIMESTAMP1, MAX(CASE AV_VName WHEN '&LOAD_01#' THEN AV_Value END) as 'LOAD_01', MAX(CASE AV_VName WHEN '&LOAD_10#' THEN AV_Value END) as 'LOAD_10', MAX(CASE AV_VName WHEN '&LOAD_60#' THEN AV_Value END) as 'LOAD_60', MAX(CASE AV_VName WHEN '&COUNT_DWP#' THEN AV_Value END) as 'COUNT_DWP', MAX(CASE AV_VName WHEN '&COUNT_PWP#' THEN AV_Value END) as 'COUNT_PWP', MAX(CASE AV_VName WHEN '&COUNT_WP#' THEN AV_Value END) as 'COUNT_WP' from AH inner join AV on AH_IDNR = AV_AH_Idnr --!Modify Client and Name according to your system! where AH_CLIENT = 1 and AH_NAME = 'SCRI_WORKLOAD' group by AH_TIMESTAMP1 order by AH_TIMESTAMP1;
Ich verzichte hier auf eine ausführlichere Erklärung des Skripts, die benutzten Tabellen und Felder sind die gleichen wie oben. Das Resultat für sechs Timestamps sieht folgedermaßen aus:
AH_TIMESTAMP1 | LOAD_01 | LOAD_10 | LOAD_60 | COUNT_DWP | COUNT_PWP | COUNT_WP |
2016-01-19 16:01:57.000 | 15 | 11 | 15 | 0 | 1 | 18 |
2016-01-19 16:02:07.000 | 8 | 4 | 4 | 1 | 1 | 21 |
2016-01-19 16:05:07.000 | 4 | 19 | 15 | 0 | 1 | 48 |
2016-01-19 16:08:09.000 | 7 | 14 | 18 | 1 | 1 | 26 |
2016-01-19 16:11:10.000 | 44 | 20 | 25 | 0 | 1 | 19 |
2016-01-19 16:14:10.000 | 15 | 11 | 15 | 0 | 1 | 18 |
In Excel können wir uns aus der Tabelle sofort eine Grafik erzeugen lassen. Markieren Sie dazu einfach die Tabell in Excel und wählen Sie unter “Einfügen” im Bereich “Diagramme” den gewünschten Diagrammtyp aus. Ich habe mich für ein Liniendiagramm entschieden. Das Ergebnis sieht folgendermaßen aus.
Für Ihr System umsetzen
Ich hoffe Sie können meine Tipps für Ihr System nutzen und umsetzen. Leider können Sie mit dieser Methde keine Daten aus der Vergangenheit mehr retten. Aber zumindest ab heute können Sie die Workload-Informationen problemlos abspeichern und aufrufen.
Wenn Sie schon den alten AutomicBlog verfolgt haben ist es Ihnen bestimmt aufgefallen: Dieser Artikel war so ähnlich dort auch schon veröffentlicht. Ich werde noch weitere der alten Artikel hier neu aufsetzen. Falls Sie aber dringend jetzt schon einen der alten Artikel brauchen, sehen Sie sich hier an, wie Sie sich die alten Posts verschaffen können.