module Prisma

Used for configuration, typically in a Rails initializer.

Public Class Methods

group(name, options={}, &block) click to toggle source

Configures a group. The instance of the current {api.rubyonrails.org/classes/ActionController/Base.html ActionController} is being passed as an argument into the block. As an example, tracking daily active users could be as simple as:

Prisma.setup do |config|
  config.group :logged_in { |controller| controller.current_user.id }
end

@param [Symbol/String] name for identifying the group, it is used as part of the redis key. @param [Hash] options where :type is either :counter (default) or :bitmap, and where :description is an optional description (used in the admin UI) @param [Block] block returning a String (or a meaningful +.to_s output+) which is used for identifying a counter inside a group, Prisma doesn’t count a request if block returns nil or false

# File lib/prisma.rb, line 65
def self.group(name, options={}, &block)
  @@groups[name] = Group.new(options.merge(name: name, block: block))
end
redis() click to toggle source

Returns a default or configured Redis instance wrapped in a Redis::Namespace @return [Redis::Namespace]

# File lib/prisma.rb, line 71
def self.redis
  @@namespaced_redis ||= lambda do
    case @@redis
    when String
      if @@redis =~ /redis\:\/\//
        redis = Redis.connect(url: @@redis, thread_safe: true)
      else
        host, port, db = @@redis.split(':')
        redis = Redis.new(host: host, port: port, thread_safe: true, db: db)
      end
      Redis::Namespace.new(redis_namespace, redis: redis)
    else
      Redis::Namespace.new(redis_namespace, redis: @@redis)
    end
  end.call
end
redis_expire(duration=nil) click to toggle source

@!visibility private Returns duration of from beginning of day to now + given or configured duration @param [Numeric] duration in seconds (defaults to configured redis_expiration_duration) @return [Numeric] duration

# File lib/prisma.rb, line 102
def self.redis_expire(duration=nil)
  duration = redis_expiration_duration unless duration
  (Time.now.utc.beginning_of_day + duration).to_i - Time.now.utc.to_i
end
redis_key(group_name, date=nil) click to toggle source

@!visibility private Returns redis key for a group name and optional date @param [Symbol/String] group_name for which group the redis key is for @param [Date] date for which date the redis key is for, if not given it uses today’s date @return [String] the redis key

# File lib/prisma.rb, line 93
def self.redis_key(group_name, date=nil)
  date = Time.now.utc.to_date unless date
  "#{group_name}:#{date.strftime('%Y:%m:%d')}"
end
setup() { |self| ... } click to toggle source

Configure prisma. Example usage:

Prisma.setup do |config|
  config.group :active_api_clients { |controller| controller.current_client.id }
  config.redis = Redis.new(db: 1)
  config.redis_namespace = 'stats'
  config.redis_expiration_duration = 2.days
  config.logger = Rails.logger
end
# File lib/prisma.rb, line 51
def self.setup
  yield self
  store_configuration
end
store_configuration() click to toggle source

@!visibility private Stores the configured groups inside of redis

# File lib/prisma.rb, line 109
def self.store_configuration
  redis.del 'configuration'
  groups.values.each do |group|
    redis.rpush 'configuration', group.name
    redis.set "configuration:description:#{group.name}", group.description if group.description
    redis.set "configuration:type:#{group.name}", group.type
  end
end