Power Automate: Bessere Logs

Falls man nur einen Flow hat, ist die Überwachung davon recht einfach. Falls man viele Flows hat, die fachlich ineinandergreifen, wird das schwieriger

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

Spalte Beschreibung
Process-Name Der Name des Prozesses, der angestoßen wurde
Process-Params Die Relevanten Parameter, die dem Prozess übergeben wurden
Process-Run-ID Eine beim Start zufällig erzeugte guid
Process-Start Der Zeitpunkt, an dem der Flow gestartet wurde
Process-End Der Zeitpunkt, an dem der Flow beendet wurde
Process-LastModified Der Zeitpunkt, an dem aus dem Flow das letzte Mal eine Aktualisierung an diese Liste geschrieben wurde
Process-State Ein 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"

Spalte Beschreibung
Sub-Process-Name Der Name des Prozesses, der angestoßen wurde
Sub-Process-Params Die Relevanten Parameter, die dem Prozess übergeben wurden
Process-Run-ID Die Guid des übergeordneten Flows
Process-State Der Status des übergeordneten Flows, zu dem dieser Childflow gehört
Sub-Process-Run-ID Eine beim Start zufällig erzeugte guid
Sub-Process-Start Der Zeitpunkt, an dem der Flow gestartet wurde
Sub-Process-End Der Zeitpunkt, an dem der Flow beendet wurde
Sub-Process-LastModified Der Zeitpunkt, an dem aus dem Flow das letzte Mal eine Aktualisierung an diese Liste geschrieben wurde
Sub-Process-State Ein 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"

Spalte Beschreibung
Process-Run-ID Die Guid des übergeordneten Flows
Sub-Process-Run-ID Die Guid des übergeordneten Child Flows (leer, wenn die Nachricht aus dem Hauptflow geschrieben wird)
Process-Message-Date Der Zeitpunkt, an dem die Nachricht geschrieben wurde
Process-Message-Type Der Typ der Nachricht, zum Beispiel "PROCESSING_ITEM"
Process-Message-Params Die 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:

processruns

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.

teaser

Ü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.

Hat dir das gefallen? Vielleicht magst du auch...

Low-Code-Programmierung: Software selbst bauen

Was verbirgt sich hinter den Begriffen? Wann kann ich das benutzen und worauf muss ich achten?

Wie breche ich alle laufenden Runs zu einem Flow ab?

Ich zeige hier, wie das geht.

Neue Governance Möglichkeiten für die PowerPlattform

Auf der Ignite wurden neue Möglichkeiten zur Kontrolle des Datenflusses in PowerApps Konnektoren vorgestellt.