Managing Azure Application Insights with Terraform
Learn how to deploy and manage Azure Application Insights using Terraform
Azure Application Insights provides application performance monitoring and analytics. This guide shows you how to manage Application Insights using Terraform.
Video Tutorial
Prerequisites
- Azure subscription
- Terraform installed
- Azure CLI installed
- Basic understanding of application monitoring concepts
Project Structure
.
├── main.tf # Main Terraform configuration file
├── variables.tf # Variable definitions
├── outputs.tf # Output definitions
├── terraform.tfvars # Variable values
└── modules/
└── app-insights/
├── main.tf # Application Insights specific configurations
├── variables.tf # Module variables
├── alerts.tf # Alert configurations
└── outputs.tf # Module outputs
Basic Configuration
Here’s a basic example of setting up Application Insights:
resource "azurerm_resource_group" "monitoring_rg" {
name = "monitoring-resources"
location = "eastus"
}
resource "azurerm_log_analytics_workspace" "workspace" {
name = "monitoring-workspace"
location = azurerm_resource_group.monitoring_rg.location
resource_group_name = azurerm_resource_group.monitoring_rg.name
sku = "PerGB2018"
retention_in_days = 30
}
resource "azurerm_application_insights" "app_insights" {
name = "app-insights"
location = azurerm_resource_group.monitoring_rg.location
resource_group_name = azurerm_resource_group.monitoring_rg.name
application_type = "web"
workspace_id = azurerm_log_analytics_workspace.workspace.id
retention_in_days = 90
}
output "instrumentation_key" {
value = azurerm_application_insights.app_insights.instrumentation_key
sensitive = true
}
output "app_id" {
value = azurerm_application_insights.app_insights.app_id
}
Advanced Features
Web Tests
Configure availability tests:
resource "azurerm_application_insights_web_test" "availability_test" {
name = "availability-test"
location = azurerm_resource_group.monitoring_rg.location
resource_group_name = azurerm_resource_group.monitoring_rg.name
application_insights_id = azurerm_application_insights.app_insights.id
kind = "ping"
frequency = 300
timeout = 30
enabled = true
geo_locations = ["us-ca-sjc-azr", "us-tx-sn1-azr", "us-il-ch1-azr"]
configuration = <<XML
<WebTest Name="availability-test" Enabled="True" Timeout="30" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<Items>
<Request Method="GET" Version="1.1" Url="https://www.example.com" ThinkTime="0" />
</Items>
<ValidationRules>
<ValidationRule Classname="Microsoft.VisualStudio.TestTools.WebTesting.Rules.ValidationRuleFindText, Microsoft.VisualStudio.QualityTools.WebTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" DisplayName="Find Text" Description="Verifies the existence of the specified text in the response." Level="High" ExectuionOrder="BeforeDependents">
<RuleParameters>
<RuleParameter Name="FindText" Value="Welcome" />
<RuleParameter Name="IgnoreCase" Value="False" />
<RuleParameter Name="UseRegularExpression" Value="False" />
<RuleParameter Name="PassIfTextFound" Value="True" />
</RuleParameters>
</ValidationRule>
</ValidationRules>
</WebTest>
XML
}
Smart Detection Rules
Configure smart detection rules:
resource "azurerm_application_insights_smart_detection_rule" "failure_anomalies" {
name = "Failure Anomalies"
application_insights_id = azurerm_application_insights.app_insights.id
enabled = true
}
Best Practices
- Use workspace-based Application Insights
- Configure appropriate retention periods
- Set up proper access control
- Use action groups for alerts
- Implement proper sampling for high-volume applications
Security Considerations
- Use Azure Key Vault for storing instrumentation keys
- Implement proper RBAC
- Use private endpoints where possible
- Enable diagnostic settings
- Regularly audit access
Monitoring Configuration
Set up monitoring and alerts:
resource "azurerm_monitor_action_group" "critical" {
name = "critical-alerts"
resource_group_name = azurerm_resource_group.monitoring_rg.name
short_name = "critical"
email_receiver {
name = "admin"
email_address = "admin@example.com"
}
}
resource "azurerm_monitor_metric_alert" "response_time" {
name = "response-time-alert"
resource_group_name = azurerm_resource_group.monitoring_rg.name
scopes = [azurerm_application_insights.app_insights.id]
description = "Alert when response time exceeds threshold"
criteria {
metric_namespace = "microsoft.insights/components"
metric_name = "requests/duration"
aggregation = "Average"
operator = "GreaterThan"
threshold = 3
}
action {
action_group_id = azurerm_monitor_action_group.critical.id
}
}
Cost Management
Configure daily data cap:
resource "azurerm_application_insights" "app_insights" {
# ... other configurations ...
daily_data_cap_in_gb = 100
daily_data_cap_notifications_disabled = false
}
Integration with Other Services
Integration with Azure Functions:
# azurerm_function_app is the old combined resource - use
# azurerm_linux_function_app or azurerm_windows_function_app instead.
resource "azurerm_linux_function_app" "function" {
# ... other configurations ...
app_settings = {
"APPINSIGHTS_INSTRUMENTATIONKEY" = azurerm_application_insights.app_insights.instrumentation_key
"APPLICATIONINSIGHTS_CONNECTION_STRING" = azurerm_application_insights.app_insights.connection_string
}
}
Integration with App Service:
# azurerm_app_service is the old combined resource - use
# azurerm_linux_web_app or azurerm_windows_web_app instead.
resource "azurerm_linux_web_app" "webapp" {
# ... other configurations ...
site_config {
app_command_line = ""
}
app_settings = {
"APPINSIGHTS_INSTRUMENTATIONKEY" = azurerm_application_insights.app_insights.instrumentation_key
"APPLICATIONINSIGHTS_CONNECTION_STRING" = azurerm_application_insights.app_insights.connection_string
}
}
Conclusion
Azure Application Insights with Terraform provides comprehensive application monitoring capabilities. By following these best practices and configurations, you can create effective monitoring solutions for your applications in Azure.