Skip to main content

lib/mix/tasks/parapet.gen.grafana.ex

defmodule Mix.Tasks.Parapet.Gen.Grafana do
  @moduledoc """
  Generates importable Grafana dashboards and provisioning YAML based on the user's SLOs.
  """
  use Igniter.Mix.Task

  @impl Igniter.Mix.Task
  def info(_argv, _composing_task) do
    %Igniter.Mix.Task.Info{
      schema: [],
      defaults: []
    }
  end

  alias Parapet.SLO

  @impl Igniter.Mix.Task
  def igniter(igniter) do
    # Register built-in SLOs
    SLO.HTTP.register()

    if Code.ensure_loaded?(Oban) do
      SLO.Oban.register()
    end

    SLO.LoginJourney.register()

    slos = SLO.all()

    app_name = Igniter.Project.Application.app_name(igniter) || :parapet_app

    # Generate Dashboards Provisioning YAML
    provisioning_template =
      Application.app_dir(:parapet, "priv/templates/parapet.gen.grafana/dashboards.yml.eex")

    provisioning_content = EEx.eval_file(provisioning_template, app_name: app_name)

    igniter =
      Igniter.create_new_file(
        igniter,
        "priv/parapet/grafana/provisioning/dashboards.yml",
        provisioning_content
      )

    # Generate Main Dashboard JSON
    dashboard_template =
      Application.app_dir(:parapet, "priv/templates/parapet.gen.grafana/main_dashboard.json.eex")

    dashboard_content = EEx.eval_file(dashboard_template, app_name: app_name, slos: slos)

    Igniter.create_new_file(
      igniter,
      "priv/parapet/grafana/dashboards/main.json",
      dashboard_content
    )
  end
end