pg_peek 0.1.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.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +217 -0
  4. data/Rakefile +16 -0
  5. data/app/assets/javascripts/pg_peek/application.js +147 -0
  6. data/app/assets/stylesheets/pg_peek/application.css +362 -0
  7. data/app/controllers/pg_peek/activity_controller.rb +16 -0
  8. data/app/controllers/pg_peek/application_controller.rb +36 -0
  9. data/app/controllers/pg_peek/databases_controller.rb +96 -0
  10. data/app/controllers/pg_peek/endpoints_controller.rb +10 -0
  11. data/app/controllers/pg_peek/indexes_controller.rb +7 -0
  12. data/app/controllers/pg_peek/jobs_controller.rb +44 -0
  13. data/app/controllers/pg_peek/pg_stat_statements_controller.rb +11 -0
  14. data/app/controllers/pg_peek/queries_controller.rb +13 -0
  15. data/app/controllers/pg_peek/tables_controller.rb +6 -0
  16. data/app/helpers/pg_peek/application_helper.rb +179 -0
  17. data/app/helpers/pg_peek/report_helper.rb +58 -0
  18. data/app/jobs/pg_peek/application_job.rb +4 -0
  19. data/app/mailers/pg_peek/application_mailer.rb +6 -0
  20. data/app/models/pg_peek/application_record.rb +3 -0
  21. data/app/models/pg_peek/database.rb +131 -0
  22. data/app/models/pg_peek/pg_stat_statements.rb +132 -0
  23. data/app/models/pg_peek/sql_comment.rb +25 -0
  24. data/app/models/pg_peek/table.rb +266 -0
  25. data/app/queries/pg_peek/pg14/activity/sessions.sql +26 -0
  26. data/app/queries/pg_peek/pg14/activity/summary.sql +8 -0
  27. data/app/queries/pg_peek/pg14/activity/waiting_locks.sql +11 -0
  28. data/app/queries/pg_peek/pg14/database/vitals.sql +11 -0
  29. data/app/queries/pg_peek/pg14/indexes/all.sql +17 -0
  30. data/app/queries/pg_peek/pg14/pg_stat_statements/endpoints.sql +43 -0
  31. data/app/queries/pg_peek/pg14/pg_stat_statements/jobs.sql +12 -0
  32. data/app/queries/pg_peek/pg14/pg_stat_statements/outliers.sql +13 -0
  33. data/app/queries/pg_peek/pg14/pg_stat_statements/outliers_by_job.sql +14 -0
  34. data/app/queries/pg_peek/pg14/tables/dead_tuples.sql +11 -0
  35. data/app/queries/pg_peek/pg14/tables/inline_stats.sql +9 -0
  36. data/app/queries/pg_peek/pg14/tables/stats.sql +32 -0
  37. data/app/queries/pg_peek/pg15/activity/sessions.sql +26 -0
  38. data/app/queries/pg_peek/pg15/activity/summary.sql +8 -0
  39. data/app/queries/pg_peek/pg15/activity/waiting_locks.sql +11 -0
  40. data/app/queries/pg_peek/pg15/database/vitals.sql +11 -0
  41. data/app/queries/pg_peek/pg15/indexes/all.sql +17 -0
  42. data/app/queries/pg_peek/pg15/pg_stat_statements/endpoints.sql +43 -0
  43. data/app/queries/pg_peek/pg15/pg_stat_statements/jobs.sql +12 -0
  44. data/app/queries/pg_peek/pg15/pg_stat_statements/outliers.sql +13 -0
  45. data/app/queries/pg_peek/pg15/pg_stat_statements/outliers_by_job.sql +14 -0
  46. data/app/queries/pg_peek/pg15/tables/dead_tuples.sql +11 -0
  47. data/app/queries/pg_peek/pg15/tables/inline_stats.sql +9 -0
  48. data/app/queries/pg_peek/pg15/tables/stats.sql +32 -0
  49. data/app/queries/pg_peek/pg16/activity/sessions.sql +26 -0
  50. data/app/queries/pg_peek/pg16/activity/summary.sql +8 -0
  51. data/app/queries/pg_peek/pg16/activity/waiting_locks.sql +11 -0
  52. data/app/queries/pg_peek/pg16/database/vitals.sql +11 -0
  53. data/app/queries/pg_peek/pg16/indexes/all.sql +17 -0
  54. data/app/queries/pg_peek/pg16/pg_stat_statements/endpoints.sql +43 -0
  55. data/app/queries/pg_peek/pg16/pg_stat_statements/jobs.sql +12 -0
  56. data/app/queries/pg_peek/pg16/pg_stat_statements/outliers.sql +13 -0
  57. data/app/queries/pg_peek/pg16/pg_stat_statements/outliers_by_job.sql +14 -0
  58. data/app/queries/pg_peek/pg16/tables/dead_tuples.sql +11 -0
  59. data/app/queries/pg_peek/pg16/tables/inline_stats.sql +9 -0
  60. data/app/queries/pg_peek/pg16/tables/stats.sql +32 -0
  61. data/app/queries/pg_peek/pg17/activity/sessions.sql +26 -0
  62. data/app/queries/pg_peek/pg17/activity/summary.sql +8 -0
  63. data/app/queries/pg_peek/pg17/activity/waiting_locks.sql +11 -0
  64. data/app/queries/pg_peek/pg17/database/vitals.sql +11 -0
  65. data/app/queries/pg_peek/pg17/indexes/all.sql +17 -0
  66. data/app/queries/pg_peek/pg17/pg_stat_statements/endpoints.sql +43 -0
  67. data/app/queries/pg_peek/pg17/pg_stat_statements/jobs.sql +12 -0
  68. data/app/queries/pg_peek/pg17/pg_stat_statements/outliers.sql +13 -0
  69. data/app/queries/pg_peek/pg17/pg_stat_statements/outliers_by_job.sql +14 -0
  70. data/app/queries/pg_peek/pg17/tables/dead_tuples.sql +11 -0
  71. data/app/queries/pg_peek/pg17/tables/inline_stats.sql +9 -0
  72. data/app/queries/pg_peek/pg17/tables/stats.sql +32 -0
  73. data/app/queries/pg_peek/pg18/activity/sessions.sql +26 -0
  74. data/app/queries/pg_peek/pg18/activity/summary.sql +8 -0
  75. data/app/queries/pg_peek/pg18/activity/waiting_locks.sql +11 -0
  76. data/app/queries/pg_peek/pg18/database/vitals.sql +11 -0
  77. data/app/queries/pg_peek/pg18/indexes/all.sql +17 -0
  78. data/app/queries/pg_peek/pg18/pg_stat_statements/endpoints.sql +43 -0
  79. data/app/queries/pg_peek/pg18/pg_stat_statements/jobs.sql +12 -0
  80. data/app/queries/pg_peek/pg18/pg_stat_statements/outliers.sql +13 -0
  81. data/app/queries/pg_peek/pg18/pg_stat_statements/outliers_by_job.sql +14 -0
  82. data/app/queries/pg_peek/pg18/tables/dead_tuples.sql +11 -0
  83. data/app/queries/pg_peek/pg18/tables/inline_stats.sql +9 -0
  84. data/app/queries/pg_peek/pg18/tables/stats.sql +32 -0
  85. data/app/reports/pg_peek/column.rb +27 -0
  86. data/app/reports/pg_peek/report.rb +63 -0
  87. data/app/reports/pg_peek/reports/blocked.rb +60 -0
  88. data/app/reports/pg_peek/reports/databases.rb +47 -0
  89. data/app/reports/pg_peek/reports/endpoints.rb +35 -0
  90. data/app/reports/pg_peek/reports/indexes.rb +44 -0
  91. data/app/reports/pg_peek/reports/job_queries.rb +14 -0
  92. data/app/reports/pg_peek/reports/jobs.rb +21 -0
  93. data/app/reports/pg_peek/reports/queries.rb +23 -0
  94. data/app/reports/pg_peek/reports/sessions.rb +88 -0
  95. data/app/reports/pg_peek/reports/tables.rb +25 -0
  96. data/app/views/layouts/pg_peek/application.html.erb +56 -0
  97. data/app/views/pg_peek/activity/show.html.erb +70 -0
  98. data/app/views/pg_peek/authentication_required.html.erb +31 -0
  99. data/app/views/pg_peek/databases/index.html.erb +43 -0
  100. data/app/views/pg_peek/databases/show.html.erb +169 -0
  101. data/app/views/pg_peek/endpoints/index.html.erb +24 -0
  102. data/app/views/pg_peek/indexes/index.html.erb +31 -0
  103. data/app/views/pg_peek/jobs/index.html.erb +51 -0
  104. data/app/views/pg_peek/jobs/show.html.erb +17 -0
  105. data/app/views/pg_peek/pg_stat_statements/_preload_instructions.html.erb +17 -0
  106. data/app/views/pg_peek/pg_stat_statements/not_preloaded.html.erb +5 -0
  107. data/app/views/pg_peek/queries/index.html.erb +10 -0
  108. data/app/views/pg_peek/reports/_report.html.erb +32 -0
  109. data/app/views/pg_peek/tables/show.html.erb +128 -0
  110. data/config/routes.rb +16 -0
  111. data/lib/generators/pg_peek/install/install_generator.rb +40 -0
  112. data/lib/generators/pg_peek/install/templates/README +31 -0
  113. data/lib/generators/pg_peek/install/templates/initializer.rb +38 -0
  114. data/lib/pg_peek/configuration.rb +59 -0
  115. data/lib/pg_peek/engine.rb +7 -0
  116. data/lib/pg_peek/query_loader.rb +59 -0
  117. data/lib/pg_peek/version.rb +3 -0
  118. data/lib/pg_peek.rb +10 -0
  119. data/lib/tasks/pg_peek_tasks.rake +4 -0
  120. metadata +192 -0
