Application Monitoring for Azure App Service and Node.js
Monitoring of your Node.js web applications running on Azure App Services doesn't require any modifications to the code. This article walks you through enabling Azure Monitor Application Insights monitoring and provides preliminary guidance for automating the process for large-scale deployments.
Enable Application Insights
The easiest way to enable application monitoring for Node.js applications running on Azure App Services is through Azure portal. Turning on application monitoring in Azure portal will automatically instrument your application with Application Insights, and doesn't require any code changes.
Note
You can configure the automatically attached agent using the APPLICATIONINSIGHTS_CONFIGURATION_CONTENT environment variable in the App Service Environment variable blade. For details on the configuration options that can be passed via this environment variable, see Node.js Configuration.
Note
If both automatic instrumentation and manual SDK-based instrumentation are detected, only the manual instrumentation settings are honored. This is to prevent duplicate data from being sent. For more information, see the troubleshooting section in this article.
Autoinstrumentation through Azure portal
For a complete list of supported autoinstrumentation scenarios, see Supported environments, languages, and resource providers.
You can turn on monitoring for your Node.js apps running in Azure App Service just with one click, no code change required. Application Insights for Node.js is integrated with Azure App Service on Linux - both code-based and custom containers, and with App Service on Windows for code-based apps. The integration is in public preview. The integration adds Node.js SDK, which is in GA.
Select Application Insights in the Azure control panel for your app service, then select Enable.
Choose to create a new resource, or select an existing Application Insights resource for this application.
Note
When you select OK to create the new resource you will be prompted to Apply monitoring settings. Selecting Continue will link your new Application Insights resource to your app service, doing so will also trigger a restart of your app service.
Once you've specified which resource to use, you're all set to go.
Configuration
The Node.js agent can be configured using JSON. Set the APPLICATIONINSIGHTS_CONFIGURATION_CONTENT
environment variable to the JSON string or set the APPLICATIONINSIGHTS_CONFIGURATION_FILE
environment variable to the file path containing the JSON.
"samplingPercentage": 80,
"enableAutoCollectExternalLoggers": true,
"enableAutoCollectExceptions": true,
"enableAutoCollectHeartbeat": true,
"enableSendLiveMetrics": true,
...
The full set of configurations is available, you just need to use a valid json file.
Enable client-side monitoring
To enable client-side monitoring for your Node.js application, you need to manually add the client-side JavaScript SDK to your application.
Automate monitoring
In order to enable telemetry collection with Application Insights, only the following Application settings need to be set:
Application settings definitions
App setting name | Definition | Value |
---|---|---|
ApplicationInsightsAgent_EXTENSION_VERSION | Main extension, which controls runtime monitoring. | ~2 in Windows or ~3 in Linux. |
XDT_MicrosoftApplicationInsights_NodeJS | Flag to control if Node.js agent is included. | 0 or 1 (only applicable in Windows). |
Note
Profiler and snapshot debugger are not available for Node.js applications
App Service application settings with Azure Resource Manager
Application settings for Azure App Service can be managed and configured with Azure Resource Manager templates. You can use this method when you deploy new App Service resources with Resource Manager automation or modify the settings of existing resources.
The basic structure of the application settings JSON for an App Service resource:
"resources": [
{
"name": "appsettings",
"type": "config",
"apiVersion": "2015-08-01",
"dependsOn": [
"[resourceId('Microsoft.Web/sites', variables('webSiteName'))]"
],
"tags": {
"displayName": "Application Insights Settings"
},
"properties": {
"key1": "value1",
"key2": "value2"
}
}
]
For an example of a Resource Manager template with application settings configured for Application Insights, this template can be helpful. Specifically, see the section that starts on line 238.
Automate the creation of an Application Insights resource and link to your newly created App Service resource
To create a Resource Manager template with the default Application Insights settings, begin the process as if you were going to create a new web app with Application Insights enabled.
Create a new App Service resource with your desired web app information. Enable Application Insights on the Monitoring tab.
Select Review + create. Then select Download a template for automation.
This option generates the latest Resource Manager template with all required settings configured.
In the following sample, replace all instances of AppMonitoredSite
with your site name:
Note
If using Windows, set ApplicationInsightsAgent_EXTENSION_VERSION
to ~2
. If using Linux, set ApplicationInsightsAgent_EXTENSION_VERSION
to ~3
.
{
"resources": [
{
"name": "[parameters('name')]",
"type": "Microsoft.Web/sites",
"properties": {
"siteConfig": {
"appSettings": [
{
"name": "APPINSIGHTS_INSTRUMENTATIONKEY",
"value": "[reference('microsoft.insights/components/AppMonitoredSite', '2015-05-01').InstrumentationKey]"
},
{
"name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
"value": "[reference('microsoft.insights/components/AppMonitoredSite', '2015-05-01').ConnectionString]"
},
{
"name": "ApplicationInsightsAgent_EXTENSION_VERSION",
"value": "~2"
}
]
},
"name": "[parameters('name')]",
"serverFarmId": "[concat('/subscriptions/', parameters('subscriptionId'),'/resourcegroups/', parameters('serverFarmResourceGroup'), '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
"hostingEnvironment": "[parameters('hostingEnvironment')]"
},
"dependsOn": [
"[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
"microsoft.insights/components/AppMonitoredSite"
],
"apiVersion": "2016-03-01",
"location": "[parameters('location')]"
},
{
"apiVersion": "2016-09-01",
"name": "[parameters('hostingPlanName')]",
"type": "Microsoft.Web/serverfarms",
"location": "[parameters('location')]",
"properties": {
"name": "[parameters('hostingPlanName')]",
"workerSizeId": "[parameters('workerSize')]",
"numberOfWorkers": "1",
"hostingEnvironment": "[parameters('hostingEnvironment')]"
},
"sku": {
"Tier": "[parameters('sku')]",
"Name": "[parameters('skuCode')]"
}
},
{
"apiVersion": "2015-05-01",
"name": "AppMonitoredSite",
"type": "microsoft.insights/components",
"location": "China North 2",
"properties": {
"ApplicationId": "[parameters('name')]",
"Request_Source": "IbizaWebAppExtensionCreate"
}
}
],
"parameters": {
"name": {
"type": "string"
},
"hostingPlanName": {
"type": "string"
},
"hostingEnvironment": {
"type": "string"
},
"location": {
"type": "string"
},
"sku": {
"type": "string"
},
"skuCode": {
"type": "string"
},
"workerSize": {
"type": "string"
},
"serverFarmResourceGroup": {
"type": "string"
},
"subscriptionId": {
"type": "string"
}
},
"$schema": "https://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
"contentVersion": "1.0.0.0"
}
Enable through PowerShell
To enable the application monitoring through PowerShell, only the underlying application settings must be changed. The following sample enables application monitoring for a website called AppMonitoredSite
in the resource group AppMonitoredRG
. It configures data to be sent to the 012345678-abcd-ef01-2345-6789abcd
instrumentation key.
Note
We recommend that you use the Azure Az PowerShell module to interact with Azure. To get started, see Install Azure PowerShell. To learn how to migrate to the Az PowerShell module, see Migrate Azure PowerShell from AzureRM to Az.
Note
If using Windows, set ApplicationInsightsAgent_EXTENSION_VERSION to ~2
. If using Linux, set ApplicationInsightsAgent_EXTENSION_VERSION to ~3
.
$app = Get-AzWebApp -ResourceGroupName "AppMonitoredRG" -Name "AppMonitoredSite" -ErrorAction Stop
$newAppSettings = @{} # case-insensitive hash map
$app.SiteConfig.AppSettings | %{$newAppSettings[$_.Name] = $_.Value} # preserve non Application Insights application settings.
$newAppSettings["APPINSIGHTS_INSTRUMENTATIONKEY"] = "012345678-abcd-ef01-2345-6789abcd"; # set the Application Insights instrumentation key
$newAppSettings["APPLICATIONINSIGHTS_CONNECTION_STRING"] = "InstrumentationKey=012345678-abcd-ef01-2345-6789abcd"; # set the Application Insights connection string
$newAppSettings["ApplicationInsightsAgent_EXTENSION_VERSION"] = "~2"; # enable the ApplicationInsightsAgent
$app = Set-AzWebApp -AppSettings $newAppSettings -ResourceGroupName $app.ResourceGroup -Name $app.Name -ErrorAction Stop
Troubleshooting
Below is our step-by-step troubleshooting guide for extension/agent based monitoring for Node.js based applications running on Azure App Services.
Check that
ApplicationInsightsAgent_EXTENSION_VERSION
app setting is set to a value of "~2".Browse to
https://yoursitename.scm.chinacloudsites.cn/ApplicationInsights
.Confirm that the
Application Insights Extension Status
isPre-Installed Site Extension, version 2.8.x.xxxx, is running.
If it isn't running, follow the enable Application Insights monitoring instructions.
Navigate to D:\local\Temp\status.json and open status.json.
Confirm that
SDKPresent
is set to false,AgentInitializedSuccessfully
to true andIKey
to have a valid iKey.Below is an example of the JSON file:
"AppType":"node.js", "MachineName":"c89d3a6d0357", "PID":"47", "AgentInitializedSuccessfully":true, "SDKPresent":false, "IKey":"00000000-0000-0000-0000-000000000000", "SdkVersion":"1.8.10"
If
SDKPresent
is true this indicates that the extension detected that some aspect of the SDK is already present in the Application, and will back-off.
What's the difference between standard metrics from Application Insights vs. Azure App Service metrics?
Application Insights collects telemetry for the requests that made it to the application. If the failure occurs in WebApps/WebServer, and the request didn't reach the user application, Application Insights doesn't have any telemetry about it.
The duration for serverresponsetime
calculated by Application Insights doesn't necessarily match the server response time observed by Web Apps. This behavior is because Application Insights only counts the duration when the request actually reaches the user application. If the request is stuck or queued in WebServer, the waiting time is included in the Web Apps metrics but not in Application Insights metrics.
Test connectivity between your application host and the ingestion service
Application Insights SDKs and agents send telemetry to get ingested as REST calls to our ingestion endpoints. You can test connectivity from your web server or application host machine to the ingestion service endpoints by using raw REST clients from PowerShell or curl commands. See Troubleshoot missing application telemetry in Azure Monitor Application Insights.
Release notes
For the latest updates and bug fixes, consult the release notes.
Next steps
- Monitor Azure Functions with Application Insights.
- Enable Azure diagnostics to be sent to Application Insights.
- Monitor service health metrics to make sure your service is available and responsive.
- Receive alert notifications whenever operational events happen or metrics cross a threshold.
- Use Application Insights for JavaScript apps and web pages to get client telemetry from the browsers that visit a web page.
- Availability overview