Azure onboarding uses an Azure Cloud Shell script instead of an ARM template because the App Registration is an Entra ID directory object rather than an Azure resource. ARM templates cannot directly create Entra ID App Registrations.
How the connection works
Metrics and logs reach Atatus by two different mechanisms, and it matters when you come to remove the integration.atatus-log-forwarder, and a Container Apps job in that same group ships them
to Atatus. Atatus never reaches into your subscription to fetch them.
You keep control the whole time. Removing the role assignments, or deleting the App Registration,
cuts Atatus off immediately.
Before you start
Make sure you have:- An Azure subscription, and permission to create an App Registration in the tenant. Application Developer in Entra ID, or an equivalent, is enough.
- Permission to assign roles on the subscriptions you want to monitor: User Access Administrator or Owner.
- Access to the Atatus dashboard.
Whoever evaluates Atatus is often not whoever owns the subscription. If the quickstart cannot
assign a role it does not fail silently. It prints the exact
az role assignment create commands
for a subscription owner to run, and you re-run the quickstart afterwards.Set up the integration
Pick a path. The tabs below hold the full steps for each one.- Quickstart
- Manual integration
Step 1: Start in Atatus
- In Atatus, go to Settings → Integrations and select Azure.
- Click Add Azure Subscription.
- Choose the subscriptions to monitor.
- Choose what to collect:
- Metrics: Azure Monitor metrics and resource metadata. Nothing is deployed into your subscription.
- Logs: deploys the log forwarder and connects your resource logs.
- Copy the command shown on screen with the Copy button.
Use the Copy button rather than selecting the text. The command carries a workflow id and a
one-time setup nonce; a partially copied command aborts before it creates anything.
Step 2: Run the command in Cloud Shell
- Open Azure Cloud Shell and choose Bash.
- Paste the command and press Enter.
A metrics-only onboarding skips the two log stages entirely and does not render them.Typical runtime is one to three minutes for metrics only, and five to fifteen minutes with log
collection on a large subscription.
Keep the Cloud Shell tab open until the script prints that it has finished. Cloud Shell ends idle
sessions, and a session that ends mid-run leaves an App Registration with no roles. Re-running the
quickstart is safe: it updates the objects it made last time rather than creating a second set.
Step 3: Confirm in Atatus
When the script reports completion, the Atatus tab moves to Create Atatus Integration and then to connected. Metrics appear within about ten minutes.What the quickstart creates
Identity
The client secret is sent to Atatus in the final status report and nowhere else. It is never echoed,
never logged, and never passed on a command line.
Roles
Monitoring Contributor is a materially larger consent than Monitoring Reader, so it is requested
only when log collection is switched on. A metrics-only onboarding is read-only.
Log forwarding infrastructure
Everything lives in one resource group,atatus-log-forwarder:The container image is
docker.io/atatus/azure-log-forwarder:latest, pulled anonymously from Docker Hub.The reconciler is what a one-shot installer cannot be. Diagnostic Settings only exist on the
resources that existed when you ran the quickstart. Without the reconciler, everything created
afterwards emits nothing, forever, while the integration still reports success.
Where the log forwarder runs
Both setup paths above run the forwarder as Azure Container Apps jobs in theatatus-log-forwarder
resource group, which is the default and the only option Atatus manages for you.
If you already operate a Kubernetes cluster, you can move the log forwarder there after the
quickstart. See Move the Azure log forwarder to Kubernetes.
Running it on Kubernetes is a manual setup, and the cluster, the CronJobs and their upgrades are
yours to manage. The move keeps every region you collect from today.
Verify the setup
- In Atatus: Settings → Integrations → Azure shows the subscription as connected.
- Metrics: open any Azure dashboard in Atatus. Data appears within about ten minutes.
- Logs: go to Logs and filter by
source:azure. - In Azure: the
atatus-log-forwarderresource group exists, and the job execution history shows successful runs.
forwarderConcurrency first, then forwarderSize.
Troubleshooting
The quickstart cannot assign a role
You have permission to create the App Registration but not to assign roles on the subscription. The script prints the exactaz role assignment create commands to hand to a subscription owner. It
keeps the App Registration it created, so once the roles are assigned you re-run the quickstart and
it picks up where it left off rather than creating a second app.
No logs are arriving, but metrics work
Check in this order:- Diagnostic Settings exist. Open any resource → Diagnostic settings. There should be one named
atatus-logs. If not, the reconciler is not running or lacks Monitoring Contributor. - The reconcile job is succeeding. Container Apps job execution history in
atatus-log-forwarder. - The forward job is succeeding, and its backlog line is near zero.
- The region matches. A Diagnostic Setting cannot write to a storage account in another region.
Confirm
deployRegionalForwarderswas left on.
ATATUS_RECONCILE_DRY_RUN=1. It reports what it would connect without changing anything.
Logs from Application Insights or Automation Accounts are missing
Some log types only ever exist inside a Log Analytics workspace and can never be reached by a Diagnostic Setting: Automation AccountJobLogs, Application Insights tables, and Entra sign-ins routed
to a workspace. These need a workspace Data Export rule, which the quickstart creates as
atatus-logs. Check the rule exists on the workspace, and that the workspace is in a region that
supports data export.
The forwarder job is not starting
The container image must be pullable anonymously from inside your subscription. If your subscription restricts registries by policy, allowdocker.io/atatus/azure-log-forwarder:latest.
The client secret expired
The quickstart requests a two year secret, and a tenant policy can force a shorter one. When it expires, metric collection stops and the reconciler can no longer maintain Diagnostic Settings. Re-run the quickstart, and it resets the credential on the existing app and reports the new secret to Atatus.Pause the integration
To stop collection without removing anything, set the integration to Disabled in Atatus. Within ten minutes the reconciler asks Atatus what it should be doing and stops. The configuration is kept, so re-enabling restores it without re-onboarding.Remove the integration
Removing Atatus from Azure is three separate operations:If you moved the forwarder to Kubernetes, steps 1 and 3 below still apply, but step 2 does not. The
uninstall script only knows about the Container Apps deployment, so follow the removal steps in
Move the Azure log forwarder to Kubernetes instead.
1. Delete the integration
In Atatus, go to Settings → Integrations → Azure and delete the subscription. Atatus cannot do this cleanup itself. Every Diagnostic Setting lives on your resources, and the only thing able to remove one is the job running in your subscription, with a credential Atatus does not hold. So the delete is a handshake:insights-logs-*, insights-metrics-* and am-* containers from the storage account.
What remains afterwards is the infrastructure: the storage account itself, the jobs, and the managed
environment. That is step 2.
A large estate takes several ten-minute cycles. Watch progress in the job execution history:
A metrics-only integration deletes immediately. Nothing was ever deployed into your
subscription, so there is nothing to remove and nothing to wait for.If a deployment cannot report back for 24 hours (the resource group deleted by hand, the job
stopped, the secret expired), Atatus marks the delete orphaned rather than complete, and tells
you what may remain. It does not claim a subscription is clean when nobody can confirm it.There is no final drain. Forwarding stops as soon as the integration is marked for deletion, so
log data written in the last minute or so is deleted with the containers rather than shipped.
2. Uninstall the forwarder
Download and run the uninstall script:az CLI
and jq, both of which are already present in Cloud Shell.
The script reads the teardown record from the storage account, confirms the settings were removed,
and then deletes the atatus-log-forwarder resource group.
Do step 1 before step 2, and the script enforces it. Your Diagnostic Settings live on your
resources, not in the
atatus-log-forwarder group, and the only record of which resources carry
one is a state blob inside that group’s storage account. Delete the group first and every setting
survives it, attached to resources across the subscription, pointing at a storage account that no
longer exists, and unfindable, because the list went with the group.The script refuses to delete anything until it has read a completed teardown record.--force is for a deployment that can no longer run at all, such as an expired client secret, a revoked
role assignment. It prints exactly what will be left behind and asks you to type the resource group
name to confirm. You then have to remove the settings by hand: look for a Diagnostic Setting named
atatus-logs on your resources, and atatus-activity-log on the subscription itself.
If the resource group is already gone, the script says so and exits cleanly.
3. Remove access
--client-id, which the Atatus dashboard shows as
Application (client) ID.
Removing the role assignments needs User Access Administrator on their scope, and deleting the
App Registration needs Application Administrator. If you lack either, the script says which
assignment it could not remove, and you can finish in the portal under Entra ID → App
registrations.