pg_reports 0.3.1 → 0.5.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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +140 -0
  3. data/README.md +129 -4
  4. data/app/controllers/pg_reports/dashboard_controller.rb +246 -28
  5. data/app/views/layouts/pg_reports/application.html.erb +283 -1
  6. data/app/views/pg_reports/dashboard/_show_modals.html.erb +8 -1
  7. data/app/views/pg_reports/dashboard/_show_scripts.html.erb +240 -41
  8. data/app/views/pg_reports/dashboard/_show_styles.html.erb +495 -1
  9. data/app/views/pg_reports/dashboard/index.html.erb +419 -0
  10. data/app/views/pg_reports/dashboard/show.html.erb +89 -47
  11. data/config/locales/en.yml +58 -0
  12. data/config/locales/ru.yml +58 -0
  13. data/config/locales/uk.yml +13 -0
  14. data/config/routes.rb +8 -0
  15. data/lib/pg_reports/configuration.rb +13 -0
  16. data/lib/pg_reports/dashboard/reports_registry.rb +38 -1
  17. data/lib/pg_reports/definitions/connections/active_connections.yml +23 -0
  18. data/lib/pg_reports/definitions/connections/blocking_queries.yml +20 -0
  19. data/lib/pg_reports/definitions/connections/connection_churn.yml +49 -0
  20. data/lib/pg_reports/definitions/connections/connection_stats.yml +18 -0
  21. data/lib/pg_reports/definitions/connections/idle_connections.yml +21 -0
  22. data/lib/pg_reports/definitions/connections/locks.yml +22 -0
  23. data/lib/pg_reports/definitions/connections/long_running_queries.yml +43 -0
  24. data/lib/pg_reports/definitions/connections/pool_saturation.yml +42 -0
  25. data/lib/pg_reports/definitions/connections/pool_usage.yml +43 -0
  26. data/lib/pg_reports/definitions/connections/pool_wait_times.yml +44 -0
  27. data/lib/pg_reports/definitions/indexes/bloated_indexes.yml +43 -0
  28. data/lib/pg_reports/definitions/indexes/duplicate_indexes.yml +19 -0
  29. data/lib/pg_reports/definitions/indexes/index_sizes.yml +29 -0
  30. data/lib/pg_reports/definitions/indexes/index_usage.yml +27 -0
  31. data/lib/pg_reports/definitions/indexes/invalid_indexes.yml +19 -0
  32. data/lib/pg_reports/definitions/indexes/missing_indexes.yml +27 -0
  33. data/lib/pg_reports/definitions/indexes/unused_indexes.yml +41 -0
  34. data/lib/pg_reports/definitions/queries/all_queries.yml +35 -0
  35. data/lib/pg_reports/definitions/queries/expensive_queries.yml +43 -0
  36. data/lib/pg_reports/definitions/queries/heavy_queries.yml +49 -0
  37. data/lib/pg_reports/definitions/queries/low_cache_hit_queries.yml +47 -0
  38. data/lib/pg_reports/definitions/queries/missing_index_queries.yml +31 -0
  39. data/lib/pg_reports/definitions/queries/slow_queries.yml +48 -0
  40. data/lib/pg_reports/definitions/system/activity_overview.yml +17 -0
  41. data/lib/pg_reports/definitions/system/cache_stats.yml +18 -0
  42. data/lib/pg_reports/definitions/system/database_sizes.yml +18 -0
  43. data/lib/pg_reports/definitions/system/extensions.yml +19 -0
  44. data/lib/pg_reports/definitions/system/settings.yml +20 -0
  45. data/lib/pg_reports/definitions/tables/bloated_tables.yml +43 -0
  46. data/lib/pg_reports/definitions/tables/cache_hit_ratios.yml +26 -0
  47. data/lib/pg_reports/definitions/tables/recently_modified.yml +27 -0
  48. data/lib/pg_reports/definitions/tables/row_counts.yml +29 -0
  49. data/lib/pg_reports/definitions/tables/seq_scans.yml +31 -0
  50. data/lib/pg_reports/definitions/tables/table_sizes.yml +31 -0
  51. data/lib/pg_reports/definitions/tables/vacuum_needed.yml +39 -0
  52. data/lib/pg_reports/explain_analyzer.rb +338 -0
  53. data/lib/pg_reports/filter.rb +58 -0
  54. data/lib/pg_reports/module_generator.rb +44 -0
  55. data/lib/pg_reports/modules/connections.rb +8 -73
  56. data/lib/pg_reports/modules/indexes.rb +9 -94
  57. data/lib/pg_reports/modules/queries.rb +9 -100
  58. data/lib/pg_reports/modules/schema_analysis.rb +154 -0
  59. data/lib/pg_reports/modules/system.rb +26 -61
  60. data/lib/pg_reports/modules/tables.rb +9 -96
  61. data/lib/pg_reports/query_monitor.rb +280 -0
  62. data/lib/pg_reports/report_definition.rb +161 -0
  63. data/lib/pg_reports/report_loader.rb +38 -0
  64. data/lib/pg_reports/sql/connections/connection_churn.sql +37 -0
  65. data/lib/pg_reports/sql/connections/pool_saturation.sql +90 -0
  66. data/lib/pg_reports/sql/connections/pool_usage.sql +31 -0
  67. data/lib/pg_reports/sql/connections/pool_wait_times.sql +19 -0
  68. data/lib/pg_reports/sql/queries/all_queries.sql +17 -15
  69. data/lib/pg_reports/sql/queries/expensive_queries.sql +9 -4
  70. data/lib/pg_reports/sql/queries/heavy_queries.sql +14 -12
  71. data/lib/pg_reports/sql/queries/low_cache_hit_queries.sql +16 -14
  72. data/lib/pg_reports/sql/queries/missing_index_queries.sql +18 -16
  73. data/lib/pg_reports/sql/queries/slow_queries.sql +14 -12
  74. data/lib/pg_reports/sql/schema_analysis/unique_indexes.sql +35 -0
  75. data/lib/pg_reports/sql/system/databases_list.sql +8 -0
  76. data/lib/pg_reports/version.rb +1 -1
  77. data/lib/pg_reports.rb +26 -0
  78. metadata +93 -3
