defmodule Mojito.Telemetry do @moduledoc ~S""" Mojito's [Telemetry](https://github.com/beam-telemetry/telemetry) integration. All time measurements are emitted in `:millisecond` units by default. A different [Erlang time unit](https://erlang.org/doc/man/erlang.html#type-time_unit) can be chosen by setting a config parameter like so: ``` config :mojito, Mojito.Telemetry, time_unit: :microsecond ``` Mojito emits the following Telemetry events: * `[:mojito, :pool, :start]` before launching a pool - Measurements: `:system_time` - Metadata: `:host`, `:port` * `[:mojito, :pool, :stop]` after launching a pool - Measurements: `:system_time`, `:duration` - Metadata: `:host`, `:port` * `[:mojito, :connect, :start]` before connecting to a host - Measurements: `:system_time` - Metadata: `:host`, `:port` * `[:mojito, :connect, :stop]` after connecting to a host - Measurements: `:system_time`, `:duration` - Metadata: `:host`, `:port` * `[:mojito, :request, :start]` before making a request - Measurements: `:system_time` - Metadata: `:host`, `:port`, `:path`, `:method` * `[:mojito, :request, :stop]` after making a request - Measurements: `:system_time`, `:duration` - Metadata: `:host`, `:port`, `:path`, `:method` """ @typep monotonic_time :: integer defp time_unit do Application.get_env(:mojito, Mojito.Telemetry)[:time_unit] || :millisecond end defp monotonic_time do :erlang.monotonic_time(time_unit()) end defp system_time do :erlang.system_time(time_unit()) end @doc false @spec start(atom, map) :: monotonic_time def start(name, meta \\ %{}) do start_time = monotonic_time() :telemetry.execute( [:mojito, name, :start], %{system_time: system_time()}, meta ) start_time end @doc false @spec stop(atom, monotonic_time, map) :: monotonic_time def stop(name, start_time, meta \\ %{}) do stop_time = monotonic_time() duration = stop_time - start_time :telemetry.execute( [:mojito, name, :stop], %{system_time: system_time(), duration: duration}, meta ) stop_time end end