module PgQtop::Monitor
Public Instance Methods
call()
click to toggle source
# File lib/pg_qtop/monitor.rb, line 46 def call cli = CLIHelper.new cli.parse_options Curses.noecho Curses.init_screen conn = PG::Connection.open cli.config.slice(:dbname, :host, :port, :user) conn.exec('SELECT pg_stat_statements_reset()') while true do Curses.setpos(0, 0) queries = conn.exec('SELECT query, calls, total_time, shared_blks_read, shared_blks_hit FROM pg_stat_statements').to_a queries = queries.sort_by {|q| (q["total_time"].to_f / q["calls"].to_f) }.reverse Curses.addstr("AVG\t| CALLS\t| HIT RATE\t| QUERY\n") Curses.addstr("-" * 80 + "\n") queries.each do |query| parsed_query = PgQuery.parse(query["query"]) next if cli.config[:statement_type] && !matches_statement_type?(parsed_query, cli.config[:statement_type]) next if cli.config[:table] && !parsed_query.tables.include?(cli.config[:table]) hit_rate = 100.0 * query["shared_blks_hit"].to_f / (query["shared_blks_hit"].to_i + query["shared_blks_read"].to_i) Curses.addstr format("%0.1fms\t", query["total_time"].to_f / query["calls"].to_f) Curses.addstr format("| %d\t", query["calls"].to_i) if hit_rate.nan? Curses.addstr "| -\t\t" else Curses.addstr format("| %0.1f\t\t", hit_rate) end Curses.addstr format("| %s\n", query["query"].gsub(/\s+/, " ").strip) end Curses.refresh sleep 1 end Curses.close_screen end
matches_statement_type?(parsed_query, filter)
click to toggle source
# File lib/pg_qtop/monitor.rb, line 92 def matches_statement_type?(parsed_query, filter) filter = filter.upcase filter = 'INSERT INTO' if filter == 'INSERT' filter = 'DELETE FROM' if filter == 'DELETE' parsed_query.parsetree.flat_map {|q| q.keys }.include?(filter) end