Overview
This sample shows how to surface Logic App Standard Business Process Tracking data in Business Activity Monitoring (BAM) using the pull model. Business Process Tracking writes transaction events to Azure Data Explorer (ADX). BAM queries that ADX database using KQL to display transaction instances, stage status, and custom properties in the Turbo360 portal — without requiring support users or business analysts to access the Azure portal directly.
Business value
Business Process Tracking in Logic App Standard provides rich transactional telemetry, but querying it requires Azure portal access and KQL familiarity. By connecting BAM to the ADX database behind Business Process Tracking, you give L2 support and business users a self-service view of interface health. Developers receive fewer support tickets, and non-Azure users can investigate transaction status, correlate events, and drill into stage detail without leaving Turbo360.
Prerequisites
Before configuring this sample in Turbo360, ensure the following are in place:
A Logic App Standard workflow is configured with Business Process Tracking, and tracking data is flowing to an Azure Data Explorer cluster.
An App Registration exists with Reader permission on the ADX resource in Azure.
The App Registration has Viewer access to query data within the ADX database.
How it works
The following diagram shows how the components interact in this sample.
The developer instruments Logic Apps using Business Process Tracking.
Logic Apps writes tracking events to Azure Data Explorer.
The developer configures KQL queries in Turbo360 BAM to query that ADX data.
L2 support and business users view transaction status and stage detail in Turbo360 without needing Azure portal access.
Developers receive fewer support questions because users can self-service.
.png)
When configuring the Turbo360 business process, you write:
A parent KQL query that queries the business process and transaction records and crafts the rows to display in the Turbo360 tracking grid. Promoting custom properties on this query enables searching by business-level fields.
One or more child KQL queries that retrieve stage events. The link between parent and child is a field promoted on the parent query — you use that field in each child query to filter to the matching records.
Video walkthrough
Parent query
The parent query finds a start event and an end event and joins them to produce a single row representing the end-to-end business process. Logic App Standard does not natively expose an overall transaction concept, but this pattern infers it by matching start and end events on a shared correlation ID.
The query promotes key business properties from the start event — including RailcarID, LoadSlipID, and EventID — so you can filter and search by those values in the Turbo360 tracking grid. You must also promote a field to use as the tile field for time-based filtering.
let startEvents = RailcarEvents
| where eventName == "Message_Received";
let endEvents = RailcarEvents
| where eventName == "Processor_Complete"
| extend EndEventStatus = eventStatus;
startEvents
| join kind=leftouter endEvents on $left.correlationId == $right.correlationId
| order by eventTimestamp desc
| extend appName = metadata.appName
| extend businessProcessName = metadata.businessProcessName
| extend trackingProfileId = metadata.trackingProfileId
| extend RailcarID = properties.RailcarID
| extend LoadSlipID = properties.LoadSlipID
| extend EventID = properties.EventID
| project StartTime=eventTimestamp, EndTime=eventTimestamp1, EventID, LoadSlipID, RailcarID, trackingProfileId, businessProcessName, appName, EndEventStatus
Stage query
The stage query is designed to be reusable across stages. To use it for a different stage, change the eventName filter to match the event name in the Business Process Tracking profile for that stage.
Key elements of this query:
The portal URL template is constructed with
strcat, injecting themetaData_flowRunSequenceIdat query time to produce a clickable link to the Logic App workflow run history in the Azure portal.The correlation ID filter (
correlationId == {EventID}) links this stage query to the parent query using theEventIDpromoted on the parent.The
eventName == "Processor_Complete"filter matches the specific stage in the Business Process Tracking profile. Change this value to target a different stage.The
extendstatements at the end of the query promote custom properties from the Logic App tracking profile for display in the stage detail panel.
Modify the portal URL, table name, and promoted properties to match your own environment before using this query.
let inputLogicAppRunPortalUrl = "https://portal.azure.com/#view/Microsoft_Azure_EMA/DesignerEditor.ReactView/id/%2Fsubscriptions%2F92357fca-2391-4501-b98a-6a93589ba4c9%2FresourceGroups%2Fblog_app_railcargps%2Fproviders%2FMicrosoft.Web%2Fsites%2Fms-blog-railcar-gps%2Fworkflows%2FProcessController/location/North%20Europe/isReadOnly~/false/isMonitoringView~/true/runId/";
RailcarEvents
| where correlationId == {EventID}
| where eventName == "Processor_Complete"
| extend metaData_appName = tostring(metadata.appName)
| extend metaData_businessProcessName = tostring(metadata.appbusinessProcessNameName)
| extend metaData_businessProcessVersion = tostring(metadata.businessProcessVersion)
| extend metaData_trackingProfileName = tostring(metadata.trackingProfileName)
| extend metaData_trackingProfileId = tostring(metadata.trackingProfileId)
| extend metaData_trackingProfileSequenceId = tostring(metadata.trackingProfileSequenceId)
| extend metaData_flowName = tostring(metadata.flowName)
| extend metaData_flowId = tostring(metadata.flowId)
| extend metaData_flowSequenceId = tostring(metadata.flowSequenceId)
| extend metaData_flowRunSequenceId = tostring(metadata.flowRunSequenceId)
| extend metaData_clientTrackingId = tostring(metadata.clientTrackingId)
| extend metaData_batchId = tostring(metadata.batchId)
| extend metaData_flowName = tostring(metadata.flowName)
| extend properties_EventID = tostring(properties.EventID)
| extend PortalUrl = strcat(inputLogicAppRunPortalUrl, metaData_flowRunSequenceId)FAQs
FAQ
Can a BAM transaction include stages from more than one data source?
Yes. A Turbo360 BAM transaction can have stages from different data sources. For example, one stage can come from Application Insights (a log event from API Management) and the next stage can come from ADX (a Business Process Tracking event from Logic App Standard).
Can stages come from different tables in ADX?
Yes. Each child stage query is independent and can target any table in the ADX database. You are not restricted to a single table across all stages in a transaction.