@@ -2,9 +2,11 @@
2
2
  -- Requires pg_stat_statements extension
3
3
 
4
4
  WITH total AS (
5
- SELECT SUM(total_exec_time) AS total_time
6
- FROM pg_stat_statements
7
- WHERE calls > 0
5
+ SELECT SUM(s.total_exec_time) AS total_time
6
+ FROM pg_stat_statements s
7
+ JOIN pg_database d ON s.dbid = d.oid
8
+ WHERE s.calls > 0
9
+ AND d.datname = current_database()
8
10
  )
9
11
  SELECT
10
12
  s.query,
@@ -13,10 +15,13 @@ SELECT
13
15
  ROUND((s.total_exec_time * 100.0 / t.total_time)::numeric, 2) AS percent_of_total,
14
16
  ROUND((s.mean_exec_time)::numeric, 2) AS mean_time_ms,
15
17
  s.rows
16
- FROM pg_stat_statements s, total t
18
+ FROM pg_stat_statements s
19
+ JOIN pg_database d ON s.dbid = d.oid
20
+ CROSS JOIN total t
17
21
  WHERE s.calls > 0
18
22
  AND s.query NOT LIKE '%pg_stat_statements%'
19
23
  AND s.query NOT LIKE 'COMMIT%'
20
24
  AND s.query NOT LIKE 'BEGIN%'
25
+ AND d.datname = current_database()
21
26
  ORDER BY s.total_exec_time DESC
22
27
  LIMIT 100;
@@ -2,16 +2,18 @@
2
2
  -- Requires pg_stat_statements extension
3
3
 
4
4
  SELECT
5
- query,
6
- calls,
7
- ROUND((total_exec_time)::numeric, 2) AS total_time_ms,
8
- ROUND((mean_exec_time)::numeric, 2) AS mean_time_ms,
9
- rows,
10
- ROUND((shared_blks_hit * 100.0 / NULLIF(shared_blks_hit + shared_blks_read, 0))::numeric, 2) AS cache_hit_ratio
11
- FROM pg_stat_statements
12
- WHERE calls > 0
13
- AND query NOT LIKE '%pg_stat_statements%'
14
- AND query NOT LIKE 'COMMIT%'
15
- AND query NOT LIKE 'BEGIN%'
16
- ORDER BY calls DESC
5
+ s.query,
6
+ s.calls,
7
+ ROUND((s.total_exec_time)::numeric, 2) AS total_time_ms,
8
+ ROUND((s.mean_exec_time)::numeric, 2) AS mean_time_ms,
9
+ s.rows,
10
+ ROUND((s.shared_blks_hit * 100.0 / NULLIF(s.shared_blks_hit + s.shared_blks_read, 0))::numeric, 2) AS cache_hit_ratio
11
+ FROM pg_stat_statements s
12
+ JOIN pg_database d ON s.dbid = d.oid
13
+ WHERE s.calls > 0
14
+ AND s.query NOT LIKE '%pg_stat_statements%'
15
+ AND s.query NOT LIKE 'COMMIT%'
16
+ AND s.query NOT LIKE 'BEGIN%'
17
+ AND d.datname = current_database()
18
+ ORDER BY s.calls DESC
17
19
  LIMIT 100;
