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