Leverage your Logic Apps performance using Azure Functions

Introduction

In this article, I am going to give a heads-up how the performance degrades when you intend to do every operation inside Logic Apps and also how to leverage our LA performance using Azure Functions.

Scenario

Inside my flow, I need to call an API that outputs JSON. My LA flow should filter and send only the required columns to caller.

Message Structure

Approach 1

In the approach one, I have tried to do everything Inside Logic Apps using Actions.

In the above Logic Apps, after I get the JSON objects I am trying to for each "fields" element and collect
the required field elements. Inside my foreach fields, I am composing a JSON array with list of name fields.
Then using "Compose 2" Action, we create a output JSON and return it. 

In that case, my Logic App has taken average 13-15 seconds. Since it is User facing API, I
have decided to improve the performance from average 13-15 seconds to 2-3 seconds using Azure Functions
and I am quite successful.

My logic app code as below,

{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Compose_2": {
                "inputs": "@{join(outputs('Compose'), ',')}",
                "runAfter": {
                    "For_each": [
                        "Succeeded"
                    ]
                },
                "type": "Compose"
            },
            "For_each": {
                "actions": {
                    "Compose": {
                        "inputs": "@item()['name']",
                        "runAfter": {},
                        "type": "Compose"
                    }
                },
                "foreach": "@body('Get_SF_Objects')?['fields']",
                "runAfter": {
                    "Get_SF_Objects": [
                        "Succeeded"
                    ]
                },
                "type": "Foreach"
            },
            "GetSalesforce_Oauth_Access_Token": {
                "inputs": {
                    "body":"grant_type=password&client_id=3MVG9YDQS5WtC11qO_LPE1P5HObJDw_5._0QaidHX5MfGaIQONHgNgVfB5_Vmq.2.yhN6S0nnzLPHASj29g7W&client_secret=8173475474047140117&username=baraneedharan.manoharan%40*****.com&password=",
                    "headers": {
                        "Content-Type": "application/x-www-form-urlencoded"
                    },
                    "method": "POST",
                    "uri": "https://login.salesforce.com/services/oauth2/token"
                },
                "runAfter": {
                    "Initialize_variable_3": [
                        "Succeeded"
                    ]
                },
                "type": "Http"
            },
            "Get_SF_Objects": {
                "inputs": {
                    "headers": {
                        "Authorization": "Bearer @{body('GetSalesforce_Oauth_Access_Token')?['access_token']}",
                        "Content-Type": "application/json"
                    },
                    "method": "GET",
                    "uri": "https://ap4.salesforce.com//services/data/v39.0/sobjects/@{variables('ObjectName')}/describe"
                },
                "runAfter": {
                    "GetSalesforce_Oauth_Access_Token": [
                        "Succeeded"
                    ]
                },
                "type": "Http"
            },
            "Initialize_variable_3": {
                "inputs": {
                    "variables": [
                        {
                            "name": "ObjectName",
                            "type": "String",
                            "value": "@{json(triggerBody()).ObjectName}"
                        }
                    ]
                },
                "runAfter": {},
                "type": "InitializeVariable"
            },
            "Response": {
                "inputs": {
                    "body": {
                        "fields": ""
                    },
                    "statusCode": 200
                },
                "runAfter": {
                    "Compose_2": [
                        "Succeeded"
                    ]
                },
                "type": "Response"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {},
        "triggers": {
            "manual": {
                "inputs": {
                    "schema": {
                        "properties": {
                            "ObjectName": {
                                "type": "string"
                            }
                        },
                        "type": "object"
                    }
                },
                "kind": "Http",
                "type": "Request"
            }
        }
    }
}

Approach 2

I have written a Azure function to collect the required fields and create a JSON output message rather using
 compose actions inside my LA.  Now my Logic Apps would like below,

Conclusion

So I have used Azure Functions inside Logic Apps flow and have leveraged the performance that has saved more than 10 seconds of processing time and 1 compose action as well. So please be careful and don't try to do everything using LA Actions that costs performance and as well money.

Return to Top