161 lines
6.5 KiB
Elixir
161 lines
6.5 KiB
Elixir
defmodule Aprsme.PromEx.Plugins.AprsmeTest do
|
|
use ExUnit.Case, async: true
|
|
|
|
alias Aprsme.PromEx.Plugins.Aprsme, as: Plugin
|
|
alias PromEx.MetricTypes.Event
|
|
|
|
describe "event_metrics/1" do
|
|
setup do
|
|
groups = Plugin.event_metrics([])
|
|
{:ok, groups: groups}
|
|
end
|
|
|
|
test "returns a list of Event structs" do
|
|
groups = Plugin.event_metrics([])
|
|
assert length(groups) == 7
|
|
assert Enum.all?(groups, &match?(%Event{}, &1))
|
|
end
|
|
|
|
test "every Event has a unique group_name and a non-empty metrics list" do
|
|
groups = Plugin.event_metrics([])
|
|
group_names = Enum.map(groups, & &1.group_name)
|
|
assert length(Enum.uniq(group_names)) == length(group_names)
|
|
|
|
assert Enum.all?(groups, fn %Event{metrics: metrics} ->
|
|
metrics != []
|
|
end)
|
|
end
|
|
|
|
test "exposes a packet pipeline group", %{groups: groups} do
|
|
group = find_group(groups, :aprsme_packet_pipeline_event_metrics)
|
|
assert %Event{group_name: _, metrics: _} = group
|
|
|
|
names = metric_names(group)
|
|
assert [:aprsme, :packet_pipeline, :batch, :count] in names
|
|
assert [:aprsme, :packet_pipeline, :batch, :success] in names
|
|
assert [:aprsme, :packet_pipeline, :batch, :error] in names
|
|
assert [:aprsme, :packet_pipeline, :batch, :duration_milliseconds] in names
|
|
end
|
|
|
|
test "exposes a producer backpressure group", %{groups: groups} do
|
|
group = find_group(groups, :aprsme_packet_producer_event_metrics)
|
|
assert %Event{group_name: _, metrics: _} = group
|
|
assert [:aprsme, :packet_producer, :backpressure, :count] in metric_names(group)
|
|
end
|
|
|
|
test "exposes a spatial pubsub group with all expected metrics", %{groups: groups} do
|
|
group = find_group(groups, :aprsme_spatial_pubsub_event_metrics)
|
|
assert %Event{group_name: _, metrics: _} = group
|
|
names = metric_names(group)
|
|
|
|
Enum.each(
|
|
[
|
|
[:aprsme, :spatial_pubsub, :clients, :count],
|
|
[:aprsme, :spatial_pubsub, :clients, :grid_cells],
|
|
[:aprsme, :spatial_pubsub, :clients, :avg_clients_per_cell],
|
|
[:aprsme, :spatial_pubsub, :broadcasts, :total],
|
|
[:aprsme, :spatial_pubsub, :broadcasts, :filtered],
|
|
[:aprsme, :spatial_pubsub, :broadcasts, :packets],
|
|
[:aprsme, :spatial_pubsub, :efficiency, :ratio],
|
|
[:aprsme, :spatial_pubsub, :efficiency, :saved_broadcasts]
|
|
],
|
|
fn n -> assert n in names end
|
|
)
|
|
end
|
|
|
|
test "exposes a repo pool group with size/idle/busy/available/queue/total", %{groups: groups} do
|
|
group = find_group(groups, :aprsme_repo_pool_event_metrics)
|
|
assert %Event{group_name: _, metrics: _} = group
|
|
names = metric_names(group)
|
|
|
|
assert [:aprsme, :repo, :pool, :size] in names
|
|
assert [:aprsme, :repo, :pool, :idle] in names
|
|
assert [:aprsme, :repo, :pool, :busy] in names
|
|
assert [:aprsme, :repo, :pool, :available] in names
|
|
assert [:aprsme, :repo, :pool, :queue_length] in names
|
|
assert [:aprsme, :repo, :pool, :total] in names
|
|
end
|
|
|
|
test "exposes a postgres group covering db size, connections, table stats and replication", %{groups: groups} do
|
|
group = find_group(groups, :aprsme_postgres_event_metrics)
|
|
assert %Event{group_name: _, metrics: _} = group
|
|
names = metric_names(group)
|
|
|
|
assert [:aprsme, :postgres, :database, :size_bytes] in names
|
|
assert [:aprsme, :postgres, :connections, :total] in names
|
|
assert [:aprsme, :postgres, :connections, :active] in names
|
|
assert [:aprsme, :postgres, :connections, :idle] in names
|
|
assert [:aprsme, :postgres, :connections, :idle_in_transaction] in names
|
|
assert [:aprsme, :postgres, :connections, :waiting] in names
|
|
assert [:aprsme, :postgres, :packets_table, :live_tuples] in names
|
|
assert [:aprsme, :postgres, :packets_table, :dead_tuples] in names
|
|
assert [:aprsme, :postgres, :packets_table, :total_inserts] in names
|
|
assert [:aprsme, :postgres, :packets_table, :total_updates] in names
|
|
assert [:aprsme, :postgres, :packets_table, :total_deletes] in names
|
|
assert [:aprsme, :postgres, :packets_table, :table_size_bytes] in names
|
|
assert [:aprsme, :postgres, :packets_table, :indexes_size_bytes] in names
|
|
assert [:aprsme, :postgres, :query_stats, :total_calls] in names
|
|
assert [:aprsme, :postgres, :query_stats, :total_time_ms] in names
|
|
assert [:aprsme, :postgres, :query_stats, :avg_time_ms] in names
|
|
assert [:aprsme, :postgres, :query_stats, :max_time_ms] in names
|
|
assert [:aprsme, :postgres, :replication, :lag_seconds] in names
|
|
end
|
|
|
|
test "exposes an api request metrics group", %{groups: groups} do
|
|
group = find_group(groups, :aprsme_api_request_event_metrics)
|
|
assert %Event{group_name: _, metrics: _} = group
|
|
names = metric_names(group)
|
|
|
|
assert [:aprsme, :api, :request, :total] in names
|
|
end
|
|
|
|
test "exposes an insert optimizer group", %{groups: groups} do
|
|
group = find_group(groups, :aprsme_insert_optimizer_event_metrics)
|
|
assert %Event{group_name: _, metrics: _} = group
|
|
names = metric_names(group)
|
|
|
|
assert [:aprsme, :insert_optimizer, :batch_size] in names
|
|
assert [:aprsme, :insert_optimizer, :throughput] in names
|
|
assert [:aprsme, :insert_optimizer, :duration] in names
|
|
assert [:aprsme, :insert_optimizer, :optimizations] in names
|
|
end
|
|
|
|
test "every metric carries a non-empty description" do
|
|
groups = Plugin.event_metrics([])
|
|
|
|
for group <- groups, metric <- group.metrics do
|
|
assert byte_size(metric.description) > 0
|
|
assert metric.description != ""
|
|
end
|
|
end
|
|
|
|
test "the batch duration metric uses the configured millisecond buckets", %{groups: groups} do
|
|
group = find_group(groups, :aprsme_packet_pipeline_event_metrics)
|
|
|
|
dist =
|
|
Enum.find(group.metrics, fn m ->
|
|
m.name == [:aprsme, :packet_pipeline, :batch, :duration_milliseconds]
|
|
end)
|
|
|
|
assert %{name: _, unit: _, reporter_options: _} = dist
|
|
assert dist.unit == :millisecond
|
|
buckets = Keyword.get(dist.reporter_options, :buckets)
|
|
assert buckets != []
|
|
assert 10 in buckets
|
|
assert 10_000 in buckets
|
|
end
|
|
end
|
|
|
|
describe "default callbacks" do
|
|
test "polling_metrics/1 returns []" do
|
|
assert Plugin.polling_metrics([]) == []
|
|
end
|
|
|
|
test "manual_metrics/1 returns []" do
|
|
assert Plugin.manual_metrics([]) == []
|
|
end
|
|
end
|
|
|
|
defp find_group(groups, name), do: Enum.find(groups, &(&1.group_name == name))
|
|
defp metric_names(%Event{metrics: metrics}), do: Enum.map(metrics, & &1.name)
|
|
end
|