/PhoenixAnalytics

📊 Plug and play analytics for Phoenix applications.

Primary LanguageElixirApache License 2.0Apache-2.0

📊 Phoenix Analytics

GitHub CI Latest release View documentation

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

Installation

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.1.2"}
  ]
end

Update config/config.exs

config :phoenix_analytics,
  database_path: System.get_env("DUCK_PATH") || "analytics.duckdb",
  app_domain: System.get_env("PHX_HOST") || "example.com"

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
defmodule MyApp.Repo.Migrations.AddPhoenixAnalytics do
  def up, do: PhoenixAnalytics.Migration.up()
  def down, do: PhoenixAnalytics.Migration.down()
end
mix ecto.migrate

Add plug to enable tracking to endpoint.ex, ‼️ add it straight after your 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.*

‼️ Please test thoroughly before proceeding to production!

Documentation

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 -> today
  • ctrl+t -> yesterday
  • w -> last_week
  • m -> last_30_days
  • q -> last_90_days
  • y -> last_12_month
  • ctrl+w -> previous_week
  • ctrl+m -> previous_month
  • ctrl+q -> previous_quarter
  • ctrl+y -> previous_year
  • a -> all_time

Development

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:

DUCK_PATH="dev.duckdb" mix run priv/repo/seeds.exs

Lastly you can start dev server:

DUCK_PATH="dev.duckdb" elixir priv/repo/dev.exs

or

DUCK_PATH="dev.duckdb" iex priv/repo/dev.exs

You can navigate to http://localhost:4000/dev/analytics

Performance test

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
with without

For whom this library

  • Single instance Phoenix app

  • Multiple instances of Phoenix app without auto scaling group

  • Multiple instances of Phoenix app with auto scaling group

There is a plan to build a separate backend to be powered by ClickHouse in order to track requests across multiple nodes in orchestrated scenarios.

Heavily inspired by