Phoenix Analytics is embedded plug and play tool designed for Phoenix applications. It provides a simple and efficient way to track and analyze user behavior and application performance without impacting your main application's performance and database.
Key features:
- ⚡️ Lightweight and fast analytics tracking
- ⛓️💥 Separate storage using DuckDB to avoid affecting your main database
- 🔌 Easy integration with Phoenix applications
- 📊 Minimalistic dashboard for data visualization
The decision to use DuckDB as the storage was made to ensure that the analytics data collection process does not interfere with or degrade the performance of your application's primary transactional database. This separation allows for efficient data storage and querying specifically optimized for analytics purposes, while keeping your main database focused on serving your application's core functionality.
d7F5wRlg5NS9EIob.mp4
If available in Hex, the package can be installed
by adding phoenix_analytics
to your list of dependencies in mix.exs
:
def deps do
[
{:phoenix_analytics, "~> 0.2"}
]
end
Update config/config.exs
config :phoenix_analytics,
duckdb_path: System.get_env("DUCKDB_PATH") || "analytics.duckdb",
app_domain: System.get_env("PHX_HOST") || "example.com"
Important
In case you have dynamic cluster, you can use your PostgresDB as backend.
config :phoenix_analytics,
duckdb_path: System.get_env("DUCKDB_PATH") || "analytics.duckdb",
app_domain: System.get_env("PHX_HOST") || "example.com",
postgres_conn: System.get_env("POSTGRES_CONN") || "dbname=postgres user=phoenix password=analytics host=localhost"
Important
In case you would like to proceed with Postgres option, consider enabling caching.
config :phoenix_analytics,
duckdb_path: System.get_env("DUCKDB_PATH") || "analytics.duckdb",
app_domain: System.get_env("PHX_HOST") || "example.com",
postgres_conn: System.get_env("POSTGRES_CONN") || "dbname=postgres user=phoenix password=analytics host=localhost",
cache_ttl: System.get_env("CACHE_TTL") || 120 # seconds
Add migration file
In case you have ecto less / no migrations project you can do the following:
iex -S mix
PhoenixAnalytics.Migration.up()
mix ecto.gen.migration add_phoenix_analytics
Tip
Based on your configuration migration will be run in appropriate database.
If only duckdb_path
then in duckdb file.
If duckdb_path
and postgres_conn
provided then in your Postgres database.
defmodule MyApp.Repo.Migrations.AddPhoenixAnalytics do
use Ecto.Migration
def up, do: PhoenixAnalytics.Migration.up()
def down, do: PhoenixAnalytics.Migration.down()
end
mix ecto.migrate
Add plug to enable tracking to endpoint.ex
, Plug.Static
plug PhoenixAnalytics.Plugs.RequestTracker
Add dashboard route to your router.ex
use PhoenixAnalytics.Web, :router
phoenix_analytics_dashboard "/analytics"
Update your .gitignore
*.duckdb
*.duckdb.*
Warning
Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/phoenix_analytics.
Shortcuts:
t
-> todayctrl+t
-> yesterdayw
-> last_weekm
-> last_30_daysq
-> last_90_daysy
-> last_12_monthctrl+w
-> previous_weekctrl+m
-> previous_monthctrl+q
-> previous_quarterctrl+y
-> previous_yeara
-> all_time
If you would like to contribute, first you would need to install deps, assets and then compile css and js. I put everything under next mix command:
mix setup
Then you would need some database with seeds. Here is command for this:
DUCKDB_PATH="analytics.duckdb" mix run priv/repo/seeds.exs
or if you would like to test with Postgres backend:
cd examples/duck_postgres/
docker compose -f postgres-compose.yml up
# from project root
mix run priv/repo/seeds_postgres.exs
Note
Move database with seeds to example project which you going to use.
Lastly you can use one of example applications to start server.
cd examples/duck_only/
mix deps.get
mix phx.server
You can navigate to http://localhost:4000/dev/analytics
I performed vegeta test on basic Macbook Air M2, to see if plug will affect application performance.
Script can be found here: vegeta/vegeta.sh
With plug | Without |
---|---|
- Single instance Phoenix app (duckdb only recommended)
- Multiple instances of Phoenix app without auto scaling group (duckdb or postgres option can be used)
- Multiple instances of Phoenix app with auto scaling group (only postgres powered apps supported at the moment)