defmodule Exbox.Logging do
@moduledoc """
This module is responsible for attaching logging to telemetry events.
To use this module, you must have the Telemetry library installed.
To do so, add {:telemetry, "~> 1.2.1"} to your list of dependencies in mix.exs.
"""
alias Exbox.Logging.LogHandler
@doc """
Attaches logging to the Phoenix endpoint stop and start events.
By default will be attached on supervisor startup
"""
@spec attach_controller_logs() :: :ok
def attach_controller_logs do
attach_telemetry(
"phoenix_controller_logs_stop",
[:phoenix, :endpoint, :stop],
&LogHandler.handle_event/4
)
attach_telemetry(
"phoenix_controller_logs_start",
[:phoenix, :endpoint, :start],
&LogHandler.handle_event/4
)
end
@doc """
Attaches logging to the given event with the given params.
## Examples
## Examples
To attach metrics for a custom event `:my_event` with parameters `[:my, :event]`, and a custom handler function `my_handler/3`, you can do the following:
```elixir
defmodule MyAppHandler do
def my_handler(event, measurements, metadata) do
# Your custom handler implementation here
end
end
def start(_type, _args) do
Exbox.Logging.attach_telemetry(:my_event, [:my, :event], &MyAppHandler.my_handler/3)
end
```
In this example, when :my_event is triggered, the telemetry system will call MyAppHandler.my_handler/1 with the captured event data. Ensure that the handler function is implemented appropriately for your specific use case.
Note: The logs will only be attached if the application environment variable :capture_telemetry_log_events is set to true.
## Parameters
- `event` (binary()) - The name of the event to which metrics will be attached.
- `params` (list(atom())) - A list of parameters representing the context of the event.
- `function` (any(), any(), any(), any() -> any()) - The function to be called when the event occurs.
Returns :ok if the logs are successfully attached.
"""
@spec attach_telemetry(binary(), list(atom()), (any(), any(), any(), any() -> any())) :: :ok
def attach_telemetry(event, params, function) do
if Exbox.Config.capture_telemetry_log_events?() do
:ok =
:telemetry.attach(
event,
params,
function,
nil
)
end
end
end