Telemetry integration for event tracing, metrics, and logging.
Redix connections (both Redix and Redix.PubSub) execute the
following Telemetry events:
[:redix, :connection]- executed when a Redix connection establishes the connection to Redis. There are no measurements associated with this event. Metadata are::connection- the PID of the Redix connection that emitted the event.:connection_name- the name (passed to the:nameoption when the connection is started) of the Redix connection that emitted the event.nilif the connection was not registered with a name.:address- the address the connection successfully connected to.:reconnection- a boolean that specifies whether this was a first connection to Redis or a reconnection after a disconnection. This can be useful for more granular logging.
[:redix, :disconnection]- executed when the connection is lost with the Redis server. There are no measurements associated with this event. Metadata are::connection- the PID of the Redix connection that emitted the event.:connection_name- the name (passed to the:nameoption when the:address- the address the connection was connected to. connection is started) of the Redix connection that emitted the event.nilif the connection was not registered with a name.:reason- the disconnection reason as aRedix.ConnectionErrorstruct.
[:redix, :failed_connection]- executed when Redix can't connect to the specified Redis server, either when starting up the connection or after a disconnection. There are no measurements associated with this event. Metadata are::connection- the PID of the Redix connection that emitted the event.:connection_name- the name (passed to the:nameoption when the connection is started) of the Redix connection that emitted the event.nilif the connection was not registered with a name.:addressor:sentinel_address- the address the connection was trying to connect to (either a Redis server or a Redis Sentinel instance).:reason- the disconnection reason as aRedix.ConnectionErrorstruct.
Redix connections execute the following Telemetry events when commands or
pipelines of any kind are executed.
[:redix, :pipeline, :start]- executed right before a pipeline (or command, which is a pipeline with just one command) is sent to the Redis server. Measurements are::system_time(integer) - the system time (in the:nativetime unit) at the time the event is emitted. SeeSystem.system_time/0.
Metadata are:
:connection- the PID of the Redix connection used to send the pipeline.:connection_name- the name of the Redix connection used to sent the pipeline. This isnilif the connection was not registered with a name or if the pipeline function was called with a PID directly (for example, if you didProcess.whereis/1manually).:commands- the commands sent to the server. This is always a list of commands, so even if you doRedix.command(conn, ["PING"])then the list of commands will be[["PING"]].:extra_metadata- any term set by users via the:telemetry_metadataoption inRedix.pipeline/3and other functions.
[:redix, :pipeline, :stop]- executed a response to a pipeline returns from the Redis server, regardless of whether it's an error response or a successful response. Measurements are::duration- the duration (in the:nativetime unit, seeSystem.time_unit/0) of back-and-forth between client and server.
Metadata are:
:connection- the PID of the Redix connection used to send the pipeline.:connection_name- the name of the Redix connection used to sent the pipeline. This isnilif the connection was not registered with a name or if the pipeline function was called with a PID directly (for example, if you didProcess.whereis/1manually).:commands- the commands sent to the server. This is always a list of commands, so even if you doRedix.command(conn, ["PING"])then the list of commands will be[["PING"]].:extra_metadata- any term set by users via the:telemetry_metadataoption inRedix.pipeline/3and other functions.
If the response is an error, the following metadata will also be present:
:kind- the atom:error.:reason- the error reason (such as aRedix.ConnectionErrorstruct).
Cluster events
Redix.Cluster connections execute the following Telemetry events:
[:redix, :cluster, :topology_change]- executed when the cluster topology is successfully refreshed. There are no measurements. Metadata are::cluster- the name of the cluster (the atom passed as:name).:nodes- the list of primary node addresses (as"host:port"strings).
[:redix, :cluster, :failed_topology_refresh]- executed when the cluster manager fails to refresh the topology (no reachable node). There are no measurements. Metadata are::cluster- the name of the cluster.:reason- the error reason. This is{:no_reachable_node, node_errors}, wherenode_errorsis a list of{host, port, reason}triples, one per node that was tried, in the order tried, so you can tell (for example) a wrong password from a network partition instead of a single opaque reason.
[:redix, :cluster, :node_connection_failed]- executed when the cluster manager fails to establish a connection to a specific node. There are no measurements. Metadata are::cluster- the name of the cluster.:address- the node address (as a"host:port"string).:reason- the error reason.
[:redix, :cluster, :redirection]- executed when a command receives aMOVEDorASKredirection from a cluster node. There are no measurements. Metadata are::cluster- the name of the cluster.:type- either:movedor:ask.:slot- the hash slot being redirected.:target_address- the target node address (as a"host:port"string).
More events might be added in the future and that won't be considered a breaking
change, so if you're writing a handler for Redix events be sure to ignore events
that are not known. All future Redix events will start with the :redix atom,
like the ones above.
A default handler that logs these events appropriately is provided, see
attach_default_handler/0. Otherwise, you can write your own handler to
instrument or log events, see the Telemetry page in the docs.
Summary
Functions
Attaches the default Redix-provided Telemetry handler.
Functions
@spec attach_default_handler() :: :ok | {:error, :already_exists}
Attaches the default Redix-provided Telemetry handler.
This function attaches a default Redix-provided handler that logs
(using Elixir's Logger) the following events:
[:redix, :disconnection]- logged at the:errorlevel[:redix, :failed_connection]- logged at the:errorlevel[:redix, :connection]- logged at the:infolevel if it's a reconnection, not logged if it's the first connection.[:redix, :cluster, :failed_topology_refresh]- logged at the:errorlevel[:redix, :cluster, :node_connection_failed]- logged at the:warninglevel[:redix, :cluster, :redirection]- logged at the:infolevel
See the module documentation for more information. If you want to attach your own handler, look at the Telemetry page in the documentation.
Examples
:ok = Redix.Telemetry.attach_default_handler()