Home / Azure

AzureChecklistIntermediate

Azure Functions not triggering: a checklist for timer, queue, blob and HTTP triggers

Work through host health, app settings, storage connectivity and trigger-specific gotchas when a function silently stops running.

Deepak Bhardwaj3 min read

Applies toAzure Functions v4 (Consumption, Flex Consumption, Premium, Dedicated)

Is the host healthy?

  • The function app is running and the function isn't disabled (AzureWebJobs.<FunctionName>.Disabled app setting).
  • AzureWebJobsStorage points to a storage account that exists and can be reached. The host needs it for locks, timers and blob receipts.
  • FUNCTIONS_EXTENSION_VERSION = ~4 and FUNCTIONS_WORKER_RUNTIME matches your code (dotnet-isolated, node, python, java, powershell).
  • The latest deployment actually contains the function. Check Functions in the portal; an empty list means a deployment or packaging problem.
az functionapp show -g rg-fn -n fn-prod --query "{state:state, kind:kind}" -o table
az functionapp config appsettings list -g rg-fn -n fn-prod \
  --query "[?name=='AzureWebJobsStorage' || name=='FUNCTIONS_WORKER_RUNTIME' || name=='FUNCTIONS_EXTENSION_VERSION']" -o table

Look at what the host says

// Application Insights
traces
| where timestamp > ago(1h)
| where severityLevel >= 3 or message has_any ("Host started", "Host lock", "Listener", "unable to", "Error")
| project timestamp, severityLevel, message
| order by timestamp desc

Messages like The listener for function 'X' was unable to start name the trigger that failed and why, often a connection string or permission problem.

Trigger-specific checks

Timer

  • The CRON expression has six fields (seconds first): 0 */5 * * * * means every 5 minutes.
  • The time zone is UTC unless WEBSITE_TIME_ZONE is set (supported on Windows and Linux Premium/Dedicated plans).
  • Only one instance runs a timer, using a blob lease in AzureWebJobsStorage. If two apps share that storage account and the same host ID, one of them silently doesn't run.

Queue / Service Bus

  • The connection setting name in the binding matches an app setting, for example "connection": "ServiceBusConn". With identity-based connections, use ServiceBusConn__fullyQualifiedNamespace.
  • Messages aren't all going to the poison or dead-letter queue. Check <queue>-poison or the DLQ.
  • The identity has a data role (Storage Queue Data Contributor / Azure Service Bus Data Receiver).

Blob

  • On Consumption plans, the classic blob trigger polls and can lag by minutes. Use the Event Grid-based blob trigger for low latency.
  • Blob receipts in azure-webjobs-hosts stop reprocessing of existing blobs. Re-uploading the same name doesn't fire again unless the blob changes.

HTTP

  • Callers use the right function key (?code= or the x-functions-key header) and route.
  • Access restrictions or private endpoints aren't blocking the caller.

Networking

  • If the storage account is locked down, the app needs VNet integration plus private endpoints for blob, queue, table and file. Set WEBSITE_CONTENTOVERVNET=1 where the plan requires it.
  • DNS resolves those endpoints to private IPs from inside the integrated VNet.

Scale and cold start

  • On Consumption, scale-out can be delayed for some trigger types. For latency-sensitive work use Premium or Flex Consumption with always-ready instances.
  • functionAppScaleLimit isn't set to a tiny number by mistake.

Tip

After fixing settings, restart the function app. Some binding settings are only read when the host starts.