resource "datadog_dashboard" "delphi_dapd_api_scraper_dashboard" {
  layout_type = "ordered"
  reflow_type = "fixed"
  title       = "delphi-dapd-api-scraper"
  url         = "/dashboard/3ej-4ae-9vh/delphi-dapd-api-scraper"
  template_variable {
    available_values = [
      "dev",
      "prod",
      "qa",
      "stage",
    ]
    defaults = [
      "prod",
    ]
    name   = "env"
    prefix = "env"
  }
  template_variable {
    available_values = [
      "apple_music",
      "spotify",
    ]
    defaults = [
      "*",
    ]
    name   = "dsp"
    prefix = "dsp"
  }
  template_variable {
    available_values = [
      "album",
      "artist",
      "playlist",
      "track",
      "playlist_tracks",
    ]
    defaults = [
      "*",
    ]
    name   = "entity"
    prefix = "entity"
  }
  template_variable {
    defaults = [
      "400",
      "401",
      "429",
      "500",
      "502",
      "503",
      "504",
    ]
    name   = "status_code"
    prefix = "status_code"
  }
  template_variable {
    defaults = [
      "*",
    ]
    name   = "db"
    prefix = "db"
  }
  template_variable {
    available_values = [
      "playlists",
    ]
    defaults = ["*"]
    name     = "table"
    prefix   = "table"
  }
  template_variable {
    available_values = [
      "read",
      "write",
    ]
    defaults = ["*"]
    name     = "operation"
    prefix   = "operation"
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "Expired playlists count"
      title_align   = "left"
      title_size    = "16"
      request {
        display_type   = "line"
        on_right_yaxis = false
        formula {
          alias              = "Playlists count"
          formula_expression = "autosmooth(query1)"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "avg:postgresql.workflowdb.expired_playlists_count{$env,$dsp} by {dsp,env}"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 0
      y               = 0
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "Scraping delay"
      title_align   = "left"
      title_size    = "16"
      marker {
        display_type = "ok dashed"
        label        = "\u00a0ok\u00a0"
        value        = "0 < y < 300"
      }
      marker {
        display_type = "warning dashed"
        label        = "\u00a0warning\u00a0"
        value        = "300 < y < 900"
      }
      marker {
        display_type = "error dashed"
        label        = "too high"
        value        = "y > 900"
      }
      request {
        display_type   = "line"
        on_right_yaxis = false
        formula {
          formula_expression = "query1"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "avg:postgresql.workflowdb.delay{$env,$dsp} by {dsp,env}"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 6
      y               = 0
    }
  }
  widget {
    query_table_definition {
      title       = "Entities processing average speed table"
      title_align = "left"
      title_size  = "16"
      request {
        limit = 0
        formula {
          alias              = "AVG"
          formula_expression = "query1"
          limit {
            count = 10
            order = "desc"
          }
        }
        formula {
          alias              = "SUM"
          formula_expression = "query2"
        }
        query {
          metric_query {
            aggregator  = "avg"
            data_source = "metrics"
            name        = "query1"
            query       = "avg:dapd_api_scraper.records_processed{$env,$dsp,$entity} by {env,dsp,entity}.as_rate()"
          }
        }
        query {
          metric_query {
            aggregator  = "sum"
            data_source = "metrics"
            name        = "query2"
            query       = "sum:dapd_api_scraper.records_processed{$env,$dsp,$entity} by {env,dsp,entity}.as_count()"
          }
        }
      }
    }
    widget_layout {
      height          = 4
      is_column_break = false
      width           = 4
      x               = 0
      y               = 3
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "Entities processing speed"
      title_align   = "left"
      title_size    = "16"
      request {
        display_type   = "line"
        on_right_yaxis = false
        formula {
          formula_expression = "autosmooth(query1)"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "sum:dapd_api_scraper.records_processed{$env,$dsp,$entity} by {dsp,env,entity}.as_rate()"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 4
      is_column_break = false
      width           = 8
      x               = 4
      y               = 3
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "API Response Time"
      title_align   = "left"
      title_size    = "16"
      request {
        display_type   = "line"
        on_right_yaxis = false
        formula {
          formula_expression = "autosmooth(query1)"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "avg:dapd_api_scraper.api_response_time.avg{$env,$dsp,$entity} by {env,dsp,entity}"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 0
      y               = 7
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "API Errors"
      title_align   = "left"
      title_size    = "16"
      request {
        display_type   = "bars"
        on_right_yaxis = false
        formula {
          formula_expression = "query1"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "sum:dapd_api_scraper.api_errors{$env,$dsp,$entity,$status_code} by {env,dsp,entity,status_code}.as_count()"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 6
      y               = 7
    }
  }
  widget {
    query_table_definition {
      title       = "DB operation time table (max)"
      title_align = "left"
      title_size  = "16"
      request {
        limit = 0
        formula {
          alias              = "max"
          formula_expression = "query1"
        }
        formula {
          alias              = "avg"
          formula_expression = "query2"
          limit {
            count = 500
            order = "desc"
          }
        }
        query {
          metric_query {
            aggregator  = "max"
            data_source = "metrics"
            name        = "query1"
            query       = "avg:dapd_api_scraper.db_operation_time.max{$env,$dsp,$entity,$operation} by {dsp,entity,db,table,operation}"
          }
        }
        query {
          metric_query {
            aggregator  = "avg"
            data_source = "metrics"
            name        = "query2"
            query       = "avg:dapd_api_scraper.db_operation_time.avg{$env,$dsp,$entity,$operation} by {dsp,entity,db,table,operation}"
          }
        }
      }
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 4
      x               = 0
      y               = 10
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "DB operation time (AVG)"
      title_align   = "left"
      title_size    = "16"
      request {
        display_type   = "line"
        on_right_yaxis = false
        formula {
          formula_expression = "query1"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "avg:dapd_api_scraper.db_operation_time.avg{$env,$dsp,$entity,$operation} by {env,dsp,entity,db,table,operation}"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 8
      x               = 4
      y               = 10
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "S3 write time (AVG)"
      title_align   = "left"
      title_size    = "16"
      request {
        display_type   = "line"
        on_right_yaxis = false
        formula {
          formula_expression = "autosmooth(query1)"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "avg:dapd_api_scraper.s3_write_time.avg{$env,$dsp,$entity} by {env,dsp,entity}"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 0
      y               = 13
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "DB operations count"
      title_align   = "left"
      title_size    = "16"
      request {
        display_type   = "bars"
        on_right_yaxis = false
        formula {
          formula_expression = "query1"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "avg:dapd_api_scraper.db_operation_time.count{$env,$dsp,$entity,$db,$table,$operation} by {env,dsp,entity,db,table}.as_rate()"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 6
      y               = 13
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "Service CPU usage"
      title_align   = "left"
      title_size    = "16"
      marker {
        display_type = "warning dashed"
        label        = "y = 200"
        value        = "y = 200"
      }
      request {
        display_type   = "line"
        on_right_yaxis = false
        formula {
          formula_expression = "autosmooth(query1)"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "avg:ecs.fargate.cpu.percent{container_name:dapd-api-scraper,$env} by {service_entities}"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 2
      is_column_break = false
      width           = 4
      x               = 0
      y               = 16
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "Service memory usage"
      title_align   = "left"
      title_size    = "16"
      marker {
        display_type = "warning dashed"
        label        = "y = 4294967296"
        value        = "y = 4294967296"
      }
      request {
        display_type   = "line"
        on_right_yaxis = false
        formula {
          formula_expression = "autosmooth(query1)"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "avg:ecs.fargate.mem.usage{$env,container_name:dapd-api-scraper} by {service_entities}"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 2
      is_column_break = false
      width           = 4
      x               = 4
      y               = 16
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "Service network usage"
      title_align   = "left"
      title_size    = "16"
      request {
        display_type   = "line"
        on_right_yaxis = false
        formula {
          alias              = "recieved"
          formula_expression = "autosmooth(query1)"
        }
        formula {
          alias              = "sent"
          formula_expression = "autosmooth(query2)"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "avg:ecs.fargate.net.bytes_rcvd{$env,container_name:dapd-api-scraper}"
          }
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query2"
            query       = "avg:ecs.fargate.net.bytes_sent{$env,container_name:dapd-api-scraper}"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 2
      is_column_break = false
      width           = 4
      x               = 8
      y               = 16
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "API requests"
      title_align   = "left"
      title_size    = "16"
      request {
        display_type   = "bars"
        on_right_yaxis = false
        formula {
          formula_expression = "query1"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "sum:dapd_api_scraper.api_request_count{$env,$dsp,$entity} by {env,dsp,entity}.as_rate()"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 12
      x               = 0
      y               = 18
    }
  }
  widget {
    alert_graph_definition {
      alert_id    = "113551119"
      title       = "DAPD Monitor: Spotify playlists (24h evaluation)"
      title_align = "left"
      title_size  = "16"
      viz_type    = "timeseries"
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 0
      y               = 21
    }
  }
  widget {
    alert_graph_definition {
      alert_id    = "113551146"
      title       = "DAPD Monitor: Apple music playlists (24h evaluation)"
      title_align = "left"
      title_size  = "16"
      viz_type    = "timeseries"
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 6
      y               = 21
    }
  }
  widget {
    alert_graph_definition {
      alert_id    = "109278809"
      title       = "DAPD Monitor: Playlists scraping anomaly"
      title_align = "left"
      title_size  = "16"
      viz_type    = "timeseries"
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 0
      y               = 24
    }
  }
  widget {
    alert_graph_definition {
      alert_id    = "116772723"
      title       = "DAPD Monitor: API Errors"
      title_align = "left"
      title_size  = "16"
      viz_type    = "timeseries"
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 6
      y               = 24
    }
  }
  widget {
    query_table_definition {
      title       = "api errors table"
      title_align = "left"
      title_size  = "16"
      request {
        limit = 0
        formula {
          alias              = "api_errors"
          formula_expression = "query1"
          limit {
            count = 500
            order = "desc"
          }
        }
        query {
          metric_query {
            aggregator  = "sum"
            data_source = "metrics"
            name        = "query1"
            query       = "avg:dapd_api_scraper.api_errors{$env,$dsp} by {dsp,status_code}.as_count()"
          }
        }
      }
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 0
      y               = 27
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title         = "API Requests vs Process Records vs DB Writes Count"
      title_align   = "left"
      title_size    = "16"
      request {
        display_type   = "bars"
        on_right_yaxis = false
        formula {
          alias              = "Processed Records"
          formula_expression = "query2"
        }
        formula {
          alias              = "API Requests"
          formula_expression = "query3"
        }
        formula {
          alias              = "DB Writes Count"
          formula_expression = "query4"
        }
        formula {
          alias              = "Total API requests"
          formula_expression = "query5"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query2"
            query       = "sum:dapd_api_scraper.records_processed{$dsp,$env,$entity} by {dsp,entity,env}.as_count()"
          }
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query3"
            query       = "sum:dapd_api_scraper.api_request_count{$dsp,$env,$entity} by {dsp,entity,env}.as_count()"
          }
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query4"
            query       = "sum:dapd_api_scraper.db_operation_time.count{$dsp,$env,$entity} by {dsp,entity,env,db,table}.as_count()"
          }
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query5"
            query       = "sum:dapd_api_scraper.api_request_count{$env} by {env}.as_count()"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 3
      is_column_break = false
      width           = 6
      x               = 6
      y               = 27
    }
  }
  widget {
    timeseries_definition {
      legend_columns = [
        "avg",
        "max",
        "min",
        "sum",
        "value",
      ]
      legend_layout = "auto"
      show_legend   = true
      title_align   = "left"
      title_size    = "16"
      request {
        display_type   = "bars"
        on_right_yaxis = false
        formula {
          formula_expression = "query1"
        }
        query {
          metric_query {
            data_source = "metrics"
            name        = "query1"
            query       = "sum:dapd_api_scraper.records_processed{$env,$dsp,$entity} by {env,dsp,entity}.as_count().rollup(sum, 86400)"
          }
        }
        style {
          line_type  = "solid"
          line_width = "normal"
          palette    = "dog_classic"
        }
      }
    }
    widget_layout {
      height          = 2
      is_column_break = false
      width           = 4
      x               = 0
      y               = 30
    }
  }
}