@@ -2,18 +2,20 @@
2
2
  -- Requires pg_stat_statements extension
3
3
 
4
4
  SELECT
5
- query,
6
- calls,
7
- ROUND((shared_blks_hit * 100.0 / NULLIF(shared_blks_hit + shared_blks_read, 0))::numeric, 2) AS cache_hit_ratio,
8
- shared_blks_hit,
9
- shared_blks_read,
10
- ROUND((total_exec_time)::numeric, 2) AS total_time_ms,
11
- ROUND((mean_exec_time)::numeric, 2) AS mean_time_ms
12
- FROM pg_stat_statements
13
- WHERE calls > 10
14
- AND (shared_blks_hit + shared_blks_read) > 0
15
- AND query NOT LIKE '%pg_stat_statements%'
16
- AND query NOT LIKE 'COMMIT%'
17
- AND query NOT LIKE 'BEGIN%'
18
- ORDER BY (shared_blks_hit * 1.0 / NULLIF(shared_blks_hit + shared_blks_read, 0)) ASC
5
+ s.query,
6
+ s.calls,
7
+ ROUND((s.shared_blks_hit * 100.0 / NULLIF(s.shared_blks_hit + s.shared_blks_read, 0))::numeric, 2) AS cache_hit_ratio,
8
+ s.shared_blks_hit,
9
+ s.shared_blks_read,
10
+ ROUND((s.total_exec_time)::numeric, 2) AS total_time_ms,
11
+ ROUND((s.mean_exec_time)::numeric, 2) AS mean_time_ms
12
+ FROM pg_stat_statements s
13
+ JOIN pg_database d ON s.dbid = d.oid
14
+ WHERE s.calls > 10
15
+ AND (s.shared_blks_hit + s.shared_blks_read) > 0
16
+ AND s.query NOT LIKE '%pg_stat_statements%'
17
+ AND s.query NOT LIKE 'COMMIT%'
18
+ AND s.query NOT LIKE 'BEGIN%'
19
+ AND d.datname = current_database()
20
+ ORDER BY (s.shared_blks_hit * 1.0 / NULLIF(s.shared_blks_hit + s.shared_blks_read, 0)) ASC
19
21
  LIMIT 100;
@@ -3,23 +3,25 @@
3
3
  -- Requires pg_stat_statements extension
4
4
 
5
5
  SELECT
6
- query,
7
- calls,
8
- ROUND((total_exec_time)::numeric, 2) AS total_time_ms,
9
- ROUND((mean_exec_time)::numeric, 2) AS mean_time_ms,
10
- rows,
6
+ s.query,
7
+ s.calls,
8
+ ROUND((s.total_exec_time)::numeric, 2) AS total_time_ms,
9
+ ROUND((s.mean_exec_time)::numeric, 2) AS mean_time_ms,
10
+ s.rows,
11
11
  -- Heuristic: high rows examined per call may indicate missing index
12
- ROUND((rows / NULLIF(calls, 0))::numeric, 0) AS rows_per_call,
12
+ ROUND((s.rows / NULLIF(s.calls, 0))::numeric, 0) AS rows_per_call,
13
13
  -- High read/hit ratio suggests disk access (possible seq scan)
14
- ROUND((shared_blks_read * 100.0 / NULLIF(shared_blks_hit + shared_blks_read, 0))::numeric, 2) AS disk_read_ratio
15
- FROM pg_stat_statements
16
- WHERE calls > 10
17
- AND (rows / NULLIF(calls, 0)) > 100
18
- AND mean_exec_time > 10
19
- AND query NOT LIKE '%pg_stat_statements%'
20
- AND query NOT LIKE 'COMMIT%'
21
- AND query NOT LIKE 'BEGIN%'
14
+ ROUND((s.shared_blks_read * 100.0 / NULLIF(s.shared_blks_hit + s.shared_blks_read, 0))::numeric, 2) AS disk_read_ratio
15
+ FROM pg_stat_statements s
16
+ JOIN pg_database d ON s.dbid = d.oid
17
+ WHERE s.calls > 10
18
+ AND (s.rows / NULLIF(s.calls, 0)) > 100
19
+ AND s.mean_exec_time > 10
20
+ AND s.query NOT LIKE '%pg_stat_statements%'
21
+ AND s.query NOT LIKE 'COMMIT%'
22
+ AND s.query NOT LIKE 'BEGIN%'
22
23
  -- Focus on SELECT statements
