postgres-vacuum-monitor 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fd8fa8d98c1da93630ad6ca53b2d34417a34aab1
4
+ data.tar.gz: ec20fb7edead9610aea85944014df8e2ca41353b
5
+ SHA512:
6
+ metadata.gz: acc26419c9fe7cc23583ade0813ae00e4b1025467c2bf7f12e8e252e329747c98a4b2435bc6503551dbc7c3cbecc8725ff8aeb77a49da275d21a4569ca40b5ce
7
+ data.tar.gz: 6e5fd0bc9126b1171acbd6604318c554a5199a58ff0fe83a99c136856ded8cc118a5c1c1c3bc4ef2a6ae2c004c306fce416c486e449bc44deea2f4e6934e2e58
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ *.iml
10
+ .idea/
11
+ Gemfile.lock
12
+ log/*.log
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --require spec_helper
3
+ --format progress
data/.rubocop.yml ADDED
@@ -0,0 +1,5 @@
1
+ inherit_gem:
2
+ salsify_rubocop: conf/rubocop_rails.yml
3
+
4
+ AllCops:
5
+ TargetRubyVersion: 2.4
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.4
4
+ - 2.5
5
+ services:
6
+ - postgresql
7
+
8
+ before_script:
9
+ - psql -c 'create database postgres_vacuum_monitor_test;' -U postgres
10
+
11
+ addons:
12
+ postgresql: '9.6'
data/Appraisals ADDED
@@ -0,0 +1,3 @@
1
+ appraise 'activerecord-5' do
2
+ gem 'activerecord', '>= 5.0.0', '< 6.0.0'
3
+ end
@@ -0,0 +1,46 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
6
+
7
+ ## Our Standards
8
+
9
+ Examples of behavior that contributes to creating a positive environment include:
10
+
11
+ * Using welcoming and inclusive language
12
+ * Being respectful of differing viewpoints and experiences
13
+ * Gracefully accepting constructive criticism
14
+ * Focusing on what is best for the community
15
+ * Showing empathy towards other community members
16
+
17
+ Examples of unacceptable behavior by participants include:
18
+
19
+ * The use of sexualized language or imagery and unwelcome sexual attention or advances
20
+ * Trolling, insulting/derogatory comments, and personal or political attacks
21
+ * Public or private harassment
22
+ * Publishing others' private information, such as a physical or electronic address, without explicit permission
23
+ * Other conduct which could reasonably be considered inappropriate in a professional setting
24
+
25
+ ## Our Responsibilities
26
+
27
+ Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
28
+
29
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
30
+
31
+ ## Scope
32
+
33
+ This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
34
+
35
+ ## Enforcement
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at fgarces@salsify.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
38
+
39
+ Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
40
+
41
+ ## Attribution
42
+
43
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
44
+
45
+ [homepage]: http://contributor-covenant.org
46
+ [version]: http://contributor-covenant.org/version/1/4/
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in postgres-vacuum-monitor.gemspec
6
+ #
7
+ #
8
+
9
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2018 Fernando Garces
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,93 @@
1
+ [![Build Status](https://travis-ci.org/salsify/postgres-vacuum-monitor.svg?branch=master)](https://travis-ci.org/salsify/postgres-vacuum-monitor)
2
+ [![Maintainability](https://api.codeclimate.com/v1/badges/9ced178ca8fee231a935/maintainability)](https://codeclimate.com/github/salsify/postgres-vacuum-monitor/maintainability)
3
+ [![Coverage Status](https://coveralls.io/repos/github/salsify/postgres-vacuum-monitor/badge.svg?branch=master)](https://coveralls.io/github/salsify/postgres-vacuum-monitor?branch=master)
4
+
5
+
6
+ # Postgres::Vacuum::Monitor
7
+
8
+ Postgres::Vacuum::Monitor provides queries that provide information about the number of dead tuples and long running queries.
9
+ This information helps to diagnose and monitor two things:
10
+ 1) That the current auto vacuum settings are working and keeping up.
11
+ 2) That there are no long running queries affecting the auto vacuuming daemon.
12
+
13
+ ## Installation
14
+
15
+ Add this line to your application's Gemfile:
16
+
17
+ ```ruby
18
+ gem 'postgres-vacuum-monitor'
19
+ ```
20
+
21
+ And then execute:
22
+
23
+ $ bundle install
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install postgres-vacuum-monitor
28
+
29
+ ## Usage
30
+
31
+ The job itself needs a class to report the information and can be configured by doing:
32
+
33
+ ```ruby
34
+ Postgres::Vacuum::Monitor.configure do |config|
35
+ config.monitor_reporter_class_name = 'MetricsReporter'
36
+ end
37
+ ```
38
+
39
+ The class needs to follow this interface:
40
+ ```ruby
41
+ class MetricsReporter
42
+ def report_event(name, attributes)
43
+ end
44
+ end
45
+ ```
46
+
47
+ For long running queries, the event name is `LongQueries` and the attributes are:
48
+ ```ruby
49
+ {
50
+ start_time: # When the query started .
51
+ running_time: # How long has it been running in seconds.
52
+ application_name: # What's the application name that is running the query.
53
+ query: # The offending query.
54
+ }
55
+ ```
56
+
57
+ For auto vacuum the attributes are the following:
58
+
59
+ ```ruby
60
+ {
61
+ table: # Table name.
62
+ table_size: # How big is the table.
63
+ dead_tuples: # How many dead tuples are in the table.
64
+ tuples_over_limit: # How many dead tuples are over the auto vacuumer threshold.
65
+ }
66
+ ```
67
+
68
+ ## New relic queries
69
+
70
+ I use [New relic](https://rpm.newrelic.com) and use the following NRQL to create dashboards:
71
+
72
+ #### Tuples over limit
73
+ ```SQL
74
+ SELECT percentile(tuples_over_limit, 95) from AutoVacuumLagging facet table where appName = 'my-app' TIMESERIES 30 minutes since 1 day ago
75
+ ```
76
+
77
+ #### Dead tuples
78
+ ```SQL
79
+ SELECT percentile(dead_tuples) FROM AutoVacuumLagging facet table where appName = 'my-app' SINCE 1 DAY AGO TIMESERIES
80
+ ```
81
+ #### Long running queries
82
+ ```SQL
83
+ SELECT application_name, query, running_time, start_time FROM LongQueries
84
+ ```
85
+
86
+ #### Tables that need to be vacuumed
87
+ ```SQL
88
+ SELECT uniques(table) FROM AutoVacuumLagging where appName = 'my-app' since 30 minutes ago
89
+ ```
90
+
91
+ ## Contributing
92
+
93
+ Bug reports and pull requests are welcome on GitHub at https://github.com/salsify/postgres-vacuum-monitor.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'bundler/setup'
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ require 'rspec/core/rake_task'
6
+ RSpec::Core::RakeTask.new(:spec) do |task|
7
+ task.verbose = false
8
+ end
9
+
10
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "postgres/vacuum/monitor"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,11 @@
1
+ module Postgres
2
+ module Vacuum
3
+ class Configuration
4
+ attr_accessor :monitor_reporter_class_name
5
+
6
+ def initialize
7
+ @monitor_reporter_class_name = nil
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,46 @@
1
+ module Postgres
2
+ module Vacuum
3
+ module Jobs
4
+ class MonitorJob
5
+
6
+ AUTOVACUUM_QUERY_EVENT = 'AutoVacuumLagging'.freeze
7
+ LONG_QUERIES = 'LongQueries'.freeze
8
+
9
+ def perform(*)
10
+ ActiveRecord::Base.connection.execute(Postgres::Vacuum::Monitor::Query.long_running_queries).each do |row|
11
+ reporter_class.report_event(
12
+ LONG_QUERIES,
13
+ start_time: row['xact_start'],
14
+ running_time: row['seconds'],
15
+ application_name: row['application_name'],
16
+ query: row['query']
17
+ )
18
+ end
19
+
20
+ ActiveRecord::Base.connection.execute(Postgres::Vacuum::Monitor::Query.tables_eligible_vacuuming).each do |row|
21
+ reporter_class.report_event(
22
+ AUTOVACUUM_QUERY_EVENT,
23
+ table: row['relation'],
24
+ table_size: row['table_size'],
25
+ dead_tuples: row['dead_tuples'].to_i,
26
+ tuples_over_limit: row['dead_tuples'].to_i - row['autovacuum_vacuum_tuples'].to_i
27
+ )
28
+ end
29
+
30
+ true
31
+ end
32
+
33
+ def reporter_class
34
+ return @reporter_class_name if @reporter_class_name
35
+
36
+ @reporter_class_name = Postgres::Vacuum::Monitor.configuration.monitor_reporter_class_name&.safe_constantize
37
+ raise ConfigurationError.new('Missing or invalid report class name. Check your configuration') if @reporter_class_name.nil?
38
+
39
+ @reporter_class_name
40
+ end
41
+
42
+ ConfigurationError = Class.new(StandardError)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,70 @@
1
+ module Postgres
2
+ module Vacuum
3
+ module Monitor
4
+ module Query
5
+ extend self
6
+
7
+ STATES = ["'idle in transaction'", "'active'"].freeze
8
+ TIME_LIMIT = 3600
9
+ THRESHOLD_SETTING = "'autovacuum_vacuum_threshold'".freeze
10
+ SCALE_FACTOR_SETTING = "'autovacuum_vacuum_scale_factor'".freeze
11
+ MAX_AGE_SETTING = "'autovacuum_freeze_max_age'".freeze
12
+ PG_CATALOG = "'pg_catalog'".freeze
13
+
14
+ def long_running_queries
15
+ <<-SQL
16
+ SELECT *
17
+ FROM (
18
+ SELECT
19
+ pid,
20
+ xact_start,
21
+ EXTRACT(EPOCH FROM (now() - xact_start)) AS seconds,
22
+ application_name,
23
+ query
24
+ FROM pg_stat_activity
25
+ WHERE state IN (#{STATES.join(', ')})
26
+ ORDER BY seconds DESC
27
+ ) AS long_queries
28
+ WHERE seconds > #{TIME_LIMIT};
29
+ SQL
30
+ end
31
+
32
+ def tables_eligible_vacuuming
33
+ # The query was taken from http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html
34
+ <<-SQL
35
+ WITH vbt AS (
36
+ SELECT setting AS autovacuum_vacuum_threshold FROM pg_settings WHERE name = #{THRESHOLD_SETTING}) , vsf AS (
37
+ SELECT setting AS autovacuum_vacuum_scale_factor FROM pg_settings WHERE name = #{SCALE_FACTOR_SETTING}) , fma AS (
38
+ SELECT setting AS autovacuum_freeze_max_age FROM pg_settings WHERE name = #{MAX_AGE_SETTING}) , sto AS (
39
+ SELECT opt_oid, split_part(setting, '=', 1) AS param, split_part(setting, '=', 2) AS value FROM (
40
+ SELECT oid opt_oid, unnest(reloptions) setting FROM pg_class
41
+ ) opt
42
+ )
43
+ SELECT '"'||ns.nspname||'"."'||c.relname||'"' AS relation,
44
+ pg_size_pretty(pg_table_size(c.oid)) AS table_size,
45
+ age(relfrozenxid) AS xid_age,
46
+ coalesce(cfma.value::float, autovacuum_freeze_max_age::float) autovacuum_freeze_max_age,
47
+ (
48
+ coalesce(cvbt.value::float, autovacuum_vacuum_threshold::float) +
49
+ coalesce(cvsf.value::float,autovacuum_vacuum_scale_factor::float) * pg_table_size(c.oid)
50
+ ) AS autovacuum_vacuum_tuples,
51
+ n_dead_tup AS dead_tuples
52
+ FROM pg_class c
53
+ JOIN pg_namespace ns ON ns.oid = c.relnamespace
54
+ JOIN pg_stat_all_tables stat ON stat.relid = c.oid
55
+ JOIN vbt ON (1=1) JOIN vsf ON (1=1)
56
+ JOIN fma ON (1=1)
57
+ LEFT JOIN sto cvbt ON cvbt.param = #{THRESHOLD_SETTING} AND c.oid = cvbt.opt_oid
58
+ LEFT JOIN sto cvsf ON cvsf.param = #{SCALE_FACTOR_SETTING} AND c.oid = cvsf.opt_oid
59
+ LEFT JOIN sto cfma ON cfma.param = #{MAX_AGE_SETTING} AND c.oid = cfma.opt_oid
60
+ WHERE c.relkind = 'r'
61
+ AND nspname <> #{PG_CATALOG}
62
+ AND ( age(relfrozenxid) >= coalesce(cfma.value::float, autovacuum_freeze_max_age::float)
63
+ OR coalesce(cvbt.value::float, autovacuum_vacuum_threshold::float) + coalesce(cvsf.value::float,autovacuum_vacuum_scale_factor::float) * pg_table_size(c.oid) <= n_dead_tup)
64
+ ORDER BY age(relfrozenxid) DESC LIMIT 50;
65
+ SQL
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,7 @@
1
+ module Postgres
2
+ module Vacuum
3
+ module Monitor
4
+ VERSION = '0.2.2'.freeze
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,27 @@
1
+ require 'active_record'
2
+ require 'postgres/vacuum/configuration'
3
+ require 'postgres/vacuum/monitor/version'
4
+ require 'postgres/vacuum/monitor/query'
5
+ require 'postgres/vacuum/jobs/monitor_job'
6
+
7
+ module Postgres
8
+ module Vacuum
9
+ module Monitor
10
+ class << self
11
+ attr_accessor :config
12
+ end
13
+
14
+ def self.configuration
15
+ @config ||= Configuration.new
16
+ end
17
+
18
+ def self.reset
19
+ @config = Configuration.new
20
+ end
21
+
22
+ def self.configure
23
+ yield(configuration)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,35 @@
1
+
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'postgres/vacuum/monitor/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'postgres-vacuum-monitor'
8
+ spec.version = Postgres::Vacuum::Monitor::VERSION
9
+ spec.authors = ['Fernando Garces']
10
+ spec.email = ['fgarces@salsify.com']
11
+
12
+ spec.summary = 'Simple stats collector for postgres auto vacuumer.'
13
+ spec.description = 'Queries the Active Record DB for information regarding the auto vacuum process and long running queries.'
14
+ spec.homepage = 'https://github.com/salsify/postgres-vacuum-monitor'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = 'exe'
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.required_ruby_version = '>= 2.4.0'
24
+
25
+ spec.add_development_dependency 'appraisal'
26
+ spec.add_development_dependency 'bundler', '~> 1.16'
27
+ spec.add_development_dependency 'coveralls'
28
+ spec.add_development_dependency 'database_cleaner'
29
+ spec.add_development_dependency 'rake', '~> 10.0'
30
+ spec.add_development_dependency 'rspec', '~> 3.2'
31
+ spec.add_development_dependency 'salsify_rubocop'
32
+
33
+ spec.add_dependency 'activerecord', '>= 5', '< 5.2'
34
+ spec.add_dependency 'pg', '~> 0.18'
35
+ end
metadata ADDED
@@ -0,0 +1,194 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: postgres-vacuum-monitor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.2
5
+ platform: ruby
6
+ authors:
7
+ - Fernando Garces
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-01-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: appraisal
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.16'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.16'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coveralls
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: database_cleaner
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.2'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: salsify_rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: activerecord
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '5'
118
+ - - "<"
119
+ - !ruby/object:Gem::Version
120
+ version: '5.2'
121
+ type: :runtime
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '5'
128
+ - - "<"
129
+ - !ruby/object:Gem::Version
130
+ version: '5.2'
131
+ - !ruby/object:Gem::Dependency
132
+ name: pg
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.18'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.18'
145
+ description: Queries the Active Record DB for information regarding the auto vacuum
146
+ process and long running queries.
147
+ email:
148
+ - fgarces@salsify.com
149
+ executables: []
150
+ extensions: []
151
+ extra_rdoc_files: []
152
+ files:
153
+ - ".gitignore"
154
+ - ".rspec"
155
+ - ".rubocop.yml"
156
+ - ".travis.yml"
157
+ - Appraisals
158
+ - CODE_OF_CONDUCT.md
159
+ - Gemfile
160
+ - LICENSE.txt
161
+ - README.md
162
+ - Rakefile
163
+ - bin/console
164
+ - bin/setup
165
+ - lib/postgres/vacuum/configuration.rb
166
+ - lib/postgres/vacuum/jobs/monitor_job.rb
167
+ - lib/postgres/vacuum/monitor.rb
168
+ - lib/postgres/vacuum/monitor/query.rb
169
+ - lib/postgres/vacuum/monitor/version.rb
170
+ - postgres-vacuum-monitor.gemspec
171
+ homepage: https://github.com/salsify/postgres-vacuum-monitor
172
+ licenses: []
173
+ metadata: {}
174
+ post_install_message:
175
+ rdoc_options: []
176
+ require_paths:
177
+ - lib
178
+ required_ruby_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: 2.4.0
183
+ required_rubygems_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ requirements: []
189
+ rubyforge_project:
190
+ rubygems_version: 2.6.14
191
+ signing_key:
192
+ specification_version: 4
193
+ summary: Simple stats collector for postgres auto vacuumer.
194
+ test_files: []