defmodule Plausible.Ingestion.Counters.TelemetryHandlerTest do use Plausible.DataCase, async: true alias Plausible.Ingestion.Counters.Buffer alias Plausible.Ingestion.Counters.TelemetryHandler alias Plausible.Ingestion.Event test "install/1 attaches a telemetry handler", %{test: test} do on_exit(:detach, fn -> :telemetry.detach("ingest-counters-#{test}") end) buffer = Buffer.new(test) assert :ok = TelemetryHandler.install(buffer) all_handlers = :telemetry.list_handlers([:plausible, :ingest, :event]) assert Enum.find(all_handlers, fn handler -> handler.config == buffer and handler.event_name == Event.telemetry_event_dropped() end) assert Enum.find(all_handlers, fn handler -> handler.config == buffer and handler.event_name == Event.telemetry_event_buffered() end) end test "handles ingest events by aggregating the counts", %{test: test} do on_exit(:detach, fn -> :telemetry.detach("ingest-counters-#{test}") end) buffer = Buffer.new(test) assert :ok = TelemetryHandler.install(buffer) e1 = %{ domain: "a.example.com", request: %{timestamp: NaiveDateTime.utc_now(), tracker_script_version: 137} } e2 = %{ domain: "b.example.com", request: %{timestamp: NaiveDateTime.utc_now(), tracker_script_version: 137} } e3 = %{ domain: "c.example.com", request: %{timestamp: NaiveDateTime.utc_now(), tracker_script_version: 137} } :ok = Event.emit_telemetry_dropped(e1, :invalid) :ok = Event.emit_telemetry_dropped(e2, :not_found) :ok = Event.emit_telemetry_buffered(e3) :ok = Event.emit_telemetry_dropped(e2, :not_found) future = DateTime.utc_now() |> DateTime.add(120, :second) assert aggregates = Buffer.flush(buffer, future) assert Enum.find(aggregates, &match?({_, "dropped_invalid", "a.example.com", 137, 1}, &1)) assert Enum.find(aggregates, &match?({_, "dropped_not_found", "b.example.com", 137, 2}, &1)) assert Enum.find(aggregates, &match?({_, "buffered", "c.example.com", 137, 1}, &1)) end end