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 +4 -4
- data/lib/newrelic_postgres_plugin/agent.rb +37 -44
- data/lib/newrelic_postgres_plugin/version.rb +1 -1
- data/newrelic_postgres_plugin.gemspec +3 -6
- metadata +15 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd5c3eba5088340cbca41478ac07e60fabfbe3c6
|
4
|
+
data.tar.gz: 643749251a9b13fd68598c027783f76bc478cd7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
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",
|
92
|
-
report_derived_metric "Database/Transactions/Committed",
|
93
|
-
report_derived_metric "Database/Transactions/Rolled Back",
|
94
|
-
|
95
|
-
report_derived_metric "Database/
|
96
|
-
report_derived_metric "Database/
|
97
|
-
report_derived_metric "Database/
|
98
|
-
report_derived_metric "Database/
|
99
|
-
|
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
|
-
|
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
|
-
|
118
|
-
|
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
|
-
|
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
|
-
|
126
|
-
|
127
|
-
|
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
|
-
|
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 { |
|
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"]
|
@@ -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.
|
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
|
-
|
52
|
-
|
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.
|
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.
|
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.
|
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
|