karafka-web 0.10.4 → 0.11.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
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +54 -176
- data/Gemfile +4 -0
- data/Gemfile.lock +87 -43
- data/LICENSE +6 -2
- data/bin/verify_kafka_warnings +35 -0
- data/bin/verify_topics_naming +35 -0
- data/config/locales/pro_errors.yml +1 -0
- data/docker-compose.yml +1 -1
- data/gulpfile.js +0 -2
- data/karafka-web.gemspec +2 -2
- data/lib/karafka/web/config.rb +80 -9
- data/lib/karafka/web/contracts/config.rb +44 -5
- data/lib/karafka/web/errors.rb +10 -0
- data/lib/karafka/web/management/actions/create_initial_states.rb +6 -6
- data/lib/karafka/web/management/actions/create_topics.rb +30 -64
- data/lib/karafka/web/management/actions/delete_topics.rb +5 -5
- data/lib/karafka/web/management/actions/enable.rb +5 -5
- data/lib/karafka/web/pro/commanding/commands/base.rb +37 -13
- data/lib/karafka/web/pro/commanding/commands/consumers/quiet.rb +33 -0
- data/lib/karafka/web/pro/commanding/commands/consumers/stop.rb +32 -0
- data/lib/karafka/web/pro/commanding/commands/consumers/trace.rb +37 -0
- data/lib/karafka/web/pro/commanding/commands/partitions/pause.rb +30 -0
- data/lib/karafka/web/pro/commanding/commands/partitions/resume.rb +30 -0
- data/lib/karafka/web/pro/commanding/commands/partitions/seek.rb +30 -0
- data/lib/karafka/web/pro/commanding/config.rb +6 -10
- data/lib/karafka/web/pro/commanding/contracts/config.rb +2 -10
- data/lib/karafka/web/pro/commanding/dispatcher.rb +45 -24
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/base.rb +67 -0
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/pause.rb +44 -0
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/resume.rb +29 -0
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/seek.rb +86 -0
- data/lib/karafka/web/pro/commanding/handlers/partitions/executor.rb +56 -0
- data/lib/karafka/web/pro/commanding/handlers/partitions/listener.rb +55 -0
- data/lib/karafka/web/pro/commanding/handlers/partitions/tracker.rb +62 -0
- data/lib/karafka/web/pro/commanding/listener.rb +4 -12
- data/lib/karafka/web/pro/commanding/manager.rb +36 -24
- data/lib/karafka/web/pro/commanding/matcher.rb +7 -17
- data/lib/karafka/web/pro/commanding/request.rb +39 -0
- data/lib/karafka/web/pro/commanding.rb +2 -10
- data/lib/karafka/web/pro/loader.rb +13 -10
- data/lib/karafka/web/pro/ui/app.rb +31 -390
- data/lib/karafka/web/pro/ui/controllers/base_controller.rb +8 -10
- data/lib/karafka/web/pro/ui/controllers/cluster_controller.rb +2 -10
- data/lib/karafka/web/pro/ui/controllers/consumers/base_controller.rb +21 -0
- data/lib/karafka/web/pro/ui/controllers/consumers/commanding_controller.rb +148 -0
- data/lib/karafka/web/pro/ui/controllers/consumers/commands_controller.rb +96 -0
- data/lib/karafka/web/pro/ui/controllers/consumers/consumers_controller.rb +101 -0
- data/lib/karafka/web/pro/ui/controllers/consumers/controls_controller.rb +36 -0
- data/lib/karafka/web/pro/ui/controllers/consumers/jobs_controller.rb +57 -0
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/base_controller.rb +86 -0
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/offsets_controller.rb +75 -0
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/pauses_controller.rb +110 -0
- data/lib/karafka/web/pro/ui/controllers/dashboard_controller.rb +2 -10
- data/lib/karafka/web/pro/ui/controllers/dlq_controller.rb +2 -10
- data/lib/karafka/web/pro/ui/controllers/errors_controller.rb +3 -11
- data/lib/karafka/web/pro/ui/controllers/explorer/base_controller.rb +21 -0
- data/lib/karafka/web/pro/ui/controllers/explorer/explorer_controller.rb +215 -0
- data/lib/karafka/web/pro/ui/controllers/explorer/messages_controller.rb +145 -0
- data/lib/karafka/web/pro/ui/controllers/explorer/search_controller.rb +68 -0
- data/lib/karafka/web/pro/ui/controllers/health_controller.rb +2 -10
- data/lib/karafka/web/pro/ui/controllers/jobs_controller.rb +2 -10
- data/lib/karafka/web/pro/ui/controllers/recurring_tasks_controller.rb +12 -13
- data/lib/karafka/web/pro/ui/controllers/routing_controller.rb +2 -10
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/base_controller.rb +2 -10
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/explorer_controller.rb +8 -16
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/messages_controller.rb +9 -15
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/schedules_controller.rb +2 -10
- data/lib/karafka/web/pro/ui/controllers/status_controller.rb +2 -10
- data/lib/karafka/web/pro/ui/controllers/support_controller.rb +2 -10
- data/lib/karafka/web/pro/ui/controllers/topics/base_controller.rb +21 -0
- data/lib/karafka/web/pro/ui/controllers/topics/configs_controller.rb +86 -0
- data/lib/karafka/web/pro/ui/controllers/topics/distributions_controller.rb +91 -0
- data/lib/karafka/web/pro/ui/controllers/topics/offsets_controller.rb +55 -0
- data/lib/karafka/web/pro/ui/controllers/topics/replications_controller.rb +37 -0
- data/lib/karafka/web/pro/ui/controllers/topics/topics_controller.rb +101 -0
- data/lib/karafka/web/pro/ui/controllers/ux_controller.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/branding/config.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/branding/contracts/config.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/branding.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/features.rb +53 -0
- data/lib/karafka/web/pro/ui/lib/patterns_detector.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/policies/config.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/policies/contracts/config.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/policies/messages.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/policies/requests.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/policies.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/safe_runner.rb +5 -0
- data/lib/karafka/web/pro/ui/lib/search/config.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/search/contracts/config.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/search/contracts/form.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/search/matchers/base.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_header_includes.rb +10 -11
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_key_includes.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_payload_includes.rb +23 -11
- data/lib/karafka/web/pro/ui/lib/search/normalizer.rb +2 -10
- data/lib/karafka/web/pro/ui/lib/search/runner.rb +3 -11
- data/lib/karafka/web/pro/ui/lib/search.rb +2 -10
- data/lib/karafka/web/pro/ui/routes/base.rb +19 -0
- data/lib/karafka/web/pro/ui/routes/cluster.rb +37 -0
- data/lib/karafka/web/pro/ui/routes/consumers.rb +145 -0
- data/lib/karafka/web/pro/ui/routes/dashboard.rb +25 -0
- data/lib/karafka/web/pro/ui/routes/dlq.rb +24 -0
- data/lib/karafka/web/pro/ui/routes/errors.rb +39 -0
- data/lib/karafka/web/pro/ui/routes/explorer.rb +118 -0
- data/lib/karafka/web/pro/ui/routes/health.rb +47 -0
- data/lib/karafka/web/pro/ui/routes/jobs.rb +33 -0
- data/lib/karafka/web/pro/ui/routes/recurring_tasks.rb +59 -0
- data/lib/karafka/web/pro/ui/routes/routing.rb +31 -0
- data/lib/karafka/web/pro/ui/routes/scheduled_messages.rb +75 -0
- data/lib/karafka/web/pro/ui/routes/status.rb +24 -0
- data/lib/karafka/web/pro/ui/routes/support.rb +24 -0
- data/lib/karafka/web/pro/ui/routes/topics.rb +90 -0
- data/lib/karafka/web/pro/ui/routes/ux.rb +24 -0
- data/lib/karafka/web/pro/ui/views/cluster/_breadcrumbs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/cluster/_broker.erb +3 -0
- data/lib/karafka/web/pro/ui/views/cluster/_config.erb +3 -0
- data/lib/karafka/web/pro/ui/views/cluster/_tabs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/cluster/index.erb +4 -1
- data/lib/karafka/web/pro/ui/views/cluster/show.erb +3 -0
- data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/_backtrace.erb +3 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/_breadcrumbs.erb +24 -0
- data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/_command.erb +22 -6
- data/lib/karafka/web/pro/ui/views/consumers/commands/_command_details.erb +4 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/_empty.erb +6 -0
- data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/_incompatible_schema.erb +3 -0
- data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/_metadata.erb +4 -1
- data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/_table.erb +5 -2
- data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/index.erb +7 -4
- data/lib/karafka/web/pro/ui/views/consumers/commands/show.erb +32 -0
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_breadcrumbs.erb +46 -0
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer.erb +59 -0
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer_performance.erb +71 -0
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_tabs.erb +38 -0
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_commands.erb +80 -0
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_consumer_group.erb +11 -0
- data/lib/karafka/web/pro/ui/views/consumers/{consumer → consumers/consumer}/_metrics.erb +3 -0
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_no_subscriptions.erb +10 -0
- data/lib/karafka/web/pro/ui/views/consumers/{consumer → consumers/consumer}/_partition.erb +16 -0
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition_edit_options.erb +33 -0
- data/lib/karafka/web/pro/ui/views/consumers/{consumer → consumers/consumer}/_stopped.erb +3 -0
- data/lib/karafka/web/pro/ui/views/consumers/{consumer → consumers/consumer}/_subscription_group.erb +7 -3
- data/lib/karafka/web/pro/ui/views/consumers/{consumer → consumers/consumer}/_tabs.erb +7 -4
- data/lib/karafka/web/pro/ui/views/consumers/consumers/details.erb +15 -0
- data/lib/karafka/web/pro/ui/views/consumers/{index.erb → consumers/index.erb} +6 -3
- data/lib/karafka/web/pro/ui/views/consumers/{performance.erb → consumers/performance.erb} +6 -3
- data/lib/karafka/web/pro/ui/views/consumers/consumers/subscriptions.erb +24 -0
- data/lib/karafka/web/pro/ui/views/consumers/controls/_breadcrumbs.erb +16 -0
- data/lib/karafka/web/pro/ui/views/consumers/controls/_controls.erb +107 -0
- data/lib/karafka/web/pro/ui/views/consumers/{controls.erb → controls/index.erb} +8 -5
- data/lib/karafka/web/pro/ui/views/consumers/jobs/_breadcrumbs.erb +36 -0
- data/lib/karafka/web/pro/ui/views/consumers/{consumer → jobs}/_job.erb +3 -0
- data/lib/karafka/web/pro/ui/views/consumers/{consumer → jobs}/_no_jobs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/consumers/{pending_jobs.erb → jobs/pending.erb} +7 -8
- data/lib/karafka/web/pro/ui/views/consumers/{running_jobs.erb → jobs/running.erb} +7 -8
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_basics.erb +77 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_breadcrumbs.erb +58 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_form.erb +109 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_not_running_error.erb +16 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_running_warning.erb +15 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/edit.erb +12 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_active_not_editable.erb +22 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_adjusting_warning.erb +27 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_breadcrumbs.erb +60 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_edit_form.erb +59 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_lrj_not_manageable.erb +24 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_new_form.erb +78 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_not_running.erb +16 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/edit.erb +20 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/new.erb +16 -0
- data/lib/karafka/web/pro/ui/views/dashboard/index.erb +4 -1
- data/lib/karafka/web/pro/ui/views/dlq/_breadcrumbs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/dlq/_no_topics.erb +3 -0
- data/lib/karafka/web/pro/ui/views/dlq/_topic.erb +4 -1
- data/lib/karafka/web/pro/ui/views/dlq/index.erb +3 -0
- data/lib/karafka/web/pro/ui/views/errors/_breadcrumbs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/errors/_error.erb +3 -0
- data/lib/karafka/web/pro/ui/views/errors/_partition_option.erb +3 -0
- data/lib/karafka/web/pro/ui/views/errors/_selector.erb +3 -0
- data/lib/karafka/web/pro/ui/views/errors/_table.erb +4 -1
- data/lib/karafka/web/pro/ui/views/errors/index.erb +6 -3
- data/lib/karafka/web/pro/ui/views/errors/partition.erb +5 -2
- data/lib/karafka/web/pro/ui/views/errors/show.erb +3 -0
- data/lib/karafka/web/pro/ui/views/explorer/{_breadcrumbs.erb → explorer/_breadcrumbs.erb} +7 -4
- data/lib/karafka/web/pro/ui/views/explorer/{_failed_deserialization.erb → explorer/_failed_deserialization.erb} +3 -0
- data/lib/karafka/web/pro/ui/views/explorer/{_filtered.erb → explorer/_filtered.erb} +3 -0
- data/lib/karafka/web/pro/ui/views/explorer/{_message.erb → explorer/_message.erb} +4 -1
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_no_topics.erb +4 -0
- data/lib/karafka/web/pro/ui/views/explorer/{_partition_option.erb → explorer/_partition_option.erb} +4 -1
- data/lib/karafka/web/pro/ui/views/explorer/{_selector.erb → explorer/_selector.erb} +4 -1
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_topic.erb +13 -0
- data/lib/karafka/web/pro/ui/views/explorer/explorer/index.erb +17 -0
- data/lib/karafka/web/pro/ui/views/explorer/{message → explorer/message}/_metadata.erb +10 -7
- data/lib/karafka/web/pro/ui/views/explorer/{message → explorer/message}/_payload.erb +6 -3
- data/lib/karafka/web/pro/ui/views/explorer/{message → explorer/message}/_resources_utilization.erb +7 -4
- data/lib/karafka/web/pro/ui/views/explorer/{message → explorer/message}/_too_big_to_be_displayed.erb +3 -0
- data/lib/karafka/web/pro/ui/views/explorer/{messages → explorer/messages}/_detail.erb +3 -0
- data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_headers.erb +51 -0
- data/lib/karafka/web/pro/ui/views/explorer/{messages → explorer/messages}/_key.erb +3 -0
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_cleaned.erb +6 -0
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_empty.erb +6 -0
- data/lib/karafka/web/pro/ui/views/explorer/{partition → explorer/partition}/_messages.erb +4 -1
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_time_selector.erb +16 -0
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_timestamp_selector.erb +33 -0
- data/lib/karafka/web/pro/ui/views/explorer/{partition.erb → explorer/partition.erb} +24 -17
- data/lib/karafka/web/pro/ui/views/explorer/{show.erb → explorer/show.erb} +17 -19
- data/lib/karafka/web/pro/ui/views/explorer/{topic → explorer/topic}/_actions.erb +5 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_empty.erb +6 -0
- data/lib/karafka/web/pro/ui/views/explorer/{topic → explorer/topic}/_limited.erb +3 -0
- data/lib/karafka/web/pro/ui/views/explorer/{topic.erb → explorer/topic.erb} +7 -4
- data/lib/karafka/web/pro/ui/views/explorer/messages/_breadcrumbs.erb +32 -0
- data/lib/karafka/web/pro/ui/views/explorer/messages/forward.erb +143 -0
- data/lib/karafka/web/pro/ui/views/explorer/search/_breadcrumbs.erb +4 -0
- data/lib/karafka/web/pro/ui/views/explorer/search/_fix_errors.erb +6 -0
- data/lib/karafka/web/pro/ui/views/{search → explorer/search}/_metadata.erb +3 -0
- data/lib/karafka/web/pro/ui/views/explorer/search/_no_results.erb +6 -0
- data/lib/karafka/web/pro/ui/views/{search → explorer/search}/_no_search_criteria.erb +3 -0
- data/lib/karafka/web/pro/ui/views/{search → explorer/search}/_search_criteria.erb +3 -0
- data/lib/karafka/web/pro/ui/views/{search → explorer/search}/_search_modal.erb +5 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_timeout.erb +6 -0
- data/lib/karafka/web/pro/ui/views/explorer/search/index.erb +32 -0
- data/lib/karafka/web/pro/ui/views/health/_breadcrumbs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/health/_no_data.erb +3 -0
- data/lib/karafka/web/pro/ui/views/health/_partition.erb +16 -1
- data/lib/karafka/web/pro/ui/views/health/_partition_lags.erb +3 -0
- data/lib/karafka/web/pro/ui/views/health/_partition_offset.erb +3 -0
- data/lib/karafka/web/pro/ui/views/health/_partition_times.erb +3 -0
- data/lib/karafka/web/pro/ui/views/health/_table_metadata.erb +4 -1
- data/lib/karafka/web/pro/ui/views/health/_tabs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/health/changes.erb +4 -1
- data/lib/karafka/web/pro/ui/views/health/cluster_lags.erb +3 -0
- data/lib/karafka/web/pro/ui/views/health/lags.erb +5 -2
- data/lib/karafka/web/pro/ui/views/health/offsets.erb +4 -1
- data/lib/karafka/web/pro/ui/views/health/overview.erb +8 -3
- data/lib/karafka/web/pro/ui/views/jobs/_job.erb +50 -38
- data/lib/karafka/web/pro/ui/views/jobs/_no_jobs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/jobs/pending.erb +4 -1
- data/lib/karafka/web/pro/ui/views/jobs/running.erb +4 -1
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_actions.erb +3 -0
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_batch_actions.erb +3 -0
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_breadcrumbs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_log.erb +3 -0
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_not_active.erb +3 -0
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_tabs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_task.erb +3 -0
- data/lib/karafka/web/pro/ui/views/recurring_tasks/logs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/recurring_tasks/schedule.erb +3 -0
- data/lib/karafka/web/pro/ui/views/routing/_consumer_group.erb +3 -0
- data/lib/karafka/web/pro/ui/views/routing/_detail.erb +3 -0
- data/lib/karafka/web/pro/ui/views/routing/_topic.erb +3 -0
- data/lib/karafka/web/pro/ui/views/routing/index.erb +3 -0
- data/lib/karafka/web/pro/ui/views/routing/show.erb +3 -0
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_breadcrumbs.erb +6 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_key.erb +3 -0
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_message.erb +4 -1
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_messages.erb +3 -0
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/partition.erb +23 -16
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/topic.erb +6 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_breadcrumbs.erb +3 -0
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_no_groups.erb +3 -0
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/index.erb +4 -1
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/show.erb +3 -0
- data/lib/karafka/web/pro/ui/views/shared/_navigation.erb +25 -17
- data/lib/karafka/web/pro/ui/views/shared/_rdkafka_form_error_alert_box.erb +16 -0
- data/lib/karafka/web/pro/ui/views/shared/branding/_label.erb +3 -0
- data/lib/karafka/web/pro/ui/views/shared/branding/_notice.erb +3 -0
- data/lib/karafka/web/pro/ui/views/topics/configs/_breadcrumbs.erb +34 -0
- data/lib/karafka/web/pro/ui/views/topics/configs/_config.erb +26 -0
- data/lib/karafka/web/pro/ui/views/topics/configs/_delete_button.erb +13 -0
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_form.erb +50 -0
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_plan.erb +16 -0
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_warning.erb +12 -0
- data/lib/karafka/web/pro/ui/views/topics/configs/edit.erb +16 -0
- data/lib/karafka/web/pro/ui/views/topics/{config.erb → configs/index.erb} +9 -3
- data/lib/karafka/web/pro/ui/views/topics/distributions/_add_partitions_button.erb +13 -0
- data/lib/karafka/web/pro/ui/views/topics/{distribution → distributions}/_badges.erb +3 -0
- data/lib/karafka/web/pro/ui/views/topics/distributions/_breadcrumbs.erb +28 -0
- data/lib/karafka/web/pro/ui/views/topics/{distribution → distributions}/_chart.erb +3 -0
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_form.erb +47 -0
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_hints.erb +15 -0
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_warnings.erb +14 -0
- data/lib/karafka/web/pro/ui/views/topics/distributions/_empty_partitions.erb +4 -0
- data/lib/karafka/web/pro/ui/views/topics/{distribution → distributions}/_limited.erb +3 -0
- data/lib/karafka/web/pro/ui/views/topics/distributions/_partition.erb +13 -0
- data/lib/karafka/web/pro/ui/views/topics/distributions/edit.erb +16 -0
- data/lib/karafka/web/pro/ui/views/topics/{distribution.erb → distributions/show.erb} +11 -7
- data/lib/karafka/web/pro/ui/views/topics/offsets/_breadcrumbs.erb +20 -0
- data/lib/karafka/web/pro/ui/views/topics/offsets/_partition.erb +13 -0
- data/lib/karafka/web/pro/ui/views/topics/{offsets.erb → offsets/show.erb} +6 -3
- data/lib/karafka/web/pro/ui/views/topics/replications/_breadcrumbs.erb +20 -0
- data/lib/karafka/web/pro/ui/views/topics/{_partition.erb → replications/_partition.erb} +4 -1
- data/lib/karafka/web/pro/ui/views/topics/{replication.erb → replications/show.erb} +6 -3
- data/lib/karafka/web/pro/ui/views/topics/topics/_breadcrumbs.erb +32 -0
- data/lib/karafka/web/pro/ui/views/topics/topics/_create_button.erb +13 -0
- data/lib/karafka/web/pro/ui/views/topics/topics/_create_hints.erb +15 -0
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_form.erb +36 -0
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_hints.erb +15 -0
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_warning.erb +13 -0
- data/lib/karafka/web/pro/ui/views/topics/topics/_new_form.erb +80 -0
- data/lib/karafka/web/pro/ui/views/topics/{_tabs.erb → topics/_tabs.erb} +7 -4
- data/lib/karafka/web/pro/ui/views/topics/topics/_topic.erb +12 -0
- data/lib/karafka/web/pro/ui/views/topics/topics/edit.erb +10 -0
- data/lib/karafka/web/pro/ui/views/topics/topics/index.erb +19 -0
- data/lib/karafka/web/pro/ui/views/topics/topics/new.erb +12 -0
- data/lib/karafka/web/processing/consumers/metrics.rb +1 -1
- data/lib/karafka/web/processing/consumers/state.rb +1 -1
- data/lib/karafka/web/processing/publisher.rb +4 -4
- data/lib/karafka/web/tracking/consumers/contracts/partition.rb +1 -0
- data/lib/karafka/web/tracking/consumers/listeners/pausing.rb +2 -2
- data/lib/karafka/web/tracking/consumers/listeners/transactions.rb +44 -0
- data/lib/karafka/web/tracking/consumers/reporter.rb +2 -2
- data/lib/karafka/web/tracking/consumers/sampler.rb +81 -14
- data/lib/karafka/web/tracking/helpers/sysconf.rb +33 -0
- data/lib/karafka/web/tracking/producers/reporter.rb +1 -1
- data/lib/karafka/web/ui/app.rb +19 -112
- data/lib/karafka/web/ui/base.rb +63 -4
- data/lib/karafka/web/ui/controllers/base_controller.rb +43 -1
- data/lib/karafka/web/ui/controllers/cluster_controller.rb +5 -2
- data/lib/karafka/web/ui/controllers/errors_controller.rb +1 -1
- data/lib/karafka/web/ui/controllers/requests/execution_wrapper.rb +52 -0
- data/lib/karafka/web/ui/controllers/requests/hookable.rb +99 -0
- data/lib/karafka/web/ui/controllers/requests/params.rb +39 -1
- data/lib/karafka/web/ui/controllers/responses/redirect.rb +0 -5
- data/lib/karafka/web/ui/controllers/status_controller.rb +3 -0
- data/lib/karafka/web/ui/helpers/application_helper.rb +10 -1
- data/lib/karafka/web/ui/helpers/paths_helper.rb +54 -10
- data/lib/karafka/web/ui/lib/admin.rb +1 -1
- data/lib/karafka/web/ui/lib/cache.rb +135 -0
- data/lib/karafka/web/ui/models/broker.rb +1 -2
- data/lib/karafka/web/ui/models/cluster_info.rb +15 -21
- data/lib/karafka/web/ui/models/consumers_metrics.rb +1 -1
- data/lib/karafka/web/ui/models/consumers_state.rb +1 -1
- data/lib/karafka/web/ui/models/counters.rb +1 -1
- data/lib/karafka/web/ui/models/health.rb +9 -7
- data/lib/karafka/web/ui/models/process.rb +14 -0
- data/lib/karafka/web/ui/models/processes.rb +2 -2
- data/lib/karafka/web/ui/models/recurring_tasks/schedule.rb +1 -1
- data/lib/karafka/web/ui/models/status.rb +27 -8
- data/lib/karafka/web/ui/models/topic.rb +1 -2
- data/lib/karafka/web/ui/public/javascripts/application.js +8 -98
- data/lib/karafka/web/ui/public/javascripts/application.min.js +12 -4
- 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/action_confirmation_manager.js +30 -0
- data/lib/karafka/web/ui/public/javascripts/components/alerts.js +39 -0
- data/lib/karafka/web/ui/public/javascripts/components/button_lock_manager.js +50 -0
- data/lib/karafka/web/ui/public/javascripts/components/live_poll.js +71 -19
- data/lib/karafka/web/ui/public/javascripts/components/message_republish_manager.js +50 -0
- data/lib/karafka/web/ui/public/javascripts/components/page_title_tracker.js +21 -0
- data/lib/karafka/web/ui/public/javascripts/components/partition_redirect_manager.js +21 -0
- data/lib/karafka/web/ui/public/javascripts/components/time_ago_manager.js +25 -0
- data/lib/karafka/web/ui/public/javascripts/components/timestamp_selector.js +30 -0
- data/lib/karafka/web/ui/public/javascripts/libs/datepicker.js +2 -2
- data/lib/karafka/web/ui/public/stylesheets/application.css +30 -0
- data/lib/karafka/web/ui/public/stylesheets/application.min.css +5122 -13
- 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 +512 -213
- data/lib/karafka/web/ui/routes/assets.rb +53 -0
- data/lib/karafka/web/ui/routes/base.rb +36 -0
- data/lib/karafka/web/ui/routes/cluster.rb +28 -0
- data/lib/karafka/web/ui/routes/consumers.rb +35 -0
- data/lib/karafka/web/ui/routes/dashboard.rb +20 -0
- data/lib/karafka/web/ui/routes/errors.rb +26 -0
- data/lib/karafka/web/ui/routes/jobs.rb +28 -0
- data/lib/karafka/web/ui/routes/pro_only.rb +27 -0
- data/lib/karafka/web/ui/routes/routing.rb +26 -0
- data/lib/karafka/web/ui/routes/status.rb +19 -0
- data/lib/karafka/web/ui/routes/support.rb +19 -0
- data/lib/karafka/web/ui/routes/ux.rb +19 -0
- data/lib/karafka/web/ui/views/cluster/_partition.erb +2 -2
- data/lib/karafka/web/ui/views/cluster/brokers.erb +1 -1
- data/lib/karafka/web/ui/views/consumers/_breadcrumbs.erb +7 -1
- data/lib/karafka/web/ui/views/consumers/_consumer.erb +39 -30
- data/lib/karafka/web/ui/views/consumers/_incompatible.erb +13 -0
- data/lib/karafka/web/ui/views/consumers/_no_consumers.erb +2 -2
- data/lib/karafka/web/ui/views/consumers/_tabs.erb +4 -4
- data/lib/karafka/web/ui/views/consumers/index.erb +1 -1
- data/lib/karafka/web/ui/views/dashboard/_feature_pro.erb +1 -1
- data/lib/karafka/web/ui/views/dashboard/_not_enough_data.erb +2 -2
- data/lib/karafka/web/ui/views/dashboard/_ranges_selector.erb +1 -1
- data/lib/karafka/web/ui/views/dashboard/index.erb +6 -49
- data/lib/karafka/web/ui/views/errors/_detail.erb +3 -3
- data/lib/karafka/web/ui/views/errors/index.erb +1 -1
- data/lib/karafka/web/ui/views/jobs/_job.erb +38 -29
- data/lib/karafka/web/ui/views/jobs/pending.erb +1 -1
- data/lib/karafka/web/ui/views/jobs/running.erb +1 -1
- data/lib/karafka/web/ui/views/layout.erb +7 -5
- data/lib/karafka/web/ui/views/shared/_become_pro.erb +1 -1
- data/lib/karafka/web/ui/views/shared/_brand.erb +1 -1
- data/lib/karafka/web/ui/views/shared/_breadcrumbs.erb +1 -1
- data/lib/karafka/web/ui/views/shared/_content.erb +1 -1
- data/lib/karafka/web/ui/views/shared/_controls.erb +10 -3
- data/lib/karafka/web/ui/views/shared/_custom_nav.erb +9 -0
- data/lib/karafka/web/ui/views/shared/_flashes.erb +3 -5
- data/lib/karafka/web/ui/views/shared/_header.erb +25 -2
- data/lib/karafka/web/ui/views/shared/_navigation.erb +17 -15
- data/lib/karafka/web/ui/views/shared/alerts/_error.erb +8 -0
- data/lib/karafka/web/ui/views/shared/alerts/_info.erb +8 -0
- data/lib/karafka/web/ui/views/shared/alerts/_primary.erb +8 -0
- data/lib/karafka/web/ui/views/shared/alerts/_secondary.erb +8 -0
- data/lib/karafka/web/ui/views/shared/alerts/_success.erb +8 -0
- data/lib/karafka/web/ui/views/shared/alerts/_warning.erb +8 -0
- data/lib/karafka/web/ui/views/shared/exceptions/incompatible_schema.erb +34 -0
- data/lib/karafka/web/ui/views/shared/exceptions/not_allowed.erb +4 -0
- data/lib/karafka/web/ui/views/shared/exceptions/not_found.erb +5 -1
- data/lib/karafka/web/ui/views/shared/exceptions/pro_only.erb +4 -0
- data/lib/karafka/web/ui/views/shared/icons/_arrow_left.erb +3 -0
- data/lib/karafka/web/ui/views/shared/icons/_arrow_up_tray.erb +3 -0
- data/lib/karafka/web/ui/views/shared/icons/_clock.erb +3 -0
- data/lib/karafka/web/ui/views/shared/icons/_pencil.erb +3 -0
- data/lib/karafka/web/ui/views/shared/icons/_pencil_square.erb +3 -0
- data/lib/karafka/web/ui/views/shared/icons/_play_pause.erb +3 -0
- data/lib/karafka/web/ui/views/shared/icons/_plus.erb +3 -0
- data/lib/karafka/web/ui/views/shared/icons/_trash.erb +3 -0
- data/lib/karafka/web/ui/views/status/failures/_live_reporting.erb +1 -1
- data/lib/karafka/web/ui/views/status/failures/_partitions.erb +3 -3
- data/lib/karafka/web/ui/views/status/failures/_state_calculation.erb +2 -2
- data/lib/karafka/web/ui/views/status/info/_components.erb +6 -6
- data/lib/karafka/web/ui/views/status/show.erb +15 -0
- data/lib/karafka/web/ui/views/status/warnings/_consumers_schemas.erb +31 -0
- data/lib/karafka/web/ui/views/ux/_icons.erb +1 -1
- data/lib/karafka/web/ui/views/ux/_status_rows.erb +6 -0
- data/lib/karafka/web/version.rb +1 -1
- data/lib/karafka/web.rb +3 -0
- data/package-lock.json +776 -1208
- data/package.json +3 -4
- data/postcss.config.js +1 -2
- data/renovate.json +13 -1
- data/tailwind.config.js +0 -4
- data.tar.gz.sig +0 -0
- metadata +232 -108
- metadata.gz.sig +0 -0
- data/lib/karafka/web/pro/commanding/commands/quiet.rb +0 -34
- data/lib/karafka/web/pro/commanding/commands/stop.rb +0 -34
- data/lib/karafka/web/pro/commanding/commands/trace.rb +0 -41
- data/lib/karafka/web/pro/ui/controllers/commanding_controller.rb +0 -118
- data/lib/karafka/web/pro/ui/controllers/commands_controller.rb +0 -96
- data/lib/karafka/web/pro/ui/controllers/consumers_controller.rb +0 -138
- data/lib/karafka/web/pro/ui/controllers/explorer_controller.rb +0 -220
- data/lib/karafka/web/pro/ui/controllers/messages_controller.rb +0 -107
- data/lib/karafka/web/pro/ui/controllers/search_controller.rb +0 -73
- data/lib/karafka/web/pro/ui/controllers/topics_controller.rb +0 -130
- data/lib/karafka/web/pro/ui/views/commands/_breadcrumbs.erb +0 -21
- data/lib/karafka/web/pro/ui/views/commands/_command_details.erb +0 -1
- data/lib/karafka/web/pro/ui/views/commands/_empty.erb +0 -3
- data/lib/karafka/web/pro/ui/views/commands/show.erb +0 -33
- data/lib/karafka/web/pro/ui/views/consumers/_breadcrumbs.erb +0 -55
- data/lib/karafka/web/pro/ui/views/consumers/_consumer.erb +0 -47
- data/lib/karafka/web/pro/ui/views/consumers/_consumer_controls.erb +0 -95
- data/lib/karafka/web/pro/ui/views/consumers/_consumer_performance.erb +0 -59
- data/lib/karafka/web/pro/ui/views/consumers/_tabs.erb +0 -33
- data/lib/karafka/web/pro/ui/views/consumers/consumer/_commands.erb +0 -72
- data/lib/karafka/web/pro/ui/views/consumers/consumer/_consumer_group.erb +0 -8
- data/lib/karafka/web/pro/ui/views/consumers/consumer/_no_subscriptions.erb +0 -7
- data/lib/karafka/web/pro/ui/views/consumers/details.erb +0 -13
- data/lib/karafka/web/pro/ui/views/consumers/subscriptions.erb +0 -25
- data/lib/karafka/web/pro/ui/views/explorer/_no_topics.erb +0 -1
- data/lib/karafka/web/pro/ui/views/explorer/_topic.erb +0 -10
- data/lib/karafka/web/pro/ui/views/explorer/index.erb +0 -14
- data/lib/karafka/web/pro/ui/views/explorer/messages/_headers.erb +0 -33
- data/lib/karafka/web/pro/ui/views/explorer/partition/_cleaned.erb +0 -3
- data/lib/karafka/web/pro/ui/views/explorer/partition/_empty.erb +0 -3
- data/lib/karafka/web/pro/ui/views/explorer/topic/_empty.erb +0 -3
- data/lib/karafka/web/pro/ui/views/search/_breadcrumbs.erb +0 -1
- data/lib/karafka/web/pro/ui/views/search/_fix_errors.erb +0 -3
- data/lib/karafka/web/pro/ui/views/search/_no_results.erb +0 -3
- data/lib/karafka/web/pro/ui/views/search/_timeout.erb +0 -3
- data/lib/karafka/web/pro/ui/views/search/index.erb +0 -29
- data/lib/karafka/web/pro/ui/views/topics/_breadcrumbs.erb +0 -45
- data/lib/karafka/web/pro/ui/views/topics/_partition_offsets.erb +0 -10
- data/lib/karafka/web/pro/ui/views/topics/_topic.erb +0 -9
- data/lib/karafka/web/pro/ui/views/topics/distribution/_empty_partitions.erb +0 -1
- data/lib/karafka/web/pro/ui/views/topics/distribution/_partition.erb +0 -10
- data/lib/karafka/web/pro/ui/views/topics/index.erb +0 -14
- data/lib/karafka/web/ui/lib/ttl_cache.rb +0 -82
@@ -0,0 +1,110 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This code is part of Karafka Pro, a commercial component not licensed under LGPL.
|
4
|
+
# See LICENSE for details.
|
5
|
+
|
6
|
+
module Karafka
|
7
|
+
module Web
|
8
|
+
module Pro
|
9
|
+
module Ui
|
10
|
+
module Controllers
|
11
|
+
module Consumers
|
12
|
+
module Partitions
|
13
|
+
# Controller for managing partitions pauses in the context of the given consumer
|
14
|
+
# process
|
15
|
+
class PausesController < BaseController
|
16
|
+
self.sortable_attributes = %w[].freeze
|
17
|
+
|
18
|
+
# Displays the toggle (pause / resume)
|
19
|
+
#
|
20
|
+
# @param process_id [String] id of the process we're interested in
|
21
|
+
# @param subscription_group_id [String]
|
22
|
+
# @param topic [String]
|
23
|
+
# @param partition_id [Integer]
|
24
|
+
def new(process_id, subscription_group_id, topic, partition_id)
|
25
|
+
bootstrap!(process_id, subscription_group_id, topic, partition_id)
|
26
|
+
|
27
|
+
render
|
28
|
+
end
|
29
|
+
|
30
|
+
# @param process_id [String]
|
31
|
+
# @param subscription_group_id [String]
|
32
|
+
# @param topic [String]
|
33
|
+
# @param partition_id [Integer]
|
34
|
+
def create(process_id, subscription_group_id, topic, partition_id)
|
35
|
+
new(process_id, subscription_group_id, topic, partition_id)
|
36
|
+
|
37
|
+
Commanding::Dispatcher.request(
|
38
|
+
Commanding::Commands::Partitions::Pause.name,
|
39
|
+
process_id,
|
40
|
+
{
|
41
|
+
consumer_group_id: @consumer_group.id,
|
42
|
+
subscription_group_id: @subscription_group.id,
|
43
|
+
topic: topic,
|
44
|
+
partition_id: partition_id,
|
45
|
+
# User provides this in seconds, we operate on ms in the system
|
46
|
+
duration: params.int(:duration) * 1_000,
|
47
|
+
prevent_override: params.bool(:prevent_override)
|
48
|
+
}
|
49
|
+
)
|
50
|
+
|
51
|
+
redirect(
|
52
|
+
:previous,
|
53
|
+
success: format_flash(
|
54
|
+
'Initiated partition ? for ?#? (subscription group: ?)',
|
55
|
+
'pause',
|
56
|
+
topic,
|
57
|
+
partition_id,
|
58
|
+
subscription_group_id
|
59
|
+
)
|
60
|
+
)
|
61
|
+
end
|
62
|
+
|
63
|
+
# @param process_id [String]
|
64
|
+
# @param subscription_group_id [String]
|
65
|
+
# @param topic [String]
|
66
|
+
# @param partition_id [Integer]
|
67
|
+
def edit(process_id, subscription_group_id, topic, partition_id)
|
68
|
+
new(process_id, subscription_group_id, topic, partition_id)
|
69
|
+
|
70
|
+
render
|
71
|
+
end
|
72
|
+
|
73
|
+
# @param process_id [String]
|
74
|
+
# @param subscription_group_id [String]
|
75
|
+
# @param topic [String]
|
76
|
+
# @param partition_id [Integer]
|
77
|
+
def delete(process_id, subscription_group_id, topic, partition_id)
|
78
|
+
new(process_id, subscription_group_id, topic, partition_id)
|
79
|
+
|
80
|
+
Commanding::Dispatcher.request(
|
81
|
+
Commanding::Commands::Partitions::Resume.name,
|
82
|
+
process_id,
|
83
|
+
{
|
84
|
+
consumer_group_id: @consumer_group.id,
|
85
|
+
subscription_group_id: @subscription_group.id,
|
86
|
+
topic: topic,
|
87
|
+
partition_id: partition_id,
|
88
|
+
reset_attempts: params.bool(:reset_attempts)
|
89
|
+
}
|
90
|
+
)
|
91
|
+
|
92
|
+
redirect(
|
93
|
+
:previous,
|
94
|
+
success: format_flash(
|
95
|
+
'Initiated partition ? for ?#? (subscription group: ?)',
|
96
|
+
'resume',
|
97
|
+
topic,
|
98
|
+
partition_id,
|
99
|
+
subscription_group_id
|
100
|
+
)
|
101
|
+
)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -1,15 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# This
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
7
|
-
# repository and their usage requires commercial license agreement.
|
8
|
-
#
|
9
|
-
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
10
|
-
#
|
11
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
12
|
-
# your code to Maciej Mensfeld.
|
3
|
+
# This code is part of Karafka Pro, a commercial component not licensed under LGPL.
|
4
|
+
# See LICENSE for details.
|
13
5
|
|
14
6
|
module Karafka
|
15
7
|
module Web
|
@@ -1,15 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# This
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
7
|
-
# repository and their usage requires commercial license agreement.
|
8
|
-
#
|
9
|
-
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
10
|
-
#
|
11
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
12
|
-
# your code to Maciej Mensfeld.
|
3
|
+
# This code is part of Karafka Pro, a commercial component not licensed under LGPL.
|
4
|
+
# See LICENSE for details.
|
13
5
|
|
14
6
|
module Karafka
|
15
7
|
module Web
|
@@ -1,15 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# This
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
7
|
-
# repository and their usage requires commercial license agreement.
|
8
|
-
#
|
9
|
-
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
10
|
-
#
|
11
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
12
|
-
# your code to Maciej Mensfeld.
|
3
|
+
# This code is part of Karafka Pro, a commercial component not licensed under LGPL.
|
4
|
+
# See LICENSE for details.
|
13
5
|
|
14
6
|
module Karafka
|
15
7
|
module Web
|
@@ -83,7 +75,7 @@ module Karafka
|
|
83
75
|
|
84
76
|
# @return [String] errors topic
|
85
77
|
def errors_topic
|
86
|
-
::Karafka::Web.config.topics.errors
|
78
|
+
::Karafka::Web.config.topics.errors.name
|
87
79
|
end
|
88
80
|
end
|
89
81
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This code is part of Karafka Pro, a commercial component not licensed under LGPL.
|
4
|
+
# See LICENSE for details.
|
5
|
+
|
6
|
+
module Karafka
|
7
|
+
module Web
|
8
|
+
module Pro
|
9
|
+
module Ui
|
10
|
+
module Controllers
|
11
|
+
# Namespace for all controllers related to explorer operations
|
12
|
+
module Explorer
|
13
|
+
# Base controller for all explorer related controllers
|
14
|
+
class BaseController < Controllers::BaseController
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,215 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This code is part of Karafka Pro, a commercial component not licensed under LGPL.
|
4
|
+
# See LICENSE for details.
|
5
|
+
|
6
|
+
module Karafka
|
7
|
+
module Web
|
8
|
+
module Pro
|
9
|
+
module Ui
|
10
|
+
module Controllers
|
11
|
+
module Explorer
|
12
|
+
# Data explorer controller
|
13
|
+
class ExplorerController < BaseController
|
14
|
+
# Lists all the topics we can explore
|
15
|
+
def index
|
16
|
+
@topics = Models::ClusterInfo
|
17
|
+
.topics
|
18
|
+
.sort_by { |topic| topic[:topic_name] }
|
19
|
+
|
20
|
+
unless ::Karafka::Web.config.ui.visibility.internal_topics
|
21
|
+
@topics.reject! { |topic| topic[:topic_name].start_with?('__') }
|
22
|
+
end
|
23
|
+
|
24
|
+
render
|
25
|
+
end
|
26
|
+
|
27
|
+
# Displays aggregated messages from (potentially) all partitions of a topic
|
28
|
+
#
|
29
|
+
# @param topic_id [String]
|
30
|
+
#
|
31
|
+
# @note This view may not be 100% accurate because we merge multiple partitions data
|
32
|
+
# into a single view and this is never accurate. It can be used however to quickly
|
33
|
+
# look at most recent data flowing, etc, hence it is still useful for aggregated
|
34
|
+
# metrics information
|
35
|
+
#
|
36
|
+
# @note We cannot use offset references here because each of the partitions may have
|
37
|
+
# completely different values
|
38
|
+
def topic(topic_id)
|
39
|
+
@visibility_filter = ::Karafka::Web.config.ui.policies.messages
|
40
|
+
|
41
|
+
@topic_id = topic_id
|
42
|
+
@partitions_count = Models::ClusterInfo.partitions_count(topic_id)
|
43
|
+
|
44
|
+
@active_partitions, materialized_page, @limited = Paginators::Partitions.call(
|
45
|
+
@partitions_count, @params.current_page
|
46
|
+
)
|
47
|
+
|
48
|
+
@messages, next_page = Models::Message.topic_page(
|
49
|
+
topic_id, @active_partitions, materialized_page
|
50
|
+
)
|
51
|
+
|
52
|
+
paginate(@params.current_page, next_page)
|
53
|
+
|
54
|
+
render
|
55
|
+
end
|
56
|
+
|
57
|
+
# Shows messages available in a given partition
|
58
|
+
#
|
59
|
+
# @param topic_id [String]
|
60
|
+
# @param partition_id [Integer]
|
61
|
+
def partition(topic_id, partition_id)
|
62
|
+
@visibility_filter = ::Karafka::Web.config.ui.policies.messages
|
63
|
+
@topic_id = topic_id
|
64
|
+
@partition_id = partition_id
|
65
|
+
@watermark_offsets = Models::WatermarkOffsets.find(topic_id, partition_id)
|
66
|
+
@partitions_count = Models::ClusterInfo.partitions_count(topic_id)
|
67
|
+
|
68
|
+
previous_offset, @messages, next_offset = current_partition_data
|
69
|
+
|
70
|
+
paginate(
|
71
|
+
previous_offset,
|
72
|
+
@params.current_offset,
|
73
|
+
next_offset,
|
74
|
+
# If message is an array, it means it's a compacted dummy offset representation
|
75
|
+
@messages.map { |message| message.is_a?(Array) ? message.last : message.offset }
|
76
|
+
)
|
77
|
+
|
78
|
+
render
|
79
|
+
end
|
80
|
+
|
81
|
+
# Displays given message
|
82
|
+
#
|
83
|
+
# @param topic_id [String]
|
84
|
+
# @param partition_id [Integer]
|
85
|
+
# @param offset [Integer] offset of the message we want to display
|
86
|
+
# @param paginate [Boolean] do we want to have pagination
|
87
|
+
def show(topic_id, partition_id, offset, paginate: true)
|
88
|
+
Lib::PatternsDetector.new.call
|
89
|
+
|
90
|
+
@visibility_filter = ::Karafka::Web.config.ui.policies.messages
|
91
|
+
@topic_id = topic_id
|
92
|
+
@partition_id = partition_id
|
93
|
+
@offset = offset
|
94
|
+
@message = Models::Message.find(@topic_id, @partition_id, @offset)
|
95
|
+
|
96
|
+
@safe_key = Web::Pro::Ui::Lib::SafeRunner.new { @message.key }.tap(&:call)
|
97
|
+
@safe_headers = Web::Pro::Ui::Lib::SafeRunner.new { @message.headers }.tap(&:call)
|
98
|
+
@safe_payload = Web::Pro::Ui::Lib::SafeRunner.new { @message.payload }.tap(&:call)
|
99
|
+
|
100
|
+
# This may be off for certain views like recent view where we are interested only
|
101
|
+
# in the most recent all the time. It does not make any sense to display pagination
|
102
|
+
# there
|
103
|
+
if paginate
|
104
|
+
# We need watermark offsets to decide if we can paginate left and right
|
105
|
+
watermark_offsets = Models::WatermarkOffsets.find(topic_id, partition_id)
|
106
|
+
paginate(offset, watermark_offsets.low, watermark_offsets.high)
|
107
|
+
end
|
108
|
+
|
109
|
+
render
|
110
|
+
end
|
111
|
+
|
112
|
+
# Displays the most recent message on a topic/partition
|
113
|
+
#
|
114
|
+
# @param topic_id [String]
|
115
|
+
# @param partition_id [Integer, nil] partition we're interested in or nil if we are
|
116
|
+
# interested in the most recent message from all the partitions
|
117
|
+
def recent(topic_id, partition_id)
|
118
|
+
if partition_id
|
119
|
+
active_partitions = [partition_id]
|
120
|
+
else
|
121
|
+
partitions_count = Models::ClusterInfo.partitions_count(topic_id)
|
122
|
+
active_partitions, = Paginators::Partitions.call(partitions_count, 1)
|
123
|
+
end
|
124
|
+
|
125
|
+
recent = nil
|
126
|
+
|
127
|
+
# This selects first pages with most recent messages and moves to next if first
|
128
|
+
# contains only compacted data, etc.
|
129
|
+
#
|
130
|
+
# We do it until we find a message we could refer to (if doable) within first
|
131
|
+
# ten pages
|
132
|
+
10.times do |page|
|
133
|
+
messages, = Models::Message.topic_page(topic_id, active_partitions, page + 1)
|
134
|
+
|
135
|
+
# Selects newest out of all partitions
|
136
|
+
# Reject compacted messages and transaction-related once
|
137
|
+
recent = messages.reject { |message| message.is_a?(Array) }.max_by(&:timestamp)
|
138
|
+
|
139
|
+
break if recent
|
140
|
+
end
|
141
|
+
|
142
|
+
recent || not_found!
|
143
|
+
|
144
|
+
show(topic_id, recent.partition, recent.offset, paginate: false)
|
145
|
+
end
|
146
|
+
|
147
|
+
# Computes a page on which the given offset is in the middle of the page if possible
|
148
|
+
# Useful often when debugging to be able to quickly jump to the historical location
|
149
|
+
# of message and its surrounding to understand failure
|
150
|
+
#
|
151
|
+
# @param topic_id [String]
|
152
|
+
# @param partition_id [Integer]
|
153
|
+
# @param offset [Integer] offset of the message we want to display
|
154
|
+
def surrounding(topic_id, partition_id, offset)
|
155
|
+
watermark_offsets = Models::WatermarkOffsets.find(topic_id, partition_id)
|
156
|
+
|
157
|
+
not_found! if offset < watermark_offsets.low
|
158
|
+
not_found! if offset >= watermark_offsets.high
|
159
|
+
|
160
|
+
# Assume we start from this offset
|
161
|
+
shift = 0
|
162
|
+
elements = 0
|
163
|
+
|
164
|
+
# Position the offset as close to the middle of offset based page as possible
|
165
|
+
::Karafka::Web.config.ui.per_page.times do
|
166
|
+
break if elements >= ::Karafka::Web.config.ui.per_page
|
167
|
+
|
168
|
+
elements += 1 if offset + shift < watermark_offsets.high
|
169
|
+
|
170
|
+
if offset - shift > watermark_offsets.low
|
171
|
+
shift += 1
|
172
|
+
elements += 1
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
target = offset - shift
|
177
|
+
|
178
|
+
redirect("explorer/topics/#{topic_id}/#{partition_id}?offset=#{target}")
|
179
|
+
end
|
180
|
+
|
181
|
+
# Finds the closest offset matching the requested time and redirects to this location
|
182
|
+
# Note, that it redirects to closest but always younger.
|
183
|
+
#
|
184
|
+
# @param topic_id [String]
|
185
|
+
# @param partition_id [Integer]
|
186
|
+
# @param time [Time] time of the message
|
187
|
+
def closest(topic_id, partition_id, time)
|
188
|
+
target = Web::Ui::Lib::Admin.read_topic(topic_id, partition_id, 1, time).first
|
189
|
+
|
190
|
+
partition_path = "explorer/topics/#{topic_id}/#{partition_id}"
|
191
|
+
partition_path += "?offset=#{target.offset}" if target
|
192
|
+
|
193
|
+
redirect(partition_path)
|
194
|
+
end
|
195
|
+
|
196
|
+
private
|
197
|
+
|
198
|
+
# Fetches current page data
|
199
|
+
# @return [Array] fetched data with pagination information for the requested
|
200
|
+
# partition
|
201
|
+
def current_partition_data
|
202
|
+
Models::Message.offset_page(
|
203
|
+
@topic_id,
|
204
|
+
@partition_id,
|
205
|
+
@params.current_offset,
|
206
|
+
@watermark_offsets
|
207
|
+
)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This code is part of Karafka Pro, a commercial component not licensed under LGPL.
|
4
|
+
# See LICENSE for details.
|
5
|
+
|
6
|
+
module Karafka
|
7
|
+
module Web
|
8
|
+
module Pro
|
9
|
+
module Ui
|
10
|
+
module Controllers
|
11
|
+
module Explorer
|
12
|
+
# Controller for working with messages
|
13
|
+
# While part of messages operations is done via explorer (exploring), this controller
|
14
|
+
# handles other cases not related to viewing data
|
15
|
+
class MessagesController < BaseController
|
16
|
+
# Renders a form allowing for piping a message to a different topic
|
17
|
+
#
|
18
|
+
# @param topic_id [String]
|
19
|
+
# @param partition_id [Integer]
|
20
|
+
# @param offset [Integer] offset of the message we want to republish
|
21
|
+
def forward(topic_id, partition_id, offset)
|
22
|
+
@message = Models::Message.find(topic_id, partition_id, offset)
|
23
|
+
|
24
|
+
deny! unless visibility_filter.republish?(@message)
|
25
|
+
|
26
|
+
@topic_id = topic_id
|
27
|
+
@partition_id = partition_id
|
28
|
+
@offset = offset
|
29
|
+
|
30
|
+
@target_topic = @topic_id
|
31
|
+
@target_partition = @partition_id
|
32
|
+
|
33
|
+
@topics = Models::ClusterInfo
|
34
|
+
.topics
|
35
|
+
.sort_by { |topic| topic[:topic_name] }
|
36
|
+
|
37
|
+
unless ::Karafka::Web.config.ui.visibility.internal_topics
|
38
|
+
@topics.reject! { |topic| topic[:topic_name].start_with?('__') }
|
39
|
+
end
|
40
|
+
|
41
|
+
render
|
42
|
+
end
|
43
|
+
|
44
|
+
# Takes a requested message content and republishes it again
|
45
|
+
#
|
46
|
+
# @param topic_id [String]
|
47
|
+
# @param partition_id [Integer]
|
48
|
+
# @param offset [Integer] offset of the message we want to republish
|
49
|
+
def republish(topic_id, partition_id, offset)
|
50
|
+
forward(topic_id, partition_id, offset)
|
51
|
+
|
52
|
+
dispatch_message = {
|
53
|
+
topic: params.str(:target_topic),
|
54
|
+
payload: @message.raw_payload,
|
55
|
+
headers: @message.headers.dup,
|
56
|
+
key: @message.key
|
57
|
+
}
|
58
|
+
|
59
|
+
# Add target partition only if it was requested, otherwise it will use either the
|
60
|
+
# message key (if present) or will jut round-robin
|
61
|
+
unless params.fetch(:target_partition).empty?
|
62
|
+
dispatch_message[:partition] = params.int(:target_partition)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Include source headers for enhanced debuggability
|
66
|
+
if params.bool(:include_source_headers)
|
67
|
+
dispatch_message[:headers].merge!(
|
68
|
+
'source_topic' => @message.topic,
|
69
|
+
'source_partition' => @message.partition.to_s,
|
70
|
+
'source_offset' => @message.offset.to_s
|
71
|
+
)
|
72
|
+
end
|
73
|
+
|
74
|
+
delivery = ::Karafka::Web.producer.produce_sync(dispatch_message)
|
75
|
+
|
76
|
+
redirect(
|
77
|
+
:previous,
|
78
|
+
success: republished(@message, delivery)
|
79
|
+
)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Dispatches the message raw payload to the browser as a file
|
83
|
+
#
|
84
|
+
# @param topic_id [String]
|
85
|
+
# @param partition_id [Integer]
|
86
|
+
# @param offset [Integer] offset of the message we want to download
|
87
|
+
def download(topic_id, partition_id, offset)
|
88
|
+
message = Models::Message.find(topic_id, partition_id, offset)
|
89
|
+
|
90
|
+
deny! unless visibility_filter.download?(message)
|
91
|
+
|
92
|
+
file(
|
93
|
+
message.raw_payload,
|
94
|
+
"#{topic_id}_#{partition_id}_#{offset}_payload.msg"
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Dispatches the message payload first deserialized and then serialized to JSON
|
99
|
+
# It differs from the raw payload in cases where raw payload is compressed or binary
|
100
|
+
# or contains data that the Web UI user should not see that was altered on the Web UI
|
101
|
+
# with the visibility filter.
|
102
|
+
#
|
103
|
+
# @param topic_id [String]
|
104
|
+
# @param partition_id [Integer]
|
105
|
+
# @param offset [Integer] offset of the message we want to export
|
106
|
+
def export(topic_id, partition_id, offset)
|
107
|
+
Lib::PatternsDetector.new.call
|
108
|
+
|
109
|
+
message = Models::Message.find(topic_id, partition_id, offset)
|
110
|
+
|
111
|
+
# Check if exports are allowed
|
112
|
+
deny! unless visibility_filter.export?(message)
|
113
|
+
|
114
|
+
file(
|
115
|
+
message.payload.to_json,
|
116
|
+
"#{topic_id}_#{partition_id}_#{offset}_payload.json"
|
117
|
+
)
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
# @param message [Karafka::Messages::Message]
|
123
|
+
# @param delivery [Rdkafka::Producer::DeliveryReport]
|
124
|
+
# @return [String] flash message about message reproducing
|
125
|
+
def republished(message, delivery)
|
126
|
+
format_flash(
|
127
|
+
'Message with offset ? has been sent to ?#? and received offset ?',
|
128
|
+
message.offset,
|
129
|
+
delivery.topic,
|
130
|
+
delivery.partition,
|
131
|
+
delivery.offset
|
132
|
+
)
|
133
|
+
end
|
134
|
+
|
135
|
+
# @return [Object] visibility filter. Either default or user-based
|
136
|
+
def visibility_filter
|
137
|
+
::Karafka::Web.config.ui.policies.messages
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This code is part of Karafka Pro, a commercial component not licensed under LGPL.
|
4
|
+
# See LICENSE for details.
|
5
|
+
|
6
|
+
module Karafka
|
7
|
+
module Web
|
8
|
+
module Pro
|
9
|
+
module Ui
|
10
|
+
module Controllers
|
11
|
+
module Explorer
|
12
|
+
# Handles the search requests
|
13
|
+
# We present this as a part of explorer scope but we use a separate controller not to
|
14
|
+
# mix data exploring with searching.
|
15
|
+
class SearchController < Web::Ui::Controllers::ClusterController
|
16
|
+
# Runs the search if search parameters are provided
|
17
|
+
# If no parameters provided, displays the search modal and info to provide search
|
18
|
+
# data. If invalid search parameters provided, modal contains errors
|
19
|
+
#
|
20
|
+
# @param topic_id [String] topic we're interested in
|
21
|
+
# @note In theory search can be used to detect pieces of information within messages.
|
22
|
+
# Since we allow for custom search strategies, this is not an issue because users
|
23
|
+
# that need to provide only granular search can do so.
|
24
|
+
def index(topic_id)
|
25
|
+
@topic_id = topic_id
|
26
|
+
@partitions_count = Models::ClusterInfo.partitions_count(topic_id)
|
27
|
+
# Select only matchers that should be available in the context of the current topic
|
28
|
+
available_matchers = Web.config.ui.search.matchers
|
29
|
+
@matchers = available_matchers.select { |match| match.active?(@topic_id) }
|
30
|
+
@search_criteria = !@params.current_search.empty?
|
31
|
+
@current_search = Lib::Search::Normalizer.call(@params.current_search)
|
32
|
+
# Needed when rendering found messages rows. We should always filter the messages
|
33
|
+
# details with the visibility filter
|
34
|
+
@visibility_filter = ::Karafka::Web.config.ui.policies.messages
|
35
|
+
@limits = ::Karafka::Web.config.ui.search.limits.sort
|
36
|
+
|
37
|
+
# If there is search form filled, we validate it to make sure there are no errors
|
38
|
+
@errors = if @search_criteria
|
39
|
+
Lib::Search::Contracts::Form.new.call(@current_search).errors
|
40
|
+
else
|
41
|
+
{}
|
42
|
+
end
|
43
|
+
|
44
|
+
# If all good we run the search
|
45
|
+
if @search_criteria && @errors.empty?
|
46
|
+
found, @search_details = Lib::Search::Runner.new(
|
47
|
+
@topic_id,
|
48
|
+
@partitions_count,
|
49
|
+
@current_search
|
50
|
+
).call
|
51
|
+
|
52
|
+
@messages, last_page = Paginators::Arrays.call(
|
53
|
+
found,
|
54
|
+
@params.current_page
|
55
|
+
)
|
56
|
+
|
57
|
+
paginate(@params.current_page, !last_page)
|
58
|
+
end
|
59
|
+
|
60
|
+
render
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -1,15 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# This
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
7
|
-
# repository and their usage requires commercial license agreement.
|
8
|
-
#
|
9
|
-
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
10
|
-
#
|
11
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
12
|
-
# your code to Maciej Mensfeld.
|
3
|
+
# This code is part of Karafka Pro, a commercial component not licensed under LGPL.
|
4
|
+
# See LICENSE for details.
|
13
5
|
|
14
6
|
module Karafka
|
15
7
|
module Web
|
@@ -1,15 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# This
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
7
|
-
# repository and their usage requires commercial license agreement.
|
8
|
-
#
|
9
|
-
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
10
|
-
#
|
11
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
12
|
-
# your code to Maciej Mensfeld.
|
3
|
+
# This code is part of Karafka Pro, a commercial component not licensed under LGPL.
|
4
|
+
# See LICENSE for details.
|
13
5
|
|
14
6
|
module Karafka
|
15
7
|
module Web
|