Skip to content

Commit 1df44c6

Browse files
authored
Add refresh_interval as a reporting option for chart components (#474)
1 parent e823614 commit 1df44c6

7 files changed

Lines changed: 45 additions & 2 deletions

File tree

assets/js/metrics_live/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ function nextTaggedValueForCallback({ x, y, z }, callback) {
125125
}
126126

127127
const getPruneThreshold = ({ pruneThreshold = 1000 }) => pruneThreshold
128+
const getRefreshInterval = ({ refreshInterval = 1000 }) => refreshInterval
128129

129130
// Handles the basic metrics like Counter, LastValue, and Sum.
130131
class CommonMetric {
@@ -210,6 +211,7 @@ class Summary {
210211
this.datasets = [{ key: "|x|", data: [] }]
211212
this.chart = new uPlot(config, this.constructor.initialData(options), chartEl)
212213
this.pruneThreshold = getPruneThreshold(options)
214+
this.refreshInterval = getRefreshInterval(options)
213215
this.options = options
214216

215217
if (options.tagged) {
@@ -467,8 +469,7 @@ const PhxChartComponent = {
467469
tagged: (chartEl.dataset.tags && chartEl.dataset.tags !== "") || false,
468470
width: Math.max(size.width, minChartSize.width),
469471
height: minChartSize.height,
470-
now: new Date() / 1e3,
471-
refreshInterval: 1000
472+
now: new Date() / 1e3
472473
})
473474

474475
this.chart = new TelemetryChart(chartEl, options)

guides/metrics.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ The following reporter options are available to the dashboard:
151151
points. When the threshold is reached, the chart data will
152152
be pruned by half. Default is `1_000`.
153153

154+
* `:refresh_interval` - the interval in milliseconds at which the chart
155+
will be refreshed. The default value is `1_000`.
156+
154157
* `:bucket_size` - the unit width of each bucket. This option only
155158
applies to `distribution` histograms. The default value is `20`.
156159

lib/phoenix/live_dashboard/components/chart_component.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ defmodule Phoenix.LiveDashboard.ChartComponent do
1616
defp validate_assigns!(assigns) do
1717
validate_positive_integer_or_nil!(assigns[:bucket_size], :bucket_size)
1818
validate_positive_integer_or_nil!(assigns[:prune_threshold], :prune_threshold)
19+
validate_positive_integer_or_nil!(assigns[:refresh_interval], :refresh_interval)
1920
:ok
2021
end
2122

@@ -48,6 +49,7 @@ defmodule Phoenix.LiveDashboard.ChartComponent do
4849
data-tags={Enum.join(@tags, "-")}
4950
data-unit={@unit}
5051
data-prune-threshold={@prune_threshold}
52+
data-refresh-interval={@refresh_interval}
5153
{bucket_size(@bucket_size)}
5254
>
5355
</div>

lib/phoenix/live_dashboard/page_builder.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,11 @@ defmodule Phoenix.LiveDashboard.PageBuilder do
916916
attr :label, :string, default: nil, doc: "Default label to use in the chart."
917917
attr :tags, :list, default: [], doc: "Optional list of tags."
918918
attr :prune_threshold, :integer, default: 1_000, doc: "Number of points to keep before pruning."
919+
920+
attr :refresh_interval, :integer,
921+
default: 1_000,
922+
doc: "The interval in milliseconds to refresh the chart."
923+
919924
attr :unit, :string, default: "", doc: "The unit that represent the chart."
920925

921926
attr :bucket_size, :integer,
@@ -939,6 +944,7 @@ defmodule Phoenix.LiveDashboard.PageBuilder do
939944
label={@label}
940945
tags={@tags}
941946
prune_threshold={@prune_threshold}
947+
refresh_interval={@refresh_interval}
942948
unit={@unit}
943949
bucket_size={@bucket_size}
944950
full_width={@full_width}

lib/phoenix/live_dashboard/pages/metrics_page.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ defmodule Phoenix.LiveDashboard.MetricsPage do
9595
label: chart_label(metric),
9696
tags: metric.tags,
9797
prune_threshold: prune_threshold(metric),
98+
refresh_interval: refresh_interval(metric),
9899
unit: chart_unit(metric.unit),
99100
bucket_size: bucket_size(kind, metric)
100101
}
@@ -134,6 +135,11 @@ defmodule Phoenix.LiveDashboard.MetricsPage do
134135
metric.reporter_options[:prune_threshold] || @default_prune_threshold
135136
end
136137

138+
@default_refresh_interval 1_000
139+
defp refresh_interval(metric) do
140+
metric.reporter_options[:refresh_interval] || @default_refresh_interval
141+
end
142+
137143
defp bucket_size(:distribution, metric), do: normalize_bucket_size(metric)
138144
defp bucket_size(_kind, _metric), do: nil
139145

test/phoenix/live_dashboard/components/chart_component_test.exs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ defmodule Phoenix.LiveDashboard.ChartComponentTest do
1717
tags: [],
1818
unit: "",
1919
prune_threshold: 1_000,
20+
refresh_interval: 1_000,
2021
bucket_size: 20
2122
}
2223

@@ -61,6 +62,11 @@ defmodule Phoenix.LiveDashboard.ChartComponentTest do
6162
assert result =~ ~s|data-prune-threshold="5"|
6263
end
6364

65+
test "renders refresh interval" do
66+
result = render_chart(refresh_interval: 5)
67+
assert result =~ ~s|data-refresh-interval="5"|
68+
end
69+
6470
test "renders data" do
6571
result = render_chart(data: [{"x", "y", "z"}])
6672
assert result =~ ~s|<span data-x="x" data-y="y" data-z="z">|
@@ -115,5 +121,19 @@ defmodule Phoenix.LiveDashboard.ChartComponentTest do
115121
render_chart(prune_threshold: true)
116122
end
117123
end
124+
125+
test "refresh_interval" do
126+
msg = ":refresh_interval must be a positive integer, got: -1"
127+
128+
assert_raise ArgumentError, msg, fn ->
129+
render_chart(refresh_interval: -1)
130+
end
131+
132+
msg = ":refresh_interval must be a positive integer, got: true"
133+
134+
assert_raise ArgumentError, msg, fn ->
135+
render_chart(refresh_interval: true)
136+
end
137+
end
118138
end
119139
end

test/phoenix/live_dashboard/pages/metrics_page_test.exs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,5 +139,10 @@ defmodule Phoenix.LiveDashboard.MetricsPageTest do
139139
opts = [reporter_options: [prune_threshold: 5]]
140140
assert %{prune_threshold: 5} = subject(last_value([:a, :b, :c, :size], opts))
141141
end
142+
143+
test "adds refresh_interval from report_options" do
144+
opts = [reporter_options: [refresh_interval: 5]]
145+
assert %{refresh_interval: 5} = subject(last_value([:a, :b, :c, :size], opts))
146+
end
142147
end
143148
end

0 commit comments

Comments
 (0)