An Azure relational database service.
Hi Daniel,
Yes, this is expected behavior, even though it definitely looks wrong at first glance. The Elastic Job Agent works by constantly polling its job database to check for new jobs, job definition changes, and other CRUD operations. It's a fixed internal heartbeat of the agent service, completely independent of your job schedules. That's why your volume is flat at ~127K records/hour with no bump at 2 AM and no overnight dip. The sp_cloud_connection_set_sds checks and the EF job_execution queries are the agent's own plumbing running under ##MS_InstanceCertificate##and Microsoft has actually added a note about exactly this audit noise to the Elastic Jobs documentation.
Is the polling cadence configurable? No. There's no setting on the job agent (at any JA tier) to slow it down; the tiers only change capacity/concurrency, not the polling behavior.
Is there a supported way to exclude the job database at the audit layer? Yes, and it's the fix Microsoft recommends for this: a predicate expression on the server audit policy. It's not exposed in the portal, but it's fully supported via PowerShell/CLI/REST:
powershell
Set-AzSqlServerAudit -ResourceGroupName "rg-name" `
-ServerName "sql-server-name" `
-PredicateExpression "database_name <> 'YourJobDatabase'"
This keeps your action groups intact (including BATCH_COMPLETED_GROUP), keeps auditing on all application databases, including ones created later, which is the main benefit of server-level auditing, and drops the job DB records before they're written, so you stop paying Log Analytics ingestion on them entirely. That's better than a transformation DCR, where the data still transits the pipeline.
A couple of caveats:
- The predicate applies to the entire server audit policy, so test it in one environment and confirm your application-database events still land as expected.
- If you want to keep visibility into the actual 2 AM job step activity while cutting only the heartbeat, you can use a more surgical predicate instead, e.g.
application_name = 'Microsoft Azure SQL Database elastic jobs - control' AND statement NOT LIKE '%sys.sp_cloud_connection_set_sds%'etc. But the plain database-name exclusion is simpler to reason about and easier to get past compliance review. - I'd avoid filtering on
server_principal_name <> '##MS_InstanceCertificate##', since that internal principal can appear for platform operations beyond the job agent.
If a predicate doesn't fit your compliance posture, the other supported option is to move the job database to a dedicated logical server with no (or reduced) server-level auditing. The agent can target databases on other servers, so the control DB doesn't need to live alongside your application databases. Switching to per-database auditing on each app DB would also work, but you'd lose automatic coverage of new databases, so I'd treat that as a last resort.
Since your 3 environments are identical, the predicate is a one-line change per server and should eliminate all of that spend essentially. Just document the exclusion in your audit standard, so it's clear the omission is deliberate.
Hope this helps. Please mark as accepted if it resolves your question.