newrelic_postgres_plugin 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: df49884a5a752bb2515da8bacbaa3d2e5c946483
4
- data.tar.gz: aadb0a56547d98b2a940c545a563744e334420c4
3
+ metadata.gz: bd5c3eba5088340cbca41478ac07e60fabfbe3c6
4
+ data.tar.gz: 643749251a9b13fd68598c027783f76bc478cd7d
5
5
  SHA512:
6
- metadata.gz: cfd61c6982580ef02ffaa5609377849c7a33df7751dd230a7fd44f315323f4ea7dfd70cb44d91364218fa60e38443fd1dd3027c6bfc355d2929436ae605cc2b6
7
- data.tar.gz: 1dd6eed77a06076bc83c03b3c918a2fd6370750039635d921d07d7377221a04a95bc8f43d8e953af346c9055aa5f2c39df2c845198c35a0a6527e5b61c06ad3e
6
+ metadata.gz: e41ac60b89fd9697d12882d231f416f1af00ee6911642366c91f4cb189007485f2c5ff84cac6d86ed240f0a689bdb88dde7b8f376ff010e5f4f3ef7fbce34307
7
+ data.tar.gz: 9b90b6d606eb3c4611d797db368cdff615f43643859feda41c57974b0bbda4c00efe513b6fe7fa229f9f73cc77b68670cc7223492dd9ea7c5bbe2992925b5d05
@@ -19,6 +19,7 @@ module NewRelic::PostgresPlugin
19
19
 
20
20
  def initialize(*args)
21
21
  @previous_metrics = {}
22
+ @previous_result_for_query ||= {}
22
23
  super
23
24
  end
24
25
 
@@ -49,19 +50,13 @@ module NewRelic::PostgresPlugin
49
50
  @connection.server_version >= 90200
50
51
  end
51
52
 
52
-
53
53
  #
54
54
  # This is called on every polling cycle
55
55
  #
56
56
  def poll_cycle
57
57
  @connection = self.connect
58
58
 
59
- report_backend_metrics
60
- report_bgwriter_metrics
61
- report_database_metrics
62
- report_index_metrics
63
- report_cache_metrics
64
- report_qps_metrics
59
+ report_metrics
65
60
 
66
61
  rescue => e
67
62
  $stderr.puts "#{e}: #{e.backtrace.join("\n ")}"
@@ -69,34 +64,22 @@ module NewRelic::PostgresPlugin
69
64
  @connection.finish if @connection
70
65
  end
71
66
 
72
- def report_derived_metric(name, units, value)
73
- if previous_value = @previous_metrics[name]
74
- report_metric name, units, (value - previous_value)
75
- else
76
- report_metric name, units, 0
77
- end
78
- @previous_metrics[name] = value
79
- end
80
-
81
- def report_backend_metrics
67
+ def report_metrics
82
68
  @connection.exec(backend_query) do |result|
83
69
  report_metric "Backends/Active", 'connections', result[0]['backends_active']
84
70
  report_metric "Backends/Idle", 'connections', result[0]['backends_idle']
85
71
  end
86
- end
87
-
88
- def report_database_metrics
89
72
  @connection.exec(database_query) do |result|
90
73
  result.each do |row|
91
- report_metric "Database/Backends", '', row['numbackends'].to_i
92
- report_derived_metric "Database/Transactions/Committed", '', row['xact_commit'].to_i
93
- report_derived_metric "Database/Transactions/Rolled Back", '', row['xact_rollback'].to_i
94
- report_derived_metric "Database/Tuples/Returned/From Sequential", '', row['tup_returned'].to_i
95
- report_derived_metric "Database/Tuples/Returned/From Bitmap", '', row['tup_fetched'].to_i
96
- report_derived_metric "Database/Tuples/Writes/Inserts", '', row['tup_inserted'].to_i
97
- report_derived_metric "Database/Tuples/Writes/Updates", '', row['tup_updated'].to_i
98
- report_derived_metric "Database/Tuples/Writes/Deletes", '', row['tup_deleted'].to_i
99
- report_derived_metric "Database/Conflicts", '', row['conflicts'].to_i
74
+ report_metric "Database/Backends", '', row['numbackends'].to_i
75
+ report_derived_metric "Database/Transactions/Committed", 'transactions', row['xact_commit'].to_i
76
+ report_derived_metric "Database/Transactions/Rolled Back", 'transactions', row['xact_rollback'].to_i
77
+
78
+ report_derived_metric "Database/Rows/Selected", 'rows', row['tup_returned'].to_i + row['tup_fetched'].to_i
79
+ report_derived_metric "Database/Rows/Inserted", 'rows', row['tup_inserted'].to_i
80
+ report_derived_metric "Database/Rows/Updated", 'rows', row['tup_updated'].to_i
81
+ report_derived_metric "Database/Rows/Deleted", 'rows', row['tup_deleted'].to_i
82
+
100
83
  end
101
84
  end
102
85
  @connection.exec(index_count_query) do |result|
@@ -105,34 +88,44 @@ module NewRelic::PostgresPlugin
105
88
  @connection.exec(index_size_query) do |result|
106
89
  report_metric "Database/Indexes/Size", 'bytes', result[0]['size'].to_i
107
90
  end
108
- end
109
-
110
- def report_bgwriter_metrics
111
91
  @connection.exec(bgwriter_query) do |result|
112
92
  report_derived_metric "Background Writer/Checkpoints/Scheduled", 'checkpoints', result[0]['checkpoints_timed'].to_i
113
93
  report_derived_metric "Background Writer/Checkpoints/Requested", 'checkpoints', result[0]['checkpoints_requests'].to_i
114
94
  end
