ActiveAnalytics
Simple traffic analytics for the win of privacy.
- NO cookies
- NO JavaScript
- NO third parties
- NO bullshit
ActiveAnalytics is a Rails engine directly mountable in your Ruby on Rails application. It doesn't reveal anything about specific visitors. It cannot be blocked by adblockers or other privacy-protecting extensions (and doesn't need to).
ActiveAnalytics lets you know about:
- Sources: What are the pages and domains that bring some traffic.
- Page views: What are the pages that are the most viewed in your application.
- Next/previous page: What are the entry and exit pages for a given page of your application.
Installation
Add this line to your application's Gemfile:
gem 'active_analytics'
Then execute bundle and run the migration:
bundle
rails active_analytics:install:migrations
rails db:migrate
Your controllers have to call ActiveAnalytics.record_request(request)
to record page views. The Rails way to achieve is to use after_action
:
class ApplicationController < ActionController::Base
after_action :record_page_view
def record_page_view
# This is a basic example, you might need to customize some conditions.
# For most sites, it makes no sense to record anything other than HTML.
if response.content_type && response.content_type.start_with?("text/html")
# Add a condition to record only your canonical domain
# and use a gem such as crawler_detect to skip bots.
ActiveAnalytics.record_request(request)
end
end
end
In case you don't want to record all page views, because each application has sensitive URLs such as password reset and so on, simply define a skip_after_action :record_page_view
in the relevant controller.
Finally, just add the route to ActiveAnalytics dashboard at the desired endpoint:
mount ActiveAnalytics::Engine, at: "analytics" # http://localhost:3000/analytics
Authentication and permissions
ActiveAnalytics cannot guess how you handle user authentication, because it is different for all Rails applications.
So you have to monkey patch ActiveAnalytics::ApplicationController
in order to inject your own mechanism.
The patch can be saved wherever you want.
For example, I like to have all the patches in one place, so I put them in lib/patches
.
# lib/patches/active_analytics.rb
ActiveAnalytics::ApplicationController.class_eval do
before_action :require_admin
def require_admin
# This example supposes there are current_user and User#admin? methods
raise ActionController::RoutingError.new("Not found") unless current_user.try(:admin?)
end
end
end
Then you have to require the monkey patch. Because it's loaded via require, it won't be reloaded in development. Since you are not supposed to change this file often, it should not be an issue.
# config/application.rb
config.after_initialize do
require "patches/active_analytics"
end
If you use Devise, you can check the permission directly from routes.rb :
# config/routes.rb
authenticate :user, -> (u) { u.admin? } do # Supposing there is a User#admin? method
mount ActiveAnalytics::Engine, at: "analytics" # http://localhost:3000/analytics
end
License
The gem is available as open-source under the terms of the MIT License.
Made by Base Secrète.
Rails developer? Check out RoRvsWild, our Ruby on Rails application monitoring tool.