tf/active_directory/monitor.tf (125 lines of code) (raw):

resource "azurerm_log_analytics_workspace" "azhop_workspace" { count = local.create_log_analytics_workspace ? 1 : 0 name = "azhop-${random_string.resource_postfix.result}-ws" location = local.create_rg ? azurerm_resource_group.rg[0].location : data.azurerm_resource_group.rg[0].location resource_group_name = local.create_rg ? azurerm_resource_group.rg[0].name : data.azurerm_resource_group.rg[0].name sku = "PerGB2018" retention_in_days = 30 } resource "azurerm_monitor_action_group" "azhop_action_group" { count = local.create_alerts ? 1 : 0 name = "azhop-${random_string.resource_postfix.result}-ag" resource_group_name = local.create_rg ? azurerm_resource_group.rg[0].name : data.azurerm_resource_group.rg[0].name short_name = "azhop-ag" # Need to be 12 characters or less email_receiver { name = "azhop-email-receiver" email_address = local.alert_email } } resource "azurerm_monitor_data_collection_rule" "vm_data_collection_rule" { count = local.monitor ? 1 : 0 name = "vm-data-collection-rule" resource_group_name = local.create_rg ? azurerm_resource_group.rg[0].name : data.azurerm_resource_group.rg[0].name location = local.create_rg ? azurerm_resource_group.rg[0].location : data.azurerm_resource_group.rg[0].location kind = "Linux" destinations { log_analytics { workspace_resource_id = local.use_existing_ws ? local.log_analytics_workspace_id : azurerm_log_analytics_workspace.azhop_workspace[0].id name = "vm-logs" } azure_monitor_metrics { name = "vm-metrics" } } data_flow { streams = ["Microsoft-InsightsMetrics"] destinations = ["vm-metrics"] } data_flow { streams = ["Microsoft-Syslog"] destinations = ["vm-logs"] } data_sources { syslog { facility_names = ["daemon", "auth", "authpriv", "cron", "kern", "lpr", "mail", "mark", "news", "syslog", "user", "uucp", "local0", "local1", "local2", "local3", "local4", "local5", "local6", "local7"] log_levels = ["Debug", "Info", "Notice", "Warning", "Error", "Critical", "Alert", "Emergency"] streams = ["Microsoft-Syslog"] name = "vm-syslog" } } } resource "azurerm_monitor_data_collection_rule" "vm_insights_collection_rule" { count = local.monitor ? 1 : 0 name = "vm-insights-collection-rule" resource_group_name = local.create_rg ? azurerm_resource_group.rg[0].name : data.azurerm_resource_group.rg[0].name location = local.create_rg ? azurerm_resource_group.rg[0].location : data.azurerm_resource_group.rg[0].location kind = "Linux" destinations { log_analytics { workspace_resource_id = local.use_existing_ws ? local.log_analytics_workspace_id : azurerm_log_analytics_workspace.azhop_workspace[0].id name = "vm-insights-logs" } } data_flow { streams = ["Microsoft-InsightsMetrics"] destinations = ["vm-insights-logs"] } data_sources { performance_counter { streams = ["Microsoft-InsightsMetrics"] sampling_frequency_in_seconds = 60 counter_specifiers = ["\\VmInsights\\DetailedMetrics" ] name = "vm-insights" } } } resource "azurerm_monitor_metric_alert" "vm_availability_alert" { count = local.create_alerts ? 1 : 0 name = "vm-availability-alert" resource_group_name = local.create_rg ? azurerm_resource_group.rg[0].name : data.azurerm_resource_group.rg[0].name scopes = [local.create_rg ? azurerm_resource_group.rg[0].id : data.azurerm_resource_group.rg[0].id] description = "Alert when VM is not available" severity = 3 enabled = true frequency = "PT1M" window_size = "PT1M" target_resource_type = "Microsoft.Compute/virtualMachines" target_resource_location = local.create_rg ? azurerm_resource_group.rg[0].location : data.azurerm_resource_group.rg[0].location criteria { metric_namespace = "Microsoft.Compute/virtualMachines" metric_name = "VmAvailabilityMetric" aggregation = "Average" operator = "LessThan" threshold = 0.95 } action { action_group_id = azurerm_monitor_action_group.azhop_action_group[0].id } }