# Monitor for Aura page_cache_hit_ratio
resource "datadog_monitor" "aura_page_cache_hit_ratio_monitor" {
  count = var.page_cache_hit_ratio_enabled ? 1 : 0
  name  = "${var.environment}-auradb-${var.service_name}-page-cache-hit-ratio-monitor"
  type  = "query alert"
  query = "avg(last_15m):avg:auradb.neo4j_dbms_page_cache_hit_ratio_per_minute{instance_id:${var.instance}} * 100 < ${var.critical_page_cache_hit_ratio_lower_than}"

  message = join("\n", [
    "{{#is_alert}} PageCache Hit Ratio is very low for longer than 15min.",
    "Action: Review query for optimisation or scale memory up.",
    "Check [Dashboard](${local.pde_datadog_url}${datadog_dashboard_json.aura_timeboard.url}) for more details or Aura console for query logs.{{/is_alert}}",
    "{{^is_alert}} PageCache Hit Ratio is now OK. {{/is_alert}}",
    "Notify: ${var.notification_endpoints}",
  ])
  escalation_message = "Escalation to ${var.escalation_notification_endpoints}"

  monitor_thresholds {
    critical = var.critical_page_cache_hit_ratio_lower_than
  }

  include_tags        = true
  notify_no_data      = false
  notify_audit        = false
  renotify_interval   = 60
  timeout_h           = 0
  tags                = local.tags
  require_full_window = true

}

# Monitor for Aura CPU Usage
resource "datadog_monitor" "aura_cpu_usage_monitor" {
  count = var.cpu_usage_enabled ? 1 : 0
  name  = "${var.environment}-auradb-${var.service_name}-cpu-usage-monitor"
  type  = "query alert"
  query = "avg(last_15m):(avg:auradb.neo4j_aura_cpu_usage{instance_id:${var.instance}} / avg:auradb.neo4j_aura_cpu_limit{instance_id:${var.instance}}) * 100 > ${var.critical_cpu_usage}"

  message = join("\n", [
    "{{#is_alert}} CPU Usage is very high for longer than 15min.",
    "Action: Check for complex query work or scale up the instance.",
    "Check [Dashboard](${local.pde_datadog_url}${datadog_dashboard_json.aura_timeboard.url}) for more details or Aura console for query logs.{{/is_alert}}",
    "{{^is_alert}} CPU Usage is now OK. {{/is_alert}}",
    "Notify: ${var.notification_endpoints}",
  ])
  escalation_message = "Escalation to ${var.escalation_notification_endpoints}"

  monitor_thresholds {
    critical = var.critical_cpu_usage
  }

  include_tags        = true
  notify_no_data      = false
  notify_audit        = false
  renotify_interval   = 60
  timeout_h           = 0
  tags                = local.tags
  require_full_window = true

}

# Monitor for Aura Heap Usage
resource "datadog_monitor" "aura_heap_used_monitor" {
  count = var.heap_used_enabled ? 1 : 0
  name  = "${var.environment}-auradb-${var.service_name}-heap-used-monitor"
  type  = "query alert"
  query = "avg(last_15m):avg:auradb.neo4j_dbms_vm_heap_used_ratio{instance_id:${var.instance}} * 100 > ${var.critical_heap_used}"

  message = join("\n", [
    "{{#is_alert}} Heap Usage is very high for longer than 15min. ",
    "Action: Check for long-running queries or scale up.",
    "Check [Dashboard](${local.pde_datadog_url}${datadog_dashboard_json.aura_timeboard.url}) for more details or Aura console for query logs.{{/is_alert}}",
    "{{^is_alert}} Heap Usage is now OK. {{/is_alert}}",
    "Notify: ${var.notification_endpoints}",
  ])
  escalation_message = "Escalation to ${var.escalation_notification_endpoints}"

  monitor_thresholds {
    critical = var.critical_heap_used
  }

  include_tags        = true
  notify_no_data      = false
  notify_audit        = false
  renotify_interval   = 60
  timeout_h           = 0
  tags                = local.tags
  require_full_window = true
}

# Monitor for Aura Query Failures
resource "datadog_monitor" "aura_query_failures_monitor" {
  count = var.query_failures_enabled ? 1 : 0
  name  = "${var.environment}-auradb-${var.service_name}-query-failures-monitor"
  type  = "query alert"
  query = "sum(last_5m):(sum:auradb.neo4j_db_query_execution_failure.count{instance_id:${var.instance}} / (sum:auradb.neo4j_db_query_execution_failure.count{instance_id:${var.instance}} + sum:auradb.neo4j_db_query_execution_success.count{instance_id:${var.instance}})) * 100 > ${var.critical_query_failures}"

  message = join("\n", [
    "{{#is_alert}} Too many query failures detected in last 5min.",
    "Action: Investigate failing queries.",
    "Check [Dashboard](${local.pde_datadog_url}${datadog_dashboard_json.aura_timeboard.url}) for more details or Aura console for query logs.{{/is_alert}}",
    "{{^is_alert}} Query failures are now OK. {{/is_alert}}",
    "Notify: ${var.notification_endpoints}",
  ])
  escalation_message = "Escalation to ${var.escalation_notification_endpoints}"

  monitor_thresholds {
    warning  = var.warning_query_failures
    critical = var.critical_query_failures
  }

  include_tags        = true
  notify_no_data      = false
  notify_audit        = false
  renotify_interval   = 60
  timeout_h           = 0
  tags                = local.tags
  require_full_window = true
}

# Monitor for Aura DB store size
resource "datadog_monitor" "aura_db_store_size_monitor" {
  count = var.db_store_size_enabled ? 1 : 0
  name  = "${var.environment}-auradb-${var.service_name}-db-store-size-monitor"
  type  = "query alert"
  query = "max(last_1d):(max:auradb.neo4j_database_store_size_database{instance_id:${var.instance}} / max:auradb.neo4j_aura_storage_limit{instance_id:${var.instance}}) * 100 > ${var.critical_db_store_size}"

  message = join("\n", [
    "{{#is_alert}} DB store size has exceeded the critical threshold for longer than a day.",
    "Action: Cleanup data from Aura, or scale storage up.",
    "Check [Dashboard](${local.pde_datadog_url}${datadog_dashboard_json.aura_timeboard.url}) for storage metrics or the Aura console for query logs.{{/is_alert}}",
    "{{^is_alert}} DB store size is now within acceptable limits. {{/is_alert}}",
    "Notify: ${var.notification_endpoints}",
  ])
  escalation_message = "Escalation to ${var.escalation_notification_endpoints}"

  monitor_thresholds {
    critical = var.critical_db_store_size
  }

  include_tags        = true
  notify_no_data      = false
  notify_audit        = false
  renotify_interval   = 0 # not sure we want to be renotified again in the same day.
  timeout_h           = 0
  tags                = local.tags
  require_full_window = true
}
