resource "datadog_dashboard" "api_efficiency" {
  title        = "Orchard - API Efficiency (POC)"
  description  = "API Efficiency dashboard for graphql and flask services"
  layout_type  = "ordered"
  is_read_only = true
  reflow_type  = "fixed"

  widget {
    query_table_definition {
      title       = "Graphql Service Response Times"
      title_size  = 16
      title_align = "left"
      request {
        formula {
          alias = "P95 Response"
          conditional_formats {
            palette    = "white_on_red"
            value      = 2
            comparator = ">"
          }
          conditional_formats {
            palette    = "white_on_yellow"
            value      = 1
            comparator = ">"
          }
          limit {
            count = 500
            order = "desc"
          }
          formula_expression = "query1"
        }
        formula {
          alias              = "AVG Response"
          formula_expression = "query2"
        }
        formula {
          alias              = "Total Requests"
          formula_expression = "query3"
        }

        query {
          metric_query {
            query       = "p95:trace.graphql.execute{$env, $service} by {service}"
            data_source = "metrics"
            name        = "query1"
            aggregator  = "percentile"
          }
        }
        query {
          metric_query {
            query       = "avg:trace.graphql.execute{$env, $service} by {service}"
            data_source = "metrics"
            name        = "query2"
            aggregator  = "avg"
          }
        }
        query {
          metric_query {
            query       = "count:trace.graphql.execute{$env, $service} by {service}.as_count()"
            data_source = "metrics"
            name        = "query3"
            aggregator  = "sum"
          }
        }
      }
    }
    widget_layout {
      x      = 0
      y      = 0
      width  = 6
      height = 4
    }
  }


  widget {
    query_table_definition {
      title       = "Flask Service Response Times"
      title_size  = 16
      title_align = "left"
      request {
        formula {
          alias = "P95 Response"
          conditional_formats {
            palette    = "white_on_red"
            value      = 2
            comparator = ">"
          }
          conditional_formats {
            palette    = "white_on_yellow"
            value      = 1
            comparator = ">"
          }
          limit {
            count = 500
            order = "desc"
          }
          formula_expression = "query1"
        }
        formula {
          alias              = "AVG Response"
          formula_expression = "query2"
        }
        formula {
          alias              = "Total Requests"
          formula_expression = "query3"
        }
        query {
          metric_query {
            query       = "p95:trace.flask.request{$env, $service} by {service}"
            data_source = "metrics"
            name        = "query1"
            aggregator  = "percentile"
          }
        }
        query {
          metric_query {
            query       = "avg:trace.flask.request{$env, $service} by {service}"
            data_source = "metrics"
            name        = "query2"
            aggregator  = "avg"
          }
        }
        query {
          metric_query {
            query       = "count:trace.flask.request{$env, $service} by {service}.as_count()"
            data_source = "metrics"
            name        = "query3"
            aggregator  = "sum"
          }
        }
      }
    }
    widget_layout {
      x      = 6
      y      = 0
      width  = 5
      height = 4
    }
  }
  widget {
    query_table_definition {
      title       = "Flask Endpoint Response Times"
      title_size  = "16"
      title_align = "left"
      request {
        formula {
          alias = "P95 Response Time"
          conditional_formats {
            palette    = "white_on_red"
            value      = 2
            comparator = ">"
          }
          conditional_formats {
            palette    = "white_on_yellow"
            value      = 1
            comparator = ">"
          }
          formula_expression = "query1"
        }
        formula {
          alias              = "Avg Response Time"
          formula_expression = "query2"
        }
        formula {
          alias              = "# of Requests"
          formula_expression = "query3"
        }
        formula {
          alias = "Performance Score"
          limit {
            count = 500
            order = "desc"
          }
          formula_expression = "query1 * cutoff_min(query5, 2) * query3 / 1000"
        }
        query {
          metric_query {
            query       = "p95:trace.flask.request{$env, $service} by {resource_name,service}"
            data_source = "metrics"
            name        = "query1"
            aggregator  = "percentile"
          }
        }
        query {
          metric_query {
            query       = "avg:trace.flask.request{$env, $service} by {resource_name,service}"
            data_source = "metrics"
            name        = "query2"
            aggregator  = "avg"
          }
        }
        query {
          metric_query {
            query       = "count:trace.flask.request {$env, $service} by {resource_name,service}.as_count()"
            data_source = "metrics"
            name        = "query3"
            aggregator  = "sum"
          }
        }
        query {
          metric_query {
            query       = "p95:trace.flask.request {$env, $service} by {resource_name,service}"
            data_source = "metrics"
            name        = "query5"
            aggregator  = "percentile"
          }
        }
        query {
          metric_query {
            query       = "count:trace.flask.request {$env, $service} by {resource_name,service}.as_count()"
            data_source = "metrics"
            name        = "query4"
            aggregator  = "sum"
          }
        }
      }
    }
    widget_layout {
      x      = 0
      y      = 4
      width  = 11
      height = 4
    }
  }


  widget {
    query_table_definition {
      title       = "Graphql Query Response Times"
      title_size  = "16"
      title_align = "left"
      request {
        formula {
          alias = "P95 Response Time"
          conditional_formats {
            palette    = "white_on_red"
            value      = 2
            comparator = ">"
          }
          conditional_formats {
            palette    = "white_on_yellow"
            value      = 1
            comparator = ">"
          }
          limit {
            count = 500
            order = "desc"
          }
          formula_expression = "query1"
        }
        formula {
          alias              = "Total Requests"
          formula_expression = "query2"
        }
        formula {
          alias              = "AVG Response time"
          formula_expression = "query5"
        }
        formula {
          alias              = "Perfomance Score"
          formula_expression = "query1 * cutoff_min(query4, 2) * query2 / 1000"
        }
        query {
          metric_query {
            query       = "p95:trace.graphql.execute{$env, $service} by {resource_name,service}"
            data_source = "metrics"
            name        = "query1"
            aggregator  = "percentile"
          }
        }
        query {
          metric_query {
            query       = "count:trace.graphql.execute{$env, $service} by {resource_name,service}.as_count()"
            data_source = "metrics"
            name        = "query2"
            aggregator  = "sum"
          }
        }
        query {
          metric_query {
            query       = "p95:trace.graphql.execute{$env, $service} by {resource_name,service}"
            data_source = "metrics"
            name        = "query4"
            aggregator  = "percentile"
          }
        }
        query {
          metric_query {
            query       = "count:trace.graphql.execute{$env, $service} by {resource_name,service}.as_count()"
            data_source = "metrics"
            name        = "query3"
            aggregator  = "sum"
          }
        }
        query {
          metric_query {
            query       = "avg:trace.graphql.execute{$env, $service} by {resource_name,service}"
            data_source = "metrics"
            name        = "query5"
            aggregator  = "avg"
          }
        }
      }
    }
    widget_layout {
      x      = 0
      y      = 8
      width  = 11
      height = 4
    }
  }

  template_variable {
    name    = "env"
    prefix  = "env"
    default = "prod"
  }

  template_variable {
    name    = "service"
    prefix  = "service"
    default = "*"
  }

}