23
- AND (query ILIKE 'SELECT%' OR query ILIKE '%WHERE%')
24
- ORDER BY (rows / NULLIF(calls, 0)) * calls DESC
24
+ AND (s.query ILIKE 'SELECT%' OR s.query ILIKE '%WHERE%')
25
+ AND d.datname = current_database()
26
+ ORDER BY (s.rows / NULLIF(s.calls, 0)) * s.calls DESC
25
27
  LIMIT 100;
@@ -2,16 +2,18 @@
2
2
  -- Requires pg_stat_statements extension
3
3
 
4
4
  SELECT
5
- query,
6
- calls,
7
- ROUND((mean_exec_time)::numeric, 2) AS mean_time_ms,
8
- ROUND((total_exec_time)::numeric, 2) AS total_time_ms,
9
- ROUND((rows / NULLIF(calls, 0))::numeric, 2) AS rows_per_call,
10
- ROUND((shared_blks_hit * 100.0 / NULLIF(shared_blks_hit + shared_blks_read, 0))::numeric, 2) AS cache_hit_ratio
11
- FROM pg_stat_statements
12
- WHERE calls > 0
13
- AND query NOT LIKE '%pg_stat_statements%'
14
- AND query NOT LIKE 'COMMIT%'
15
- AND query NOT LIKE 'BEGIN%'
16
- ORDER BY mean_exec_time DESC
5
+ s.query,
6
+ s.calls,
7
+ ROUND((s.mean_exec_time)::numeric, 2) AS mean_time_ms,
8
+ ROUND((s.total_exec_time)::numeric, 2) AS total_time_ms,
9
+ ROUND((s.rows / NULLIF(s.calls, 0))::numeric, 2) AS rows_per_call,
10
+ ROUND((s.shared_blks_hit * 100.0 / NULLIF(s.shared_blks_hit + s.shared_blks_read, 0))::numeric, 2) AS cache_hit_ratio
11
+ FROM pg_stat_statements s
12
+ JOIN pg_database d ON s.dbid = d.oid
13
+ WHERE s.calls > 0
14
+ AND s.query NOT LIKE '%pg_stat_statements%'
15
+ AND s.query NOT LIKE 'COMMIT%'
16
+ AND s.query NOT LIKE 'BEGIN%'
17
+ AND d.datname = current_database()
18
+ ORDER BY s.mean_exec_time DESC
17
19
  LIMIT 100;
@@ -0,0 +1,35 @@
1
+ -- Unique indexes: all unique indexes in the database
2
+ -- Used for validation consistency analysis
3
+
4
+ SELECT
5
+ n.nspname AS schema_name,
6
+ t.relname AS table_name,
7
+ i.relname AS index_name,
8
+ array_agg(a.attname ORDER BY array_position(ix.indkey, a.attnum)) AS column_names,
9
+ pg_get_indexdef(i.oid) AS index_definition,
10
+ CASE
11
+ WHEN ix.indisprimary THEN 'primary_key'
12
+ WHEN ix.indisunique THEN 'unique'
13
+ ELSE 'regular'
14
+ END AS index_type
15
+ FROM
16
+ pg_index ix
17
+ JOIN pg_class i ON i.oid = ix.indexrelid
18
+ JOIN pg_class t ON t.oid = ix.indrelid
19
+ JOIN pg_namespace n ON n.oid = t.relnamespace
20
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
21
+ WHERE
22
+ n.nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
23
+ AND (ix.indisunique = true OR ix.indisprimary = true)
24
+ AND t.relkind = 'r'
25
+ GROUP BY
26
+ n.nspname,
27
+ t.relname,
28
+ i.relname,
29
+ i.oid,
30
+ ix.indisprimary,
31
+ ix.indisunique
32
+ ORDER BY
33
+ n.nspname,
34
+ t.relname,
35
+ i.relname;
@@ -0,0 +1,8 @@
1
+ -- List of all databases in the cluster
2
+ SELECT
3
+ datname AS database,
4
+ pg_size_pretty(pg_database_size(datname)) AS size
5
+ FROM pg_database
6
+ WHERE datistemplate = false
7
+ AND datallowconn = true
8
+ ORDER BY datname;
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgReports
4
- VERSION = "0.3.1"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/pg_reports.rb CHANGED
@@ -12,6 +12,14 @@ require_relative "pg_reports/executor"
12
12
  require_relative "pg_reports/report"
