packages feed

grafdhall-0.1.0.0: examples/zuul-tenant-usage.dhall

let Grafana =
      https://raw.githubusercontent.com/weeezes/dhall-grafana/f78d2887939dcb555a47a4b85a91a3d6b38ec2ea/package.dhall sha256:a0e1b5432090944fa671efce0085c6049019ae0d00ca289c268b4528d1cd39af

let Prelude =
      https://prelude.dhall-lang.org/v17.0.0/package.dhall sha256:10db3c919c25e9046833df897a8ffe2701dc390fa0893d958c3430524be5a43e

let Tenant = { Type = { name : Text, id : Text } }

let tenants =
      [ { name = "Fedora", id = "fedora" }
      , { name = "RDO", id = "rdoproject_org" }
      , { name = "Packit", id = "packit-service" }
      , { name = "Local", id = "local" }
      ]

let gauge =
      \(measurement : Text) ->
        Grafana.MetricsTargets.InfluxTarget
          { groupBy =
            [ { type = "time", params = [ "\$__interval" ] }
            , { type = "fill", params = [ "previous" ] }
            ]
          , measurement
          , orderByTime = "ASC"
          , policy = "default"
          , refId = "A"
          , rawQuery = False
          , query = ""
          , resultFormat = "time_series"
          , select =
            [ [ { type = "field", params = [ "value" ] }
              , { type = "distinct", params = [] : List Text }
              ]
            ]
          , tags = [ { key = "metric_type", operator = "=", value = "gauge" } ]
          }

let resource-panel =
      \(title : Text) ->
      \(measurement : Text) ->
        Grafana.Panels.mkGraphPanel
          Grafana.GraphPanel::{
          , title
          , gridPos = { x = 0, y = 1, w = 24, h = 8 }
          , targets = [ gauge measurement ]
          }

let panels =
      \(tenant : Text) ->
        [ Grafana.Panels.mkTextPanel
            Grafana.TextPanel::{
            , title = "Generated with grafdhall"
            , gridPos = { x = 0, y = 0, w = 24, h = 1 }
            , content =
                ''
                # This dashboard is generated with grafdhall
                ''
            }
        , resource-panel
            "Instances"
            "zuul.nodepool.resources.tenant.${tenant}.instances"
        , resource-panel
            "Cores"
            "zuul.nodepool.resources.tenant.${tenant}.cores"
        , resource-panel "Memory" "zuul.nodepool.resources.tenant.${tenant}.ram"
        ]

let all-panel =
      \(measurement : Text) ->
        Grafana.Panels.mkGraphPanel
          Grafana.GraphPanel::{
          , title = "Resources usage: ${measurement}"
          , gridPos = { x = 0, y = 0, w = 24, h = 8 }
          , targets =
              Prelude.List.map
                Tenant.Type
                Grafana.MetricsTargets
                ( \(tenant : Tenant.Type) ->
                    gauge
                      "zuul.nodepool.resources.tenant.${tenant.id}.${measurement}"
                )
                tenants
          }

let tenant-dashboard =
      \(tenant : Tenant.Type) ->
        Grafana.Dashboard::{
        , title = "Tenant ${tenant.name} resources usage"
        , panels = Grafana.Utils.generateIds (panels tenant.id)
        , uid = Some "${tenant.name}-tenant-resources"
        , editable = True
        }

let tenant-dashboards =
      Prelude.List.map
        Tenant.Type
        Grafana.Dashboard.Type
        tenant-dashboard
        tenants

let all-tenant-dashboard =
      Grafana.Dashboard::{
      , title = "Tenants resource usage"
      , uid = Some "all-tenants-resources"
      , panels =
          Grafana.Utils.generateIds
            ( Prelude.List.map
                Text
                (Natural -> Grafana.Panels.Panels)
                all-panel
                [ "instances", "cores", "ram" ]
            )
      , editable = True
      }

in  [ all-tenant-dashboard ] # tenant-dashboards