karafka-web 0.11.5 → 0.11.6
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 +13 -0
- data/Gemfile +9 -10
- data/Gemfile.lint +14 -0
- data/Gemfile.lint.lock +123 -0
- data/Gemfile.lock +15 -16
- data/README.md +15 -15
- data/Rakefile +2 -2
- data/bin/balance_specs +120 -0
- data/bin/check_coverage +31 -0
- data/bin/collect_timings +83 -0
- data/bin/rspecs +10 -0
- data/bin/rspecs_parallel +111 -0
- data/docker-compose.yml +1 -1
- data/karafka-web.gemspec +35 -35
- data/lib/karafka/web/cli/base.rb +2 -2
- data/lib/karafka/web/cli/help.rb +2 -2
- data/lib/karafka/web/cli/install.rb +3 -3
- data/lib/karafka/web/cli/migrate.rb +3 -3
- data/lib/karafka/web/cli/reset.rb +3 -3
- data/lib/karafka/web/cli/uninstall.rb +1 -1
- data/lib/karafka/web/config.rb +40 -32
- data/lib/karafka/web/contracts/base.rb +2 -2
- data/lib/karafka/web/deserializer.rb +5 -5
- data/lib/karafka/web/installer.rb +14 -14
- data/lib/karafka/web/management/actions/base.rb +5 -5
- data/lib/karafka/web/management/actions/clean_boot_file.rb +3 -3
- data/lib/karafka/web/management/actions/create_initial_states.rb +8 -8
- data/lib/karafka/web/management/actions/enable.rb +3 -3
- data/lib/karafka/web/management/actions/extend_boot_file.rb +3 -3
- data/lib/karafka/web/management/migrations/base.rb +3 -3
- data/lib/karafka/web/management/migrations/consumers_metrics/0_set_initial.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1699543515_fill_missing_received_and_sent_bytes.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1700234522_introduce_waiting.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1700234522_remove_processing.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1704722380_split_listeners_into_active_and_paused.rb +7 -7
- data/lib/karafka/web/management/migrations/consumers_metrics/1706607960_introduce_lag_total.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1706611396_rename_lag_total_to_lag_hybrid.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1716218393_populate_jobs_metrics.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_reports/1761645571_rename_process_name_to_id.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_reports/1765657887_add_group_instance_id_to_subscription_groups.rb +42 -0
- data/lib/karafka/web/management/migrations/consumers_states/0_set_initial.rb +2 -2
- data/lib/karafka/web/management/migrations/consumers_states/1699543515_fill_missing_received_and_sent_bytes.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_states/1700234522_introduce_waiting.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_states/1700234522_remove_processing.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_states/1704722380_split_listeners_into_active_and_paused.rb +7 -7
- data/lib/karafka/web/management/migrations/consumers_states/1706607960_introduce_lag_total.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_states/1706611396_rename_lag_total_to_lag_hybrid.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_states/1716218393_add_jobs_counter.rb +1 -1
- data/lib/karafka/web/management/migrator.rb +2 -2
- data/lib/karafka/web/pro/commanding/commands/base.rb +20 -4
- data/lib/karafka/web/pro/commanding/commands/consumers/quiet.rb +22 -5
- data/lib/karafka/web/pro/commanding/commands/consumers/stop.rb +22 -5
- data/lib/karafka/web/pro/commanding/commands/consumers/trace.rb +21 -4
- data/lib/karafka/web/pro/commanding/commands/partitions/pause.rb +20 -3
- data/lib/karafka/web/pro/commanding/commands/partitions/resume.rb +20 -3
- data/lib/karafka/web/pro/commanding/commands/partitions/seek.rb +20 -3
- data/lib/karafka/web/pro/commanding/commands/topics/pause.rb +48 -0
- data/lib/karafka/web/pro/commanding/commands/topics/resume.rb +49 -0
- data/lib/karafka/web/pro/commanding/config.rb +23 -5
- data/lib/karafka/web/pro/commanding/contracts/config.rb +21 -4
- data/lib/karafka/web/pro/commanding/dispatcher.rb +61 -26
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/base.rb +20 -3
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/pause.rb +21 -4
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/resume.rb +20 -3
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/seek.rb +24 -7
- data/lib/karafka/web/pro/commanding/handlers/partitions/executor.rb +36 -12
- data/lib/karafka/web/pro/commanding/handlers/partitions/listener.rb +47 -8
- data/lib/karafka/web/pro/commanding/handlers/partitions/tracker.rb +62 -13
- data/lib/karafka/web/pro/commanding/handlers/topics/commands/base.rb +109 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/commands/pause.rb +76 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/commands/resume.rb +56 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/executor.rb +75 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/listener.rb +82 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/tracker.rb +81 -0
- data/lib/karafka/web/pro/commanding/listener.rb +23 -6
- data/lib/karafka/web/pro/commanding/manager.rb +44 -23
- data/lib/karafka/web/pro/commanding/matcher.rb +46 -18
- data/lib/karafka/web/pro/commanding/matchers/base.rb +87 -0
- data/lib/karafka/web/pro/commanding/matchers/consumer_group_id.rb +58 -0
- data/lib/karafka/web/pro/commanding/matchers/message_type.rb +49 -0
- data/lib/karafka/web/pro/commanding/matchers/partition_id.rb +61 -0
- data/lib/karafka/web/pro/commanding/matchers/process_id.rb +58 -0
- data/lib/karafka/web/pro/commanding/matchers/schema_version.rb +44 -0
- data/lib/karafka/web/pro/commanding/matchers/topic.rb +58 -0
- data/lib/karafka/web/pro/commanding/request.rb +19 -2
- data/lib/karafka/web/pro/commanding.rb +19 -2
- data/lib/karafka/web/pro/loader.rb +20 -3
- data/lib/karafka/web/pro/ui/app.rb +25 -8
- data/lib/karafka/web/pro/ui/controllers/base_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/cluster_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/base_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/commanding_controller.rb +37 -15
- data/lib/karafka/web/pro/ui/controllers/consumers/commands_controller.rb +23 -6
- data/lib/karafka/web/pro/ui/controllers/consumers/consumers_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/controls_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/jobs_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/base_controller.rb +43 -42
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/offsets_controller.rb +36 -17
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/pauses_controller.rb +59 -33
- data/lib/karafka/web/pro/ui/controllers/consumers/topics/pauses_controller.rb +164 -0
- data/lib/karafka/web/pro/ui/controllers/dashboard_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/dlq_controller.rb +26 -9
- data/lib/karafka/web/pro/ui/controllers/errors_controller.rb +25 -9
- data/lib/karafka/web/pro/ui/controllers/explorer/base_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/explorer/explorer_controller.rb +22 -5
- data/lib/karafka/web/pro/ui/controllers/explorer/messages_controller.rb +26 -9
- data/lib/karafka/web/pro/ui/controllers/explorer/search_controller.rb +23 -6
- data/lib/karafka/web/pro/ui/controllers/health_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/jobs_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/recurring_tasks_controller.rb +22 -5
- data/lib/karafka/web/pro/ui/controllers/routing_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/base_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/explorer_controller.rb +25 -8
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/messages_controller.rb +21 -4
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/schedules_controller.rb +26 -9
- data/lib/karafka/web/pro/ui/controllers/status_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/support_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/topics/base_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/topics/configs_controller.rb +20 -3
- data/lib/karafka/web/pro/ui/controllers/topics/distributions_controller.rb +20 -3
- data/lib/karafka/web/pro/ui/controllers/topics/offsets_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/topics/replications_controller.rb +41 -2
- data/lib/karafka/web/pro/ui/controllers/topics/topics_controller.rb +24 -7
- data/lib/karafka/web/pro/ui/controllers/ux_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/branding/config.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/branding/contracts/config.rb +21 -4
- data/lib/karafka/web/pro/ui/lib/branding.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/features.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/patterns_detector.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/policies/config.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/policies/contracts/config.rb +21 -4
- data/lib/karafka/web/pro/ui/lib/policies/messages.rb +20 -3
- data/lib/karafka/web/pro/ui/lib/policies/requests.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/policies.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/safe_runner.rb +20 -3
- data/lib/karafka/web/pro/ui/lib/search/config.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/search/contracts/config.rb +21 -4
- data/lib/karafka/web/pro/ui/lib/search/contracts/form.rb +24 -6
- data/lib/karafka/web/pro/ui/lib/search/matchers/base.rb +21 -4
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_header_includes.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_key_includes.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_payload_includes.rb +20 -3
- data/lib/karafka/web/pro/ui/lib/search/normalizer.rb +26 -9
- data/lib/karafka/web/pro/ui/lib/search/runner.rb +33 -16
- data/lib/karafka/web/pro/ui/lib/search.rb +19 -2
- data/lib/karafka/web/pro/ui/routes/base.rb +19 -2
- data/lib/karafka/web/pro/ui/routes/cluster.rb +21 -4
- data/lib/karafka/web/pro/ui/routes/consumers.rb +83 -49
- data/lib/karafka/web/pro/ui/routes/dashboard.rb +20 -3
- data/lib/karafka/web/pro/ui/routes/dlq.rb +20 -3
- data/lib/karafka/web/pro/ui/routes/errors.rb +21 -4
- data/lib/karafka/web/pro/ui/routes/explorer.rb +33 -16
- data/lib/karafka/web/pro/ui/routes/health.rb +26 -9
- data/lib/karafka/web/pro/ui/routes/jobs.rb +23 -6
- data/lib/karafka/web/pro/ui/routes/recurring_tasks.rb +29 -12
- data/lib/karafka/web/pro/ui/routes/routing.rb +20 -3
- data/lib/karafka/web/pro/ui/routes/scheduled_messages.rb +28 -11
- data/lib/karafka/web/pro/ui/routes/status.rb +20 -3
- data/lib/karafka/web/pro/ui/routes/support.rb +20 -3
- data/lib/karafka/web/pro/ui/routes/topics.rb +29 -12
- data/lib/karafka/web/pro/ui/routes/ux.rb +20 -3
- data/lib/karafka/web/pro/ui/views/cluster/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/cluster/_broker.erb +13 -2
- data/lib/karafka/web/pro/ui/views/cluster/_config.erb +14 -3
- data/lib/karafka/web/pro/ui/views/cluster/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/cluster/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/cluster/show.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_backtrace.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_command.erb +24 -66
- data/lib/karafka/web/pro/ui/views/consumers/commands/_command_details.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_empty.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_command.erb +19 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_schema.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_table.erb +15 -4
- data/lib/karafka/web/pro/ui/views/consumers/commands/details/_acceptance.erb +19 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/details/_request.erb +19 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/details/_result.erb +27 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_request.erb +52 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_response.erb +46 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_command_name_badge.erb +40 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_request.erb +47 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_response.erb +46 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/show.erb +14 -15
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer_performance.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_commands.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_consumer_group.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_metrics.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_no_subscriptions.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition.erb +15 -5
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition_edit_options.erb +16 -5
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_stopped.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_subscription_group.erb +31 -7
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/details.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/performance.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/subscriptions.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/controls/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/controls/_controls.erb +14 -3
- data/lib/karafka/web/pro/ui/views/consumers/controls/index.erb +35 -7
- data/lib/karafka/web/pro/ui/views/consumers/jobs/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/jobs/_job.erb +14 -3
- data/lib/karafka/web/pro/ui/views/consumers/jobs/_no_jobs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/jobs/pending.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/jobs/running.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_basics.erb +20 -13
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_breadcrumbs.erb +37 -46
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_form.erb +25 -14
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_not_running_error.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_running_warning.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/edit.erb +17 -6
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_active_not_editable.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_adjusting_warning.erb +14 -3
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_breadcrumbs.erb +40 -48
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_edit_form.erb +18 -8
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_lrj_not_manageable.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_new_form.erb +22 -11
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_not_running.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_partition_info.erb +57 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/edit.erb +16 -5
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/new.erb +16 -5
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_adjusting_warning.erb +38 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_breadcrumbs.erb +46 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_edit_form.erb +66 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_lrj_not_manageable.erb +30 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_new_form.erb +86 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_not_running.erb +27 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_topic_info.erb +72 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/edit.erb +29 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/new.erb +29 -0
- data/lib/karafka/web/pro/ui/views/dashboard/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/dlq/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/dlq/_no_topics.erb +13 -2
- data/lib/karafka/web/pro/ui/views/dlq/_topic.erb +13 -2
- data/lib/karafka/web/pro/ui/views/dlq/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/errors/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/errors/_error.erb +14 -3
- data/lib/karafka/web/pro/ui/views/errors/_partition_option.erb +18 -5
- data/lib/karafka/web/pro/ui/views/errors/_selector.erb +14 -3
- data/lib/karafka/web/pro/ui/views/errors/_table.erb +14 -3
- data/lib/karafka/web/pro/ui/views/errors/index.erb +39 -26
- data/lib/karafka/web/pro/ui/views/errors/partition.erb +50 -37
- data/lib/karafka/web/pro/ui/views/errors/show.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_failed_deserialization.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_filtered.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_message.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_no_topics.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_partition_option.erb +18 -5
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_selector.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_topic.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_metadata.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_payload.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_resources_utilization.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_too_big_to_be_displayed.erb +15 -4
- data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_detail.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_headers.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_key.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_cleaned.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_empty.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_messages.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_time_selector.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_timestamp_selector.erb +15 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition.erb +52 -39
- data/lib/karafka/web/pro/ui/views/explorer/explorer/show.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_actions.erb +39 -26
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_empty.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_limited.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/messages/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/messages/forward.erb +28 -16
- data/lib/karafka/web/pro/ui/views/explorer/search/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_fix_errors.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_metadata.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_no_results.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_no_search_criteria.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_search_criteria.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/search/_search_modal.erb +27 -15
- data/lib/karafka/web/pro/ui/views/explorer/search/_timeout.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_no_data.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_no_partition_data.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_partition.erb +22 -6
- data/lib/karafka/web/pro/ui/views/health/_partition_lags.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_partition_offset.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_partition_times.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_partitions_with_fallback.erb +15 -2
- data/lib/karafka/web/pro/ui/views/health/_table_metadata.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_topic_edit_options.erb +64 -0
- data/lib/karafka/web/pro/ui/views/health/changes.erb +14 -2
- data/lib/karafka/web/pro/ui/views/health/cluster_lags.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/lags.erb +14 -2
- data/lib/karafka/web/pro/ui/views/health/offsets.erb +14 -2
- data/lib/karafka/web/pro/ui/views/health/overview.erb +29 -5
- data/lib/karafka/web/pro/ui/views/jobs/_job.erb +14 -3
- data/lib/karafka/web/pro/ui/views/jobs/_no_jobs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/jobs/pending.erb +13 -2
- data/lib/karafka/web/pro/ui/views/jobs/running.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_actions.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_batch_actions.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_log.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_not_active.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_task.erb +14 -3
- data/lib/karafka/web/pro/ui/views/recurring_tasks/logs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/schedule.erb +14 -3
- data/lib/karafka/web/pro/ui/views/routing/_consumer_group.erb +14 -3
- data/lib/karafka/web/pro/ui/views/routing/_detail.erb +13 -2
- data/lib/karafka/web/pro/ui/views/routing/_topic.erb +14 -3
- data/lib/karafka/web/pro/ui/views/routing/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/routing/show.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_key.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_message.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_messages.erb +14 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_cancel.erb +14 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_compacted.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_schedule.erb +14 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_tombstone.erb +14 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_unknown.erb +14 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/partition.erb +52 -39
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/topic.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_no_groups.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/show.erb +14 -3
- data/lib/karafka/web/pro/ui/views/shared/_navigation.erb +14 -3
- data/lib/karafka/web/pro/ui/views/shared/_rdkafka_form_error_alert_box.erb +13 -2
- data/lib/karafka/web/pro/ui/views/shared/branding/_label.erb +13 -2
- data/lib/karafka/web/pro/ui/views/shared/branding/_notice.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_config.erb +14 -3
- data/lib/karafka/web/pro/ui/views/topics/configs/_delete_button.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_form.erb +17 -6
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_plan.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_warning.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/edit.erb +21 -10
- data/lib/karafka/web/pro/ui/views/topics/configs/index.erb +14 -3
- data/lib/karafka/web/pro/ui/views/topics/distributions/_add_partitions_button.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_badges.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_chart.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_form.erb +18 -6
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_hints.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_warnings.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_empty_partitions.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_limited.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_partition.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/edit.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/show.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/offsets/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/offsets/_partition.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/offsets/show.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/replications/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/replications/_metric_box.erb +20 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_partition.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/replications/_replication_info.erb +65 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_resilience_success.erb +24 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_warning_low_durability.erb +67 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_warning_no_redundancy.erb +66 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_warning_zero_fault_tolerance.erb +67 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/show.erb +15 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_create_button.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_create_hints.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_form.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_hints.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_warning.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_new_form.erb +25 -11
- data/lib/karafka/web/pro/ui/views/topics/topics/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_topic.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/edit.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/new.erb +13 -2
- data/lib/karafka/web/processing/consumer.rb +1 -1
- data/lib/karafka/web/processing/consumers/aggregators/metrics.rb +11 -11
- data/lib/karafka/web/processing/consumers/aggregators/state.rb +4 -3
- data/lib/karafka/web/processing/consumers/reports_migrator.rb +2 -2
- data/lib/karafka/web/processing/consumers/schema_manager.rb +1 -1
- data/lib/karafka/web/processing/publisher.rb +2 -2
- data/lib/karafka/web/producer.rb +61 -0
- data/lib/karafka/web/tracking/consumers/contracts/report.rb +2 -2
- data/lib/karafka/web/tracking/consumers/contracts/subscription_group.rb +1 -0
- data/lib/karafka/web/tracking/consumers/listeners/booting.rb +1 -1
- data/lib/karafka/web/tracking/consumers/listeners/connections.rb +7 -2
- data/lib/karafka/web/tracking/consumers/listeners/errors.rb +10 -10
- data/lib/karafka/web/tracking/consumers/listeners/pausing.rb +1 -1
- data/lib/karafka/web/tracking/consumers/listeners/processing.rb +25 -25
- data/lib/karafka/web/tracking/consumers/listeners/statistics.rb +35 -35
- data/lib/karafka/web/tracking/consumers/reporter.rb +2 -2
- data/lib/karafka/web/tracking/consumers/sampler/enrichers/consumer_groups.rb +1 -0
- data/lib/karafka/web/tracking/consumers/sampler/metrics/base.rb +2 -1
- data/lib/karafka/web/tracking/consumers/sampler/metrics/container.rb +15 -15
- data/lib/karafka/web/tracking/consumers/sampler/metrics/network.rb +6 -6
- data/lib/karafka/web/tracking/consumers/sampler/metrics/os.rb +41 -37
- data/lib/karafka/web/tracking/consumers/sampler.rb +7 -7
- data/lib/karafka/web/tracking/helpers/error_info.rb +10 -10
- data/lib/karafka/web/tracking/helpers/sysconf.rb +2 -2
- data/lib/karafka/web/tracking/helpers/ttls/array.rb +1 -1
- data/lib/karafka/web/tracking/helpers/ttls/hash.rb +1 -1
- data/lib/karafka/web/tracking/helpers/ttls/stats.rb +4 -4
- data/lib/karafka/web/tracking/producers/listeners/booting.rb +1 -1
- data/lib/karafka/web/tracking/producers/listeners/errors.rb +2 -2
- data/lib/karafka/web/tracking/producers/reporter.rb +2 -2
- data/lib/karafka/web/tracking/producers/sampler.rb +1 -1
- data/lib/karafka/web/tracking/ui/errors.rb +4 -4
- data/lib/karafka/web/ui/app.rb +2 -2
- data/lib/karafka/web/ui/base.rb +30 -30
- data/lib/karafka/web/ui/controllers/base_controller.rb +24 -24
- data/lib/karafka/web/ui/controllers/cluster_controller.rb +3 -3
- data/lib/karafka/web/ui/controllers/requests/params.rb +6 -6
- data/lib/karafka/web/ui/helpers/application_helper.rb +59 -59
- data/lib/karafka/web/ui/helpers/paths_helper.rb +15 -7
- data/lib/karafka/web/ui/helpers/tailwind_helper.rb +6 -6
- data/lib/karafka/web/ui/helpers/time_helper.rb +1 -1
- data/lib/karafka/web/ui/helpers/topics_helper.rb +4 -4
- data/lib/karafka/web/ui/lib/admin.rb +2 -2
- data/lib/karafka/web/ui/lib/paginations/base.rb +7 -7
- data/lib/karafka/web/ui/lib/paginations/offset_based.rb +2 -2
- data/lib/karafka/web/ui/lib/paginations/page_based.rb +1 -1
- data/lib/karafka/web/ui/lib/paginations/paginators/arrays.rb +3 -3
- data/lib/karafka/web/ui/lib/paginations/watermark_offsets_based.rb +1 -1
- data/lib/karafka/web/ui/lib/sorter.rb +2 -2
- data/lib/karafka/web/ui/models/counters.rb +1 -1
- data/lib/karafka/web/ui/models/health.rb +1 -0
- data/lib/karafka/web/ui/models/jobs.rb +2 -2
- data/lib/karafka/web/ui/models/message.rb +9 -9
- data/lib/karafka/web/ui/models/metrics/charts/aggregated.rb +3 -3
- data/lib/karafka/web/ui/models/metrics/charts/topics.rb +3 -3
- data/lib/karafka/web/ui/models/metrics/topics.rb +8 -8
- data/lib/karafka/web/ui/models/processes.rb +3 -3
- data/lib/karafka/web/ui/models/recurring_tasks/schedule.rb +2 -2
- data/lib/karafka/web/ui/models/status/checks/base.rb +127 -0
- data/lib/karafka/web/ui/models/status/checks/commands_topic_presence.rb +52 -0
- data/lib/karafka/web/ui/models/status/checks/connection.rb +68 -0
- data/lib/karafka/web/ui/models/status/checks/consumers_reports.rb +34 -0
- data/lib/karafka/web/ui/models/status/checks/consumers_reports_schema_state.rb +32 -0
- data/lib/karafka/web/ui/models/status/checks/consumers_schemas.rb +44 -0
- data/lib/karafka/web/ui/models/status/checks/enabled.rb +39 -0
- data/lib/karafka/web/ui/models/status/checks/initial_consumers_metrics.rb +48 -0
- data/lib/karafka/web/ui/models/status/checks/initial_consumers_state.rb +48 -0
- data/lib/karafka/web/ui/models/status/checks/live_reporting.rb +31 -0
- data/lib/karafka/web/ui/models/status/checks/materializing_lag.rb +49 -0
- data/lib/karafka/web/ui/models/status/checks/partitions.rb +45 -0
- data/lib/karafka/web/ui/models/status/checks/pro_subscription.rb +29 -0
- data/lib/karafka/web/ui/models/status/checks/replication.rb +51 -0
- data/lib/karafka/web/ui/models/status/checks/routing_topics_presence.rb +53 -0
- data/lib/karafka/web/ui/models/status/checks/state_calculation.rb +39 -0
- data/lib/karafka/web/ui/models/status/checks/topics.rb +44 -0
- data/lib/karafka/web/ui/models/status/context.rb +142 -0
- data/lib/karafka/web/ui/models/status/step.rb +64 -0
- data/lib/karafka/web/ui/models/status.rb +70 -356
- data/lib/karafka/web/ui/models/topic.rb +2 -2
- data/lib/karafka/web/ui/public/javascripts/application.min.js +1 -1
- data/lib/karafka/web/ui/public/javascripts/application.min.js.br +0 -0
- data/lib/karafka/web/ui/public/javascripts/application.min.js.gz +0 -0
- data/lib/karafka/web/ui/public/javascripts/components/live_poll.js +2 -2
- data/lib/karafka/web/ui/public/stylesheets/application.min.css +4660 -2524
- data/lib/karafka/web/ui/public/stylesheets/application.min.css.br +0 -0
- data/lib/karafka/web/ui/public/stylesheets/application.min.css.gz +0 -0
- data/lib/karafka/web/ui/public/stylesheets/libs/tailwind.css +62 -3
- data/lib/karafka/web/ui/routes/assets.rb +7 -7
- data/lib/karafka/web/ui/routes/cluster.rb +4 -4
- data/lib/karafka/web/ui/routes/consumers.rb +2 -2
- data/lib/karafka/web/ui/routes/dashboard.rb +1 -1
- data/lib/karafka/web/ui/routes/errors.rb +2 -2
- data/lib/karafka/web/ui/routes/jobs.rb +4 -4
- data/lib/karafka/web/ui/routes/routing.rb +1 -1
- data/lib/karafka/web/ui/routes/status.rb +1 -1
- data/lib/karafka/web/ui/routes/support.rb +1 -1
- data/lib/karafka/web/ui/routes/ux.rb +1 -1
- data/lib/karafka/web/ui/views/cluster/_partition.erb +1 -0
- data/lib/karafka/web/ui/views/dashboard/_counters.erb +16 -16
- data/lib/karafka/web/ui/views/errors/_detail.erb +2 -3
- data/lib/karafka/web/ui/views/errors/_error.erb +1 -1
- data/lib/karafka/web/ui/views/errors/index.erb +1 -1
- data/lib/karafka/web/ui/views/errors/show.erb +1 -1
- data/lib/karafka/web/ui/views/jobs/_job.erb +1 -1
- data/lib/karafka/web/ui/views/layout.erb +1 -1
- data/lib/karafka/web/ui/views/routing/_consumer_group.erb +1 -1
- data/lib/karafka/web/ui/views/routing/_topic.erb +1 -1
- data/lib/karafka/web/ui/views/shared/_header.erb +5 -5
- data/lib/karafka/web/ui/views/shared/_navigation.erb +1 -1
- data/lib/karafka/web/ui/views/shared/alerts/_error.erb +2 -2
- data/lib/karafka/web/ui/views/shared/alerts/_info.erb +1 -1
- data/lib/karafka/web/ui/views/shared/alerts/_primary.erb +1 -1
- data/lib/karafka/web/ui/views/shared/alerts/_secondary.erb +1 -1
- data/lib/karafka/web/ui/views/shared/alerts/_success.erb +1 -1
- data/lib/karafka/web/ui/views/shared/alerts/_warning.erb +2 -2
- data/lib/karafka/web/ui/views/shared/exceptions/not_allowed.erb +3 -3
- data/lib/karafka/web/ui/views/shared/exceptions/not_found.erb +4 -4
- data/lib/karafka/web/ui/views/shared/exceptions/pro_only.erb +4 -4
- data/lib/karafka/web/ui/views/shared/exceptions/unhandled_error.erb +4 -4
- data/lib/karafka/web/ui/views/status/show.erb +15 -0
- data/lib/karafka/web/ui/views/status/warnings/_commands_topic_presence.erb +14 -0
- data/lib/karafka/web/ui/views/ux/_code.erb +0 -1
- data/lib/karafka/web/ui/views/ux/_data_table.erb +79 -0
- data/lib/karafka/web/ui/views/ux/_headers.erb +1 -1
- data/lib/karafka/web/ui/views/ux/_pagination.erb +1 -1
- data/lib/karafka/web/version.rb +1 -1
- data/lib/karafka/web.rb +17 -17
- data/package-lock.json +480 -92
- data/package.json +3 -1
- data/renovate.json +12 -11
- data/tailwind.config.js +4 -7
- metadata +72 -3
- data/lib/karafka/web/pro/ui/views/consumers/commands/_metadata.erb +0 -44
|
@@ -27,7 +27,7 @@ module Karafka
|
|
|
27
27
|
# Reading this that way is cheaper than running a shell command
|
|
28
28
|
when /linux/
|
|
29
29
|
File.readlines("/proc/#{pid}/status").each do |line|
|
|
30
|
-
next unless line.start_with?(
|
|
30
|
+
next unless line.start_with?("VmRSS:")
|
|
31
31
|
|
|
32
32
|
break line.split[1].to_i
|
|
33
33
|
end
|
|
@@ -49,7 +49,8 @@ module Karafka
|
|
|
49
49
|
# This represents system-wide (or container-wide) memory usage by summing RSS
|
|
50
50
|
# across all processes.
|
|
51
51
|
# On bare metal: sums memory for all processes on the host
|
|
52
|
-
# In containers: sums memory for all processes within the container
|
|
52
|
+
# In containers: sums memory for all processes within the container
|
|
53
|
+
# (due to PID namespace)
|
|
53
54
|
# @note This is DIFFERENT from memory_usage which only shows current process memory
|
|
54
55
|
# @note Used in Web UI to show "OS memory used" metric
|
|
55
56
|
def memory_total_usage(memory_threads_ps)
|
|
@@ -69,22 +70,22 @@ module Karafka
|
|
|
69
70
|
return @memory_size if instance_variable_defined?(:@memory_size)
|
|
70
71
|
|
|
71
72
|
@memory_size = case RUBY_PLATFORM
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
73
|
+
when /linux/
|
|
74
|
+
mem_info = File.read("/proc/meminfo")
|
|
75
|
+
mem_total_line = mem_info.match(/MemTotal:\s*(?<total>\d+)/)
|
|
76
|
+
mem_total_line["total"].to_i
|
|
77
|
+
when /darwin|bsd/
|
|
78
|
+
shell
|
|
79
|
+
.call("sysctl -a")
|
|
80
|
+
.split("\n")
|
|
81
|
+
.find { |line| line.start_with?("hw.memsize:") }
|
|
82
|
+
.to_s
|
|
83
|
+
.split
|
|
84
|
+
.last
|
|
85
|
+
.to_i
|
|
86
|
+
else
|
|
87
|
+
0
|
|
88
|
+
end
|
|
88
89
|
end
|
|
89
90
|
|
|
90
91
|
# @return [Array<Float>] load averages for last 1, 5 and 15 minutes
|
|
@@ -92,13 +93,13 @@ module Karafka
|
|
|
92
93
|
case RUBY_PLATFORM
|
|
93
94
|
when /linux/
|
|
94
95
|
File
|
|
95
|
-
.read(
|
|
96
|
+
.read("/proc/loadavg")
|
|
96
97
|
.split
|
|
97
98
|
.first(3)
|
|
98
99
|
.map(&:to_f)
|
|
99
100
|
when /darwin|bsd/
|
|
100
101
|
shell
|
|
101
|
-
.call(
|
|
102
|
+
.call("w | head -1")
|
|
102
103
|
.strip
|
|
103
104
|
.split
|
|
104
105
|
.map(&:to_f)
|
|
@@ -124,10 +125,11 @@ module Karafka
|
|
|
124
125
|
end
|
|
125
126
|
|
|
126
127
|
# Loads process information for all running processes
|
|
127
|
-
# @return [Array<Array<Integer, Integer, Integer>>, false] array of
|
|
128
|
-
# for each process, or false if unavailable
|
|
128
|
+
# @return [Array<Array<Integer, Integer, Integer>>, false] array of
|
|
129
|
+
# [rss_kb, threads, pid] for each process, or false if unavailable
|
|
129
130
|
#
|
|
130
|
-
# This method reads information about ALL processes on the system
|
|
131
|
+
# This method reads information about ALL processes on the system
|
|
132
|
+
# (or in the container).
|
|
131
133
|
# The data is used by multiple metrics:
|
|
132
134
|
# - memory_total_usage: sums RSS across all processes
|
|
133
135
|
# - threads: extracts thread count for current process
|
|
@@ -142,10 +144,12 @@ module Karafka
|
|
|
142
144
|
# - macOS: Uses `ps -A` to get all processes
|
|
143
145
|
# - Containers: Due to PID namespaces, only sees processes within the container
|
|
144
146
|
#
|
|
145
|
-
# @note Sampler calls this once per sample cycle (every ~5 seconds) and caches
|
|
146
|
-
# in @memory_threads_ps to ensure consistent data within a single
|
|
147
|
+
# @note Sampler calls this once per sample cycle (every ~5 seconds) and caches
|
|
148
|
+
# the result in @memory_threads_ps to ensure consistent data within a single
|
|
149
|
+
# sample snapshot
|
|
147
150
|
# @note The cache is refreshed on EVERY sample cycle, so data stays current
|
|
148
|
-
# @note On Linux, thread count is only extracted for the current process to
|
|
151
|
+
# @note On Linux, thread count is only extracted for the current process to
|
|
152
|
+
# optimize performance
|
|
149
153
|
def memory_threads_ps
|
|
150
154
|
case RUBY_PLATFORM
|
|
151
155
|
when /linux/
|
|
@@ -153,27 +157,27 @@ module Karafka
|
|
|
153
157
|
current_pid = ::Process.pid
|
|
154
158
|
|
|
155
159
|
# Read all processes from /proc
|
|
156
|
-
Dir.glob(
|
|
160
|
+
Dir.glob("/proc/[0-9]*/statm").filter_map do |statm_file|
|
|
157
161
|
pid = statm_file.match(%r{/proc/(\d+)/statm})[1].to_i
|
|
158
162
|
status_file = "/proc/#{pid}/status"
|
|
159
163
|
|
|
160
164
|
# Extract RSS from /proc/<pid>/statm (second field)
|
|
161
165
|
rss_pages = begin
|
|
162
166
|
File.read(statm_file).split[1].to_i
|
|
163
|
-
rescue
|
|
167
|
+
rescue
|
|
164
168
|
next # Process may have exited
|
|
165
169
|
end
|
|
166
170
|
|
|
167
171
|
# Extract thread count from /proc/<pid>/status (only for current process)
|
|
168
172
|
thcount = if pid == current_pid
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
173
|
+
begin
|
|
174
|
+
File.read(status_file)[/^Threads:\s+(\d+)/, 1].to_i
|
|
175
|
+
rescue
|
|
176
|
+
0
|
|
177
|
+
end
|
|
178
|
+
else
|
|
179
|
+
0
|
|
180
|
+
end
|
|
177
181
|
|
|
178
182
|
# Convert RSS from pages to kilobytes
|
|
179
183
|
rss_kb = (rss_pages * page_size) / 1024
|
|
@@ -185,7 +189,7 @@ module Karafka
|
|
|
185
189
|
# we do on windows
|
|
186
190
|
when /darwin|bsd/
|
|
187
191
|
shell
|
|
188
|
-
.call(
|
|
192
|
+
.call("ps -A -o rss=,pid=")
|
|
189
193
|
.split("\n")
|
|
190
194
|
.map { |row| row.strip.split.map(&:to_i) }
|
|
191
195
|
.map { |row| [row.first, 0, row.last] }
|
|
@@ -10,12 +10,12 @@ module Karafka
|
|
|
10
10
|
include ::Karafka::Core::Helpers::Time
|
|
11
11
|
|
|
12
12
|
attr_reader :counters, :consumer_groups, :subscription_groups, :errors,
|
|
13
|
-
|
|
13
|
+
:pauses, :jobs, :windows
|
|
14
14
|
|
|
15
15
|
# Current schema version
|
|
16
16
|
# This is used for detecting incompatible changes and not using outdated data during
|
|
17
17
|
# upgrades
|
|
18
|
-
SCHEMA_VERSION =
|
|
18
|
+
SCHEMA_VERSION = "1.6.0"
|
|
19
19
|
|
|
20
20
|
# Counters that count events occurrences during the given window
|
|
21
21
|
COUNTERS_BASE = {
|
|
@@ -76,10 +76,10 @@ module Karafka
|
|
|
76
76
|
# Select and instantiate appropriate system metrics collector based on environment
|
|
77
77
|
# Use container-aware collector if cgroups are available, otherwise use OS-based
|
|
78
78
|
metrics_class = if Metrics::Container.active?
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
Metrics::Container
|
|
80
|
+
else
|
|
81
|
+
Metrics::Os
|
|
82
|
+
end
|
|
83
83
|
@system_metrics = metrics_class.new(@shell)
|
|
84
84
|
@network_metrics = Metrics::Network.new(@windows)
|
|
85
85
|
@server_metrics = Metrics::Server.new
|
|
@@ -97,7 +97,7 @@ module Karafka
|
|
|
97
97
|
def to_report
|
|
98
98
|
{
|
|
99
99
|
schema_version: SCHEMA_VERSION,
|
|
100
|
-
type:
|
|
100
|
+
type: "consumer",
|
|
101
101
|
dispatched_at: float_now,
|
|
102
102
|
|
|
103
103
|
process: {
|
|
@@ -14,17 +14,17 @@ module Karafka
|
|
|
14
14
|
def extract_error_info(error)
|
|
15
15
|
app_root = "#{::Karafka.root}/"
|
|
16
16
|
|
|
17
|
-
gem_home = if ENV.key?(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
gem_home = if ENV.key?("GEM_HOME")
|
|
18
|
+
ENV["GEM_HOME"]
|
|
19
|
+
else
|
|
20
|
+
File.expand_path(File.join(Karafka.gem_root.to_s, "../"))
|
|
21
|
+
end
|
|
22
22
|
|
|
23
23
|
gem_home = "#{gem_home}/"
|
|
24
24
|
|
|
25
25
|
backtrace = error.backtrace || []
|
|
26
|
-
backtrace.map! { |line| line.gsub(app_root,
|
|
27
|
-
backtrace.map! { |line| line.gsub(gem_home,
|
|
26
|
+
backtrace.map! { |line| line.gsub(app_root, "") }
|
|
27
|
+
backtrace.map! { |line| line.gsub(gem_home, "") }
|
|
28
28
|
|
|
29
29
|
[
|
|
30
30
|
error.class.name,
|
|
@@ -37,11 +37,11 @@ module Karafka
|
|
|
37
37
|
# @return [String] formatted exception message
|
|
38
38
|
def extract_error_message(error)
|
|
39
39
|
error_message = error.message.to_s[0, 10_000]
|
|
40
|
-
error_message.force_encoding(
|
|
40
|
+
error_message.force_encoding("utf-8")
|
|
41
41
|
error_message.scrub! if error_message.respond_to?(:scrub!)
|
|
42
42
|
error_message
|
|
43
|
-
rescue
|
|
44
|
-
|
|
43
|
+
rescue
|
|
44
|
+
"!!! Error message extraction failed !!!"
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
end
|
|
@@ -11,10 +11,10 @@ module Karafka
|
|
|
11
11
|
|
|
12
12
|
case RUBY_PLATFORM
|
|
13
13
|
when /linux/
|
|
14
|
-
ffi_lib
|
|
14
|
+
ffi_lib "libc.so.6" # Standard C library on Linux
|
|
15
15
|
SC_PAGESIZE = 30 # _SC_PAGESIZE constant
|
|
16
16
|
when /darwin/
|
|
17
|
-
ffi_lib
|
|
17
|
+
ffi_lib "libSystem.B.dylib" # Standard C library on macOS
|
|
18
18
|
SC_PAGESIZE = 29 # _SC_PAGESIZE constant
|
|
19
19
|
end
|
|
20
20
|
|
|
@@ -29,7 +29,7 @@ module Karafka
|
|
|
29
29
|
|
|
30
30
|
# @return [String] thread-safe inspect of the ttls hash
|
|
31
31
|
def inspect
|
|
32
|
-
"#<#{self.class.name}:#{format(
|
|
32
|
+
"#<#{self.class.name}:#{format("%#x", object_id)} size=#{size} ttl=#{@ttl}ms>"
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
end
|
|
@@ -16,10 +16,10 @@ module Karafka
|
|
|
16
16
|
# @param ttls_hash [Ttls::Hash, Hash] hash with window based samples
|
|
17
17
|
def initialize(ttls_hash)
|
|
18
18
|
@data = ttls_hash
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
.values
|
|
20
|
+
.map { |value| value.samples.to_a }
|
|
21
|
+
.delete_if { |samples| samples.size < 2 }
|
|
22
|
+
.map { |samples| samples.map(&:values) }
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
# Computes the rate out of the samples provided on a per second basis. The samples need
|
|
@@ -10,7 +10,7 @@ module Karafka
|
|
|
10
10
|
include Tracking::Helpers::ErrorInfo
|
|
11
11
|
|
|
12
12
|
# Schema used by producers error reporting
|
|
13
|
-
SCHEMA_VERSION =
|
|
13
|
+
SCHEMA_VERSION = "1.2.0"
|
|
14
14
|
|
|
15
15
|
private_constant :SCHEMA_VERSION
|
|
16
16
|
|
|
@@ -53,7 +53,7 @@ module Karafka
|
|
|
53
53
|
# @return [Hash] hash with details
|
|
54
54
|
def build_details(type, payload)
|
|
55
55
|
case type
|
|
56
|
-
when
|
|
56
|
+
when "librdkafka.dispatch_error"
|
|
57
57
|
payload.slice(:topic, :partition, :offset)
|
|
58
58
|
else
|
|
59
59
|
{}
|
|
@@ -87,8 +87,8 @@ module Karafka
|
|
|
87
87
|
# and we can just safely ignore this
|
|
88
88
|
rescue WaterDrop::Errors::ProducerClosedError
|
|
89
89
|
nil
|
|
90
|
-
rescue
|
|
91
|
-
p
|
|
90
|
+
rescue => e
|
|
91
|
+
p "------------------------------------------------"
|
|
92
92
|
p e
|
|
93
93
|
end
|
|
94
94
|
end
|
|
@@ -15,7 +15,7 @@ module Karafka
|
|
|
15
15
|
include Tracking::Helpers::ErrorInfo
|
|
16
16
|
|
|
17
17
|
# Schema used by UI error reporting
|
|
18
|
-
SCHEMA_VERSION =
|
|
18
|
+
SCHEMA_VERSION = "1.2.0"
|
|
19
19
|
|
|
20
20
|
private_constant :SCHEMA_VERSION
|
|
21
21
|
|
|
@@ -24,7 +24,7 @@ module Karafka
|
|
|
24
24
|
# @param event [Karafka::Core::Monitoring::Event]
|
|
25
25
|
def on_error_occurred(event)
|
|
26
26
|
# Only process UI errors, ignore all other error types
|
|
27
|
-
return unless event[:type] ==
|
|
27
|
+
return unless event[:type] == "web.ui.error"
|
|
28
28
|
|
|
29
29
|
error_class, error_message, backtrace = extract_error_info(event[:error])
|
|
30
30
|
|
|
@@ -47,7 +47,7 @@ module Karafka
|
|
|
47
47
|
|
|
48
48
|
# Dispatch error to Kafka asynchronously
|
|
49
49
|
dispatch(error_data)
|
|
50
|
-
rescue
|
|
50
|
+
rescue => e
|
|
51
51
|
# If we fail to report an error, log it but don't raise to avoid error loops
|
|
52
52
|
::Karafka.logger.error("Failed to report UI error: #{e.message}")
|
|
53
53
|
end
|
|
@@ -66,7 +66,7 @@ module Karafka
|
|
|
66
66
|
topic: ::Karafka::Web.config.topics.errors.name,
|
|
67
67
|
payload: Zlib::Deflate.deflate(error_data.to_json),
|
|
68
68
|
key: process_id,
|
|
69
|
-
headers: {
|
|
69
|
+
headers: { "zlib" => "true" }
|
|
70
70
|
)
|
|
71
71
|
end
|
|
72
72
|
end
|
data/lib/karafka/web/ui/app.rb
CHANGED
|
@@ -7,7 +7,7 @@ module Karafka
|
|
|
7
7
|
# Main Roda Web App that servers all the metrics and stats
|
|
8
8
|
class App < Base
|
|
9
9
|
# Use the gem views and assets location
|
|
10
|
-
opts[:root] = Karafka::Web.gem_root.join(
|
|
10
|
+
opts[:root] = Karafka::Web.gem_root.join("lib/karafka/web/ui")
|
|
11
11
|
|
|
12
12
|
instance_exec(&CONTEXT_DETAILS)
|
|
13
13
|
|
|
@@ -29,7 +29,7 @@ module Karafka
|
|
|
29
29
|
private_constant :SUB_ROUTES
|
|
30
30
|
|
|
31
31
|
route do |r|
|
|
32
|
-
r.root { r.redirect root_path(
|
|
32
|
+
r.root { r.redirect root_path("dashboard") }
|
|
33
33
|
|
|
34
34
|
SUB_ROUTES.each { |sub_route| sub_route.bind(self, r) }
|
|
35
35
|
|
data/lib/karafka/web/ui/base.rb
CHANGED
|
@@ -16,10 +16,10 @@ module Karafka
|
|
|
16
16
|
CONTEXT_DETAILS = lambda do
|
|
17
17
|
plugin(
|
|
18
18
|
:public,
|
|
19
|
-
root: Karafka::Web.gem_root.join(
|
|
19
|
+
root: Karafka::Web.gem_root.join("lib/karafka/web/ui/public"),
|
|
20
20
|
# Cache all static files for the end user for as long as possible
|
|
21
21
|
# We can do it because we ship per version assets so they invalidate with gem bumps
|
|
22
|
-
headers: {
|
|
22
|
+
headers: { "Cache-Control" => "max-age=31536000, immutable" },
|
|
23
23
|
gzip: true,
|
|
24
24
|
brotli: true
|
|
25
25
|
)
|
|
@@ -31,13 +31,13 @@ module Karafka
|
|
|
31
31
|
# user to make the Web UI work.
|
|
32
32
|
plugin(
|
|
33
33
|
:sessions,
|
|
34
|
-
key:
|
|
35
|
-
env_key:
|
|
34
|
+
key: "_karafka_session",
|
|
35
|
+
env_key: "karafka.session",
|
|
36
36
|
secret: SecureRandom.hex(64)
|
|
37
37
|
)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
plugin :render, escape: true, engine:
|
|
40
|
+
plugin :render, escape: true, engine: "erb"
|
|
41
41
|
plugin :run_append_slash
|
|
42
42
|
plugin :error_handler
|
|
43
43
|
plugin :not_found
|
|
@@ -79,20 +79,20 @@ module Karafka
|
|
|
79
79
|
result.flashes.each { |key, value| flash[key] = value }
|
|
80
80
|
|
|
81
81
|
path = case result.path
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
82
|
+
when :back
|
|
83
|
+
session["current_path"]
|
|
84
|
+
when :previous
|
|
85
|
+
session["previous_path"]
|
|
86
|
+
else
|
|
87
|
+
root_path(result.path)
|
|
88
|
+
end
|
|
89
89
|
|
|
90
90
|
response.redirect path || root_path
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
handle_block_result Controllers::Responses::File do |result|
|
|
94
|
-
response.headers[
|
|
95
|
-
response.headers[
|
|
94
|
+
response.headers["Content-Type"] = "application/octet-stream"
|
|
95
|
+
response.headers["Content-Disposition"] = "attachment; filename=\"#{result.file_name}\""
|
|
96
96
|
response.write result.content
|
|
97
97
|
end
|
|
98
98
|
|
|
@@ -103,35 +103,35 @@ module Karafka
|
|
|
103
103
|
case e
|
|
104
104
|
when Errors::Ui::ProOnlyError
|
|
105
105
|
response.status = 402
|
|
106
|
-
view
|
|
106
|
+
view "shared/exceptions/pro_only"
|
|
107
107
|
when Errors::Ui::ForbiddenError
|
|
108
108
|
response.status = 403
|
|
109
|
-
view
|
|
109
|
+
view "shared/exceptions/not_allowed"
|
|
110
110
|
when Errors::Ui::NotFoundError
|
|
111
111
|
response.status = 404
|
|
112
|
-
view
|
|
112
|
+
view "shared/exceptions/not_found"
|
|
113
113
|
when ::Rdkafka::RdkafkaError
|
|
114
114
|
response.status = 404
|
|
115
|
-
view
|
|
115
|
+
view "shared/exceptions/not_found"
|
|
116
116
|
else
|
|
117
117
|
# Report unhandled errors to Karafka monitoring
|
|
118
118
|
::Karafka.monitor.instrument(
|
|
119
|
-
|
|
119
|
+
"error.occurred",
|
|
120
120
|
error: e,
|
|
121
121
|
caller: self,
|
|
122
|
-
type:
|
|
122
|
+
type: "web.ui.error"
|
|
123
123
|
)
|
|
124
124
|
|
|
125
125
|
# For all other unhandled errors, show a generic error page
|
|
126
126
|
response.status = 500
|
|
127
|
-
view
|
|
127
|
+
view "shared/exceptions/unhandled_error"
|
|
128
128
|
end
|
|
129
129
|
end
|
|
130
130
|
|
|
131
131
|
not_found do
|
|
132
132
|
@error = true
|
|
133
133
|
response.status = 404
|
|
134
|
-
view
|
|
134
|
+
view "shared/exceptions/not_found"
|
|
135
135
|
end
|
|
136
136
|
|
|
137
137
|
before do
|
|
@@ -175,13 +175,13 @@ module Karafka
|
|
|
175
175
|
merged_params = deep_merge(request.params, query_data)
|
|
176
176
|
|
|
177
177
|
# Flatten the merged parameters
|
|
178
|
-
flattened_params = flatten_params(
|
|
178
|
+
flattened_params = flatten_params("", merged_params)
|
|
179
179
|
|
|
180
180
|
# Build the query string from the flattened parameters
|
|
181
181
|
query_string = URI.encode_www_form(flattened_params)
|
|
182
182
|
|
|
183
183
|
# Construct the full path with query string
|
|
184
|
-
[request.path, query_string].compact.join(
|
|
184
|
+
[request.path, query_string].compact.join("?")
|
|
185
185
|
end
|
|
186
186
|
|
|
187
187
|
# Builds a consumer instance with all needed details
|
|
@@ -218,21 +218,21 @@ module Karafka
|
|
|
218
218
|
def store_paths_history(request, session)
|
|
219
219
|
# Code below tracks previous paths so we can use it to redirect users back
|
|
220
220
|
return unless request.get?
|
|
221
|
-
return unless request.env[
|
|
221
|
+
return unless request.env["HTTP_ACCEPT"]&.include?("text/html")
|
|
222
222
|
|
|
223
223
|
requested_path = request.path
|
|
224
224
|
|
|
225
|
-
if session[
|
|
226
|
-
session[
|
|
225
|
+
if session["current_path"].nil?
|
|
226
|
+
session["current_path"] = requested_path
|
|
227
227
|
|
|
228
228
|
return
|
|
229
229
|
end
|
|
230
230
|
|
|
231
|
-
return if request.path == session[
|
|
231
|
+
return if request.path == session["current_path"]
|
|
232
232
|
|
|
233
233
|
# When navigating to a different page
|
|
234
|
-
session[
|
|
235
|
-
session[
|
|
234
|
+
session["previous_path"] = session["current_path"]
|
|
235
|
+
session["current_path"] = requested_path
|
|
236
236
|
end
|
|
237
237
|
end
|
|
238
238
|
end
|
|
@@ -25,16 +25,16 @@ module Karafka
|
|
|
25
25
|
# Detect that the state of the cache has changed
|
|
26
26
|
before do
|
|
27
27
|
cache.clear_if_needed(
|
|
28
|
-
session[
|
|
29
|
-
session[
|
|
28
|
+
session["cache_hash"],
|
|
29
|
+
session["cache_timestamp"].to_i
|
|
30
30
|
)
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
after do
|
|
34
34
|
next unless cache.exist?
|
|
35
35
|
|
|
36
|
-
session[
|
|
37
|
-
session[
|
|
36
|
+
session["cache_hash"] = cache.hash
|
|
37
|
+
session["cache_timestamp"] = cache.timestamp.to_i
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
# @param params [Karafka::Web::Ui::Controllers::Requests::Params] request parameters
|
|
@@ -58,31 +58,31 @@ module Karafka
|
|
|
58
58
|
def render(attributes: {})
|
|
59
59
|
attributes = attributes.dup
|
|
60
60
|
|
|
61
|
-
full_parts = self.class.to_s.split(
|
|
62
|
-
separator = full_parts.index(
|
|
61
|
+
full_parts = self.class.to_s.split("::")
|
|
62
|
+
separator = full_parts.index("Controllers")
|
|
63
63
|
base = full_parts[(separator + 1)..]
|
|
64
64
|
|
|
65
65
|
base.map!.with_index do |path_part, index|
|
|
66
66
|
if index == (base.size - 1)
|
|
67
|
-
path_part.gsub(/(.)([A-Z])/, '\1_\2').downcase.gsub(
|
|
67
|
+
path_part.gsub(/(.)([A-Z])/, '\1_\2').downcase.gsub("_controller", "")
|
|
68
68
|
else
|
|
69
69
|
path_part.gsub(/(.)([A-Z])/, '\1_\2').downcase
|
|
70
70
|
end
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
-
scope = base.join(
|
|
74
|
-
action = caller_locations(1, 1)[0].label.split(
|
|
73
|
+
scope = base.join("/")
|
|
74
|
+
action = caller_locations(1, 1)[0].label.split("#").last
|
|
75
75
|
|
|
76
76
|
attributes[:breadcrums_scope] = scope
|
|
77
77
|
|
|
78
78
|
@current_action_name = action.to_sym
|
|
79
|
-
@current_controller_name = base.join(
|
|
79
|
+
@current_controller_name = base.join("-")
|
|
80
80
|
|
|
81
81
|
instance_variables.each do |iv|
|
|
82
|
-
next if iv.to_s.start_with?(
|
|
83
|
-
next if iv.to_s.start_with?(
|
|
82
|
+
next if iv.to_s.start_with?("@_")
|
|
83
|
+
next if iv.to_s.start_with?("@params")
|
|
84
84
|
|
|
85
|
-
attributes[iv.to_s.delete(
|
|
85
|
+
attributes[iv.to_s.delete("@").to_sym] = instance_variable_get(iv)
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
Responses::Render.new(
|
|
@@ -108,7 +108,7 @@ module Karafka
|
|
|
108
108
|
# @return [String] formatted string
|
|
109
109
|
def format_flash(message, *args)
|
|
110
110
|
args.each do |arg|
|
|
111
|
-
message = message.sub(
|
|
111
|
+
message = message.sub("?", "<strong>#{arg}</strong>")
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
message
|
|
@@ -143,15 +143,15 @@ module Karafka
|
|
|
143
143
|
# @param args Any arguments accepted by the selected pagination engine
|
|
144
144
|
def paginate(*args)
|
|
145
145
|
engine = case args.count
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
146
|
+
when 2
|
|
147
|
+
Ui::Lib::Paginations::PageBased
|
|
148
|
+
when 3
|
|
149
|
+
Ui::Lib::Paginations::WatermarkOffsetsBased
|
|
150
|
+
when 4
|
|
151
|
+
Ui::Lib::Paginations::OffsetBased
|
|
152
|
+
else
|
|
153
|
+
raise ::Karafka::Errors::UnsupportedCaseError, args.count
|
|
154
|
+
end
|
|
155
155
|
|
|
156
156
|
@pagination = engine.new(*args)
|
|
157
157
|
end
|
|
@@ -160,7 +160,7 @@ module Karafka
|
|
|
160
160
|
#
|
|
161
161
|
# @param resource_id [String] resource id that was not found
|
|
162
162
|
# @raise [::Karafka::Web::Errors::Ui::NotFoundError]
|
|
163
|
-
def not_found!(resource_id =
|
|
163
|
+
def not_found!(resource_id = "")
|
|
164
164
|
raise(::Karafka::Web::Errors::Ui::NotFoundError, resource_id)
|
|
165
165
|
end
|
|
166
166
|
end
|
|
@@ -63,12 +63,12 @@ module Karafka
|
|
|
63
63
|
# order
|
|
64
64
|
def displayable_topics(cluster_info)
|
|
65
65
|
all = cluster_info
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
.topics
|
|
67
|
+
.sort_by { |topic| topic[:topic_name] }
|
|
68
68
|
|
|
69
69
|
return all if ::Karafka::Web.config.ui.visibility.internal_topics
|
|
70
70
|
|
|
71
|
-
all.reject { |topic| topic[:topic_name].start_with?(
|
|
71
|
+
all.reject { |topic| topic[:topic_name].start_with?("__") }
|
|
72
72
|
end
|
|
73
73
|
end
|
|
74
74
|
end
|