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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5377e1f7c20ed732850895389e9e47be86f94c85068fe363fab13fb52d4f12a4
|
|
4
|
+
data.tar.gz: f774171188b56858db87e66088436f88dc4d36460743d29152cb3b3fcc7119b2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 494a61a08bf0fd768827c05add65ad3d6d13f9e50140d37b25cf9faf9c8f2eecc1b6033612d377fd9cde6fe9d2004817ffa4e1ce8fea1fb24363ca845f979c69
|
|
7
|
+
data.tar.gz: 3c55088e048fe5a8a861a09d2dabdbea6d4e47423949d3927de646456a5f891628858c377c0bb636e34545d512d3a01887cc25dc55c37bf3904ccc79b3b918de
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Karafka Web Changelog
|
|
2
2
|
|
|
3
|
+
## 0.11.6 (2026-02-01)
|
|
4
|
+
- **[Feature]** Provide ability to pause/resume all partitions of a topic at once across all consumer processes via the Health Overview page (Pro). Topic-level commands are broadcast to all processes, and each process applies the command to partitions it owns within the specified consumer group. This simplifies bulk operations compared to pausing/resuming individual partitions one by one.
|
|
5
|
+
- [Enhancement] Optimize partition command tracker to use index-based lookup instead of iterating over 10,000 partitions during rebalance events. The tracker now maintains a partition index for O(n) lookups where n is the number of partitions with pending commands.
|
|
6
|
+
- [Enhancement] Report `group.instance.id` (static membership ID) per subscription group in consumer reports. This enables identifying consumers using Kafka's static group membership feature. The ID is displayed in the per-consumer subscription view header and in Health Overview below each process ID, making it easy to find a process by its static membership ID. Consumer schema version bumped to 1.6.0.
|
|
7
|
+
- [Enhancement] Display `min.insync.replicas` alongside replication factor on the topic replication page with fault tolerance indicators (Pro). Shows specific warnings for different resilience issues: no redundancy (RF=1), zero fault tolerance (RF ≤ minISR), and low durability (minISR=1). Each warning includes impact details, environment-aware severity messaging, and recommended actions. Helps users identify misconfigured topics that would cause outages or data loss.
|
|
8
|
+
- [Enhancement] Add `.options` CSS class for table columns containing action buttons, providing consistent `width: 1%; white-space: nowrap` styling to prevent column width fluctuation.
|
|
9
|
+
- [Enhancement] Add commands topic presence status check for Pro users. Warns when the `karafka_consumers_commands` topic is missing, which is required for commanding features (pause, resume, trace).
|
|
10
|
+
- [Enhancement] Disable "Quiet All" and "Stop All" buttons when only swarm or embedded consumers are running (Pro). These commands only work on standalone consumer processes.
|
|
11
|
+
- [Enhancement] Use low-ack producer variant (`acks: 0`) for Web UI reporting. Since Web UI reporting serves analytical purposes, fire-and-forget semantics minimize latency and overhead while occasional message loss is acceptable. Falls back to the original producer for idempotent/transactional producers.
|
|
12
|
+
- [Refactor] Refactor Status model into a DSL-based architecture with individual check classes. Each status check is now a separate class in `Karafka::Web::Ui::Models::Status::Checks` that declares its dependencies using `depends_on :check_name` DSL. Shared state is managed through a `Context` class, and the `Step` struct has been extracted to its own file. This improves maintainability, testability, and makes it easier to add new status checks in the future.
|
|
13
|
+
- [Fix] Fix session keys to use strings instead of symbols for compatibility with Roda's session management.
|
|
14
|
+
- [Fix] Fix actions and selector alignment in explorer and errors views by wrapping col-span elements in proper grid container.
|
|
15
|
+
|
|
3
16
|
## 0.11.5 (2025-11-14)
|
|
4
17
|
- [Enhancement] Utilize newly released Roda session management `:env_key` to isolate Karafka Web session from the main application session.
|
|
5
18
|
|
data/Gemfile
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
source
|
|
3
|
+
source "https://rubygems.org"
|
|
4
4
|
|
|
5
5
|
gemspec
|
|
6
6
|
|
|
7
7
|
group :test do
|
|
8
|
-
gem
|
|
9
|
-
gem
|
|
10
|
-
gem
|
|
8
|
+
gem "byebug"
|
|
9
|
+
gem "factory_bot"
|
|
10
|
+
gem "fugit"
|
|
11
11
|
# Needed for links extraction for visits verification
|
|
12
|
-
gem
|
|
13
|
-
gem
|
|
14
|
-
gem
|
|
15
|
-
gem
|
|
16
|
-
gem
|
|
17
|
-
gem 'yard-lint'
|
|
12
|
+
gem "nokogiri"
|
|
13
|
+
gem "ostruct"
|
|
14
|
+
gem "rack-test"
|
|
15
|
+
gem "rspec"
|
|
16
|
+
gem "simplecov"
|
|
18
17
|
end
|
data/Gemfile.lint
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
source "https://rubygems.org"
|
|
4
|
+
|
|
5
|
+
# Documentation linting
|
|
6
|
+
gem "yard-lint"
|
|
7
|
+
|
|
8
|
+
# Code style (StandardRB via RuboCop)
|
|
9
|
+
gem "standard"
|
|
10
|
+
gem "standard-performance"
|
|
11
|
+
gem "rubocop-performance"
|
|
12
|
+
gem "rubocop-rspec"
|
|
13
|
+
gem "standard-rspec"
|
|
14
|
+
gem "rubocop-thread_safety"
|
data/Gemfile.lint.lock
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
GEM
|
|
2
|
+
remote: https://rubygems.org/
|
|
3
|
+
specs:
|
|
4
|
+
ast (2.4.3)
|
|
5
|
+
json (2.18.0)
|
|
6
|
+
language_server-protocol (3.17.0.5)
|
|
7
|
+
lint_roller (1.1.0)
|
|
8
|
+
parallel (1.27.0)
|
|
9
|
+
parser (3.3.10.1)
|
|
10
|
+
ast (~> 2.4.1)
|
|
11
|
+
racc
|
|
12
|
+
prism (1.8.0)
|
|
13
|
+
racc (1.8.1)
|
|
14
|
+
rainbow (3.1.1)
|
|
15
|
+
regexp_parser (2.11.3)
|
|
16
|
+
rubocop (1.82.1)
|
|
17
|
+
json (~> 2.3)
|
|
18
|
+
language_server-protocol (~> 3.17.0.2)
|
|
19
|
+
lint_roller (~> 1.1.0)
|
|
20
|
+
parallel (~> 1.10)
|
|
21
|
+
parser (>= 3.3.0.2)
|
|
22
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
23
|
+
regexp_parser (>= 2.9.3, < 3.0)
|
|
24
|
+
rubocop-ast (>= 1.48.0, < 2.0)
|
|
25
|
+
ruby-progressbar (~> 1.7)
|
|
26
|
+
unicode-display_width (>= 2.4.0, < 4.0)
|
|
27
|
+
rubocop-ast (1.49.0)
|
|
28
|
+
parser (>= 3.3.7.2)
|
|
29
|
+
prism (~> 1.7)
|
|
30
|
+
rubocop-capybara (2.22.1)
|
|
31
|
+
lint_roller (~> 1.1)
|
|
32
|
+
rubocop (~> 1.72, >= 1.72.1)
|
|
33
|
+
rubocop-factory_bot (2.28.0)
|
|
34
|
+
lint_roller (~> 1.1)
|
|
35
|
+
rubocop (~> 1.72, >= 1.72.1)
|
|
36
|
+
rubocop-performance (1.26.1)
|
|
37
|
+
lint_roller (~> 1.1)
|
|
38
|
+
rubocop (>= 1.75.0, < 2.0)
|
|
39
|
+
rubocop-ast (>= 1.47.1, < 2.0)
|
|
40
|
+
rubocop-rspec (3.9.0)
|
|
41
|
+
lint_roller (~> 1.1)
|
|
42
|
+
rubocop (~> 1.81)
|
|
43
|
+
rubocop-rspec_rails (2.32.0)
|
|
44
|
+
lint_roller (~> 1.1)
|
|
45
|
+
rubocop (~> 1.72, >= 1.72.1)
|
|
46
|
+
rubocop-rspec (~> 3.5)
|
|
47
|
+
rubocop-thread_safety (0.7.3)
|
|
48
|
+
lint_roller (~> 1.1)
|
|
49
|
+
rubocop (~> 1.72, >= 1.72.1)
|
|
50
|
+
rubocop-ast (>= 1.44.0, < 2.0)
|
|
51
|
+
ruby-progressbar (1.13.0)
|
|
52
|
+
standard (1.53.0)
|
|
53
|
+
language_server-protocol (~> 3.17.0.2)
|
|
54
|
+
lint_roller (~> 1.0)
|
|
55
|
+
rubocop (~> 1.82.0)
|
|
56
|
+
standard-custom (~> 1.0.0)
|
|
57
|
+
standard-performance (~> 1.8)
|
|
58
|
+
standard-custom (1.0.2)
|
|
59
|
+
lint_roller (~> 1.0)
|
|
60
|
+
rubocop (~> 1.50)
|
|
61
|
+
standard-performance (1.9.0)
|
|
62
|
+
lint_roller (~> 1.1)
|
|
63
|
+
rubocop-performance (~> 1.26.0)
|
|
64
|
+
standard-rspec (0.3.1)
|
|
65
|
+
lint_roller (>= 1.0)
|
|
66
|
+
rubocop-capybara (~> 2.22)
|
|
67
|
+
rubocop-factory_bot (~> 2.27)
|
|
68
|
+
rubocop-rspec (~> 3.5)
|
|
69
|
+
rubocop-rspec_rails (~> 2.31)
|
|
70
|
+
unicode-display_width (3.2.0)
|
|
71
|
+
unicode-emoji (~> 4.1)
|
|
72
|
+
unicode-emoji (4.2.0)
|
|
73
|
+
yard (0.9.38)
|
|
74
|
+
yard-lint (1.4.0)
|
|
75
|
+
yard (~> 0.9)
|
|
76
|
+
zeitwerk (~> 2.6)
|
|
77
|
+
zeitwerk (2.7.4)
|
|
78
|
+
|
|
79
|
+
PLATFORMS
|
|
80
|
+
ruby
|
|
81
|
+
x86_64-linux
|
|
82
|
+
|
|
83
|
+
DEPENDENCIES
|
|
84
|
+
rubocop-performance
|
|
85
|
+
rubocop-rspec
|
|
86
|
+
rubocop-thread_safety
|
|
87
|
+
standard
|
|
88
|
+
standard-performance
|
|
89
|
+
standard-rspec
|
|
90
|
+
yard-lint
|
|
91
|
+
|
|
92
|
+
CHECKSUMS
|
|
93
|
+
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
|
|
94
|
+
json (2.18.0) sha256=b10506aee4183f5cf49e0efc48073d7b75843ce3782c68dbeb763351c08fd505
|
|
95
|
+
language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
|
|
96
|
+
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
|
|
97
|
+
parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130
|
|
98
|
+
parser (3.3.10.1) sha256=06f6a725d2cd91e5e7f2b7c32ba143631e1f7c8ae2fb918fc4cebec187e6a688
|
|
99
|
+
prism (1.8.0) sha256=84453a16ef5530ea62c5f03ec16b52a459575ad4e7b9c2b360fd8ce2c39c1254
|
|
100
|
+
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
|
|
101
|
+
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
|
|
102
|
+
regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
|
|
103
|
+
rubocop (1.82.1) sha256=09f1a6a654a960eda767aebea33e47603080f8e9c9a3f019bf9b94c9cab5e273
|
|
104
|
+
rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd
|
|
105
|
+
rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c
|
|
106
|
+
rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb
|
|
107
|
+
rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
|
|
108
|
+
rubocop-rspec (3.9.0) sha256=8fa70a3619408237d789aeecfb9beef40576acc855173e60939d63332fdb55e2
|
|
109
|
+
rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100
|
|
110
|
+
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
|
|
111
|
+
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
|
|
112
|
+
standard (1.53.0) sha256=f3c9493385db7079d0abce6f7582f553122156997b81258cd361d3480eeacf9c
|
|
113
|
+
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
|
|
114
|
+
standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
|
|
115
|
+
standard-rspec (0.3.1) sha256=67bc957281cacf24f0d88235ca1bf28a8995265b1a60eb519cd0451858b56a22
|
|
116
|
+
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
|
|
117
|
+
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
|
|
118
|
+
yard (0.9.38) sha256=721fb82afb10532aa49860655f6cc2eaa7130889df291b052e1e6b268283010f
|
|
119
|
+
yard-lint (1.4.0) sha256=7dd88fbb08fd77cb840bea899d58812817b36d92291b5693dd0eeb3af9f91f0f
|
|
120
|
+
zeitwerk (2.7.4) sha256=2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b
|
|
121
|
+
|
|
122
|
+
BUNDLED WITH
|
|
123
|
+
4.0.3
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
karafka-web (0.11.
|
|
4
|
+
karafka-web (0.11.6)
|
|
5
5
|
erubi (~> 1.4)
|
|
6
6
|
karafka (>= 2.5.2, < 2.6.0)
|
|
7
7
|
karafka-core (>= 2.5.0, < 2.6.0)
|
|
@@ -26,7 +26,8 @@ GEM
|
|
|
26
26
|
uri (>= 0.13.1)
|
|
27
27
|
base64 (0.3.0)
|
|
28
28
|
bigdecimal (3.3.1)
|
|
29
|
-
byebug (
|
|
29
|
+
byebug (13.0.0)
|
|
30
|
+
reline (>= 0.6.0)
|
|
30
31
|
concurrent-ruby (1.3.5)
|
|
31
32
|
connection_pool (2.5.4)
|
|
32
33
|
diff-lcs (1.6.2)
|
|
@@ -53,6 +54,7 @@ GEM
|
|
|
53
54
|
raabro (~> 1.4)
|
|
54
55
|
i18n (1.14.7)
|
|
55
56
|
concurrent-ruby (~> 1.0)
|
|
57
|
+
io-console (0.8.2)
|
|
56
58
|
json (2.16.0)
|
|
57
59
|
karafka (2.5.2)
|
|
58
60
|
base64 (~> 0.2)
|
|
@@ -96,24 +98,24 @@ GEM
|
|
|
96
98
|
logger (1.7.0)
|
|
97
99
|
mini_portile2 (2.8.9)
|
|
98
100
|
minitest (5.26.1)
|
|
99
|
-
nokogiri (1.
|
|
101
|
+
nokogiri (1.19.0)
|
|
100
102
|
mini_portile2 (~> 2.8.2)
|
|
101
103
|
racc (~> 1.4)
|
|
102
|
-
nokogiri (1.
|
|
104
|
+
nokogiri (1.19.0-aarch64-linux-gnu)
|
|
103
105
|
racc (~> 1.4)
|
|
104
|
-
nokogiri (1.
|
|
106
|
+
nokogiri (1.19.0-aarch64-linux-musl)
|
|
105
107
|
racc (~> 1.4)
|
|
106
|
-
nokogiri (1.
|
|
108
|
+
nokogiri (1.19.0-arm-linux-gnu)
|
|
107
109
|
racc (~> 1.4)
|
|
108
|
-
nokogiri (1.
|
|
110
|
+
nokogiri (1.19.0-arm-linux-musl)
|
|
109
111
|
racc (~> 1.4)
|
|
110
|
-
nokogiri (1.
|
|
112
|
+
nokogiri (1.19.0-arm64-darwin)
|
|
111
113
|
racc (~> 1.4)
|
|
112
|
-
nokogiri (1.
|
|
114
|
+
nokogiri (1.19.0-x86_64-darwin)
|
|
113
115
|
racc (~> 1.4)
|
|
114
|
-
nokogiri (1.
|
|
116
|
+
nokogiri (1.19.0-x86_64-linux-gnu)
|
|
115
117
|
racc (~> 1.4)
|
|
116
|
-
nokogiri (1.
|
|
118
|
+
nokogiri (1.19.0-x86_64-linux-musl)
|
|
117
119
|
racc (~> 1.4)
|
|
118
120
|
ostruct (0.6.3)
|
|
119
121
|
raabro (1.4.0)
|
|
@@ -125,6 +127,8 @@ GEM
|
|
|
125
127
|
rack (>= 3.0.0.beta1)
|
|
126
128
|
webrick
|
|
127
129
|
rake (13.3.1)
|
|
130
|
+
reline (0.6.3)
|
|
131
|
+
io-console (~> 0.5)
|
|
128
132
|
roda (3.98.0)
|
|
129
133
|
rack
|
|
130
134
|
rspec (3.13.2)
|
|
@@ -156,10 +160,6 @@ GEM
|
|
|
156
160
|
karafka-rdkafka (>= 0.20.0)
|
|
157
161
|
zeitwerk (~> 2.3)
|
|
158
162
|
webrick (1.9.1)
|
|
159
|
-
yard (0.9.37)
|
|
160
|
-
yard-lint (1.2.3)
|
|
161
|
-
yard (~> 0.9)
|
|
162
|
-
zeitwerk (~> 2.6)
|
|
163
163
|
zeitwerk (2.7.3)
|
|
164
164
|
|
|
165
165
|
PLATFORMS
|
|
@@ -186,7 +186,6 @@ DEPENDENCIES
|
|
|
186
186
|
rackup (~> 0.2)
|
|
187
187
|
rspec
|
|
188
188
|
simplecov
|
|
189
|
-
yard-lint
|
|
190
189
|
|
|
191
190
|
BUNDLED WITH
|
|
192
191
|
2.7.1
|
data/README.md
CHANGED
|
@@ -4,31 +4,31 @@
|
|
|
4
4
|
[](http://badge.fury.io/rb/karafka-web)
|
|
5
5
|
[](https://slack.karafka.io)
|
|
6
6
|
|
|
7
|
-
Karafka Web UI is a
|
|
7
|
+
Karafka Web UI is a web-based interface for the [Karafka framework](https://github.com/karafka/karafka). The Web UI provides a convenient way for developers to monitor and manage their Kafka-based applications, eliminating the need to use command-line tools or third-party software.
|
|
8
8
|
|
|
9
|
-
It
|
|
9
|
+
It provides easy access to various metrics, including the number of messages consumed, the number of errors, and the number of consumers in operation. It also provides a way to view the various Kafka topics, consumers, and groups used by the application.
|
|
10
10
|
|
|
11
11
|
> [!IMPORTANT]
|
|
12
|
-
>
|
|
12
|
+
> Documentation for all ecosystem components, including the Web UI, is available in the [Karafka framework docs Wiki](https://karafka.io/docs/).
|
|
13
13
|
|
|
14
14
|
## Getting started
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
To get started with the Karafka Web UI, see the [Web UI](https://karafka.io/docs/#web-ui) chapter of the Karafka documentation Wiki.
|
|
17
17
|
|
|
18
18
|

|
|
19
19
|
|
|
20
20
|
## Karafka Pro Enhanced Web UI
|
|
21
21
|
|
|
22
|
-
The Enhanced Web UI,
|
|
22
|
+
The Enhanced Web UI, in addition to all the features from the OSS version, also offers additional features and capabilities not available in the free version, making it a more robust option for those seeking enhanced monitoring and management capabilities for their Karafka applications. Some of the key benefits of the Enhanced Web UI version include the following:
|
|
23
23
|
|
|
24
|
-
- Real-time and historical processing and utilization metrics
|
|
25
|
-
- Real-time topics lag awareness
|
|
26
|
-
- Enhanced
|
|
27
|
-
- Consumer process inspection to quickly analyze the state of a given consuming process
|
|
28
|
-
- Consumer jobs inspection to view currently running jobs on a per-process basis
|
|
29
|
-
-
|
|
30
|
-
- Data Explorer allowing for viewing and exploring the data produced to Kafka topics
|
|
31
|
-
- Enhanced error reporting allowing for backtrace inspection and providing multi-partition support
|
|
32
|
-
- DLQ / Dead insights allowing
|
|
24
|
+
- Real-time and historical processing and utilization metrics
|
|
25
|
+
- Real-time topics lag awareness
|
|
26
|
+
- Enhanced consumer utilization metrics providing much better insights into process and resource utilization
|
|
27
|
+
- Consumer process inspection to quickly analyze the state of a given consuming process
|
|
28
|
+
- Consumer jobs inspection to view currently running jobs on a per-process basis
|
|
29
|
+
- A health dashboard containing general consumption overview information
|
|
30
|
+
- Data Explorer allowing for viewing and exploring the data produced to Kafka topics and understanding the routing table and deserializing data before it is displayed
|
|
31
|
+
- Enhanced error reporting allowing for backtrace inspection and providing multi-partition support
|
|
32
|
+
- DLQ / Dead insights allowing navigation through DLQ topics and messages dispatched
|
|
33
33
|
|
|
34
|
-
Help me provide high-quality open-source software.
|
|
34
|
+
Help me provide high-quality open-source software. For more details, see the Karafka [homepage](https://karafka.io).
|
data/Rakefile
CHANGED
data/bin/balance_specs
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Balances spec files across N workers using timing data
|
|
5
|
+
# Uses greedy bin-packing: assign each file to worker with lowest total time
|
|
6
|
+
#
|
|
7
|
+
# Usage: bin/balance_specs <regular|pro> <num_workers>
|
|
8
|
+
#
|
|
9
|
+
# Output: JSON array of arrays where each inner array contains the spec files
|
|
10
|
+
# assigned to that worker
|
|
11
|
+
#
|
|
12
|
+
# Example:
|
|
13
|
+
# bin/balance_specs regular 4
|
|
14
|
+
# [["spec/a.rb","spec/d.rb"],["spec/b.rb"],["spec/c.rb"],["spec/e.rb"]]
|
|
15
|
+
|
|
16
|
+
require 'json'
|
|
17
|
+
|
|
18
|
+
TIMINGS_DIR = File.expand_path('../spec/timings', __dir__)
|
|
19
|
+
DEFAULT_TIME = 1.0 # Default time for files not in timing data
|
|
20
|
+
|
|
21
|
+
# Loads timing data from a JSON file for the given spec type
|
|
22
|
+
#
|
|
23
|
+
# @param specs_type [String] the type of specs ('regular' or 'pro')
|
|
24
|
+
# @return [Hash<String, Float>] hash mapping file paths to execution times in seconds
|
|
25
|
+
def load_timings(specs_type)
|
|
26
|
+
file_path = File.join(TIMINGS_DIR, "#{specs_type}.json")
|
|
27
|
+
|
|
28
|
+
if File.exist?(file_path)
|
|
29
|
+
JSON.parse(File.read(file_path))
|
|
30
|
+
else
|
|
31
|
+
{}
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Returns a sorted list of spec files for the given spec type
|
|
36
|
+
#
|
|
37
|
+
# @param specs_type [String] the type of specs ('regular' or 'pro')
|
|
38
|
+
# @return [Array<String>] sorted array of spec file paths
|
|
39
|
+
def get_spec_files(specs_type)
|
|
40
|
+
all_specs = Dir.glob('spec/lib/karafka/web/**/*_spec.rb').sort
|
|
41
|
+
|
|
42
|
+
case specs_type
|
|
43
|
+
when 'pro'
|
|
44
|
+
all_specs.select { |f| f.include?('/pro/') }
|
|
45
|
+
when 'regular'
|
|
46
|
+
all_specs.reject { |f| f.include?('/pro/') }
|
|
47
|
+
else
|
|
48
|
+
warn "Unknown specs type: #{specs_type}"
|
|
49
|
+
exit 1
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Balances spec files across workers using greedy bin-packing algorithm
|
|
54
|
+
#
|
|
55
|
+
# Files are sorted by execution time (descending) and each file is assigned
|
|
56
|
+
# to the worker with the lowest total time. This minimizes the imbalance
|
|
57
|
+
# between the slowest and fastest workers.
|
|
58
|
+
#
|
|
59
|
+
# @param files [Array<String>] list of spec file paths to balance
|
|
60
|
+
# @param timings [Hash<String, Float>] hash mapping file paths to execution times
|
|
61
|
+
# @param num_workers [Integer] number of workers to distribute files across
|
|
62
|
+
# @return [Array<Hash>] array of worker hashes, each with :files and :total_time keys
|
|
63
|
+
def balance_files(files, timings, num_workers)
|
|
64
|
+
# Get timing for each file, using default if not found
|
|
65
|
+
# Handle both "./spec/..." and "spec/..." path formats
|
|
66
|
+
files_with_times = files.map do |file|
|
|
67
|
+
time = timings[file] || timings["./#{file}"] || DEFAULT_TIME
|
|
68
|
+
[file, time]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Sort by time descending (largest first for better bin packing)
|
|
72
|
+
files_with_times.sort_by! { |_, time| -time }
|
|
73
|
+
|
|
74
|
+
# Initialize workers
|
|
75
|
+
workers = Array.new(num_workers) { { files: [], total_time: 0.0 } }
|
|
76
|
+
|
|
77
|
+
# Greedy assignment: assign each file to worker with lowest total time
|
|
78
|
+
files_with_times.each do |file, time|
|
|
79
|
+
# Find worker with minimum total time
|
|
80
|
+
min_worker = workers.min_by { |w| w[:total_time] }
|
|
81
|
+
min_worker[:files] << file
|
|
82
|
+
min_worker[:total_time] += time
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
workers
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Prints balance information to stderr for debugging/visibility
|
|
89
|
+
#
|
|
90
|
+
# @param workers [Array<Hash>] array of worker hashes with :files and :total_time keys
|
|
91
|
+
def print_balance_info(workers)
|
|
92
|
+
total_time = workers.sum { |w| w[:total_time] }
|
|
93
|
+
max_time = workers.max_by { |w| w[:total_time] }[:total_time]
|
|
94
|
+
min_time = workers.min_by { |w| w[:total_time] }[:total_time]
|
|
95
|
+
|
|
96
|
+
warn "Balance info:"
|
|
97
|
+
workers.each_with_index do |worker, i|
|
|
98
|
+
warn " Worker #{i + 1}: #{worker[:files].size} files, #{worker[:total_time].round(1)}s"
|
|
99
|
+
end
|
|
100
|
+
warn " Total: #{total_time.round(1)}s, Max: #{max_time.round(1)}s, Imbalance: #{(max_time - min_time).round(1)}s"
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Main
|
|
104
|
+
specs_type = ARGV[0]
|
|
105
|
+
num_workers = (ARGV[1] || '4').to_i
|
|
106
|
+
|
|
107
|
+
unless specs_type
|
|
108
|
+
warn "Usage: bin/balance_specs <regular|pro> <num_workers>"
|
|
109
|
+
exit 1
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
timings = load_timings(specs_type)
|
|
113
|
+
files = get_spec_files(specs_type)
|
|
114
|
+
workers = balance_files(files, timings, num_workers)
|
|
115
|
+
|
|
116
|
+
# Print balance info to stderr
|
|
117
|
+
print_balance_info(workers)
|
|
118
|
+
|
|
119
|
+
# Output file lists as JSON array of arrays
|
|
120
|
+
puts JSON.generate(workers.map { |w| w[:files] })
|
data/bin/check_coverage
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Collates SimpleCov results from parallel spec runs and checks minimum coverage
|
|
4
|
+
#
|
|
5
|
+
# This script should be run after bin/rspecs_parallel or bin/rspecs to verify
|
|
6
|
+
# code coverage meets the minimum threshold.
|
|
7
|
+
#
|
|
8
|
+
# Coverage thresholds are defined in spec/support/coverage_config.rb
|
|
9
|
+
|
|
10
|
+
set -e
|
|
11
|
+
|
|
12
|
+
echo "Collating SimpleCov coverage results..."
|
|
13
|
+
|
|
14
|
+
bundle exec ruby -e "
|
|
15
|
+
require 'simplecov'
|
|
16
|
+
require_relative 'spec/support/coverage_config'
|
|
17
|
+
|
|
18
|
+
SimpleCov.collate Dir['coverage/.resultset.json'], 'rails' do
|
|
19
|
+
add_filter '/spec/'
|
|
20
|
+
add_filter '/vendor/'
|
|
21
|
+
add_filter '/gems/'
|
|
22
|
+
add_filter '/.bundle/'
|
|
23
|
+
add_filter '/doc/'
|
|
24
|
+
add_filter '/config/'
|
|
25
|
+
enable_coverage :branch
|
|
26
|
+
minimum_coverage(
|
|
27
|
+
line: CoverageConfig::LINE_COVERAGE,
|
|
28
|
+
branch: CoverageConfig::BRANCH_COVERAGE
|
|
29
|
+
)
|
|
30
|
+
end
|
|
31
|
+
"
|
data/bin/collect_timings
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Collects timing data from RSpec runs for both regular and pro specs.
|
|
5
|
+
# Results are stored in spec/timings/{regular,pro}.json for use by bin/balance_specs.
|
|
6
|
+
#
|
|
7
|
+
# Usage: bin/collect_timings
|
|
8
|
+
|
|
9
|
+
require 'json'
|
|
10
|
+
require 'open3'
|
|
11
|
+
require 'fileutils'
|
|
12
|
+
|
|
13
|
+
TIMINGS_DIR = File.expand_path('../spec/timings', __dir__)
|
|
14
|
+
|
|
15
|
+
# Returns spec files for the given type
|
|
16
|
+
#
|
|
17
|
+
# @param specs_type [String] 'regular' or 'pro'
|
|
18
|
+
# @return [Array<String>] sorted array of spec file paths
|
|
19
|
+
def spec_files(specs_type)
|
|
20
|
+
all_specs = Dir.glob('spec/lib/karafka/web/**/*_spec.rb').sort
|
|
21
|
+
|
|
22
|
+
case specs_type
|
|
23
|
+
when 'pro' then all_specs.select { |f| f.include?('/pro/') }
|
|
24
|
+
when 'regular' then all_specs.reject { |f| f.include?('/pro/') }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Collects timing data by running specs with JSON output
|
|
29
|
+
#
|
|
30
|
+
# @param specs_type [String] 'regular' or 'pro'
|
|
31
|
+
# @return [Hash<String, Float>] file paths to execution times in seconds
|
|
32
|
+
def collect_timings(specs_type)
|
|
33
|
+
puts "Collecting #{specs_type} specs timings..."
|
|
34
|
+
|
|
35
|
+
env = { 'SPECS_TYPE' => specs_type }
|
|
36
|
+
files = spec_files(specs_type)
|
|
37
|
+
|
|
38
|
+
puts " Running #{files.size} spec files..."
|
|
39
|
+
|
|
40
|
+
# Run all specs at once with JSON output
|
|
41
|
+
cmd = ['bundle', 'exec', 'rspec', *files, '--format', 'json']
|
|
42
|
+
stdout, _stderr, _status = Open3.capture3(env, *cmd)
|
|
43
|
+
|
|
44
|
+
# Parse timing from JSON output
|
|
45
|
+
data = JSON.parse(stdout)
|
|
46
|
+
timings = {}
|
|
47
|
+
|
|
48
|
+
data['examples'].each do |example|
|
|
49
|
+
file = example['file_path']
|
|
50
|
+
timings[file] ||= 0
|
|
51
|
+
timings[file] += example['run_time'] || 0
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
timings.transform_values! { |v| v.round(3) }
|
|
55
|
+
timings
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Saves timing data to JSON file
|
|
59
|
+
#
|
|
60
|
+
# @param specs_type [String] 'regular' or 'pro'
|
|
61
|
+
# @param timings [Hash<String, Float>] timing data
|
|
62
|
+
def save_timings(specs_type, timings)
|
|
63
|
+
FileUtils.mkdir_p(TIMINGS_DIR)
|
|
64
|
+
file_path = File.join(TIMINGS_DIR, "#{specs_type}.json")
|
|
65
|
+
|
|
66
|
+
sorted = timings.sort_by { |_, time| -time }.to_h
|
|
67
|
+
File.write(file_path, JSON.pretty_generate(sorted))
|
|
68
|
+
|
|
69
|
+
total = timings.values.sum
|
|
70
|
+
puts " Saved #{file_path}: #{timings.size} files, #{total.round(1)}s total"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Main
|
|
74
|
+
puts '=== Collecting Spec Timings ==='
|
|
75
|
+
puts
|
|
76
|
+
|
|
77
|
+
%w[regular pro].each do |specs_type|
|
|
78
|
+
timings = collect_timings(specs_type)
|
|
79
|
+
save_timings(specs_type, timings)
|
|
80
|
+
puts
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
puts 'Done!'
|
data/bin/rspecs
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
|
|
3
|
+
# Runs all specs sequentially (regular then pro)
|
|
4
|
+
# For parallel execution, use bin/rspecs_parallel
|
|
5
|
+
|
|
3
6
|
set -e
|
|
4
7
|
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
+
|
|
10
|
+
echo "Running specs in sequential mode..."
|
|
11
|
+
|
|
5
12
|
SPECS_TYPE=regular bundle exec rspec \
|
|
6
13
|
spec/lib \
|
|
7
14
|
--exclude-pattern "**/pro/**/*_spec.rb"
|
|
8
15
|
|
|
9
16
|
SPECS_TYPE=pro bundle exec rspec \
|
|
10
17
|
spec/lib/karafka/web/pro
|
|
18
|
+
|
|
19
|
+
# Run coverage check
|
|
20
|
+
"$SCRIPT_DIR/check_coverage"
|