115
- end
95
+ report_metric "Alerts/Index Miss Ratio", '%', calculate_miss_ratio(%Q{SELECT SUM(idx_blks_hit) AS hits, SUM(idx_blks_read) AS reads FROM pg_statio_user_indexes})
96
+ report_metric "Alerts/Cache Miss Ratio", '%', calculate_miss_ratio(%Q{SELECT SUM(heap_blks_hit) AS hits, SUM(heap_blks_read) AS reads FROM pg_statio_user_tables})
116
97
 
117
- def report_index_metrics
118
- report_metric "Indexes/Miss Ratio", '%', calculate_miss_ratio(%Q{SELECT SUM(idx_blks_hit) AS hits, SUM(idx_blks_read) AS reads FROM pg_statio_user_indexes})
98
+ # This is dependent on the pg_stat_statements being loaded, and assumes that pg_stat_statements.max has been set sufficiently high that most queries will be recorded. If your application typically generates more than 1000 distinct query plans per sampling interval, you're going to have a bad time.
99
+ if extension_loaded? "pg_stat_statements"
100
+ @connection.exec("SELECT SUM(calls) FROM pg_stat_statements") do |result|
101
+ report_derived_metric "Database/Statements", '', result[0]["sum"].to_i
102
+ end
103
+ else
104
+ puts "pg_stat_statements is not loaded; no Database/Statements metric will be reported."
105
+ end
119
106
  end
120
107
 
121
- def report_cache_metrics
122
- report_metric "Cache/Miss Ratio", '%', calculate_miss_ratio(%Q{SELECT SUM(heap_blks_hit) AS hits, SUM(heap_blks_read) AS reads FROM pg_statio_user_tables})
123
- end
108
+ private
124
109
 
125
- def report_qps_metrics
126
- report_derived_metric "Database/Queries/Count", '', @connection.exec("SELECT SUM(calls) FROM pg_stat_statements")[0]["sum"].to_i
127
- end
110
+ def extension_loaded?(extname)
111
+ @connection.exec("SELECT count(*) FROM pg_extension WHERE extname = '#{extname}'") do |result|
112
+ result[0]["count"] == "1"
113
+ end
114
+ end
128
115
 
129
- private
116
+ def report_derived_metric(name, units, value)
117
+ if previous_value = @previous_metrics[name]
118
+ report_metric name, units, (value - previous_value)
119
+ else
120
+ report_metric name, units, 0
121
+ end
122
+ @previous_metrics[name] = value
123
+ end
130
124
 
131
125
  # This assumes the query returns a single row with two columns: hits and reads.
132
126
  def calculate_miss_ratio(query)
133
127
  sample = @connection.exec(query)[0]
134
- sample.each { |k,v| sample[k] = v.to_i }
135
- @previous_result_for_query ||= {}
128
+ sample.each { |key,value| sample[key] = value.to_i }
136
129
  miss_ratio = if check_samples(@previous_result_for_query[query], sample)
137
130
 
138
131
  hits = sample["hits"] - @previous_result_for_query[query]["hits"]
@@ -1,3 +1,3 @@
1
1
  module NewRelic::PostgresPlugin
2
- VERSION = '0.2.3'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
13
13
  ## If your rubyforge_project name is different, then edit it and comment out
14
14
  ## the sub! line in the Rakefile
15
15
  s.name = 'newrelic_postgres_plugin'
16
- s.version = '0.2.3'
16
+ s.version = '0.3.0'
17
17
  s.date = '2014-08-05'
18
18
  s.rubyforge_project = 'newrelic_postgres_plugin'
19
19
 
@@ -48,11 +48,8 @@ This is the New Relic plugin for monitoring Postgres developed by Boundless Inc.
48
48
  "--main", "README.md"]
49
49
  s.extra_rdoc_files = %w[README.md LICENSE]
50
50
 
51
- ## The newrelic_plugin needs to be installed. Prior to public release, the
52
- # gem needs to be downloaded from git@github.com:newrelic-platform/newrelic_plugin.git
53
- # and built using the "rake build" command
54
- s.add_dependency('newrelic_plugin', "~> 1.3")
55
- s.add_dependency('pg', ">= 0.15.1")
51
+ s.add_dependency('newrelic_plugin', '~> 1.3', '>= 1.3.1')
52
+ s.add_dependency('pg', '~> 0.17', '>= 0.17.0')
56
53
 
57
54
  s.post_install_message = <<-EOF
58
55
  To get started with this plugin, create a working directory and do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: newrelic_postgres_plugin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Hodgson
@@ -18,6 +18,9 @@ dependencies:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '1.3'
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.3.1
21
24
  type: :runtime
22
25
  prerelease: false
23
26
  version_requirements: !ruby/object:Gem::Requirement
@@ -25,20 +28,29 @@ dependencies:
25
28
  - - "~>"
26
29
  - !ruby/object:Gem::Version
27
30
  version: '1.3'
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.3.1
28
34
  - !ruby/object:Gem::Dependency
29
35
  name: pg
30
36
  requirement: !ruby/object:Gem::Requirement
31
37
  requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.17'
32
41
  - - ">="
33
42
  - !ruby/object:Gem::Version
34
- version: 0.15.1
43
+ version: 0.17.0
35
44
  type: :runtime
36
45
  prerelease: false
37
46
  version_requirements: !ruby/object:Gem::Requirement
38
47
  requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '0.17'
39
51
  - - ">="
40
52
  - !ruby/object:Gem::Version
41
- version: 0.15.1
53
+ version: 0.17.0
42
54
  description: |
43
55
  This is the New Relic plugin for monitoring Postgres developed by Boundless Inc.
44
56
  email: matt@boundless.com