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 +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
|