The Atatus .NET agent monitors .NET Framework and .NET Core applications hosted on IIS. Install it using the Profiler (per–application-pool environment variables) or the NuGet package.

Profiler

The profiler attaches at runtime through environment variables set on each application pool. See the Profiler overview for prerequisites and the full list of variables.

Before you start: IIS 10 or later is recommended — it scopes environment variables per application pool (on IIS 7–8.5, set them globally). Run the application pool in Integrated pipeline mode, and make sure its identity has read and execute access to the profiler directory.

1. Download the profiler

Download the Windows profiler ZIP in your browser.

2. Extract the profiler

Extract All… and choose a directory the application pool identity can read, such as C:\atatus. Use this path in the steps below.

3. Set environment variables per application pool

Run the script for your runtime, replacing the pool names, Atatus app names, and <extracted directory>.

.NET Framework

copy
icon/buttons/copy

   $appcmd = "$($env:systemroot)\system32\inetsrv\AppCmd.exe"
   # Define your application pools and their corresponding Atatus app names
   $appPools = @{
       "<IISAppPoolName1>" = "<AtatusAppName1>"
       "<IISAppPoolName2>" = "<AtatusAppName2>"
   }
   # Base environment variables (common to all pools)
   $environment = @{
       COR_ENABLE_PROFILING         = "1"
       COR_PROFILER                 = "{A6C28362-6F75-472A-B36C-50C1644DA40A}"
       COR_PROFILER_PATH            = "<extracted directory>\atatus_profiler.dll"
       ATATUS_PROFILER_HOME         = "<extracted directory>"
       ATATUS_PROFILER_INTEGRATIONS = "<extracted directory>\integrations.yml"
       COMPlus_LoaderOptimization   = "1"
       ATATUS_LICENSE_KEY           = "YOUR_LICENSE_KEY"
       ATATUS_ANALYTICS             = "true"
       ATATUS_TRACING               = "true"
       ATATUS_CAPTURE_BODY          = "all"
   }
   # Apply environment variables per app pool
   $appPools.GetEnumerator() | ForEach-Object {
       $appPool = $_.Key
       $atatusAppName = $_.Value
       $envVars = $environment.Clone()
       $envVars["ATATUS_APP_NAME"] = $atatusAppName
       $envVars.Keys | ForEach-Object {
           & $appcmd set config -section:system.applicationHost/applicationPools /+"[name='$appPool'].environmentVariables.[name='$_',value='$($envVars[$_])']"
       }
   }
   # Recycle only the configured app pools to apply changes
   $appPools.Keys | ForEach-Object {
       & $appcmd recycle apppool /apppool.name:"$_"
   }

.NET Core

copy
icon/buttons/copy

   $appcmd = "$($env:systemroot)\system32\inetsrv\AppCmd.exe"
   # Define your application pools and their corresponding Atatus app names
   $appPools = @{
       "<IISAppPoolName1>" = "<AtatusAppName1>"
       "<IISAppPoolName2>" = "<AtatusAppName2>"
   }
   # Base environment variables (common to all pools)
   $environment = @{
       CORECLR_ENABLE_PROFILING     = "1"
       CORECLR_PROFILER             = "{A6C28362-6F75-472A-B36C-50C1644DA40A}"
       CORECLR_PROFILER_PATH        = "<extracted directory>\atatus_profiler.dll"
       ATATUS_PROFILER_HOME         = "<extracted directory>"
       ATATUS_PROFILER_INTEGRATIONS = "<extracted directory>\integrations.yml"
       COMPlus_LoaderOptimization   = "1"
       ATATUS_LICENSE_KEY           = "YOUR_LICENSE_KEY"
       ATATUS_ANALYTICS             = "true"
       ATATUS_TRACING               = "true"
       ATATUS_CAPTURE_BODY          = "all"
   }
   # Apply environment variables per app pool
   $appPools.GetEnumerator() | ForEach-Object {
       $appPool = $_.Key
       $atatusAppName = $_.Value
       $envVars = $environment.Clone()
       $envVars["ATATUS_APP_NAME"] = $atatusAppName
       $envVars.Keys | ForEach-Object {
           & $appcmd set config -section:system.applicationHost/applicationPools /+"[name='$appPool'].environmentVariables.[name='$_',value='$($envVars[$_])']"
       }
   }
   # Recycle only the configured app pools to apply changes
   $appPools.Keys | ForEach-Object {
       & $appcmd recycle apppool /apppool.name:"$_"
   }

4. Recycle pools later (optional)

To apply the changes during a later maintenance window instead of recycling immediately, run this script when ready:

copy
icon/buttons/copy

   $appcmd = "$($env:systemroot)\system32\inetsrv\AppCmd.exe"

   $appPools = @{
       "<IISAppPoolName1>" = "<AtatusAppName1>"
       "<IISAppPoolName2>" = "<AtatusAppName2>"
   }

   # Recycle only the configured app pools to apply changes
   $appPools.Keys | ForEach-Object {
       & $appcmd recycle apppool /apppool.name:"$_"
   }

NuGet package

For a NuGet-based installation on IIS, follow the guide for your runtime:

Next steps