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),
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"""
<%= for {x, y, z} <- @data do %>
<% 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