Power Automate: Bessere Logs

Power Automate: Bessere Logs

Fr. Mai 19 2023
Power Automate Keine Kategorien zugewiesen

Flows sind mÀchtig. Ich kann mir einfache Benachrichtigungsflows bauen, aber auch komplexe Prozesse erstellen, die mir im Minutenzyklus aus mehreren Systemen Daten aggregieren und selbst aus mehreren Teilflows bestehen.

Wie behalte ich aber einen Überblick ĂŒber alle meine Flow-LĂ€ufe? Ich meine das hier nicht technisch. Dass ein einzelner Flow auf einen Fehler lĂ€uft ist leicht zu erkennen. Was ist aber, wenn ein Flow, der hĂ€tte laufen sollen, nicht gelaufen ist?

WEnn ich mit einem komplexen Geflecht von Workflows zu tun habe, erstelle ich mir normalerweise noch zusĂ€tzlich ein paar Listen im Dataverse, in denen ich dann zusĂ€tzliche Informationen zu FlowlĂ€ufen hinterlege. Das sind normalerweise die drei Tabellen “Process-Runs”,“Sub-Process-Runs”,“Process-Messages”.

In der Tabelle “Process-Runs” hinterlege ich beim Start der Hauptprozesses alle relevanten Informationen

SpalteBeschreibung
Process-NameDer Name des Prozesses, der angestoßen wurde
Process-ParamsDie Relevanten Parameter, die dem Prozess ĂŒbergeben wurden
Process-Run-IDEine beim Start zufÀllig erzeugte guid
Process-StartDer Zeitpunkt, an dem der Flow gestartet wurde
Process-EndDer Zeitpunkt, an dem der Flow beendet wurde
Process-LastModifiedDer Zeitpunkt, an dem aus dem Flow das letzte Mal eine Aktualisierung an diese Liste geschrieben wurde
Process-StateEin TextFeld, welches von innerhalb des Prozesses aktualisiert wird und mit den aktuellen Status anzeigt (z.B. “Initialisierung”,“Datenanlagephase”,“Ende” etc.)

In diese Liste schreibe ich nun einen neuen Eintrag, sobald der Hauptprozess gestartet wurde und setzte den Status und das Start_Datum. Wann immer der Flow eine bestimmte Phase durchlaufen hat, aktualisiere ich diesen Eintrag in der Tabelle, bis der Flow beendet ist.

Damit habe ich schon mal eine gute Grundlage zur Dokumentation und Überwachung meines Flows. Mittels dieser Tabelle kann ich nun recht einfach erkennen, ob ein Flow gestartet wurde und sich nicht innerhalb einer halbwegs erwarteten Zeit wieder beendet hat. Das kann ich zum Beispiel durch einen weiteren Flow ĂŒberprĂŒfen lassen, den ich zeitgesteuert regelmĂ€ssig ausfĂŒhre.

Manchmal macht es Sinn, einzelne Blöcke eines Flows in Child-Flows auszulagern. Oder wir iterieren in einer Schleiße ĂŒber viele Elemente und wollen jeden einzelnen Schleifenablauf einzeln dokumentieren. Dazu benutze ich dann die Tabelle “Sub-Process-Runs”

SpalteBeschreibung
Sub-Process-NameDer Name des Prozesses, der angestoßen wurde
Sub-Process-ParamsDie Relevanten Parameter, die dem Prozess ĂŒbergeben wurden
Process-Run-IDDie Guid des ĂŒbergeordneten Flows
Process-StateDer Status des ĂŒbergeordneten Flows, zu dem dieser Childflow gehört
Sub-Process-Run-IDEine beim Start zufÀllig erzeugte guid
Sub-Process-StartDer Zeitpunkt, an dem der Flow gestartet wurde
Sub-Process-EndDer Zeitpunkt, an dem der Flow beendet wurde
Sub-Process-LastModifiedDer Zeitpunkt, an dem aus dem Flow das letzte Mal eine Aktualisierung an diese Liste geschrieben wurde
Sub-Process-StateEin TextFeld, welches von innerhalb des Prozesses aktualisiert wird und mit den aktuellen Status anzeigt (z.B. “Initialisierung”,“Datenanlagephase”,“Ende” etc.)

Die Tabelle ist analog zur “Process-Run” Tabelle aufgebaut. Hier ist nur das Feld “Process-Run-ID” zusĂ€tzlich vorhanden, mit dem ich auf den aufrufenden Flow in der “Process-Run” Tabelle verweise.

Wenn ich nun einen Childflow starte oder in einer Schleife Elemente bearbeite, erstelle ich immer einen Eintrag in dieser Tabelle und setzte entsprechend Statuswerte und Zeitstempel um, wenn es erforderlich wird.

Schließlich erstelle ich noch die letzte Tabelle “Process-Messages”

SpalteBeschreibung
Process-Run-IDDie Guid des ĂŒbergeordneten Flows
Sub-Process-Run-IDDie Guid des ĂŒbergeordneten Child Flows (leer, wenn die Nachricht aus dem Hauptflow geschrieben wird)
Process-Message-DateDer Zeitpunkt, an dem die Nachricht geschrieben wurde
Process-Message-TypeDer Typ der Nachricht, zum Beispiel “PROCESSING_ITEM”
Process-Message-ParamsDie Parameter der Nachricht, zum Beispiel eine Item ID

In diese Liste schreibe ich nun Nachrichten, wenn ich bestimmte Phasen in meinen Workflows durchlaufe. Im Prinzip resultiert das ganze dann in einer Log-Datei ĂŒber mehrere Flow Aufrufe nur fĂŒr meinen aktuellen Process-Run.

Die ganzen Daten stehen dann als Werte im Dataverse und ich könnte Sie da auswerten. Das ist aber ein wenig mĂŒhselig, weswegen ich mir normalerweise nun eine kleine PowerApp baue, in der ich mir die Daten visualisiere.

ZunĂ€chst erstelle ich einen Screen, in auf dem ich alle “Process-Runs” zu einem komplexen Workflow darstelle:

Wenn ich auf einen konkreten Run klicke gelange ich auf einen Detailscreen zu diesem Run. Darauf stelle ich von links nach rechts alle möglichen Phasen des Workflows dar. Zu jeder Phase liste ich die durchlaufenden Childflows aus der Tabelle “Sub-Process-Runs” zu diesem Flow auf.

Über einen Klick auf einen der Pfleile nach rechts gelangt man auf eine Ansicht, in der ich alle Log-EintrĂ€ge aus der Tabelle “Process-Messages” darstelle.

Über diese App kann ich mir nun einfach den Status meines Workflows live anzeigen.