We have decided to go with App Dynamics to do monitoring on our infrastructure and code, which is great and even better they have released support for .Net Core 2.0. However when working with their product and consultant we found an issue with monitoring multiple .Net Core instances on one server, plus with console apps, but we found a way.
Currently their documentation, that is helpful, shows you have to set up monitoring for the .Net Core Application with environment variables. Follow the direction in the App Dynamics Documentation says to set the environment variable for the profilers path, which is in each of the applications, but of course we can’t set multiple environment variables. Therefore we copied the profiler DLL to a central source and used that as the environment variable, but quickly found out that it still didn’t work. For the profiler to start tracking, it needs to be set to point to the applications root folder for each application.
The consultants investigation then lend to looking at how we can set the environment variables for each application, to which we found the application can be set in the web.config using the node ‘environmentVariables’ under the ‘aspNetCore’ node as stated as part of the Microsoft Documentation. Of course using the ‘dotnet publish’ command generates this web.config, so you can’t just set this in the code. Therefore in the release of the code I wrote some PowerShell to set these parameters.
In the below PowerShell, I get the XML content of the web.config, then create each of the environment variable nodes I want to insert. Once I have these I can then insert them into the correct ‘aspNetCore’ node of the XML variable, which I then use to overwrite the contents of the existing file.
$configFile = "web.config"; $sourceDir = "D://wwwroot"; ## Get XML $doc = New-Object System.Xml.XmlDocument $doc.Load() $environmentVariables = $doc.CreateElement("environmentVariables") ## Set 64 bit version $Profiler64 = $doc.CreateElement("environmentVariable") $Profiler64.SetAttribute("name", "CORECLR_PROFILER_PATH_64") $Profiler64.SetAttribute("value", "$sourceDir\$subFolderName\AppDynamics.Profiler_x64.dll") $environmentVariables.AppendChild($Profiler64) ## Set 32 bit version $Profiler32 = $doc.CreateElement("environmentVariable") $Profiler32.SetAttribute("name", "CORECLR_PROFILER_PATH_32") $Profiler32.SetAttribute("value", "$sourceDir\$subFolderName\AppDynamics.Profiler_x86.dll") $environmentVariables.AppendChild($Profiler32) $doc.SelectSingleNode("configuration/system.webServer/aspNetCore").AppendChild($environmentVariables) $doc.Save($configFile.FullName)
Example Web.config result:
<configuration> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\SecurityService.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout"> <environmentVariables> <environmentVariable name="CORECLR_PROFILER_PATH_64" value="D:\IIS\ServiceOne\AppDynamics.Profiler_x64.dll" /> <environmentVariable name="CORECLR_PROFILER_PATH_32" value="D:\IIS\ServiceTwo\AppDynamics.Profiler_x86.dll" /> </environmentVariables> </aspNetCore> </system.webServer> </configuration>
This will work for the application that have a web.config, but something like a Console App doesn’t have one, so what do we do?
The recommendation and solution is to create an organiser script. This script will set the Environment Variable, which will only effect the application triggered in the session. To do this you can use any script really like PowerShell or Command Line.
In this script you just need to set the environment variables and then run the Exe after.
For example in PowerShell:
Param( [string] $TaskLocation, [string] $Arguments ) # Set Environment Variables for AppDynamics Write-Host “Set Environment Variables in path $TaskLocation” $env:CORECLR_PROFILER_PATH_64 = “$TaskLocation\AppDynamics.Profiler_x64.dll” $env:CORECLR_PROFILER_PATH_32 = “$TaskLocation\AppDynamics.Profiler_x86.dll” # Run Exe Write-Host “Start Script” cmd.exe \c exit
These two solutions will mean you can use AppDynamics with both .NetCore Web Apps and Console App, with multiple application on one box.