pg_reports 0.8.2 → 0.9.1
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/CHANGELOG.md +48 -0
- data/app/controllers/pg_reports/dashboard_controller.rb +104 -6
- data/app/views/layouts/pg_reports/application.html.erb +712 -214
- data/app/views/pg_reports/dashboard/_database_selector.html.erb +2 -1
- data/app/views/pg_reports/dashboard/_settings_modal.html.erb +55 -0
- data/app/views/pg_reports/dashboard/_show_modals.html.erb +11 -49
- data/app/views/pg_reports/dashboard/_show_scripts.html.erb +101 -90
- data/app/views/pg_reports/dashboard/_show_styles.html.erb +392 -476
- data/app/views/pg_reports/dashboard/index.html.erb +217 -493
- data/app/views/pg_reports/dashboard/show.html.erb +13 -11
- data/config/brakeman.ignore +24 -1
- data/config/locales/en.yml +58 -50
- data/config/locales/ru.yml +58 -50
- data/config/locales/uk.yml +58 -50
- data/config/routes.rb +1 -0
- data/lib/pg_reports/connection/error_translator.rb +43 -0
- data/lib/pg_reports/dashboard/reports_registry.rb +10 -0
- data/lib/pg_reports/explain_analyzer.rb +0 -3
- data/lib/pg_reports/query_monitor.rb +15 -3
- data/lib/pg_reports/version.rb +1 -1
- metadata +2 -1
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
<div class="report-page">
|
|
4
4
|
<nav class="breadcrumb">
|
|
5
|
-
<%= link_to t("pg_reports.ui.navigation.
|
|
6
|
-
|
|
5
|
+
<%= link_to root_path, class: "breadcrumb-back", title: t("pg_reports.ui.navigation.back") do %>
|
|
6
|
+
<svg class="icon" aria-hidden="true"><use href="#i-arrow-left"></use></svg>
|
|
7
|
+
<span><%= t("pg_reports.ui.navigation.dashboard") %></span>
|
|
8
|
+
<% end %>
|
|
9
|
+
<span class="breadcrumb-sep">/</span>
|
|
7
10
|
<span><%= @categories[@category][:name] %></span>
|
|
8
|
-
<span>/</span>
|
|
9
|
-
<span><%= @report_info[:name] %></span>
|
|
11
|
+
<span class="breadcrumb-sep">/</span>
|
|
12
|
+
<span class="breadcrumb-current"><%= @report_info[:name] %></span>
|
|
10
13
|
|
|
11
14
|
<span class="breadcrumb-spacer"></span>
|
|
12
15
|
<%= render "target_selector" %>
|
|
@@ -35,7 +38,7 @@
|
|
|
35
38
|
<a href="#" onclick="downloadReport('json'); return false;"><%= t("pg_reports.ui.actions.download_json") %></a>
|
|
36
39
|
<% if @documentation && @documentation[:ai_prompt].present? %>
|
|
37
40
|
<div class="dropdown-divider"></div>
|
|
38
|
-
<a href="#" id="ai-prompt-btn" onclick="copyAiPrompt(this); return false;"><span class="ai-icon">AI</span
|
|
41
|
+
<a href="#" id="ai-prompt-btn" onclick="copyAiPrompt(this); return false;"><span class="ai-icon">AI</span><%= t("pg_reports.ui.actions.copy_ai_prompt") %></a>
|
|
39
42
|
<% end %>
|
|
40
43
|
</div>
|
|
41
44
|
</div>
|
|
@@ -45,10 +48,9 @@
|
|
|
45
48
|
<%= t("pg_reports.ui.actions.send_telegram") %>
|
|
46
49
|
</button>
|
|
47
50
|
<% end %>
|
|
48
|
-
<button class="btn
|
|
49
|
-
|
|
51
|
+
<button type="button" class="btn-icon" onclick="showSettingsModal()" title="<%= t("pg_reports.ui.actions.settings_button_title") %>" aria-label="<%= t("pg_reports.ui.actions.settings_button_title") %>">
|
|
52
|
+
<svg class="icon icon-lg"><use href="#i-settings"></use></svg>
|
|
50
53
|
</button>
|
|
51
|
-
<%= link_to t("pg_reports.ui.navigation.back"), root_path, class: "btn btn-secondary" %>
|
|
52
54
|
</div>
|
|
53
55
|
</div>
|
|
54
56
|
|
|
@@ -63,7 +65,7 @@
|
|
|
63
65
|
<% if @documentation && @documentation[:what].present? %>
|
|
64
66
|
<details class="documentation-section">
|
|
65
67
|
<summary class="documentation-toggle">
|
|
66
|
-
<
|
|
68
|
+
<svg class="icon toggle-icon" aria-hidden="true"><use href="#i-chevron-right"></use></svg>
|
|
67
69
|
<span><%= t("pg_reports.ui.documentation.toggle_title") %></span>
|
|
68
70
|
</summary>
|
|
69
71
|
<div class="documentation-content">
|
|
@@ -118,7 +120,7 @@
|
|
|
118
120
|
<div class="filter-section">
|
|
119
121
|
<details class="filter-details">
|
|
120
122
|
<summary class="filter-toggle">
|
|
121
|
-
<
|
|
123
|
+
<svg class="icon toggle-icon" aria-hidden="true"><use href="#i-chevron-right"></use></svg>
|
|
122
124
|
<span><%= t("pg_reports.ui.filters.title") %></span>
|
|
123
125
|
</summary>
|
|
124
126
|
<div class="filter-content">
|
|
@@ -176,7 +178,7 @@
|
|
|
176
178
|
</div>
|
|
177
179
|
|
|
178
180
|
<div id="empty-state" class="empty-state" style="display: none;">
|
|
179
|
-
<
|
|
181
|
+
<svg class="icon empty-state-icon" aria-hidden="true"><use href="#i-check"></use></svg>
|
|
180
182
|
<p><%= t("pg_reports.ui.results.empty_message") %></p>
|
|
181
183
|
</div>
|
|
182
184
|
|
data/config/brakeman.ignore
CHANGED
|
@@ -23,6 +23,29 @@
|
|
|
23
23
|
],
|
|
24
24
|
"note": "Reviewed & accepted: user-query execution feature (execute_query count). Gated by config.allow_raw_query_execution; the query is fetched by hash from an internal registry (retrieve_query_by_hash), parameters are validated/substituted, and SecurityError checks reject dangerous input. Not arbitrary attacker-controlled SQL."
|
|
25
25
|
},
|
|
26
|
+
{
|
|
27
|
+
"warning_type": "SQL Injection",
|
|
28
|
+
"warning_code": 0,
|
|
29
|
+
"fingerprint": "52294539b2a9666f9a79f7ad52cdd1dc531a3b71e487e5134174029cd5138571",
|
|
30
|
+
"check_name": "SQL",
|
|
31
|
+
"message": "Possible SQL injection",
|
|
32
|
+
"file": "app/controllers/pg_reports/dashboard_controller.rb",
|
|
33
|
+
"line": 440,
|
|
34
|
+
"link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
|
|
35
|
+
"code": "ActiveRecord::Base.connection.execute(\"SELECT COUNT(*) FROM (#{params[:query].to_s}) AS count_query\")",
|
|
36
|
+
"render_path": null,
|
|
37
|
+
"location": {
|
|
38
|
+
"type": "method",
|
|
39
|
+
"class": "PgReports::DashboardController",
|
|
40
|
+
"method": "run_query"
|
|
41
|
+
},
|
|
42
|
+
"user_input": "params[:query]",
|
|
43
|
+
"confidence": "High",
|
|
44
|
+
"cwe_id": [
|
|
45
|
+
89
|
|
46
|
+
],
|
|
47
|
+
"note": "Reviewed & accepted: SQL Console (run_query count). Gated by config.allow_raw_query_execution; the client-typed query passes enforce_select_only! (SELECT-only, no semicolons, keyword denylist) and runs under a bounded statement_timeout. Intentional DBA tooling; same risk profile as execute_query/explain_analyze."
|
|
48
|
+
},
|
|
26
49
|
{
|
|
27
50
|
"warning_type": "Cross-Site Request Forgery",
|
|
28
51
|
"warning_code": 7,
|
|
@@ -69,6 +92,6 @@
|
|
|
69
92
|
"note": "Reviewed & accepted: EXPLAIN ANALYZE feature. Same safeguards as execute_query - query resolved by hash from internal registry, params validated, SecurityError guards. Intentional DBA tooling."
|
|
70
93
|
}
|
|
71
94
|
],
|
|
72
|
-
"updated": "2026-07-
|
|
95
|
+
"updated": "2026-07-10 19:15:00 +0300",
|
|
73
96
|
"brakeman_version": "8.0.5"
|
|
74
97
|
}
|
data/config/locales/en.yml
CHANGED
|
@@ -589,9 +589,12 @@ en:
|
|
|
589
589
|
title: "PgReports"
|
|
590
590
|
subtitle: "PostgreSQL Analysis Dashboard"
|
|
591
591
|
page_title: "PgReports Dashboard"
|
|
592
|
+
language:
|
|
593
|
+
label: "Language"
|
|
594
|
+
name: "English"
|
|
592
595
|
navigation:
|
|
593
596
|
dashboard: "Dashboard"
|
|
594
|
-
back: "
|
|
597
|
+
back: "Back"
|
|
595
598
|
database_selector:
|
|
596
599
|
label: "Database"
|
|
597
600
|
target_selector:
|
|
@@ -599,40 +602,41 @@ en:
|
|
|
599
602
|
actions:
|
|
600
603
|
cancel: "Cancel"
|
|
601
604
|
retry: "Retry"
|
|
602
|
-
copy: "
|
|
603
|
-
copy_query: "
|
|
604
|
-
copy_code: "
|
|
605
|
+
copy: "Copy"
|
|
606
|
+
copy_query: "Copy Query"
|
|
607
|
+
copy_code: "Copy Code"
|
|
605
608
|
copy_to_clipboard_title: "Copy to clipboard"
|
|
606
|
-
copied_feedback: "
|
|
609
|
+
copied_feedback: "Copied!"
|
|
607
610
|
clear_all: "Clear All"
|
|
608
|
-
run_report: "
|
|
609
|
-
export: "
|
|
610
|
-
download_text: "
|
|
611
|
-
download_csv: "
|
|
612
|
-
download_json: "
|
|
613
|
-
download: "
|
|
611
|
+
run_report: "Run Report"
|
|
612
|
+
export: "Export"
|
|
613
|
+
download_text: "Text (.txt)"
|
|
614
|
+
download_csv: "CSV (.csv)"
|
|
615
|
+
download_json: "JSON (.json)"
|
|
616
|
+
download: "Download"
|
|
614
617
|
copy_ai_prompt: "Copy Prompt"
|
|
615
|
-
send_telegram: "
|
|
618
|
+
send_telegram: "Telegram"
|
|
616
619
|
sending: "Sending..."
|
|
617
|
-
reset_statistics: "
|
|
620
|
+
reset_statistics: "Reset Statistics"
|
|
618
621
|
resetting: "Resetting..."
|
|
619
622
|
confirm_reset: "Yes, Reset"
|
|
620
|
-
create_extension: "
|
|
623
|
+
create_extension: "Create Extension"
|
|
621
624
|
creating: "Creating..."
|
|
622
|
-
|
|
623
|
-
explain_analyze: "
|
|
624
|
-
execute_query: "
|
|
625
|
+
settings_button_title: "Settings"
|
|
626
|
+
explain_analyze: "EXPLAIN ANALYZE"
|
|
627
|
+
execute_query: "Execute Query"
|
|
625
628
|
run_query: "SQL Console"
|
|
626
|
-
create_migration_file: "
|
|
627
|
-
start_monitoring: "
|
|
628
|
-
stop_monitoring: "
|
|
629
|
+
create_migration_file: "Create File & Open in IDE"
|
|
630
|
+
start_monitoring: "Start Monitoring"
|
|
631
|
+
stop_monitoring: "Stop Monitoring"
|
|
629
632
|
starting: "Starting..."
|
|
630
633
|
stopping: "Stopping..."
|
|
631
|
-
load_history: "
|
|
634
|
+
load_history: "Load History"
|
|
635
|
+
load_history_unavailable_title: "No stored history — set config.query_monitor_log_file to keep captured queries across restarts"
|
|
632
636
|
loading: "Loading..."
|
|
633
637
|
running: "Running..."
|
|
634
|
-
save_for_comparison: "
|
|
635
|
-
saved_marker: "
|
|
638
|
+
save_for_comparison: "Save for Comparison"
|
|
639
|
+
saved_marker: "Saved"
|
|
636
640
|
status:
|
|
637
641
|
pg_stat_ready: "Active"
|
|
638
642
|
not_preloaded: "Preload required"
|
|
@@ -650,25 +654,26 @@ en:
|
|
|
650
654
|
create_extension_title: "Create pg_stat_statements extension"
|
|
651
655
|
create_extension_intro: "The pg_stat_statements extension isn't created in this database yet. Click below to create it:"
|
|
652
656
|
create_extension_note: "If the library isn't preloaded, you'll also need to add it to shared_preload_libraries and restart PostgreSQL."
|
|
653
|
-
reset_stats_title: "
|
|
657
|
+
reset_stats_title: "Reset Statistics"
|
|
654
658
|
reset_stats_confirm: "Are you sure you want to reset pg_stat_statements statistics?"
|
|
655
659
|
reset_stats_warning: "This action will clear all collected query statistics and cannot be undone."
|
|
656
|
-
|
|
657
|
-
problem_detected_title: "
|
|
658
|
-
query_analyzer_title: "
|
|
660
|
+
settings_title: "Settings"
|
|
661
|
+
problem_detected_title: "Problem Detected"
|
|
662
|
+
query_analyzer_title: "Query Analyzer"
|
|
659
663
|
query_label: "Query:"
|
|
660
664
|
parameters_label: "Parameters:"
|
|
661
|
-
migration_title: "
|
|
665
|
+
migration_title: "Drop Index Migration"
|
|
662
666
|
migration_subtitle: "Generated migration to remove the index:"
|
|
663
667
|
migration_warning: "Creating a migration will generate a migration file in your project. Running this migration will drop the index from the database, which may significantly impact application performance."
|
|
664
668
|
migration_warning_dev_only: "This operation should only be performed in a local development environment."
|
|
665
|
-
query_execution_disabled_title: "
|
|
669
|
+
query_execution_disabled_title: "Query execution is disabled"
|
|
670
|
+
migration_disabled_title: "Migration creation is disabled"
|
|
666
671
|
query_execution_disabled_intro: "To enable this feature, add to your configuration:"
|
|
667
672
|
query_execution_disabled_env_note: "...or set the following environment variable instead:"
|
|
668
673
|
run_query_title: "SQL Console"
|
|
669
674
|
run_query_placeholder: "SELECT * FROM users LIMIT 10;"
|
|
670
675
|
settings:
|
|
671
|
-
default_ide_label: "Default IDE for source links
|
|
676
|
+
default_ide_label: "Default IDE for source links"
|
|
672
677
|
ide_show_menu: "Show menu (default)"
|
|
673
678
|
ide_vscode_wsl: "VS Code (WSL)"
|
|
674
679
|
ide_vscode: "VS Code"
|
|
@@ -705,25 +710,27 @@ en:
|
|
|
705
710
|
waiting_for_locks: "waiting for locks"
|
|
706
711
|
percent_used_suffix: "% used"
|
|
707
712
|
categories:
|
|
708
|
-
requires_pg_stat: "
|
|
713
|
+
requires_pg_stat: "Requires pg_stat_statements"
|
|
714
|
+
pg_stat_missing_reason: "Requires pg_stat_statements, which is not installed on \"%{database}\". Create the extension there, or switch to a database that has it."
|
|
715
|
+
pg_stat_not_preloaded_reason: "Requires pg_stat_statements. The extension exists on \"%{database}\" but is not in shared_preload_libraries, so it returns no data until PostgreSQL is restarted with it preloaded."
|
|
709
716
|
reports_count_suffix: "reports"
|
|
710
|
-
primary_only_reason: "
|
|
711
|
-
standalone_no_host_app_reason: "
|
|
717
|
+
primary_only_reason: "This category only runs on the primary database — it inspects the host application's models. Switch back to the default database to use it."
|
|
718
|
+
standalone_no_host_app_reason: "Not available in standalone mode — this category inspects the host application's models, and there is no host app when running the dashboard on its own."
|
|
712
719
|
documentation:
|
|
713
|
-
toggle_title: "
|
|
714
|
-
what_section: "
|
|
715
|
-
why_section: "
|
|
716
|
-
nuances_section: "
|
|
717
|
-
thresholds_section: "
|
|
718
|
-
threshold_warning_label: "
|
|
719
|
-
threshold_critical_label: "
|
|
720
|
+
toggle_title: "What does this report show?"
|
|
721
|
+
what_section: "What"
|
|
722
|
+
why_section: "Why It Matters"
|
|
723
|
+
nuances_section: "Nuances"
|
|
724
|
+
thresholds_section: "Thresholds"
|
|
725
|
+
threshold_warning_label: "Warning:"
|
|
726
|
+
threshold_critical_label: "Critical:"
|
|
720
727
|
threshold_inverted_note: "(lower is worse)"
|
|
721
728
|
filters:
|
|
722
|
-
title: "
|
|
729
|
+
title: "Filter Parameters"
|
|
723
730
|
current_value: "current"
|
|
724
731
|
saved:
|
|
725
|
-
title: "
|
|
726
|
-
saved_at_prefix: "
|
|
732
|
+
title: "Saved for Comparison"
|
|
733
|
+
saved_at_prefix: "Saved:"
|
|
727
734
|
click_to_expand: "Click to expand"
|
|
728
735
|
confirm_clear_all: "Remove all saved records for this report?"
|
|
729
736
|
remove_title: "Remove"
|
|
@@ -737,9 +744,9 @@ en:
|
|
|
737
744
|
execution_time_label: "Execution time:"
|
|
738
745
|
null_placeholder: "<null>"
|
|
739
746
|
sections:
|
|
740
|
-
recommendation: "
|
|
741
|
-
detected_issues: "
|
|
742
|
-
execution_plan: "
|
|
747
|
+
recommendation: "Recommendation"
|
|
748
|
+
detected_issues: "Detected Issues"
|
|
749
|
+
execution_plan: "Execution Plan"
|
|
743
750
|
line_label: "Line"
|
|
744
751
|
current_label: "Current:"
|
|
745
752
|
threshold_label: "Threshold:"
|
|
@@ -747,8 +754,8 @@ en:
|
|
|
747
754
|
warning_eq: "warning"
|
|
748
755
|
critical_eq: "critical"
|
|
749
756
|
levels:
|
|
750
|
-
critical: "
|
|
751
|
-
warning: "
|
|
757
|
+
critical: "Critical"
|
|
758
|
+
warning: "Warning"
|
|
752
759
|
errors:
|
|
753
760
|
error_prefix: "Error:"
|
|
754
761
|
unable_fetch_metrics: "Unable to fetch database statistics."
|
|
@@ -776,8 +783,9 @@ en:
|
|
|
776
783
|
run_query_failed: "Failed to run query"
|
|
777
784
|
query_required: "Please enter a query"
|
|
778
785
|
create_migration_failed: "Failed to create migration"
|
|
779
|
-
explain_disabled_toast: "
|
|
780
|
-
execute_disabled_toast: "
|
|
786
|
+
explain_disabled_toast: "EXPLAIN ANALYZE is disabled. Enable in configuration: config.allow_raw_query_execution = true"
|
|
787
|
+
execute_disabled_toast: "Query execution is disabled. Enable in configuration: config.allow_raw_query_execution = true"
|
|
788
|
+
migration_disabled_toast: "Migration creation is disabled. Enable in configuration: config.allow_raw_query_execution = true"
|
|
781
789
|
query_monitoring_error: "Query monitoring error"
|
|
782
790
|
query_hash_required: "Query hash is required"
|
|
783
791
|
query_execution_disabled: "Query execution from dashboard is disabled. Enable it in configuration with 'config.allow_raw_query_execution = true'"
|
data/config/locales/ru.yml
CHANGED
|
@@ -554,9 +554,12 @@ ru:
|
|
|
554
554
|
title: "PgReports"
|
|
555
555
|
subtitle: "Дашборд анализа PostgreSQL"
|
|
556
556
|
page_title: "PgReports — Дашборд"
|
|
557
|
+
language:
|
|
558
|
+
label: "Язык"
|
|
559
|
+
name: "Русский"
|
|
557
560
|
navigation:
|
|
558
561
|
dashboard: "Дашборд"
|
|
559
|
-
back: "
|
|
562
|
+
back: "Назад"
|
|
560
563
|
database_selector:
|
|
561
564
|
label: "База данных"
|
|
562
565
|
target_selector:
|
|
@@ -564,40 +567,41 @@ ru:
|
|
|
564
567
|
actions:
|
|
565
568
|
cancel: "Отмена"
|
|
566
569
|
retry: "Повторить"
|
|
567
|
-
copy: "
|
|
568
|
-
copy_query: "
|
|
569
|
-
copy_code: "
|
|
570
|
+
copy: "Копировать"
|
|
571
|
+
copy_query: "Копировать запрос"
|
|
572
|
+
copy_code: "Копировать код"
|
|
570
573
|
copy_to_clipboard_title: "Скопировать в буфер обмена"
|
|
571
|
-
copied_feedback: "
|
|
574
|
+
copied_feedback: "Скопировано!"
|
|
572
575
|
clear_all: "Очистить всё"
|
|
573
|
-
run_report: "
|
|
574
|
-
export: "
|
|
575
|
-
download_text: "
|
|
576
|
-
download_csv: "
|
|
577
|
-
download_json: "
|
|
578
|
-
download: "
|
|
576
|
+
run_report: "Запустить отчёт"
|
|
577
|
+
export: "Экспорт"
|
|
578
|
+
download_text: "Текст (.txt)"
|
|
579
|
+
download_csv: "CSV (.csv)"
|
|
580
|
+
download_json: "JSON (.json)"
|
|
581
|
+
download: "Скачать"
|
|
579
582
|
copy_ai_prompt: "Копировать промпт"
|
|
580
|
-
send_telegram: "
|
|
583
|
+
send_telegram: "Telegram"
|
|
581
584
|
sending: "Отправка..."
|
|
582
|
-
reset_statistics: "
|
|
585
|
+
reset_statistics: "Сбросить статистику"
|
|
583
586
|
resetting: "Сброс..."
|
|
584
587
|
confirm_reset: "Да, сбросить"
|
|
585
|
-
create_extension: "
|
|
588
|
+
create_extension: "Создать расширение"
|
|
586
589
|
creating: "Создание..."
|
|
587
|
-
|
|
588
|
-
explain_analyze: "
|
|
589
|
-
execute_query: "
|
|
590
|
+
settings_button_title: "Настройки"
|
|
591
|
+
explain_analyze: "EXPLAIN ANALYZE"
|
|
592
|
+
execute_query: "Выполнить запрос"
|
|
590
593
|
run_query: "SQL-консоль"
|
|
591
|
-
create_migration_file: "
|
|
592
|
-
start_monitoring: "
|
|
593
|
-
stop_monitoring: "
|
|
594
|
+
create_migration_file: "Создать файл и открыть в IDE"
|
|
595
|
+
start_monitoring: "Запустить мониторинг"
|
|
596
|
+
stop_monitoring: "Остановить мониторинг"
|
|
594
597
|
starting: "Запуск..."
|
|
595
598
|
stopping: "Остановка..."
|
|
596
|
-
load_history: "
|
|
599
|
+
load_history: "Загрузить историю"
|
|
600
|
+
load_history_unavailable_title: "Сохранённой истории нет — задайте config.query_monitor_log_file, чтобы запросы сохранялись между перезапусками"
|
|
597
601
|
loading: "Загрузка..."
|
|
598
602
|
running: "Выполнение..."
|
|
599
|
-
save_for_comparison: "
|
|
600
|
-
saved_marker: "
|
|
603
|
+
save_for_comparison: "Сохранить для сравнения"
|
|
604
|
+
saved_marker: "Сохранено"
|
|
601
605
|
status:
|
|
602
606
|
pg_stat_ready: "Активно"
|
|
603
607
|
not_preloaded: "Требуется предзагрузка"
|
|
@@ -615,25 +619,26 @@ ru:
|
|
|
615
619
|
create_extension_title: "Создание расширения pg_stat_statements"
|
|
616
620
|
create_extension_intro: "Расширение pg_stat_statements ещё не создано в этой базе данных. Нажмите, чтобы создать его:"
|
|
617
621
|
create_extension_note: "Если библиотека не предзагружена, её также нужно добавить в shared_preload_libraries и перезапустить PostgreSQL."
|
|
618
|
-
reset_stats_title: "
|
|
622
|
+
reset_stats_title: "Сброс статистики"
|
|
619
623
|
reset_stats_confirm: "Вы уверены, что хотите сбросить статистику pg_stat_statements?"
|
|
620
624
|
reset_stats_warning: "Это действие очистит всю собранную статистику запросов и не может быть отменено."
|
|
621
|
-
|
|
622
|
-
problem_detected_title: "
|
|
623
|
-
query_analyzer_title: "
|
|
625
|
+
settings_title: "Настройки"
|
|
626
|
+
problem_detected_title: "Обнаружена проблема"
|
|
627
|
+
query_analyzer_title: "Анализатор запроса"
|
|
624
628
|
query_label: "Запрос:"
|
|
625
629
|
parameters_label: "Параметры:"
|
|
626
|
-
migration_title: "
|
|
630
|
+
migration_title: "Миграция удаления индекса"
|
|
627
631
|
migration_subtitle: "Сгенерированная миграция для удаления индекса:"
|
|
628
632
|
migration_warning: "Создание миграции сгенерирует файл миграции в вашем проекте. Запуск этой миграции удалит индекс из БД, что может значительно повлиять на производительность приложения."
|
|
629
633
|
migration_warning_dev_only: "Эту операцию следует выполнять только в локальном dev-окружении."
|
|
630
|
-
query_execution_disabled_title: "
|
|
634
|
+
query_execution_disabled_title: "Выполнение запросов отключено"
|
|
635
|
+
migration_disabled_title: "Создание миграций отключено"
|
|
631
636
|
query_execution_disabled_intro: "Чтобы включить эту функцию, добавьте в конфигурацию:"
|
|
632
637
|
query_execution_disabled_env_note: "...или вместо этого установите переменную окружения:"
|
|
633
638
|
run_query_title: "SQL-консоль"
|
|
634
639
|
run_query_placeholder: "SELECT * FROM users LIMIT 10;"
|
|
635
640
|
settings:
|
|
636
|
-
default_ide_label: "IDE по умолчанию для ссылок на
|
|
641
|
+
default_ide_label: "IDE по умолчанию для ссылок на исходники"
|
|
637
642
|
ide_show_menu: "Показывать меню (по умолчанию)"
|
|
638
643
|
ide_vscode_wsl: "VS Code (WSL)"
|
|
639
644
|
ide_vscode: "VS Code"
|
|
@@ -670,25 +675,27 @@ ru:
|
|
|
670
675
|
waiting_for_locks: "ждут блокировок"
|
|
671
676
|
percent_used_suffix: "% использовано"
|
|
672
677
|
categories:
|
|
673
|
-
requires_pg_stat: "
|
|
678
|
+
requires_pg_stat: "Требуется pg_stat_statements"
|
|
679
|
+
pg_stat_missing_reason: "Требуется pg_stat_statements, но расширение не установлено в базе «%{database}». Создайте его там или переключитесь на базу, где оно есть."
|
|
680
|
+
pg_stat_not_preloaded_reason: "Требуется pg_stat_statements. Расширение есть в базе «%{database}», но отсутствует в shared_preload_libraries — данных не будет, пока PostgreSQL не перезапустят с ним."
|
|
674
681
|
reports_count_suffix: "отчётов"
|
|
675
|
-
primary_only_reason: "
|
|
676
|
-
standalone_no_host_app_reason: "
|
|
682
|
+
primary_only_reason: "Эта категория работает только на первичной базе — она проверяет модели хост-приложения. Чтобы пользоваться, переключитесь обратно на базу по умолчанию."
|
|
683
|
+
standalone_no_host_app_reason: "Недоступно в автономном режиме — эта категория проверяет модели хост-приложения, а при самостоятельном запуске дашборда хост-приложения нет."
|
|
677
684
|
documentation:
|
|
678
|
-
toggle_title: "
|
|
679
|
-
what_section: "
|
|
680
|
-
why_section: "
|
|
681
|
-
nuances_section: "
|
|
682
|
-
thresholds_section: "
|
|
683
|
-
threshold_warning_label: "
|
|
684
|
-
threshold_critical_label: "
|
|
685
|
+
toggle_title: "Что показывает этот отчёт?"
|
|
686
|
+
what_section: "Что"
|
|
687
|
+
why_section: "Почему это важно"
|
|
688
|
+
nuances_section: "Нюансы"
|
|
689
|
+
thresholds_section: "Пороги"
|
|
690
|
+
threshold_warning_label: "Warning:"
|
|
691
|
+
threshold_critical_label: "Critical:"
|
|
685
692
|
threshold_inverted_note: "(меньше — хуже)"
|
|
686
693
|
filters:
|
|
687
|
-
title: "
|
|
694
|
+
title: "Параметры фильтрации"
|
|
688
695
|
current_value: "сейчас"
|
|
689
696
|
saved:
|
|
690
|
-
title: "
|
|
691
|
-
saved_at_prefix: "
|
|
697
|
+
title: "Сохранено для сравнения"
|
|
698
|
+
saved_at_prefix: "Сохранено:"
|
|
692
699
|
click_to_expand: "Нажмите, чтобы развернуть"
|
|
693
700
|
confirm_clear_all: "Удалить все сохранённые записи для этого отчёта?"
|
|
694
701
|
remove_title: "Удалить"
|
|
@@ -702,9 +709,9 @@ ru:
|
|
|
702
709
|
execution_time_label: "Время выполнения:"
|
|
703
710
|
null_placeholder: "<null>"
|
|
704
711
|
sections:
|
|
705
|
-
recommendation: "
|
|
706
|
-
detected_issues: "
|
|
707
|
-
execution_plan: "
|
|
712
|
+
recommendation: "Рекомендация"
|
|
713
|
+
detected_issues: "Обнаруженные проблемы"
|
|
714
|
+
execution_plan: "План выполнения"
|
|
708
715
|
line_label: "Строка"
|
|
709
716
|
current_label: "Текущее:"
|
|
710
717
|
threshold_label: "Порог:"
|
|
@@ -712,8 +719,8 @@ ru:
|
|
|
712
719
|
warning_eq: "warning"
|
|
713
720
|
critical_eq: "critical"
|
|
714
721
|
levels:
|
|
715
|
-
critical: "
|
|
716
|
-
warning: "
|
|
722
|
+
critical: "Критично"
|
|
723
|
+
warning: "Внимание"
|
|
717
724
|
errors:
|
|
718
725
|
error_prefix: "Ошибка:"
|
|
719
726
|
unable_fetch_metrics: "Не удалось получить статистику БД."
|
|
@@ -741,8 +748,9 @@ ru:
|
|
|
741
748
|
run_query_failed: "Не удалось выполнить запрос"
|
|
742
749
|
query_required: "Введите запрос"
|
|
743
750
|
create_migration_failed: "Не удалось создать миграцию"
|
|
744
|
-
explain_disabled_toast: "
|
|
745
|
-
execute_disabled_toast: "
|
|
751
|
+
explain_disabled_toast: "EXPLAIN ANALYZE отключен. Включите в конфигурации: config.allow_raw_query_execution = true"
|
|
752
|
+
execute_disabled_toast: "Выполнение запросов отключено. Включите в конфигурации: config.allow_raw_query_execution = true"
|
|
753
|
+
migration_disabled_toast: "Создание миграций отключено. Включите в конфигурации: config.allow_raw_query_execution = true"
|
|
746
754
|
query_monitoring_error: "Ошибка мониторинга запросов"
|
|
747
755
|
query_hash_required: "Требуется хэш запроса"
|
|
748
756
|
query_execution_disabled: "Выполнение запросов из дашборда отключено. Включите в конфигурации: 'config.allow_raw_query_execution = true'"
|