| defmodule Plausible.Ingestion.Counters.TelemetryHandler do |
| @moduledoc """ |
| Subscribes to telemetry events emitted by `Plausible.Ingestion.Event`. |
| Every time a request derived event is either dispatched to clickhouse or dropped, |
| a telemetry event is emitted respectively. That event is captured here, |
| its metadata is extracted and sent for internal stats aggregation via |
| `Counters.Buffer` interface. |
| """ |
| alias Plausible.Ingestion.Counters |
| alias Plausible.Ingestion.Event |
|
|
| @event_dropped Event.telemetry_event_dropped() |
| @event_buffered Event.telemetry_event_buffered() |
|
|
| @telemetry_events [@event_dropped, @event_buffered] |
| @telemetry_handler &__MODULE__.handle_event/4 |
|
|
| @spec install(Counters.Buffer.t()) :: :ok |
| def install(%Counters.Buffer{buffer_name: buffer_name} = buffer) do |
| :ok = |
| :telemetry.attach_many( |
| "ingest-counters-#{buffer_name}", |
| @telemetry_events, |
| @telemetry_handler, |
| buffer |
| ) |
| end |
|
|
| @spec handle_event([atom()], any(), map(), Counters.Buffer.t()) :: :ok |
| def handle_event( |
| @event_dropped, |
| _measurements, |
| %{ |
| domain: domain, |
| reason: reason, |
| request_timestamp: timestamp, |
| tracker_script_version: tracker_script_version |
| }, |
| buffer |
| ) do |
| Counters.Buffer.aggregate( |
| buffer, |
| "dropped_#{reason}", |
| domain, |
| timestamp, |
| tracker_script_version |
| ) |
|
|
| :ok |
| end |
|
|
| def handle_event( |
| @event_buffered, |
| _measurements, |
| %{ |
| domain: domain, |
| request_timestamp: timestamp, |
| tracker_script_version: tracker_script_version |
| }, |
| buffer |
| ) do |
| Counters.Buffer.aggregate(buffer, "buffered", domain, timestamp, tracker_script_version) |
| :ok |
| end |
| end |
|
|