newrelic_postgres_plugin 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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