class Sidekiq::UsageDbMonitor::DBRedisLogger

Public Class Methods

new(args={}) click to toggle source
# File lib/sidekiq/usage-db-monitor/db_redis_logger.rb, line 4
def initialize(args={})
  @redis = Redis.new(args)
  @tables = nil
end

Public Instance Methods

close() click to toggle source
# File lib/sidekiq/usage-db-monitor/db_redis_logger.rb, line 37
def close
  @redis.commit
end
write(*args) click to toggle source
# File lib/sidekiq/usage-db-monitor/db_redis_logger.rb, line 9
def write(*args)
  raw_log = args.to_s
  timestamp = Time.current.to_i / 60
  puts raw_log
  sql = ""
  if raw_log.include?('\e[1m\e[32m') # Insert
    parse=raw_log.split('\e[1m\e[32m')
    sql = parse.last
    duration_str = /(?:\()([A-z0-9.]*)(?:\))/.match(parse.first).try(:[],1)
    duration = duration_str[0..-3].try(:to_d)
    query = sql.split('RETURNING').first
    log_table_by_action(timestamp, query, 'write', duration)
  elsif raw_log.include?('\e[1m\e[34m') # Select
    parse = raw_log.split('\e[1m\e[34m')
    sql=parse.last
    duration_str = /(?:\()([A-z0-9.]*)(?:\))/.match(parse.first).try(:[],1)
    duration = duration_str[0..-3].try(:to_d)
    query = sql.split('\e[0m').first
    log_table_by_action(timestamp, query, 'read', duration)
  elsif raw_log.include?('\e[1m\e[35m') #transaction
    sql=raw_log.split('\e[1m\e[35m').last
    return # don't need a log
  else
    raise 'Error unexpected log format.'
  end
  @redis.hincrby("sidekiq-job-planner-by-query-count-#{timestamp}", query, 1)
end

Private Instance Methods

log_table_by_action(timestamp, query, action, duration) click to toggle source
# File lib/sidekiq/usage-db-monitor/db_redis_logger.rb, line 43
def log_table_by_action(timestamp, query, action, duration)
  tables.each do |table|
    if query.downcase.include?(table)
      @redis.hincrby("sidekiq-job-planner-by-table-count-#{action}-#{timestamp}", table, 1)
      @redis.expire("sidekiq-job-planner-by-table-count-#{action}-#{timestamp}", 82800)
      @redis.hincrby("sidekiq-job-planner-by-table-duration-#{action}-#{timestamp}", table, duration.to_i*1000)
      @redis.expire("sidekiq-job-planner-by-table-duration-#{action}-#{timestamp}", 82800)
      break
    end
  end
end
tables() click to toggle source
# File lib/sidekiq/usage-db-monitor/db_redis_logger.rb, line 55
def tables
  @tables ||= ActiveRecord::Base.connection.tables
end