resource "datadog_dashboard" "apollo_load_tester_dashboard" {
  layout_type = "ordered"
  reflow_type = "fixed"
  title       = "Apollo Load Tester"
  url         = "/dashboard/5vm-f8b-n6m/apollo-load-tester"
  template_variable {
    defaults = [
      "dev-proxy.apollo.stream/gate-api",
    ]
    name   = "host"
    prefix = "host"
  }
  widget {
    group_definition {
      background_color = "vivid_green"
      layout_type      = "ordered"
      show_title       = true
      title            = "$host"
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "Max/Avg/Min response time (sec)"
          title_align   = "left"
          title_size    = "16"
          request {
            display_type   = "line"
            on_right_yaxis = false
            formula {
              alias              = "avg"
              formula_expression = "query1 / 1000"
              style {
                palette       = "green"
                palette_index = 4
              }
            }
            formula {
              alias              = "max"
              formula_expression = "query2 / 1000"
              style {
                palette       = "orange"
                palette_index = 4
              }
            }
            formula {
              alias              = "min"
              formula_expression = "query3 / 1000"
              style {
                palette       = "cool"
                palette_index = 4
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query1"
                query       = "avg:core_load_tester.total.avg_response_time{$host}.as_count()"
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query2"
                query       = "avg:core_load_tester.total.max_response_time{$host}.as_count()"
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query3"
                query       = "avg:core_load_tester.total.min_response_time{$host}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }
          yaxis {
            include_zero = false
            scale        = "log"
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 0
          y               = 0
        }
      }
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "Average response time by endpoint (sec)"
          title_align   = "left"
          title_size    = "16"
          request {
            display_type   = "line"
            on_right_yaxis = false
            formula {
              formula_expression = "query1 / 1000"
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query1"
                query       = "avg:core_load_tester.by_endpoint.avg_response_time{$host} by {method_endpoint}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 4
          y               = 0
        }
      }
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "Average size (bytes)"
          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:core_load_tester.by_endpoint.avg_content_length{$host} by {method_endpoint}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 8
          y               = 0
        }
      }
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "Fails %"
          title_align   = "left"
          title_size    = "16"
          request {
            display_type   = "line"
            on_right_yaxis = false
            formula {
              formula_expression = "query1 / query2 * 100"
              style {
                palette       = "warm"
                palette_index = 5
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query1"
                query       = "avg:core_load_tester.total.num_failures{$host}.as_count()"
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query2"
                query       = "avg:core_load_tester.total.num_requests{$host}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "semantic"
            }
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 0
          y               = 2
        }
      }
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "Fail ratio by endpoint"
          title_align   = "left"
          title_size    = "16"
          request {
            display_type   = "line"
            on_right_yaxis = false
            formula {
              formula_expression = "query1 / query2 * 100"
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query1"
                query       = "avg:core_load_tester.by_endpoint.num_failures{$host} by {method_endpoint}.as_count()"
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query2"
                query       = "avg:core_load_tester.by_endpoint.num_requests{$host} by {method_endpoint}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "warm"
            }
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 4
          y               = 2
        }
      }
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "RPS"
          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:core_load_tester.total.total_rps{$host}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 8
          y               = 2
        }
      }
    }
    widget_layout {
      height          = 5
      is_column_break = false
      width           = 12
      x               = 0
      y               = 0
    }
  }
  widget {
    group_definition {
      background_color = "vivid_green"
      layout_type      = "ordered"
      show_title       = true
      title            = "host:test-proxy.apollo.stream/gate-api"
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "Max/Avg/Min response time (sec)"
          title_align   = "left"
          title_size    = "16"
          request {
            display_type   = "line"
            on_right_yaxis = false
            formula {
              alias              = "avg"
              formula_expression = "query1 / 1000"
              style {
                palette       = "green"
                palette_index = 4
              }
            }
            formula {
              alias              = "max"
              formula_expression = "query2 / 1000"
              style {
                palette       = "orange"
                palette_index = 4
              }
            }
            formula {
              alias              = "min"
              formula_expression = "query3 / 1000"
              style {
                palette       = "cool"
                palette_index = 4
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query1"
                query       = "avg:core_load_tester.total.avg_response_time{host:test-proxy.apollo.stream/gate-api}.as_count()"
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query2"
                query       = "avg:core_load_tester.total.max_response_time{host:test-proxy.apollo.stream/gate-api}.as_count()"
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query3"
                query       = "avg:core_load_tester.total.min_response_time{host:test-proxy.apollo.stream/gate-api}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }
          yaxis {
            include_zero = false
            scale        = "log"
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 0
          y               = 0
        }
      }
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "Average response time by endpoint (sec)"
          title_align   = "left"
          title_size    = "16"
          request {
            display_type   = "line"
            on_right_yaxis = false
            formula {
              formula_expression = "query1 / 1000"
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query1"
                query       = "avg:core_load_tester.by_endpoint.avg_response_time{host:test-proxy.apollo.stream/gate-api} by {method_endpoint}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 4
          y               = 0
        }
      }
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "Average size (bytes)"
          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:core_load_tester.by_endpoint.avg_content_length{host:test-proxy.apollo.stream/gate-api} by {method_endpoint}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 8
          y               = 0
        }
      }
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "Fails %"
          title_align   = "left"
          title_size    = "16"
          request {
            display_type   = "line"
            on_right_yaxis = false
            formula {
              alias              = "err %"
              formula_expression = "query1 / query2 * 100"
              style {
                palette       = "warm"
                palette_index = 5
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query1"
                query       = "avg:core_load_tester.total.num_failures{host:test-proxy.apollo.stream/gate-api}.as_count()"
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query2"
                query       = "avg:core_load_tester.total.num_requests{host:test-proxy.apollo.stream/gate-api}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "semantic"
            }
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 0
          y               = 2
        }
      }
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "Fail ratio by endpoint"
          title_align   = "left"
          title_size    = "16"
          request {
            display_type   = "line"
            on_right_yaxis = false
            formula {
              formula_expression = "query1 / query2 * 100"
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query1"
                query       = "avg:core_load_tester.by_endpoint.num_failures{host:test-proxy.apollo.stream/gate-api} by {method_endpoint}.as_count()"
              }
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query2"
                query       = "avg:core_load_tester.by_endpoint.num_requests{host:test-proxy.apollo.stream/gate-api} by {method_endpoint}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "warm"
            }
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 4
          y               = 2
        }
      }
      widget {
        timeseries_definition {
          legend_columns = [
            "avg",
            "max",
            "min",
            "sum",
            "value",
          ]
          legend_layout = "auto"
          show_legend   = true
          title         = "RPS"
          title_align   = "left"
          title_size    = "16"
          request {
            display_type   = "line"
            on_right_yaxis = false
            formula {
              alias              = "total_rps"
              formula_expression = "query1"
            }
            query {
              metric_query {
                data_source = "metrics"
                name        = "query1"
                query       = "avg:core_load_tester.total.total_rps{host:test-proxy.apollo.stream/gate-api}.as_count()"
              }
            }
            style {
              line_type  = "solid"
              line_width = "normal"
              palette    = "dog_classic"
            }
          }
        }
        widget_layout {
          height          = 2
          is_column_break = false
          width           = 4
          x               = 8
          y               = 2
        }
      }
    }
    widget_layout {
      height          = 5
      is_column_break = true
      width           = 12
      x               = 0
      y               = 0
    }
  }
}
