Skip to main content

Generating Logic App Workflow Reports with PowerShell

Β· 5 min read
Hasan Gural

Hey friends,

In this post, we will dive into generating a report that tracks which workflows are running on which Logic App instances within your tenant. If you are using Logic Apps, especially the Consumption or Standard-based, keeping track of these workflows across different instances can be a challenge. The good news is, with the help of PowerShell that I have developed, we can create a report that highlights which Logic App instances are running which workflows. This report can be crucial for troubleshooting, performance monitoring, and resource management.

If you're running Logic App Standard instances, which can host multiple workflows, the need for clarity becomes even more essential. Previously, tracking this information was done manually or via portal interfaces, but with a little help from PowerShell, we can automate the reporting process. I’ve designed a script that collects the necessary information, processes it, and exports it in a way that's easy to understand.

πŸ”Ž Query Logic App Workflows using PowerShell​

For our task, we'll use PowerShell along with the Az.Resource module to query the status of workflows across Logic App instances. While Logic Apps provide a built-in management interface, using PowerShell can significantly streamline the process when handling large numbers of workflows.

Below is the script to help you generate a report of workflow instances across the tenant’s Logic App instances:


$subscriptions = Get-AzSubscription
$logicAppsOutput = @()
$workflowsOutput = @()

ForEach ($subscription in $subscriptions) {

Write-Output "Processing subscription: $($subscription.Name)"
Set-AzContext -Subscription $subscription.Id

$logicApps = Get-AzResource -ResourceType 'Microsoft.Logic/workflows'
$standardLogicApps = Get-AzResource -ResourceType 'Microsoft.Web/sites' | Where-Object { $_.Kind -like '*workflowapp*' }
$allLogicApps = $logicApps + $standardLogicApps

ForEach ($logicApp in $allLogicApps) {

Write-Output "Processing Logic App: $($logicApp.Name)" -ForegroundColor Green

$resourceGroupName = $logicApp.ResourceGroupName
$logicAppName = $logicApp.Name
$subscriptionId = $subscription.Id

$location = $logicApp.Location
$state = $null
$kind = $null

$logicAppObj = [PSCustomObject]@{

SubscriptionName = $subscription.Name
SubscriptionId = $subscription.Id
ResourceGroupName = $resourceGroupName
LogicAppName = $logicAppName
Location = $location
State = $null # Placeholder, will update later
Kind = $null # Placeholder, will update later

}

$logicAppsOutput += $logicAppObj

# Check if the Logic App is Standard or Consumption
if ($logicApp.Type -eq "Microsoft.Web/sites") {
# Standard Logic App
$kind = "Standard"

try {

$logicAppDetails = Get-AzWebApp -ResourceGroupName $resourceGroupName -Name $logicAppName
$state = $logicAppDetails.State

} catch {

Write-Warning "Failed to retrieve details for Standard Logic App: $logicAppName"
$state = "Unknown"
}

$logicAppObj.State = $state
$logicAppObj.Kind = $kind

# Retrieve workflows within the Standard Logic App
$workflowsUrl = "https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Web/sites/$logicAppName/workflows?api-version=2022-03-01"

try {

$workflows = @()
$nextLink = $workflowsUrl

do {
$response = Invoke-AzRestMethod -Method GET -Uri $nextLink
$content = $response.Content | ConvertFrom-Json

if ($content.value) {
$workflows += $content.value
}

$nextLink = $content.nextLink
} while ($nextLink)

# Loop through each workflow
foreach ($workflow in $workflows) {
$workflowName = $workflow.name

# Create an object for each workflow
$workflowObj = [PSCustomObject]@{
SubscriptionName = $subscription.Name
SubscriptionId = $subscription.Id
ResourceGroupName = $resourceGroupName
LogicAppName = $logicAppName
WorkflowName = $workflowName
Location = $location
State = $state
Kind = $kind
}

$workflowsOutput += $workflowObj
}

if ($workflows.Count -eq 0) {

$workflowObj = [PSCustomObject]@{
SubscriptionName = $subscription.Name
SubscriptionId = $subscription.Id
ResourceGroupName = $resourceGroupName
LogicAppName = $logicAppName
WorkflowName = "No Workflows Found"
Location = $location
State = $state
Kind = $kind
}

$workflowsOutput += $workflowObj
}
}
catch {

Write-Warning "Failed to retrieve workflows for Standard Logic App: $logicAppName"
$workflowObj = [PSCustomObject]@{
SubscriptionName = $subscription.Name
SubscriptionId = $subscription.Id
ResourceGroupName = $resourceGroupName
LogicAppName = $logicAppName
WorkflowName = "Error retrieving workflows"
Location = $location
State = $state
Kind = $kind
}

$workflowsOutput += $workflowObj
}
}
elseif ($logicApp.Type -eq "Microsoft.Logic/workflows") {

$kind = "Consumption"

try {

$logicAppDetails = Get-AzLogicApp -ResourceGroupName $resourceGroupName -Name $logicAppName
$state = $logicAppDetails.State

} catch {

Write-Warning "Failed to retrieve details for Consumption Logic App: $logicAppName"
$state = "Unknown"

}

$logicAppObj.State = $state
$logicAppObj.Kind = $kind

# The workflow name is the same as the Logic App name
$workflowName = $logicAppName

$workflowObj = [PSCustomObject]@{

SubscriptionName = $subscription.Name
SubscriptionId = $subscription.Id
ResourceGroupName = $resourceGroupName
LogicAppName = $logicAppName
WorkflowName = $workflowName
Location = $location
State = $state
Kind = $kind

}

$workflowsOutput += $workflowObj

}
else {

Write-Warning "Unknown Logic App type for: $logicAppName"
$kind = "Unknown"

$logicAppObj.Kind = $kind

}
}
}

$timestamp = Get-Date -Format "yyyyMMdd-HHmmss"
$workflowsFileName = "LogicAppWorkflows-Report-$timestamp.csv"
Write-Output "INFO: Exporting Logic App Workflows to CSV file: $workflowsFileName"
$workflowsOutput | Export-Csv -Path "$PSScriptRoot\$workflowsFileName" -NoTypeInformation -Force

πŸ’» Generating a Logic Apps Workflow Report​

Let's break down the script to understand how it works and what it does: The script leverages the Get-AzResource cmdlet to query all Logic Apps and Standard Logic Apps under a subscription. It then retrieves relevant details such as the workflow name, state, and the type of Logic App (Standard or Consumption). After collecting the necessary data, the script exports it into a CSV report for easier analysis.

πŸš€ Execute the Script​

The script will automatically get all subscriptions in the tenant and retrieve the details of each Logic App instance, including the workflows running within them. To run the script, follow these steps:


## Run the script to generate the report
.\Get-AzLogicAppWorkflowReport.ps1

Once the script finishes, you’ll find a file named LogicAppWorkflows-Report-<timestamp>.csv that contains all the gathered workflow details, which you can use for further analysis or reporting.

πŸ“ Extending the Script​

Feel free to customize the script further if you need more specific information, such as filtering workflows by state, trigger type, or other parameters. Let me know if you have any ideas for additional features, and we can enhance the script together!