@@ -0,0 +1,59 @@
1
+ module PgPeek
2
+ class Configuration
3
+ DEFAULT_EXCLUDED_TABLES = %w[schema_migrations ar_internal_metadata].freeze
4
+ DEFAULT_DEAD_TUPLE_WARNING_THRESHOLD = 10 # percentage
5
+ DEFAULT_OUTLIERS_LIMIT = 20
6
+ DEFAULT_CACHE_HIT_WARNING_THRESHOLD = 99 # percentage
7
+ DEFAULT_LONG_QUERY_WARNING_SECONDS = 5
8
+ DEFAULT_IDLE_IN_TRANSACTION_WARNING_SECONDS = 60
9
+
10
+ attr_accessor :connections, :excluded_tables, :dead_tuple_warning_threshold, :outliers_limit,
11
+ :cache_hit_warning_threshold, :long_query_warning_seconds,
12
+ :idle_in_transaction_warning_seconds, :public_dashboard
13
+ attr_writer :username, :password
14
+
15
+ def initialize
16
+ @connections = {}
17
+ @excluded_tables = DEFAULT_EXCLUDED_TABLES.dup
18
+ @dead_tuple_warning_threshold = DEFAULT_DEAD_TUPLE_WARNING_THRESHOLD
19
+ @outliers_limit = DEFAULT_OUTLIERS_LIMIT
20
+ @cache_hit_warning_threshold = DEFAULT_CACHE_HIT_WARNING_THRESHOLD
21
+ @long_query_warning_seconds = DEFAULT_LONG_QUERY_WARNING_SECONDS
22
+ @idle_in_transaction_warning_seconds = DEFAULT_IDLE_IN_TRANSACTION_WARNING_SECONDS
23
+ @public_dashboard = false
24
+ end
25
+
26
+ def username
27
+ @username.presence || credential(:username) || ENV["PG_PEEK_USERNAME"].presence
28
+ end
29
+
30
+ def password
31
+ @password.presence || credential(:password) || ENV["PG_PEEK_PASSWORD"].presence
32
+ end
33
+
34
+ def credentials?
35
+ username.present? && password.present?
36
+ end
37
+
38
+ # Reading credentials raises when the application has none set up at all,
39
+ # which is not a configuration error for anyone using the ENV variables.
40
+ def credential(key)
41
+ Rails.application.try(:credentials)&.dig(:pg_peek, key).presence
42
+ rescue StandardError
43
+ nil
44
+ end
45
+
46
+ def connection_class_for(database_name)
47
+ class_name = @connections[database_name]
48
+ unless class_name
49
+ Rails.logger.warn "[PgPeek] No connection configured for database '#{database_name}'. " \
50
+ "Add it to config.pg_peek.connections"
51
+ return nil
52
+ end
53
+ class_name.constantize
54
+ rescue NameError => e
55
+ Rails.logger.warn "[PgPeek] Could not find connection class '#{class_name}': #{e.message}"
56
+ nil
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,7 @@
1
+ module PgPeek
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace PgPeek
4
+
5
+ config.pg_peek = Configuration.new
6
+ end
7
+ end
@@ -0,0 +1,59 @@
1
+ module PgPeek
2
+ class QueryLoader
3
+ # Every statement pg_peek issues ends with this, so the statistics queries
4
+ # can leave the engine's own cost out of what they report. It has to be a
5
+ # trailing comment: pg_stat_statements stores a statement from its first
6
+ # token, so a leading comment is dropped, while trailing text is kept --
7
+ # which is also why Rails' SQLcommenter tags survive.
8
+ MARKER = "/* pg_peek */".freeze
9
+
10
+ class << self
11
+ def load(path, pg_version:, **variables)
12
+ sql = read_file(path, pg_version)
13
+ mark(interpolate(sql, variables))
14
+ end
15
+
16
+ def mark(sql)
17
+ # Only a marker at the end counts: the statistics queries mention the
18
+ # marker inside their own exclusion filter.
19
+ return sql if sql.rstrip.end_with?(MARKER)
20
+
21
+ # A trailing semicolon would end the statement before the comment.
22
+ "#{sql.rstrip.chomp(";")} #{MARKER}"
23
+ end
24
+
25
+ private
26
+
27
+ def read_file(path, pg_version)
28
+ full_path = Engine.root.join("app/queries/pg_peek", "pg#{pg_version}", "#{path}.sql")
29
+
30
+ if Rails.env.production?
31
+ cache[full_path] ||= File.read(full_path)
32
+ else
33
+ File.read(full_path)
34
+ end
35
+ end
36
+
37
+ def cache
38
+ @cache ||= {}
39
+ end
40
+
41
+ def interpolate(sql, variables)
42
+ result = sql.dup
43
+
44
+ # Handle {{placeholders:key}} - expands to $1, $2, ..., $n
45
+ result = result.gsub(/\{\{placeholders:(\w+)\}\}/) do
46
+ count = variables[::Regexp.last_match(1).to_sym].to_i
47
+ (1..count).map { |i| "$#{i}" }.join(", ")
48
+ end
49
+
50
+ # Handle simple {{key}} replacements
51
+ variables.each do |key, value|
52
+ result = result.gsub("{{#{key}}}", value.to_s)
53
+ end
54
+
55
+ result
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,3 @@
1
+ module PgPeek
2
+ VERSION = "0.1.0"
3
+ end
data/lib/pg_peek.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "pg_peek/version"
2
+ require "pg_peek/configuration"
3
+ require "pg_peek/query_loader"
4
+ require "pg_peek/engine"
5
+
6
+ module PgPeek
7
+ def self.config
8
+ Rails.application.config.pg_peek
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :pg_peek do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,192 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pg_peek
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Tomasz Mazur
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '8.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '8.1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: pg
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '1.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '1.0'
40
+ description: A Rails Engine that provides a web UI for monitoring and analyzing PostgreSQL
41
+ query performance. Mount pg_peek into your Rails application to introspect database
42
+ queries, analyze pg_stat_statements data, track Active Job queries, and parse SQLcommenter
43
+ tags for performance optimization.
44
+ email:
45
+ - tomasz.mazur@hey.com
46
+ executables: []
47
+ extensions: []
48
+ extra_rdoc_files: []
49
+ files:
50
+ - MIT-LICENSE
51
+ - README.md
52
+ - Rakefile
53
+ - app/assets/javascripts/pg_peek/application.js
54
+ - app/assets/stylesheets/pg_peek/application.css
55
+ - app/controllers/pg_peek/activity_controller.rb
56
+ - app/controllers/pg_peek/application_controller.rb
57
+ - app/controllers/pg_peek/databases_controller.rb
58
+ - app/controllers/pg_peek/endpoints_controller.rb
59
+ - app/controllers/pg_peek/indexes_controller.rb
60
+ - app/controllers/pg_peek/jobs_controller.rb
61
+ - app/controllers/pg_peek/pg_stat_statements_controller.rb
62
+ - app/controllers/pg_peek/queries_controller.rb
63
+ - app/controllers/pg_peek/tables_controller.rb
64
+ - app/helpers/pg_peek/application_helper.rb
65
+ - app/helpers/pg_peek/report_helper.rb
66
+ - app/jobs/pg_peek/application_job.rb
67
+ - app/mailers/pg_peek/application_mailer.rb
68
+ - app/models/pg_peek/application_record.rb
69
+ - app/models/pg_peek/database.rb
70
+ - app/models/pg_peek/pg_stat_statements.rb
71
+ - app/models/pg_peek/sql_comment.rb
72
+ - app/models/pg_peek/table.rb
73
+ - app/queries/pg_peek/pg14/activity/sessions.sql
74
+ - app/queries/pg_peek/pg14/activity/summary.sql
75
+ - app/queries/pg_peek/pg14/activity/waiting_locks.sql
76
+ - app/queries/pg_peek/pg14/database/vitals.sql
77
+ - app/queries/pg_peek/pg14/indexes/all.sql
78
+ - app/queries/pg_peek/pg14/pg_stat_statements/endpoints.sql
79
+ - app/queries/pg_peek/pg14/pg_stat_statements/jobs.sql
80
+ - app/queries/pg_peek/pg14/pg_stat_statements/outliers.sql
81
+ - app/queries/pg_peek/pg14/pg_stat_statements/outliers_by_job.sql
82
+ - app/queries/pg_peek/pg14/tables/dead_tuples.sql
83
+ - app/queries/pg_peek/pg14/tables/inline_stats.sql
84
+ - app/queries/pg_peek/pg14/tables/stats.sql
85
+ - app/queries/pg_peek/pg15/activity/sessions.sql
86
+ - app/queries/pg_peek/pg15/activity/summary.sql
87
+ - app/queries/pg_peek/pg15/activity/waiting_locks.sql
88
+ - app/queries/pg_peek/pg15/database/vitals.sql
89
+ - app/queries/pg_peek/pg15/indexes/all.sql
90
+ - app/queries/pg_peek/pg15/pg_stat_statements/endpoints.sql
91
+ - app/queries/pg_peek/pg15/pg_stat_statements/jobs.sql
92
+ - app/queries/pg_peek/pg15/pg_stat_statements/outliers.sql
93
+ - app/queries/pg_peek/pg15/pg_stat_statements/outliers_by_job.sql
94
+ - app/queries/pg_peek/pg15/tables/dead_tuples.sql
95
+ - app/queries/pg_peek/pg15/tables/inline_stats.sql
96
+ - app/queries/pg_peek/pg15/tables/stats.sql
97
+ - app/queries/pg_peek/pg16/activity/sessions.sql
98
+ - app/queries/pg_peek/pg16/activity/summary.sql
99
+ - app/queries/pg_peek/pg16/activity/waiting_locks.sql
100
+ - app/queries/pg_peek/pg16/database/vitals.sql
101
+ - app/queries/pg_peek/pg16/indexes/all.sql
102
+ - app/queries/pg_peek/pg16/pg_stat_statements/endpoints.sql
103
+ - app/queries/pg_peek/pg16/pg_stat_statements/jobs.sql
104
+ - app/queries/pg_peek/pg16/pg_stat_statements/outliers.sql
105
+ - app/queries/pg_peek/pg16/pg_stat_statements/outliers_by_job.sql
106
+ - app/queries/pg_peek/pg16/tables/dead_tuples.sql
107
+ - app/queries/pg_peek/pg16/tables/inline_stats.sql
108
+ - app/queries/pg_peek/pg16/tables/stats.sql
109
+ - app/queries/pg_peek/pg17/activity/sessions.sql
110
+ - app/queries/pg_peek/pg17/activity/summary.sql
111
+ - app/queries/pg_peek/pg17/activity/waiting_locks.sql
112
+ - app/queries/pg_peek/pg17/database/vitals.sql
113
+ - app/queries/pg_peek/pg17/indexes/all.sql
114
+ - app/queries/pg_peek/pg17/pg_stat_statements/endpoints.sql
115
+ - app/queries/pg_peek/pg17/pg_stat_statements/jobs.sql
116
+ - app/queries/pg_peek/pg17/pg_stat_statements/outliers.sql
117
+ - app/queries/pg_peek/pg17/pg_stat_statements/outliers_by_job.sql
118
+ - app/queries/pg_peek/pg17/tables/dead_tuples.sql
119
+ - app/queries/pg_peek/pg17/tables/inline_stats.sql
120
+ - app/queries/pg_peek/pg17/tables/stats.sql
121
+ - app/queries/pg_peek/pg18/activity/sessions.sql
122
+ - app/queries/pg_peek/pg18/activity/summary.sql
123
+ - app/queries/pg_peek/pg18/activity/waiting_locks.sql
124
+ - app/queries/pg_peek/pg18/database/vitals.sql
125
+ - app/queries/pg_peek/pg18/indexes/all.sql
126
+ - app/queries/pg_peek/pg18/pg_stat_statements/endpoints.sql
127
+ - app/queries/pg_peek/pg18/pg_stat_statements/jobs.sql
128
+ - app/queries/pg_peek/pg18/pg_stat_statements/outliers.sql
129
+ - app/queries/pg_peek/pg18/pg_stat_statements/outliers_by_job.sql
130
+ - app/queries/pg_peek/pg18/tables/dead_tuples.sql
131
+ - app/queries/pg_peek/pg18/tables/inline_stats.sql
132
+ - app/queries/pg_peek/pg18/tables/stats.sql
133
+ - app/reports/pg_peek/column.rb
134
+ - app/reports/pg_peek/report.rb
135
+ - app/reports/pg_peek/reports/blocked.rb
136
+ - app/reports/pg_peek/reports/databases.rb
137
+ - app/reports/pg_peek/reports/endpoints.rb
138
+ - app/reports/pg_peek/reports/indexes.rb
139
+ - app/reports/pg_peek/reports/job_queries.rb
140
+ - app/reports/pg_peek/reports/jobs.rb
141
+ - app/reports/pg_peek/reports/queries.rb
142
+ - app/reports/pg_peek/reports/sessions.rb
143
+ - app/reports/pg_peek/reports/tables.rb
144
+ - app/views/layouts/pg_peek/application.html.erb
145
+ - app/views/pg_peek/activity/show.html.erb
146
+ - app/views/pg_peek/authentication_required.html.erb
147
+ - app/views/pg_peek/databases/index.html.erb
148
+ - app/views/pg_peek/databases/show.html.erb
149
+ - app/views/pg_peek/endpoints/index.html.erb
150
+ - app/views/pg_peek/indexes/index.html.erb
151
+ - app/views/pg_peek/jobs/index.html.erb
152
+ - app/views/pg_peek/jobs/show.html.erb
153
+ - app/views/pg_peek/pg_stat_statements/_preload_instructions.html.erb
154
+ - app/views/pg_peek/pg_stat_statements/not_preloaded.html.erb
155
+ - app/views/pg_peek/queries/index.html.erb
156
+ - app/views/pg_peek/reports/_report.html.erb
157
+ - app/views/pg_peek/tables/show.html.erb
158
+ - config/routes.rb
159
+ - lib/generators/pg_peek/install/install_generator.rb
160
+ - lib/generators/pg_peek/install/templates/README
161
+ - lib/generators/pg_peek/install/templates/initializer.rb
162
+ - lib/pg_peek.rb
163
+ - lib/pg_peek/configuration.rb
164
+ - lib/pg_peek/engine.rb
165
+ - lib/pg_peek/query_loader.rb
166
+ - lib/pg_peek/version.rb
167
+ - lib/tasks/pg_peek_tasks.rake
168
+ homepage: https://github.com/trix/pg_peek
169
+ licenses:
170
+ - MIT
171
+ metadata:
172
+ homepage_uri: https://github.com/trix/pg_peek
173
+ source_code_uri: https://github.com/trix/pg_peek
174
+ rubygems_mfa_required: 'true'
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: '0'
183
+ required_rubygems_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ requirements: []
189
+ rubygems_version: 3.6.9
190
+ specification_version: 4
191
+ summary: PostgreSQL query performance monitoring for Rails applications
192
+ test_files: []