defmodule EtcdEx.Telemetry do @moduledoc """ EtcdEx telemetry integration. All time measurements are in `:native` units. EtcdEx executes following events: ### Request start `[:etcdex, :request, :start]` - Executed when sending a request to Etcd cluster. #### Measurements * `system_time` - The system time. #### Metadata * `request` - Type of the request. * `args` - Arguments of the request. ### Request stop `[:etcdex, :request, :stop]` - Executed after receiving a response from Etcd cluster. #### Measurements * `duration` - Time taken from the request start event. #### Metadata * `request` - Type of the request. * `args` - Arguments of the request. * `result` - The result of the operation. ### Connect start `[:etcdex, :connect, :start]` - Executed before establishing connection to Etcd cluster. #### Measurements * `system_time` - The system time. #### Metadata * `scheme` - The scheme used in the connection. * `address` - The host address of the Etcd cluster. * `port` - The port of the Etcd cluster. ### Connect stop `[:etcdex, :connect, :stop]` - Executed when finished establishing connection (either successfully or not). #### Measurements * `duration` - Time take from the connect start event. #### Metadata * `scheme` - The scheme used in the connection. * `address` - The host address of the Etcd cluster. * `port` - The port of the Etcd cluster. * `error` - Error message received when trying to establish the connection, set only on unsuccessful attempts. ### Disconnect `[:etcdex, :disconnect]` - Executed when disconnected from Etcd cluster. #### Measurements * `system_time` - The system time. #### Metadata * `scheme` - The scheme used in the connection. * `address` - The host address of the Etcd cluster. * `port` - The port of the Etcd cluster. * `reason` - The disconnect reason. """ @doc false def start(event, meta \\ %{}, extra_measurements \\ %{}) do start_time = System.monotonic_time() measurements = Map.merge(extra_measurements, %{start_time: System.system_time()}) :telemetry.execute( [:etcdex, event, :start], measurements, meta ) start_time end @doc false def stop(event, start_time, meta \\ %{}, extra_measurements \\ %{}) do end_time = System.monotonic_time() measurements = Map.merge(extra_measurements, %{duration: end_time - start_time}) :telemetry.execute( [:etcdex, event, :stop], measurements, meta ) end @doc false def event(event, meta, measurements) do :telemetry.execute([:etcdex, event], measurements, meta) end end