defmodule Drone.Telemetry do @moduledoc """ Telemetry event helpers for ex_drone. This module provides convenience functions for emitting `:telemetry` events throughout the drone command pipeline. All events follow the naming convention `[:drone, namespace, action]`. """ @spec emit_connect_start(atom(), atom()) :: :ok def emit_connect_start(adapter, name) do :telemetry.execute( [:drone, :connect, :start], %{timestamp: System.monotonic_time()}, %{adapter: adapter, name: name} ) end @spec emit_connect_stop(atom(), atom(), non_neg_integer()) :: :ok def emit_connect_stop(adapter, name, duration) do :telemetry.execute( [:drone, :connect, :stop], %{duration: duration, timestamp: System.monotonic_time()}, %{adapter: adapter, name: name} ) end @spec emit_connect_error(atom(), atom(), term()) :: :ok def emit_connect_error(adapter, name, reason) do :telemetry.execute( [:drone, :connect, :error], %{timestamp: System.monotonic_time()}, %{adapter: adapter, name: name, reason: reason} ) end @spec emit_disconnect(atom(), atom()) :: :ok def emit_disconnect(adapter, name) do :telemetry.execute( [:drone, :disconnect], %{timestamp: System.monotonic_time()}, %{adapter: adapter, name: name} ) end @spec emit_command_start(atom(), atom(), Drone.Command.t()) :: :ok def emit_command_start(adapter, name, %Drone.Command{} = command) do :telemetry.execute( [:drone, :command, :start], %{command: command.type, timestamp: System.monotonic_time()}, %{adapter: adapter, name: name} ) end @spec emit_command_stop(atom(), atom(), atom(), atom(), non_neg_integer()) :: :ok def emit_command_stop(adapter, name, command_type, result, duration) do :telemetry.execute( [:drone, :command, :stop], %{ command: command_type, result: result, duration: duration, timestamp: System.monotonic_time() }, %{adapter: adapter, name: name} ) end @spec emit_command_error(atom(), atom(), atom(), atom(), non_neg_integer()) :: :ok def emit_command_error(adapter, name, command_type, reason, duration) do :telemetry.execute( [:drone, :command, :error], %{ command: command_type, reason: reason, duration: duration, timestamp: System.monotonic_time() }, %{adapter: adapter, name: name} ) end @spec emit_safety_reject(atom(), atom(), atom(), atom()) :: :ok def emit_safety_reject(adapter, name, command_type, reason) do :telemetry.execute( [:drone, :safety, :reject], %{command: command_type, reason: reason, timestamp: System.monotonic_time()}, %{adapter: adapter, name: name} ) end @spec emit_safety_warning(atom(), atom(), atom(), atom()) :: :ok def emit_safety_warning(adapter, name, command_type, warning) do :telemetry.execute( [:drone, :safety, :warning], %{command: command_type, warning: warning, timestamp: System.monotonic_time()}, %{adapter: adapter, name: name} ) end @spec emit_telemetry_update(atom(), atom(), map()) :: :ok def emit_telemetry_update(adapter, name, telemetry) do :telemetry.execute( [:drone, :telemetry, :update], Map.merge(telemetry, %{timestamp: System.monotonic_time()}), %{adapter: adapter, name: name} ) end @spec emit_emergency(atom(), atom()) :: :ok def emit_emergency(adapter, name) do :telemetry.execute( [:drone, :emergency], %{timestamp: System.monotonic_time()}, %{adapter: adapter, name: name} ) end end