13
13
  require_relative "pg_reports/telegram_sender"
14
14
  require_relative "pg_reports/annotation_parser"
15
+ require_relative "pg_reports/explain_analyzer"
16
+ require_relative "pg_reports/query_monitor"
17
+
18
+ # YAML-based report system
19
+ require_relative "pg_reports/filter"
20
+ require_relative "pg_reports/report_definition"
21
+ require_relative "pg_reports/report_loader"
22
+ require_relative "pg_reports/module_generator"
15
23
 
16
24
  # Modules
17
25
  require_relative "pg_reports/modules/queries"
@@ -19,6 +27,7 @@ require_relative "pg_reports/modules/indexes"
19
27
  require_relative "pg_reports/modules/tables"
20
28
  require_relative "pg_reports/modules/connections"
21
29
  require_relative "pg_reports/modules/system"
30
+ require_relative "pg_reports/modules/schema_analysis"
22
31
 
23
32
  # Dashboard
24
33
  require_relative "pg_reports/dashboard/reports_registry"
@@ -56,6 +65,10 @@ module PgReports
56
65
  :enable_pg_stat_statements!,
57
66
  to: Modules::System
58
67
 
68
+ # Schema analysis methods
69
+ delegate :missing_validations,
70
+ to: Modules::SchemaAnalysis
71
+
59
72
  # Generate a comprehensive database health report
60
73
  # @return [Report] Combined health report
61
74
  def health_report
@@ -110,5 +123,18 @@ module PgReports
110
123
  def system
111
124
  Modules::System
112
125
  end
126
+
127
+ def schema_analysis
128
+ Modules::SchemaAnalysis
129
+ end
130
+
131
+ # Reload YAML report definitions and regenerate module methods
132
+ def reload_definitions!
133
+ ReportLoader.reload!
134
+ ModuleGenerator.generate!
135
+ end
113
136
  end
114
137
  end
138
+
139
+ # Generate YAML-based methods on load
140
+ PgReports::ModuleGenerator.generate!
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_reports
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eldar Avatov
@@ -10,7 +10,49 @@ cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: rails
13
+ name: activesupport
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '5.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '5.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: activerecord
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '5.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: actionpack
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '5.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '5.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: railties
14
56
  requirement: !ruby/object:Gem::Requirement
15
57
  requirements:
16
58
  - - ">="
@@ -121,21 +163,67 @@ files:
121
163
  - lib/pg_reports/annotation_parser.rb
122
164
  - lib/pg_reports/configuration.rb
123
165
  - lib/pg_reports/dashboard/reports_registry.rb
166
+ - lib/pg_reports/definitions/connections/active_connections.yml
167
+ - lib/pg_reports/definitions/connections/blocking_queries.yml
168
+ - lib/pg_reports/definitions/connections/connection_churn.yml
169
+ - lib/pg_reports/definitions/connections/connection_stats.yml
170
+ - lib/pg_reports/definitions/connections/idle_connections.yml
171
+ - lib/pg_reports/definitions/connections/locks.yml
172
+ - lib/pg_reports/definitions/connections/long_running_queries.yml
173
+ - lib/pg_reports/definitions/connections/pool_saturation.yml
174
+ - lib/pg_reports/definitions/connections/pool_usage.yml
175
+ - lib/pg_reports/definitions/connections/pool_wait_times.yml
176
+ - lib/pg_reports/definitions/indexes/bloated_indexes.yml
177
+ - lib/pg_reports/definitions/indexes/duplicate_indexes.yml
178
+ - lib/pg_reports/definitions/indexes/index_sizes.yml
179
+ - lib/pg_reports/definitions/indexes/index_usage.yml
180
+ - lib/pg_reports/definitions/indexes/invalid_indexes.yml
181
+ - lib/pg_reports/definitions/indexes/missing_indexes.yml
182
+ - lib/pg_reports/definitions/indexes/unused_indexes.yml
183
+ - lib/pg_reports/definitions/queries/all_queries.yml
184
+ - lib/pg_reports/definitions/queries/expensive_queries.yml
185
+ - lib/pg_reports/definitions/queries/heavy_queries.yml
186
+ - lib/pg_reports/definitions/queries/low_cache_hit_queries.yml
187
+ - lib/pg_reports/definitions/queries/missing_index_queries.yml
188
+ - lib/pg_reports/definitions/queries/slow_queries.yml
189
+ - lib/pg_reports/definitions/system/activity_overview.yml
190
+ - lib/pg_reports/definitions/system/cache_stats.yml
191
+ - lib/pg_reports/definitions/system/database_sizes.yml
192
+ - lib/pg_reports/definitions/system/extensions.yml
193
+ - lib/pg_reports/definitions/system/settings.yml
194
+ - lib/pg_reports/definitions/tables/bloated_tables.yml
195
+ - lib/pg_reports/definitions/tables/cache_hit_ratios.yml
196
+ - lib/pg_reports/definitions/tables/recently_modified.yml
197
+ - lib/pg_reports/definitions/tables/row_counts.yml
198
+ - lib/pg_reports/definitions/tables/seq_scans.yml
199
+ - lib/pg_reports/definitions/tables/table_sizes.yml
200
+ - lib/pg_reports/definitions/tables/vacuum_needed.yml
124
201
  - lib/pg_reports/engine.rb
