# Datadog configs for creating custom monitors
data "aws_secretsmanager_secret" "datadog_api" {
  name = "${var.environment}/datadog/DD_API_KEY"
}

data "aws_secretsmanager_secret_version" "datadog_api" {
  secret_id = data.aws_secretsmanager_secret.datadog_api.id
}

data "aws_secretsmanager_secret" "datadog_app_key" {
  name = "${var.environment}/datadog/DD_APP_KEY"
}

data "aws_secretsmanager_secret_version" "datadog_app_key" {
  secret_id = data.aws_secretsmanager_secret.datadog_app_key.id
}

data "datadog_role" "datadog_admin_role" {
  filter = "Datadog Admin Role"
}

# Terraform 0.13+ uses the Terraform Registry:
terraform {
  required_providers {
    datadog = {
      source = "DataDog/datadog"
    }
  }
}

# Datadog provider
provider "datadog" {
  api_key = data.aws_secretsmanager_secret_version.datadog_api.secret_string
  app_key = data.aws_secretsmanager_secret_version.datadog_app_key.secret_string
}

resource "datadog_monitor" "lambda_error_monitor" {
  name    = "🚨Lambda Error Monitor: {{service.name}} Error Count Too High"
  type    = "trace-analytics alert"
  message = "${var.lambda_error_monitor_message} ${var.notification_alerts_endpoint}"

  query = "trace-analytics(\"env:prod service:(lambda-moneyhub-generate-attachments OR lambda-moneyhub-custom-reports OR lambda-moneyhub-internal-attachments) status:error -error.type:(src.utils.error_handling.TaxDetailsException OR TaxDetailsException)\").rollup(\"count\").by(\"service,error.type\").last(\"5m\") > 10"

  monitor_thresholds {
    warning  = 4
    critical = 10
  }

  include_tags       = true
  enable_logs_sample = false
  notify_audit       = false
  on_missing_data    = "default"
  new_group_delay    = 60
  renotify_interval  = 0
  escalation_message = "${var.lambda_error_monitor_escalation_message} ${var.notification_main_endpoint}"

  tags = [
    "env:${var.environment}",
    "status:error",
    "service:lambda-moneyhub-generate-attachments",
    "service:lambda-moneyhub-custom-reports",
    "service:lambda-moneyhub-internal-attachments",
    "team:${var.team_handle}",
  ]
}

resource "datadog_monitor" "lambda_p75_duration_monitor" {
  name               = "⏱️ Duration Monitor: Lambda p75 execution time approaching timeout on env:prod"
  type               = "query alert"
  message            = "${var.lambda_p75_duration_monitor_message} ${var.notification_alerts_endpoint}"
  escalation_message = ""
  priority           = 1

  query = "percentile(last_15m):p75:aws.lambda.duration{environment:${var.environment} AND (functionname:${var.environment}-${var.lambda_generate_attachments_name} OR functionname:${var.environment}-${var.lambda_custom_reports_name} OR functionname:${var.environment}-${var.lambda_internal_attachments_name})} by {functionname} > 780000"

  monitor_thresholds {
    critical = 780000
  }

  include_tags        = true
  notify_audit        = false
  require_full_window = false
  notify_no_data      = false
  renotify_interval   = 0
  new_group_delay     = 60

  tags = [
    "env:${var.environment}",
    "service:lambda-moneyhub-generate-attachments",
    "service:lambda-moneyhub-custom-reports",
    "service:lambda-moneyhub-internal-attachments",
    "team:${var.team_handle}",
  ]
}


resource "datadog_monitor" "lambda_p90_duration_monitor" {
  name               = "⏱️ Duration Monitor: Lambda p90 execution time approaching timeout on env:prod"
  type               = "query alert"
  message            = "${var.lambda_p90_duration_monitor_message} ${var.notification_alerts_endpoint}"
  escalation_message = ""
  priority           = 3

  query = "percentile(last_15m):p90:aws.lambda.duration{environment:${var.environment} AND (functionname:${var.environment}-${var.lambda_generate_attachments_name} OR functionname:${var.environment}-${var.lambda_custom_reports_name} OR functionname:${var.environment}-${var.lambda_internal_attachments_name})} by {functionname} > 780000"

  monitor_thresholds {
    critical = 780000
  }

  include_tags        = true
  notify_audit        = false
  require_full_window = false
  notify_no_data      = false
  renotify_interval   = 0
  new_group_delay     = 60

  tags = [
    "env:${var.environment}",
    "service:lambda-moneyhub-generate-attachments",
    "service:lambda-moneyhub-custom-reports",
    "service:lambda-moneyhub-internal-attachments",
    "team:${var.team_handle}",
  ]
}

module "lambda_moneyhub_custom_reports_dashboard" {
  source = "git@github.com:theorchard/terraform-datadog.git//modules/lambda?ref=6.13.9"

  environment                       = var.environment
  service_name                      = var.lambda_custom_reports_name
  notification_endpoints            = var.notification_alerts_endpoint
  lambda_invocation_monitor_enabled = true
  lambda_error_monitor_enabled      = false
}

module "lambda_moneyhub_generate_attachments_dashboard" {
  source = "git@github.com:theorchard/terraform-datadog.git//modules/lambda?ref=6.13.9"

  environment                       = var.environment
  service_name                      = var.lambda_generate_attachments_name
  notification_endpoints            = var.notification_alerts_endpoint
  lambda_invocation_monitor_enabled = true
  lambda_error_monitor_enabled      = false
}

module "lambda_moneyhub_internal_attachments_dashboard" {
  source = "git@github.com:theorchard/terraform-datadog.git//modules/lambda?ref=6.13.9"

  environment                       = var.environment
  service_name                      = var.lambda_internal_attachments_name
  notification_endpoints            = var.notification_alerts_endpoint
  lambda_invocation_monitor_enabled = true
  lambda_error_monitor_enabled      = false
}
