defmodule Phoenix.LiveDashboard.ChartComponent do use Phoenix.LiveDashboard.Web, :live_component @impl true def mount(socket) do {:ok, socket, temporary_assigns: [data: []]} end @impl true def update(assigns, socket) do {metric, assigns} = Map.pop(assigns, :metric) socket = if metric do assign(socket, title: chart_title(metric), description: metric.description, kind: chart_kind(metric.__struct__), label: chart_label(metric), tags: Enum.join(metric.tags, "-"), unit: chart_unit(metric.unit) ) else socket end {:ok, assign(socket, assigns)} end @impl true def render(assigns) do ~L"""
<%= if @description do %> <%= hint do %> <%= @description %> <% end %> <% end %>
""" end defp chart_title(metric) do "#{Enum.join(metric.name, ".")}#{chart_tags(metric.tags)}" end defp chart_tags([]), do: "" defp chart_tags(tags), do: " (#{Enum.join(tags, "-")})" defp chart_kind(Telemetry.Metrics.Counter), do: :counter defp chart_kind(Telemetry.Metrics.LastValue), do: :last_value defp chart_kind(Telemetry.Metrics.Sum), do: :sum defp chart_kind(Telemetry.Metrics.Summary), do: :summary defp chart_kind(Telemetry.Metrics.Distribution), do: raise(ArgumentError, "LiveDashboard does not yet support distribution metrics") defp chart_label(%{} = metric) do metric.name |> List.last() |> Phoenix.Naming.humanize() end defp chart_unit(:byte), do: "bytes" defp chart_unit(:kilobyte), do: "KB" defp chart_unit(:megabyte), do: "MB" defp chart_unit(:nanosecond), do: "ns" defp chart_unit(:microsecond), do: "µs" defp chart_unit(:millisecond), do: "ms" defp chart_unit(:second), do: "s" defp chart_unit(:unit), do: "" defp chart_unit(unit) when is_atom(unit), do: unit end