Configuration Reference

Copy Markdown View Source

TimelessPhoenix is configured through two touch points: a child spec in your supervision tree and a router macro in your Phoenix router.

Child spec options

Pass these options to {TimelessPhoenix, opts} in your supervision tree:

OptionTypeDefaultDescription
:data_dirstringrequiredBase directory; creates metrics/, logs/, spans/ subdirectories
:nameatom:defaultInstance name for process naming
:metricslistDefaultMetrics.all()Telemetry.Metrics list for the reporter
:timelesskeyword[]Extra opts forwarded to TimelessMetrics
:timeless_logskeyword[]Application env overrides for TimelessLogs
:timeless_traceskeyword[]Application env overrides for TimelessTraces
:reporterkeyword[]Extra opts for the telemetry reporter

Router macro options

Pass these to timeless_phoenix_dashboard "/path", opts:

OptionTypeDefaultDescription
:nameatom:defaultMust match the child spec :name
:metricsmoduleTimelessPhoenix.DefaultMetricsCustom metrics module (must export metrics/0)
:download_pathstring"/timeless/downloads"Path for the metrics backup download plug
:live_dashboardkeyword[]Extra options merged into the live_dashboard call

Full example

# lib/my_app/application.ex
children = [
  {TimelessPhoenix,
    data_dir: "priv/observability",
    name: :default,
    metrics: MyApp.Telemetry.metrics(),
    timeless: [max_blocks: 200, block_size: 2000],
    timeless_logs: [retention_max_age: 3 * 86_400],
    timeless_traces: [retention_max_age: 3 * 86_400],
    reporter: [flush_interval: 15_000]}
]

# lib/my_app_web/router.ex
import TimelessPhoenix.Router

scope "/" do
  pipe_through [:browser, :admin]
  timeless_phoenix_dashboard "/dashboard",
    name: :default,
    metrics: MyApp.Telemetry,
    live_dashboard: [on_mount: [{MyAppWeb.AdminAuth, :ensure_admin, []}]]
end

Subsystem overrides

TimelessMetrics options

Forwarded via the :timeless key. Common options:

OptionDefaultDescription
:max_blocks100Max compressed blocks per series
:block_size1000Points per block
:flush_interval60_000Reporter flush interval (ms)
:compression:zstdBlock compression (:zstd)
:raw_retention_seconds604_800 (7 days)Raw data retention
:daily_retention_seconds31_536_000 (365 days)Daily rollup retention

See TimelessMetrics Configuration for the full reference.

TimelessLogs options

Forwarded via the :timeless_logs key. Set as application env before the app starts:

OptionDefaultDescription
:storage:disk:disk or :memory
:flush_interval1_000Buffer flush interval (ms)
:max_buffer_size1_000Max entries before forced flush
:compaction_format:openzlCompression format (:openzl or :zstd)
:retention_max_age604_800 (7 days)Max log age in seconds
:retention_max_size536_870_912 (512 MB)Max storage size

See TimelessLogs Configuration for the full reference.

TimelessTraces options

Forwarded via the :timeless_traces key. Set as application env before the app starts:

OptionDefaultDescription
:storage:disk:disk or :memory
:flush_interval1_000Buffer flush interval (ms)
:max_buffer_size1_000Max spans before forced flush
:compaction_format:openzlCompression format (:openzl or :zstd)
:retention_max_age604_800 (7 days)Max span age in seconds
:retention_max_size536_870_912 (512 MB)Max storage size

See TimelessTraces Configuration for the full reference.

Reporter options

Forwarded via the :reporter key:

OptionDefaultDescription
:flush_intervalinheritedOverride the reporter's flush interval
:prefixnilPrefix for metric names

Named instances

Multiple TimelessPhoenix instances can run in the same application. Each gets isolated storage, processes, and dashboard pages:

children = [
  {TimelessPhoenix, data_dir: "priv/obs_main", name: :main},
  {TimelessPhoenix, data_dir: "priv/obs_admin", name: :admin}
]
scope "/main" do
  pipe_through :browser
  timeless_phoenix_dashboard "/dashboard", name: :main
end

scope "/admin" do
  pipe_through [:browser, :admin]
  timeless_phoenix_dashboard "/dashboard", name: :admin
end

Instance names generate process names:

  • Store: :"tp_{name}_timeless" (e.g., :"tp_main_timeless")
  • Reporter: :"tp_{name}_reporter"
  • Supervisor: :"tp_{name}_sup"

Memory mode

For development or CI, store logs and traces in memory (metrics always persist to disk):

{TimelessPhoenix,
  data_dir: "priv/observability",
  timeless_logs: [storage: :memory],
  timeless_traces: [storage: :memory]}

Or via the Igniter installer when you explicitly want ephemeral logs/traces:

mix igniter.install timeless_phoenix --storage memory