Class: Dexter::PgStatActivitySource

Inherits:
Object
  • Object
show all
Defined in:
lib/dexter/sources/pg_stat_activity_source.rb

Instance Method Summary collapse

Constructor Details

#initialize(connection) ⇒ PgStatActivitySource



3
4
5
# File 'lib/dexter/sources/pg_stat_activity_source.rb', line 3

def initialize(connection)
  @connection = connection
end

Instance Method Details

#perform(collector) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/dexter/sources/pg_stat_activity_source.rb', line 7

def perform(collector)
  previous_queries = {}

  10.times do
    active_queries = {}
    processed_queries = {}

    stat_activity.each do |row|
      if row["state"] == "active"
        active_queries[row["id"]] = row
      else
        collector.add(row["query"], row["duration_ms"].to_f)
        processed_queries[row["id"]] = true
      end
    end

    # store queries after they complete
    previous_queries.each do |id, row|
      if !active_queries[id] && !processed_queries[id]
        collector.add(row["query"], row["duration_ms"].to_f)
      end
    end

    previous_queries = active_queries

    sleep($dexter_test ? 0 : 0.1)
  end
end

#stat_activityObject



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/dexter/sources/pg_stat_activity_source.rb', line 36

def stat_activity
  sql = "    SELECT\n      pid || ':' || COALESCE(query_start, xact_start) AS id,\n      query,\n      state,\n      EXTRACT(EPOCH FROM NOW() - COALESCE(query_start, xact_start)) * 1000.0 AS duration_ms\n    FROM\n      pg_stat_activity\n    WHERE\n      datname = current_database()\n      AND pid != pg_backend_pid()\n    ORDER BY\n      1\n  SQL\n  @connection.execute(sql)\nend\n"