125
202
  - lib/pg_reports/error.rb
126
203
  - lib/pg_reports/executor.rb
204
+ - lib/pg_reports/explain_analyzer.rb
205
+ - lib/pg_reports/filter.rb
206
+ - lib/pg_reports/module_generator.rb
127
207
  - lib/pg_reports/modules/connections.rb
128
208
  - lib/pg_reports/modules/indexes.rb
129
209
  - lib/pg_reports/modules/queries.rb
210
+ - lib/pg_reports/modules/schema_analysis.rb
130
211
  - lib/pg_reports/modules/system.rb
131
212
  - lib/pg_reports/modules/tables.rb
213
+ - lib/pg_reports/query_monitor.rb
132
214
  - lib/pg_reports/report.rb
215
+ - lib/pg_reports/report_definition.rb
216
+ - lib/pg_reports/report_loader.rb
133
217
  - lib/pg_reports/sql/connections/active_connections.sql
134
218
  - lib/pg_reports/sql/connections/blocking_queries.sql
219
+ - lib/pg_reports/sql/connections/connection_churn.sql
135
220
  - lib/pg_reports/sql/connections/connection_stats.sql
136
221
  - lib/pg_reports/sql/connections/idle_connections.sql
137
222
  - lib/pg_reports/sql/connections/locks.sql
138
223
  - lib/pg_reports/sql/connections/long_running_queries.sql
224
+ - lib/pg_reports/sql/connections/pool_saturation.sql
225
+ - lib/pg_reports/sql/connections/pool_usage.sql
226
+ - lib/pg_reports/sql/connections/pool_wait_times.sql
139
227
  - lib/pg_reports/sql/indexes/bloated_indexes.sql
140
228
  - lib/pg_reports/sql/indexes/duplicate_indexes.sql
141
229
  - lib/pg_reports/sql/indexes/index_sizes.sql
@@ -149,9 +237,11 @@ files:
149
237
  - lib/pg_reports/sql/queries/low_cache_hit_queries.sql
150
238
  - lib/pg_reports/sql/queries/missing_index_queries.sql
151
239
  - lib/pg_reports/sql/queries/slow_queries.sql
240
+ - lib/pg_reports/sql/schema_analysis/unique_indexes.sql
152
241
  - lib/pg_reports/sql/system/activity_overview.sql
153
242
  - lib/pg_reports/sql/system/cache_stats.sql
154
243
  - lib/pg_reports/sql/system/database_sizes.sql
244
+ - lib/pg_reports/sql/system/databases_list.sql
155
245
  - lib/pg_reports/sql/system/extensions.sql
156
246
  - lib/pg_reports/sql/system/live_metrics.sql
157
247
  - lib/pg_reports/sql/system/settings.sql
@@ -186,7 +276,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
276
  - !ruby/object:Gem::Version
187
277
  version: '0'
188
278
  requirements: []
189
- rubygems_version: 4.0.4
279
+ rubygems_version: 3.7.1
190
280
  specification_version: 4
191
281
  summary: PostgreSQL analysis and reporting tool with Telegram integration
192
282
  test_files: []