karafka-web 0.11.5 → 1.0.0.beta1
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 +32 -0
- data/Gemfile +10 -10
- data/Gemfile.lint +14 -0
- data/Gemfile.lint.lock +108 -0
- data/Gemfile.lock +69 -93
- data/README.md +15 -15
- data/Rakefile +28 -2
- data/bin/balance_tests +120 -0
- data/bin/check_coverage +31 -0
- data/bin/collect_timings +79 -0
- data/bin/integrations +5 -5
- data/bin/rspecs +12 -5
- data/bin/tests_parallel +124 -0
- data/bin/verify_kafka_warnings +2 -0
- data/docker-compose.yml +1 -1
- data/gulpfile.js +14 -11
- 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 +41 -34
- 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 +4 -5
- 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_reports/1772128000_add_poll_interval_to_subscription_groups.rb +48 -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 +28 -4
- data/lib/karafka/web/pro/commanding/commands/consumers/quiet.rb +30 -5
- data/lib/karafka/web/pro/commanding/commands/consumers/stop.rb +30 -5
- data/lib/karafka/web/pro/commanding/commands/consumers/trace.rb +29 -4
- data/lib/karafka/web/pro/commanding/commands/partitions/pause.rb +28 -3
- data/lib/karafka/web/pro/commanding/commands/partitions/resume.rb +28 -3
- data/lib/karafka/web/pro/commanding/commands/partitions/seek.rb +28 -3
- data/lib/karafka/web/pro/commanding/commands/topics/pause.rb +56 -0
- data/lib/karafka/web/pro/commanding/commands/topics/resume.rb +57 -0
- data/lib/karafka/web/pro/commanding/config.rb +31 -5
- data/lib/karafka/web/pro/commanding/contracts/config.rb +29 -4
- data/lib/karafka/web/pro/commanding/dispatcher.rb +69 -26
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/base.rb +28 -3
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/pause.rb +29 -4
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/resume.rb +28 -3
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/seek.rb +32 -7
- data/lib/karafka/web/pro/commanding/handlers/partitions/executor.rb +44 -12
- data/lib/karafka/web/pro/commanding/handlers/partitions/listener.rb +55 -8
- data/lib/karafka/web/pro/commanding/handlers/partitions/tracker.rb +70 -13
- data/lib/karafka/web/pro/commanding/handlers/topics/commands/base.rb +117 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/commands/pause.rb +84 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/commands/resume.rb +64 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/executor.rb +83 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/listener.rb +90 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/tracker.rb +89 -0
- data/lib/karafka/web/pro/commanding/listener.rb +31 -6
- data/lib/karafka/web/pro/commanding/manager.rb +52 -23
- data/lib/karafka/web/pro/commanding/matcher.rb +54 -18
- data/lib/karafka/web/pro/commanding/matchers/base.rb +95 -0
- data/lib/karafka/web/pro/commanding/matchers/consumer_group_id.rb +66 -0
- data/lib/karafka/web/pro/commanding/matchers/message_type.rb +57 -0
- data/lib/karafka/web/pro/commanding/matchers/partition_id.rb +69 -0
- data/lib/karafka/web/pro/commanding/matchers/process_id.rb +66 -0
- data/lib/karafka/web/pro/commanding/matchers/schema_version.rb +52 -0
- data/lib/karafka/web/pro/commanding/matchers/topic.rb +66 -0
- data/lib/karafka/web/pro/commanding/request.rb +27 -2
- data/lib/karafka/web/pro/commanding.rb +27 -2
- data/lib/karafka/web/pro/loader.rb +28 -3
- data/lib/karafka/web/pro/ui/app.rb +33 -8
- data/lib/karafka/web/pro/ui/controllers/base_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/cluster_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/base_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/commanding_controller.rb +45 -15
- data/lib/karafka/web/pro/ui/controllers/consumers/commands_controller.rb +31 -6
- data/lib/karafka/web/pro/ui/controllers/consumers/consumers_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/controls_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/jobs_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/base_controller.rb +51 -42
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/offsets_controller.rb +44 -17
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/pauses_controller.rb +67 -33
- data/lib/karafka/web/pro/ui/controllers/consumers/topics/pauses_controller.rb +172 -0
- data/lib/karafka/web/pro/ui/controllers/dashboard_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/dlq_controller.rb +34 -9
- data/lib/karafka/web/pro/ui/controllers/errors_controller.rb +33 -9
- data/lib/karafka/web/pro/ui/controllers/explorer/base_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/explorer/explorer_controller.rb +33 -5
- data/lib/karafka/web/pro/ui/controllers/explorer/messages_controller.rb +42 -10
- data/lib/karafka/web/pro/ui/controllers/explorer/search_controller.rb +31 -6
- data/lib/karafka/web/pro/ui/controllers/health_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/jobs_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/recurring_tasks_controller.rb +30 -5
- data/lib/karafka/web/pro/ui/controllers/routing_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/base_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/explorer_controller.rb +33 -8
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/messages_controller.rb +29 -4
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/schedules_controller.rb +34 -9
- data/lib/karafka/web/pro/ui/controllers/status_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/support_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/topics/base_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/controllers/topics/configs_controller.rb +28 -3
- data/lib/karafka/web/pro/ui/controllers/topics/distributions_controller.rb +28 -3
- data/lib/karafka/web/pro/ui/controllers/topics/offsets_controller.rb +30 -3
- data/lib/karafka/web/pro/ui/controllers/topics/replications_controller.rb +49 -2
- data/lib/karafka/web/pro/ui/controllers/topics/topics_controller.rb +32 -7
- data/lib/karafka/web/pro/ui/controllers/ux_controller.rb +27 -2
- data/lib/karafka/web/pro/ui/lib/branding/config.rb +27 -2
- data/lib/karafka/web/pro/ui/lib/branding/contracts/config.rb +29 -4
- data/lib/karafka/web/pro/ui/lib/branding.rb +27 -2
- data/lib/karafka/web/pro/ui/lib/features.rb +27 -2
- data/lib/karafka/web/pro/ui/lib/patterns_detector.rb +27 -2
- data/lib/karafka/web/pro/ui/lib/policies/config.rb +27 -2
- data/lib/karafka/web/pro/ui/lib/policies/contracts/config.rb +29 -4
- data/lib/karafka/web/pro/ui/lib/policies/messages.rb +28 -3
- data/lib/karafka/web/pro/ui/lib/policies/requests.rb +27 -2
- data/lib/karafka/web/pro/ui/lib/policies.rb +27 -2
- data/lib/karafka/web/pro/ui/lib/safe_runner.rb +28 -3
- data/lib/karafka/web/pro/ui/lib/search/config.rb +27 -2
- data/lib/karafka/web/pro/ui/lib/search/contracts/config.rb +29 -4
- data/lib/karafka/web/pro/ui/lib/search/contracts/form.rb +32 -6
- data/lib/karafka/web/pro/ui/lib/search/matchers/base.rb +29 -4
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_header_includes.rb +27 -2
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_key_includes.rb +27 -2
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_payload_includes.rb +28 -3
- data/lib/karafka/web/pro/ui/lib/search/normalizer.rb +34 -9
- data/lib/karafka/web/pro/ui/lib/search/runner.rb +40 -16
- data/lib/karafka/web/pro/ui/lib/search.rb +27 -2
- data/lib/karafka/web/pro/ui/routes/base.rb +27 -2
- data/lib/karafka/web/pro/ui/routes/cluster.rb +29 -4
- data/lib/karafka/web/pro/ui/routes/consumers.rb +91 -49
- data/lib/karafka/web/pro/ui/routes/dashboard.rb +28 -3
- data/lib/karafka/web/pro/ui/routes/dlq.rb +28 -3
- data/lib/karafka/web/pro/ui/routes/errors.rb +29 -4
- data/lib/karafka/web/pro/ui/routes/explorer.rb +41 -16
- data/lib/karafka/web/pro/ui/routes/health.rb +34 -9
- data/lib/karafka/web/pro/ui/routes/jobs.rb +31 -6
- data/lib/karafka/web/pro/ui/routes/recurring_tasks.rb +37 -12
- data/lib/karafka/web/pro/ui/routes/routing.rb +28 -3
- data/lib/karafka/web/pro/ui/routes/scheduled_messages.rb +36 -11
- data/lib/karafka/web/pro/ui/routes/status.rb +28 -3
- data/lib/karafka/web/pro/ui/routes/support.rb +28 -3
- data/lib/karafka/web/pro/ui/routes/topics.rb +37 -12
- data/lib/karafka/web/pro/ui/routes/ux.rb +28 -3
- data/lib/karafka/web/pro/ui/views/cluster/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/cluster/_broker.erb +19 -2
- data/lib/karafka/web/pro/ui/views/cluster/_config.erb +20 -3
- data/lib/karafka/web/pro/ui/views/cluster/_tabs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/cluster/index.erb +19 -2
- data/lib/karafka/web/pro/ui/views/cluster/show.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_backtrace.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_command.erb +30 -66
- data/lib/karafka/web/pro/ui/views/consumers/commands/_command_details.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_empty.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_command.erb +25 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_schema.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_table.erb +21 -4
- data/lib/karafka/web/pro/ui/views/consumers/commands/details/_acceptance.erb +25 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/details/_request.erb +25 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/details/_result.erb +33 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/index.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_request.erb +58 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_response.erb +52 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_command_name_badge.erb +46 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_request.erb +53 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_response.erb +52 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/show.erb +20 -15
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer_performance.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_tabs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_commands.erb +19 -5
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_consumer_group.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_metrics.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_no_subscriptions.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition.erb +21 -5
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition_edit_options.erb +22 -5
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_stopped.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_subscription_group.erb +37 -7
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_tabs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/details.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/index.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/performance.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/subscriptions.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/controls/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/controls/_controls.erb +20 -7
- data/lib/karafka/web/pro/ui/views/consumers/controls/index.erb +41 -9
- data/lib/karafka/web/pro/ui/views/consumers/jobs/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/jobs/_job.erb +20 -3
- data/lib/karafka/web/pro/ui/views/consumers/jobs/_no_jobs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/jobs/pending.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/jobs/running.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_basics.erb +26 -13
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_breadcrumbs.erb +43 -46
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_form.erb +31 -15
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_not_running_error.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_running_warning.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/edit.erb +23 -6
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_active_not_editable.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_adjusting_warning.erb +20 -3
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_breadcrumbs.erb +46 -48
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_edit_form.erb +24 -9
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_lrj_not_manageable.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_new_form.erb +28 -13
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_not_running.erb +19 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_partition_info.erb +63 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/edit.erb +22 -5
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/new.erb +22 -5
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_adjusting_warning.erb +44 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_breadcrumbs.erb +52 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_edit_form.erb +71 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_lrj_not_manageable.erb +36 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_new_form.erb +90 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_not_running.erb +33 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_topic_info.erb +78 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/edit.erb +35 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/new.erb +35 -0
- data/lib/karafka/web/pro/ui/views/dashboard/index.erb +19 -2
- data/lib/karafka/web/pro/ui/views/dlq/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/dlq/_no_topics.erb +19 -2
- data/lib/karafka/web/pro/ui/views/dlq/_topic.erb +19 -2
- data/lib/karafka/web/pro/ui/views/dlq/index.erb +19 -2
- data/lib/karafka/web/pro/ui/views/errors/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/errors/_error.erb +20 -3
- data/lib/karafka/web/pro/ui/views/errors/_partition_option.erb +24 -5
- data/lib/karafka/web/pro/ui/views/errors/_selector.erb +20 -3
- data/lib/karafka/web/pro/ui/views/errors/_table.erb +20 -3
- data/lib/karafka/web/pro/ui/views/errors/index.erb +45 -26
- data/lib/karafka/web/pro/ui/views/errors/partition.erb +56 -37
- data/lib/karafka/web/pro/ui/views/errors/show.erb +20 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_failed_deserialization.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_filtered.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_message.erb +20 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_no_topics.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_partition_option.erb +24 -5
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_selector.erb +20 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_topic.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/index.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_metadata.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_payload.erb +28 -4
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_resources_utilization.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_too_big_to_be_displayed.erb +21 -4
- data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_detail.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_headers.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_key.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_cleaned.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_empty.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_messages.erb +20 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_time_selector.erb +20 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_timestamp_selector.erb +21 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition.erb +58 -39
- data/lib/karafka/web/pro/ui/views/explorer/explorer/show.erb +20 -4
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_actions.erb +45 -26
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_empty.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_limited.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/messages/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/messages/forward.erb +34 -18
- data/lib/karafka/web/pro/ui/views/explorer/search/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_fix_errors.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_metadata.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_no_results.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_no_search_criteria.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_search_criteria.erb +20 -3
- data/lib/karafka/web/pro/ui/views/explorer/search/_search_modal.erb +33 -15
- data/lib/karafka/web/pro/ui/views/explorer/search/_timeout.erb +19 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/index.erb +19 -2
- data/lib/karafka/web/pro/ui/views/health/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/health/_no_data.erb +19 -2
- data/lib/karafka/web/pro/ui/views/health/_no_partition_data.erb +19 -2
- data/lib/karafka/web/pro/ui/views/health/_partition.erb +27 -5
- data/lib/karafka/web/pro/ui/views/health/_partition_lags.erb +19 -2
- data/lib/karafka/web/pro/ui/views/health/_partition_offset.erb +19 -2
- data/lib/karafka/web/pro/ui/views/health/_partition_times.erb +19 -2
- data/lib/karafka/web/pro/ui/views/health/_partitions_with_fallback.erb +21 -2
- data/lib/karafka/web/pro/ui/views/health/_table_metadata.erb +19 -2
- data/lib/karafka/web/pro/ui/views/health/_tabs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/health/_topic_edit_options.erb +70 -0
- data/lib/karafka/web/pro/ui/views/health/changes.erb +20 -2
- data/lib/karafka/web/pro/ui/views/health/cluster_lags.erb +19 -2
- data/lib/karafka/web/pro/ui/views/health/lags.erb +20 -2
- data/lib/karafka/web/pro/ui/views/health/offsets.erb +20 -2
- data/lib/karafka/web/pro/ui/views/health/overview.erb +35 -5
- data/lib/karafka/web/pro/ui/views/jobs/_job.erb +20 -3
- data/lib/karafka/web/pro/ui/views/jobs/_no_jobs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/jobs/pending.erb +19 -2
- data/lib/karafka/web/pro/ui/views/jobs/running.erb +19 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_actions.erb +19 -5
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_batch_actions.erb +19 -5
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_log.erb +19 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_not_active.erb +19 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_tabs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_task.erb +20 -3
- data/lib/karafka/web/pro/ui/views/recurring_tasks/logs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/schedule.erb +20 -3
- data/lib/karafka/web/pro/ui/views/routing/_consumer_group.erb +20 -3
- data/lib/karafka/web/pro/ui/views/routing/_detail.erb +19 -2
- data/lib/karafka/web/pro/ui/views/routing/_topic.erb +20 -3
- data/lib/karafka/web/pro/ui/views/routing/index.erb +19 -2
- data/lib/karafka/web/pro/ui/views/routing/show.erb +19 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_key.erb +19 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_message.erb +19 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_messages.erb +20 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_cancel.erb +20 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_compacted.erb +19 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_schedule.erb +20 -4
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_tombstone.erb +20 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_unknown.erb +20 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/partition.erb +58 -39
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/topic.erb +19 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_no_groups.erb +19 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/index.erb +19 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/show.erb +20 -3
- data/lib/karafka/web/pro/ui/views/shared/_navigation.erb +20 -3
- data/lib/karafka/web/pro/ui/views/shared/_rdkafka_form_error_alert_box.erb +19 -2
- data/lib/karafka/web/pro/ui/views/shared/branding/_label.erb +19 -2
- data/lib/karafka/web/pro/ui/views/shared/branding/_notice.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_config.erb +20 -3
- data/lib/karafka/web/pro/ui/views/topics/configs/_delete_button.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_form.erb +23 -7
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_plan.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_warning.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/edit.erb +27 -10
- data/lib/karafka/web/pro/ui/views/topics/configs/index.erb +20 -3
- data/lib/karafka/web/pro/ui/views/topics/distributions/_add_partitions_button.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_badges.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_chart.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_form.erb +24 -7
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_hints.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_warnings.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_empty_partitions.erb +22 -3
- data/lib/karafka/web/pro/ui/views/topics/distributions/_limited.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_partition.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/edit.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/show.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/offsets/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/offsets/_partition.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/offsets/show.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/replications/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/replications/_metric_box.erb +26 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_partition.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/replications/_replication_info.erb +71 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_resilience_success.erb +30 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_warning_low_durability.erb +73 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_warning_no_redundancy.erb +72 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_warning_zero_fault_tolerance.erb +73 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/show.erb +21 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_breadcrumbs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_create_button.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_create_hints.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_form.erb +19 -3
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_hints.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_warning.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_new_form.erb +31 -13
- data/lib/karafka/web/pro/ui/views/topics/topics/_tabs.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_topic.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/edit.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/index.erb +19 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/new.erb +19 -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/processing/time_series_tracker.rb +1 -2
- data/lib/karafka/web/producer.rb +62 -0
- data/lib/karafka/web/tracking/consumers/contracts/report.rb +3 -3
- data/lib/karafka/web/tracking/consumers/contracts/subscription_group.rb +2 -0
- data/lib/karafka/web/tracking/consumers/listeners/booting.rb +1 -1
- data/lib/karafka/web/tracking/consumers/listeners/connections.rb +12 -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/listeners/tags.rb +1 -2
- data/lib/karafka/web/tracking/consumers/reporter.rb +2 -2
- data/lib/karafka/web/tracking/consumers/sampler/enrichers/consumer_groups.rb +2 -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/jobs.rb +14 -5
- data/lib/karafka/web/tracking/consumers/sampler/metrics/network.rb +6 -6
- data/lib/karafka/web/tracking/consumers/sampler/metrics/os.rb +42 -39
- data/lib/karafka/web/tracking/consumers/sampler/metrics/server.rb +2 -1
- data/lib/karafka/web/tracking/consumers/sampler.rb +16 -10
- 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 +36 -33
- 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 +4 -3
- data/lib/karafka/web/ui/lib/hash_proxy.rb +1 -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 +23 -25
- 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 +10 -11
- 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 +3 -4
- data/lib/karafka/web/ui/models/status/checks/base.rb +126 -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 +154 -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 +5 -3
- data/lib/karafka/web/ui/public/javascripts/application.min.js +7 -8
- 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 +4752 -2644
- 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/highlight_dark.min.css.gz +0 -0
- data/lib/karafka/web/ui/public/stylesheets/libs/highlight_light.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/consumers/_assignments_badges.erb +0 -1
- 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 +5 -5
- data/lib/karafka/web/ui/views/ux/_tabs.erb +3 -3
- data/lib/karafka/web/ui/views/ux/_topic_tiles.erb +4 -4
- data/lib/karafka/web/version.rb +1 -1
- data/lib/karafka/web.rb +16 -17
- data/package-lock.json +1052 -613
- data/package.json +4 -3
- data/renovate.json +33 -10
- data/tailwind.config.js +4 -7
- metadata +87 -17
- 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: 27e32327bc795732ee58f5dc757bd1fbe1dbc24198a8561f67cffbb48c5a4eb3
|
|
4
|
+
data.tar.gz: 81bb5e628233f6acf7d9cf0527ed07517271cc87f4b19cef925dd2e4e3887ef0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 935b6515910e2eaf6871c5cb00920cda705935d06449de61410e941dfdb185c7437a2e7fa388244997dcb338efd0221ad7cf9c9e207d0b2fa4237fd9f63166e0
|
|
7
|
+
data.tar.gz: 9d3fe3b1c638b6a72b729464a2dc5178202fe9158f88aa3d5c692498d82eda3e65760141d5233e43e7bfd083ecd68bbaf2881f97db6a828825498e1771b4bdcf
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# Karafka Web Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.0 (Unreleased)
|
|
4
|
+
- [Fix] Add `initialize` to `Status::Context` that defines all instance variables upfront in a consistent order, giving every instance the same Ruby object shape and eliminating the `:performance` shape-variation warning.
|
|
5
|
+
- [Enhancement] Add `Warning.process` block to the test helper to turn Ruby warnings originating from the project code into test failures.
|
|
6
|
+
- [Enhancement] Enable all opt-in Ruby warning categories in the test helper via `Warning.categories` (available since Ruby 3.4), so any new categories added in future Ruby versions are automatically enabled without code changes.
|
|
7
|
+
- [Enhancement] Replace sequential per-partition `query_watermark_offsets` consumer calls in `Counters#estimate_errors_count` with a single targeted `topic_info` metadata call followed by a batch `read_watermark_offsets` admin call. This eliminates the consumer connection overhead and reduces Kafka roundtrips from up to N+1 sequential calls to 3 regardless of partition count.
|
|
8
|
+
- [Enhancement] Allow for zero value in number of workers to support dynamic scaling of Karafka workers.
|
|
9
|
+
- [Enhancement] Align concurrency tracking with dynamic thread pool scaling. Workers count is now read from `Karafka::Server.workers.size` instead of the static `Karafka::App.config.concurrency`, so the Web UI accurately reflects runtime thread pool changes.
|
|
10
|
+
- [Enhancement] Track `poll_interval` (max.poll.interval.ms) per subscription group alongside `poll_age` to help users monitor how close they are to the polling timeout limit. Consumer schema version bumped to 1.7.0.
|
|
11
|
+
- [Enhancement] Replace token-based CSRF protection (`route_csrf` plugin) with header-based protection using `Sec-Fetch-Site` header (`sec_fetch_site_csrf` plugin). This eliminates the need for CSRF tokens by leveraging browser-enforced headers that cannot be forged from cross-origin requests. Modern browsers automatically include this header, providing simpler and more robust CSRF protection.
|
|
12
|
+
- [Enhancement] Include a short spec file hash in generated test topic names for traceability. Topic names now follow the `it-{hash}-{uuid}` format, making it easy to identify which test file created a given topic in Kafka logs.
|
|
13
|
+
- [Change] Require Roda `>= 3.100` (previously `~> 3.69`).
|
|
14
|
+
- [Fix] Accept (and ignore) a block in `Karafka::Web::Producer#__getobj__` to silence Ruby 3.4's `strict_unused_block` warning emitted via `SimpleDelegator#method_missing` on every delegated producer call.
|
|
15
|
+
- [Fix] Remove `cgi` as no longer needed.
|
|
16
|
+
- [Fix] Exclude `test/` directory from gem releases to reduce package size.
|
|
17
|
+
- [Fix] Update LinksValidator regexes to match the new `it-{hash}-{uuid}` test topic naming format, fixing test-order dependent failures in explorer controller specs.
|
|
18
|
+
- [Fix] Fix alerts formatting for the distribution view.
|
|
19
|
+
- [Fix] Fix 500 error in the Pro Explorer when a message payload parses as valid JSON but contains strings with invalid UTF-8 byte sequences. `JSON.pretty_generate` would raise `JSON::GeneratorError` outside of any error boundary and propagate as an unhandled 500. The pretty-print step is now wrapped in a dedicated `@safe_pretty_payload` SafeRunner; on failure the raw bytes are displayed alongside a deserialization warning.
|
|
20
|
+
- [Fix] Fix 500 error in the Pro Explorer message JSON export when a payload deserializes correctly but cannot be serialized back to JSON (for example when it contains strings with invalid UTF-8 byte sequences). The export endpoint now responds with 404 in such cases and the export action button is no longer rendered for such messages.
|
|
21
|
+
|
|
22
|
+
## 0.11.6 (2026-02-01)
|
|
23
|
+
- **[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.
|
|
24
|
+
- [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.
|
|
25
|
+
- [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.
|
|
26
|
+
- [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.
|
|
27
|
+
- [Enhancement] Add `.options` CSS class for table columns containing action buttons, providing consistent `width: 1%; white-space: nowrap` styling to prevent column width fluctuation.
|
|
28
|
+
- [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).
|
|
29
|
+
- [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.
|
|
30
|
+
- [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.
|
|
31
|
+
- [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.
|
|
32
|
+
- [Fix] Fix session keys to use strings instead of symbols for compatibility with Roda's session management.
|
|
33
|
+
- [Fix] Fix actions and selector alignment in explorer and errors views by wrapping col-span elements in proper grid container.
|
|
34
|
+
|
|
3
35
|
## 0.11.5 (2025-11-14)
|
|
4
36
|
- [Enhancement] Utilize newly released Roda session management `:env_key` to isolate Karafka Web session from the main application session.
|
|
5
37
|
|
data/Gemfile
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
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 "fugit"
|
|
10
|
+
gem "mocha"
|
|
11
11
|
# Needed for links extraction for visits verification
|
|
12
|
-
gem
|
|
13
|
-
gem
|
|
14
|
-
gem
|
|
15
|
-
gem
|
|
16
|
-
gem
|
|
17
|
-
gem
|
|
12
|
+
gem "nokogiri"
|
|
13
|
+
gem "ostruct"
|
|
14
|
+
gem "rack-test"
|
|
15
|
+
gem "minitest"
|
|
16
|
+
gem "simplecov"
|
|
17
|
+
gem "warning"
|
|
18
18
|
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-minitest"
|
|
13
|
+
gem "standard-minitest"
|
|
14
|
+
gem "rubocop-thread_safety"
|
data/Gemfile.lint.lock
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
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-minitest (0.39.1)
|
|
31
|
+
lint_roller (~> 1.1)
|
|
32
|
+
rubocop (>= 1.75.0, < 2.0)
|
|
33
|
+
rubocop-ast (>= 1.38.0, < 2.0)
|
|
34
|
+
rubocop-performance (1.26.1)
|
|
35
|
+
lint_roller (~> 1.1)
|
|
36
|
+
rubocop (>= 1.75.0, < 2.0)
|
|
37
|
+
rubocop-ast (>= 1.47.1, < 2.0)
|
|
38
|
+
rubocop-thread_safety (0.7.3)
|
|
39
|
+
lint_roller (~> 1.1)
|
|
40
|
+
rubocop (~> 1.72, >= 1.72.1)
|
|
41
|
+
rubocop-ast (>= 1.44.0, < 2.0)
|
|
42
|
+
ruby-progressbar (1.13.0)
|
|
43
|
+
standard (1.53.0)
|
|
44
|
+
language_server-protocol (~> 3.17.0.2)
|
|
45
|
+
lint_roller (~> 1.0)
|
|
46
|
+
rubocop (~> 1.82.0)
|
|
47
|
+
standard-custom (~> 1.0.0)
|
|
48
|
+
standard-performance (~> 1.8)
|
|
49
|
+
standard-custom (1.0.2)
|
|
50
|
+
lint_roller (~> 1.0)
|
|
51
|
+
rubocop (~> 1.50)
|
|
52
|
+
standard-minitest (1.0.0)
|
|
53
|
+
lint_roller (~> 1.0)
|
|
54
|
+
rubocop-minitest
|
|
55
|
+
standard-performance (1.9.0)
|
|
56
|
+
lint_roller (~> 1.1)
|
|
57
|
+
rubocop-performance (~> 1.26.0)
|
|
58
|
+
unicode-display_width (3.2.0)
|
|
59
|
+
unicode-emoji (~> 4.1)
|
|
60
|
+
unicode-emoji (4.2.0)
|
|
61
|
+
yard (0.9.38)
|
|
62
|
+
yard-lint (1.4.0)
|
|
63
|
+
yard (~> 0.9)
|
|
64
|
+
zeitwerk (~> 2.6)
|
|
65
|
+
zeitwerk (2.7.4)
|
|
66
|
+
|
|
67
|
+
PLATFORMS
|
|
68
|
+
ruby
|
|
69
|
+
x86_64-linux
|
|
70
|
+
|
|
71
|
+
DEPENDENCIES
|
|
72
|
+
rubocop-minitest
|
|
73
|
+
rubocop-performance
|
|
74
|
+
rubocop-thread_safety
|
|
75
|
+
standard
|
|
76
|
+
standard-minitest
|
|
77
|
+
standard-performance
|
|
78
|
+
yard-lint
|
|
79
|
+
|
|
80
|
+
CHECKSUMS
|
|
81
|
+
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
|
|
82
|
+
json (2.18.0) sha256=b10506aee4183f5cf49e0efc48073d7b75843ce3782c68dbeb763351c08fd505
|
|
83
|
+
language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
|
|
84
|
+
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
|
|
85
|
+
parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130
|
|
86
|
+
parser (3.3.10.1) sha256=06f6a725d2cd91e5e7f2b7c32ba143631e1f7c8ae2fb918fc4cebec187e6a688
|
|
87
|
+
prism (1.8.0) sha256=84453a16ef5530ea62c5f03ec16b52a459575ad4e7b9c2b360fd8ce2c39c1254
|
|
88
|
+
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
|
|
89
|
+
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
|
|
90
|
+
regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
|
|
91
|
+
rubocop (1.82.1) sha256=09f1a6a654a960eda767aebea33e47603080f8e9c9a3f019bf9b94c9cab5e273
|
|
92
|
+
rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd
|
|
93
|
+
rubocop-minitest (0.39.1) sha256=998398d6da4026d297f0f9bf709a1eac5f2b6947c24431f94af08138510cf7ed
|
|
94
|
+
rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
|
|
95
|
+
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
|
|
96
|
+
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
|
|
97
|
+
standard (1.53.0) sha256=f3c9493385db7079d0abce6f7582f553122156997b81258cd361d3480eeacf9c
|
|
98
|
+
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
|
|
99
|
+
standard-minitest (1.0.0) sha256=450caa86a64a6e6f6f186cc88601dbb49b6cfaa3b0dce77a73b50ba8cdc15b2a
|
|
100
|
+
standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
|
|
101
|
+
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
|
|
102
|
+
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
|
|
103
|
+
yard (0.9.38) sha256=721fb82afb10532aa49860655f6cc2eaa7130889df291b052e1e6b268283010f
|
|
104
|
+
yard-lint (1.4.0) sha256=7dd88fbb08fd77cb840bea899d58812817b36d92291b5693dd0eeb3af9f91f0f
|
|
105
|
+
zeitwerk (2.7.4) sha256=2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b
|
|
106
|
+
|
|
107
|
+
BUNDLED WITH
|
|
108
|
+
4.0.3
|
data/Gemfile.lock
CHANGED
|
@@ -1,93 +1,79 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
karafka-web (0.
|
|
4
|
+
karafka-web (1.0.0.beta1)
|
|
5
5
|
erubi (~> 1.4)
|
|
6
|
-
karafka (>= 2.5.
|
|
7
|
-
karafka-core (>= 2.5.0, < 2.
|
|
8
|
-
roda (
|
|
6
|
+
karafka (>= 2.5.10.rc1, < 2.7.0)
|
|
7
|
+
karafka-core (>= 2.5.0, < 2.7.0)
|
|
8
|
+
roda (>= 3.100, < 4.0)
|
|
9
9
|
tilt (~> 2.0)
|
|
10
10
|
|
|
11
11
|
GEM
|
|
12
12
|
remote: https://rubygems.org/
|
|
13
13
|
specs:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
concurrent-ruby (~> 1.0, >= 1.3.1)
|
|
18
|
-
connection_pool (>= 2.2.5)
|
|
19
|
-
drb
|
|
20
|
-
i18n (>= 1.6, < 2)
|
|
21
|
-
json
|
|
22
|
-
logger (>= 1.4.2)
|
|
23
|
-
minitest (>= 5.1)
|
|
24
|
-
securerandom (>= 0.3)
|
|
25
|
-
tzinfo (~> 2.0, >= 2.0.5)
|
|
26
|
-
uri (>= 0.13.1)
|
|
27
|
-
base64 (0.3.0)
|
|
28
|
-
bigdecimal (3.3.1)
|
|
29
|
-
byebug (12.0.0)
|
|
30
|
-
concurrent-ruby (1.3.5)
|
|
31
|
-
connection_pool (2.5.4)
|
|
32
|
-
diff-lcs (1.6.2)
|
|
14
|
+
byebug (13.0.0)
|
|
15
|
+
reline (>= 0.6.0)
|
|
16
|
+
concurrent-ruby (1.3.6)
|
|
33
17
|
docile (1.4.1)
|
|
34
18
|
drb (2.2.3)
|
|
35
19
|
erubi (1.13.1)
|
|
36
20
|
et-orbi (1.4.0)
|
|
37
21
|
tzinfo
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
ffi (1.17.
|
|
41
|
-
ffi (1.17.
|
|
42
|
-
ffi (1.17.
|
|
43
|
-
ffi (1.17.
|
|
44
|
-
ffi (1.17.
|
|
45
|
-
ffi (1.17.
|
|
46
|
-
ffi (1.17.
|
|
47
|
-
ffi (1.17.
|
|
48
|
-
ffi (1.17.
|
|
49
|
-
|
|
50
|
-
ffi (1.17.2-x86_64-linux-musl)
|
|
51
|
-
fugit (1.12.1)
|
|
22
|
+
ffi (1.17.4)
|
|
23
|
+
ffi (1.17.4-aarch64-linux-gnu)
|
|
24
|
+
ffi (1.17.4-aarch64-linux-musl)
|
|
25
|
+
ffi (1.17.4-arm-linux-gnu)
|
|
26
|
+
ffi (1.17.4-arm-linux-musl)
|
|
27
|
+
ffi (1.17.4-arm64-darwin)
|
|
28
|
+
ffi (1.17.4-x86-linux-gnu)
|
|
29
|
+
ffi (1.17.4-x86-linux-musl)
|
|
30
|
+
ffi (1.17.4-x86_64-darwin)
|
|
31
|
+
ffi (1.17.4-x86_64-linux-gnu)
|
|
32
|
+
ffi (1.17.4-x86_64-linux-musl)
|
|
33
|
+
fugit (1.12.2)
|
|
52
34
|
et-orbi (~> 1.4)
|
|
53
35
|
raabro (~> 1.4)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
karafka-rdkafka (>= 0.22.0)
|
|
61
|
-
waterdrop (>= 2.8.9, < 3.0.0)
|
|
36
|
+
io-console (0.8.2)
|
|
37
|
+
json (2.19.7)
|
|
38
|
+
karafka (2.5.10.rc1)
|
|
39
|
+
karafka-core (>= 2.5.13, < 2.6.0)
|
|
40
|
+
karafka-rdkafka (>= 0.26.1)
|
|
41
|
+
waterdrop (>= 2.8.14, < 3.0.0)
|
|
62
42
|
zeitwerk (~> 2.3)
|
|
63
|
-
karafka-core (2.5.
|
|
43
|
+
karafka-core (2.5.13)
|
|
64
44
|
karafka-rdkafka (>= 0.20.0)
|
|
65
45
|
logger (>= 1.6.0)
|
|
66
|
-
karafka-rdkafka (0.
|
|
46
|
+
karafka-rdkafka (0.27.2)
|
|
67
47
|
ffi (~> 1.17.1)
|
|
68
48
|
json (> 2.0)
|
|
69
49
|
logger
|
|
70
50
|
mini_portile2 (~> 2.6)
|
|
71
51
|
rake (> 12)
|
|
72
|
-
karafka-rdkafka (0.
|
|
52
|
+
karafka-rdkafka (0.27.2-aarch64-linux-gnu)
|
|
73
53
|
ffi (~> 1.17.1)
|
|
74
54
|
json (> 2.0)
|
|
75
55
|
logger
|
|
76
56
|
mini_portile2 (~> 2.6)
|
|
77
57
|
rake (> 12)
|
|
78
|
-
karafka-rdkafka (0.
|
|
58
|
+
karafka-rdkafka (0.27.2-aarch64-linux-musl)
|
|
79
59
|
ffi (~> 1.17.1)
|
|
80
60
|
json (> 2.0)
|
|
81
61
|
logger
|
|
82
62
|
mini_portile2 (~> 2.6)
|
|
83
63
|
rake (> 12)
|
|
84
|
-
karafka-rdkafka (0.
|
|
64
|
+
karafka-rdkafka (0.27.2-arm64-darwin)
|
|
85
65
|
ffi (~> 1.17.1)
|
|
86
66
|
json (> 2.0)
|
|
87
67
|
logger
|
|
88
68
|
mini_portile2 (~> 2.6)
|
|
89
69
|
rake (> 12)
|
|
90
|
-
karafka-rdkafka (0.
|
|
70
|
+
karafka-rdkafka (0.27.2-x86_64-linux-gnu)
|
|
71
|
+
ffi (~> 1.17.1)
|
|
72
|
+
json (> 2.0)
|
|
73
|
+
logger
|
|
74
|
+
mini_portile2 (~> 2.6)
|
|
75
|
+
rake (> 12)
|
|
76
|
+
karafka-rdkafka (0.27.2-x86_64-linux-musl)
|
|
91
77
|
ffi (~> 1.17.1)
|
|
92
78
|
json (> 2.0)
|
|
93
79
|
logger
|
|
@@ -95,72 +81,62 @@ GEM
|
|
|
95
81
|
rake (> 12)
|
|
96
82
|
logger (1.7.0)
|
|
97
83
|
mini_portile2 (2.8.9)
|
|
98
|
-
minitest (
|
|
99
|
-
|
|
84
|
+
minitest (6.0.6)
|
|
85
|
+
drb (~> 2.0)
|
|
86
|
+
prism (~> 1.5)
|
|
87
|
+
mocha (3.1.0)
|
|
88
|
+
ruby2_keywords (>= 0.0.5)
|
|
89
|
+
nokogiri (1.19.3)
|
|
100
90
|
mini_portile2 (~> 2.8.2)
|
|
101
91
|
racc (~> 1.4)
|
|
102
|
-
nokogiri (1.
|
|
92
|
+
nokogiri (1.19.3-aarch64-linux-gnu)
|
|
103
93
|
racc (~> 1.4)
|
|
104
|
-
nokogiri (1.
|
|
94
|
+
nokogiri (1.19.3-aarch64-linux-musl)
|
|
105
95
|
racc (~> 1.4)
|
|
106
|
-
nokogiri (1.
|
|
96
|
+
nokogiri (1.19.3-arm-linux-gnu)
|
|
107
97
|
racc (~> 1.4)
|
|
108
|
-
nokogiri (1.
|
|
98
|
+
nokogiri (1.19.3-arm-linux-musl)
|
|
109
99
|
racc (~> 1.4)
|
|
110
|
-
nokogiri (1.
|
|
100
|
+
nokogiri (1.19.3-arm64-darwin)
|
|
111
101
|
racc (~> 1.4)
|
|
112
|
-
nokogiri (1.
|
|
102
|
+
nokogiri (1.19.3-x86_64-darwin)
|
|
113
103
|
racc (~> 1.4)
|
|
114
|
-
nokogiri (1.
|
|
104
|
+
nokogiri (1.19.3-x86_64-linux-gnu)
|
|
115
105
|
racc (~> 1.4)
|
|
116
|
-
nokogiri (1.
|
|
106
|
+
nokogiri (1.19.3-x86_64-linux-musl)
|
|
117
107
|
racc (~> 1.4)
|
|
118
108
|
ostruct (0.6.3)
|
|
109
|
+
prism (1.9.0)
|
|
119
110
|
raabro (1.4.0)
|
|
120
111
|
racc (1.8.1)
|
|
121
|
-
rack (3.2.
|
|
112
|
+
rack (3.2.6)
|
|
122
113
|
rack-test (2.2.0)
|
|
123
114
|
rack (>= 1.3)
|
|
124
115
|
rackup (0.2.3)
|
|
125
116
|
rack (>= 3.0.0.beta1)
|
|
126
117
|
webrick
|
|
127
|
-
rake (13.
|
|
128
|
-
|
|
118
|
+
rake (13.4.2)
|
|
119
|
+
reline (0.6.3)
|
|
120
|
+
io-console (~> 0.5)
|
|
121
|
+
roda (3.104.0)
|
|
129
122
|
rack
|
|
130
|
-
|
|
131
|
-
rspec-core (~> 3.13.0)
|
|
132
|
-
rspec-expectations (~> 3.13.0)
|
|
133
|
-
rspec-mocks (~> 3.13.0)
|
|
134
|
-
rspec-core (3.13.6)
|
|
135
|
-
rspec-support (~> 3.13.0)
|
|
136
|
-
rspec-expectations (3.13.5)
|
|
137
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
138
|
-
rspec-support (~> 3.13.0)
|
|
139
|
-
rspec-mocks (3.13.7)
|
|
140
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
141
|
-
rspec-support (~> 3.13.0)
|
|
142
|
-
rspec-support (3.13.6)
|
|
143
|
-
securerandom (0.4.1)
|
|
123
|
+
ruby2_keywords (0.0.5)
|
|
144
124
|
simplecov (0.22.0)
|
|
145
125
|
docile (~> 1.1)
|
|
146
126
|
simplecov-html (~> 0.11)
|
|
147
127
|
simplecov_json_formatter (~> 0.1)
|
|
148
128
|
simplecov-html (0.13.2)
|
|
149
129
|
simplecov_json_formatter (0.1.4)
|
|
150
|
-
tilt (2.
|
|
130
|
+
tilt (2.7.0)
|
|
151
131
|
tzinfo (2.0.6)
|
|
152
132
|
concurrent-ruby (~> 1.0)
|
|
153
|
-
|
|
154
|
-
waterdrop (2.
|
|
155
|
-
karafka-core (>= 2.
|
|
156
|
-
karafka-rdkafka (>= 0.
|
|
133
|
+
warning (1.6.0)
|
|
134
|
+
waterdrop (2.10.1)
|
|
135
|
+
karafka-core (>= 2.5.12, < 3.0.0)
|
|
136
|
+
karafka-rdkafka (>= 0.24.0)
|
|
157
137
|
zeitwerk (~> 2.3)
|
|
158
|
-
webrick (1.9.
|
|
159
|
-
|
|
160
|
-
yard-lint (1.2.3)
|
|
161
|
-
yard (~> 0.9)
|
|
162
|
-
zeitwerk (~> 2.6)
|
|
163
|
-
zeitwerk (2.7.3)
|
|
138
|
+
webrick (1.9.2)
|
|
139
|
+
zeitwerk (2.8.2)
|
|
164
140
|
|
|
165
141
|
PLATFORMS
|
|
166
142
|
aarch64-linux-gnu
|
|
@@ -177,16 +153,16 @@ PLATFORMS
|
|
|
177
153
|
|
|
178
154
|
DEPENDENCIES
|
|
179
155
|
byebug
|
|
180
|
-
factory_bot
|
|
181
156
|
fugit
|
|
182
157
|
karafka-web!
|
|
158
|
+
minitest
|
|
159
|
+
mocha
|
|
183
160
|
nokogiri
|
|
184
161
|
ostruct
|
|
185
162
|
rack-test
|
|
186
163
|
rackup (~> 0.2)
|
|
187
|
-
rspec
|
|
188
164
|
simplecov
|
|
189
|
-
|
|
165
|
+
warning
|
|
190
166
|
|
|
191
167
|
BUNDLED WITH
|
|
192
|
-
|
|
168
|
+
4.0.12
|
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
|
@@ -1,4 +1,30 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "bundler/gem_tasks"
|
|
5
|
+
require "minitest/test_task"
|
|
6
|
+
|
|
7
|
+
specs_type = ENV.fetch("SPECS_TYPE", "regular")
|
|
8
|
+
|
|
9
|
+
Minitest::TestTask.create(:test) do |t|
|
|
10
|
+
t.libs << "test"
|
|
11
|
+
t.libs << "lib"
|
|
12
|
+
t.test_prelude = 'require "test_helper"; require "minitest/autorun"'
|
|
13
|
+
|
|
14
|
+
t.test_globs = if specs_type == "pro"
|
|
15
|
+
["test/lib/karafka/web/pro/**/*_test.rb"]
|
|
16
|
+
else
|
|
17
|
+
# Exclude pro tests from regular test runs
|
|
18
|
+
[
|
|
19
|
+
"test/lib/karafka/web/*_test.rb",
|
|
20
|
+
"test/lib/karafka/web/cli/**/*_test.rb",
|
|
21
|
+
"test/lib/karafka/web/contracts/**/*_test.rb",
|
|
22
|
+
"test/lib/karafka/web/management/**/*_test.rb",
|
|
23
|
+
"test/lib/karafka/web/processing/**/*_test.rb",
|
|
24
|
+
"test/lib/karafka/web/tracking/**/*_test.rb",
|
|
25
|
+
"test/lib/karafka/web/ui/**/*_test.rb"
|
|
26
|
+
]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
task default: :test
|
data/bin/balance_tests
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Balances test 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_tests <regular|pro> <num_workers>
|
|
8
|
+
#
|
|
9
|
+
# Output: JSON array of arrays where each inner array contains the test files
|
|
10
|
+
# assigned to that worker
|
|
11
|
+
#
|
|
12
|
+
# Example:
|
|
13
|
+
# bin/balance_tests regular 4
|
|
14
|
+
# [["test/a.rb","test/d.rb"],["test/b.rb"],["test/c.rb"],["test/e.rb"]]
|
|
15
|
+
|
|
16
|
+
require 'json'
|
|
17
|
+
|
|
18
|
+
TIMINGS_DIR = File.expand_path('../test/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 test type
|
|
22
|
+
#
|
|
23
|
+
# @param tests_type [String] the type of tests ('regular' or 'pro')
|
|
24
|
+
# @return [Hash<String, Float>] hash mapping file paths to execution times in seconds
|
|
25
|
+
def load_timings(tests_type)
|
|
26
|
+
file_path = File.join(TIMINGS_DIR, "#{tests_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 test files for the given test type
|
|
36
|
+
#
|
|
37
|
+
# @param tests_type [String] the type of tests ('regular' or 'pro')
|
|
38
|
+
# @return [Array<String>] sorted array of test file paths
|
|
39
|
+
def get_test_files(tests_type)
|
|
40
|
+
all_tests = Dir.glob('test/lib/karafka/web/**/*_test.rb').sort
|
|
41
|
+
|
|
42
|
+
case tests_type
|
|
43
|
+
when 'pro'
|
|
44
|
+
all_tests.select { |f| f.include?('/pro/') }
|
|
45
|
+
when 'regular'
|
|
46
|
+
all_tests.reject { |f| f.include?('/pro/') }
|
|
47
|
+
else
|
|
48
|
+
warn "Unknown tests type: #{tests_type}"
|
|
49
|
+
exit 1
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Balances test 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 test 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 "./test/..." and "test/..." 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
|
+
tests_type = ARGV[0]
|
|
105
|
+
num_workers = (ARGV[1] || '4').to_i
|
|
106
|
+
|
|
107
|
+
unless tests_type
|
|
108
|
+
warn "Usage: bin/balance_tests <regular|pro> <num_workers>"
|
|
109
|
+
exit 1
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
timings = load_timings(tests_type)
|
|
113
|
+
files = get_test_files(tests_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] })
|