karafka-web 0.11.5 → 0.11.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/Gemfile +9 -10
- data/Gemfile.lint +14 -0
- data/Gemfile.lint.lock +123 -0
- data/Gemfile.lock +15 -16
- data/README.md +15 -15
- data/Rakefile +2 -2
- data/bin/balance_specs +120 -0
- data/bin/check_coverage +31 -0
- data/bin/collect_timings +83 -0
- data/bin/rspecs +10 -0
- data/bin/rspecs_parallel +111 -0
- data/docker-compose.yml +1 -1
- data/karafka-web.gemspec +35 -35
- data/lib/karafka/web/cli/base.rb +2 -2
- data/lib/karafka/web/cli/help.rb +2 -2
- data/lib/karafka/web/cli/install.rb +3 -3
- data/lib/karafka/web/cli/migrate.rb +3 -3
- data/lib/karafka/web/cli/reset.rb +3 -3
- data/lib/karafka/web/cli/uninstall.rb +1 -1
- data/lib/karafka/web/config.rb +40 -32
- data/lib/karafka/web/contracts/base.rb +2 -2
- data/lib/karafka/web/deserializer.rb +5 -5
- data/lib/karafka/web/installer.rb +14 -14
- data/lib/karafka/web/management/actions/base.rb +5 -5
- data/lib/karafka/web/management/actions/clean_boot_file.rb +3 -3
- data/lib/karafka/web/management/actions/create_initial_states.rb +8 -8
- data/lib/karafka/web/management/actions/enable.rb +3 -3
- data/lib/karafka/web/management/actions/extend_boot_file.rb +3 -3
- data/lib/karafka/web/management/migrations/base.rb +3 -3
- data/lib/karafka/web/management/migrations/consumers_metrics/0_set_initial.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1699543515_fill_missing_received_and_sent_bytes.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1700234522_introduce_waiting.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1700234522_remove_processing.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1704722380_split_listeners_into_active_and_paused.rb +7 -7
- data/lib/karafka/web/management/migrations/consumers_metrics/1706607960_introduce_lag_total.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1706611396_rename_lag_total_to_lag_hybrid.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_metrics/1716218393_populate_jobs_metrics.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_reports/1761645571_rename_process_name_to_id.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_reports/1765657887_add_group_instance_id_to_subscription_groups.rb +42 -0
- data/lib/karafka/web/management/migrations/consumers_states/0_set_initial.rb +2 -2
- data/lib/karafka/web/management/migrations/consumers_states/1699543515_fill_missing_received_and_sent_bytes.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_states/1700234522_introduce_waiting.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_states/1700234522_remove_processing.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_states/1704722380_split_listeners_into_active_and_paused.rb +7 -7
- data/lib/karafka/web/management/migrations/consumers_states/1706607960_introduce_lag_total.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_states/1706611396_rename_lag_total_to_lag_hybrid.rb +1 -1
- data/lib/karafka/web/management/migrations/consumers_states/1716218393_add_jobs_counter.rb +1 -1
- data/lib/karafka/web/management/migrator.rb +2 -2
- data/lib/karafka/web/pro/commanding/commands/base.rb +20 -4
- data/lib/karafka/web/pro/commanding/commands/consumers/quiet.rb +22 -5
- data/lib/karafka/web/pro/commanding/commands/consumers/stop.rb +22 -5
- data/lib/karafka/web/pro/commanding/commands/consumers/trace.rb +21 -4
- data/lib/karafka/web/pro/commanding/commands/partitions/pause.rb +20 -3
- data/lib/karafka/web/pro/commanding/commands/partitions/resume.rb +20 -3
- data/lib/karafka/web/pro/commanding/commands/partitions/seek.rb +20 -3
- data/lib/karafka/web/pro/commanding/commands/topics/pause.rb +48 -0
- data/lib/karafka/web/pro/commanding/commands/topics/resume.rb +49 -0
- data/lib/karafka/web/pro/commanding/config.rb +23 -5
- data/lib/karafka/web/pro/commanding/contracts/config.rb +21 -4
- data/lib/karafka/web/pro/commanding/dispatcher.rb +61 -26
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/base.rb +20 -3
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/pause.rb +21 -4
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/resume.rb +20 -3
- data/lib/karafka/web/pro/commanding/handlers/partitions/commands/seek.rb +24 -7
- data/lib/karafka/web/pro/commanding/handlers/partitions/executor.rb +36 -12
- data/lib/karafka/web/pro/commanding/handlers/partitions/listener.rb +47 -8
- data/lib/karafka/web/pro/commanding/handlers/partitions/tracker.rb +62 -13
- data/lib/karafka/web/pro/commanding/handlers/topics/commands/base.rb +109 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/commands/pause.rb +76 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/commands/resume.rb +56 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/executor.rb +75 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/listener.rb +82 -0
- data/lib/karafka/web/pro/commanding/handlers/topics/tracker.rb +81 -0
- data/lib/karafka/web/pro/commanding/listener.rb +23 -6
- data/lib/karafka/web/pro/commanding/manager.rb +44 -23
- data/lib/karafka/web/pro/commanding/matcher.rb +46 -18
- data/lib/karafka/web/pro/commanding/matchers/base.rb +87 -0
- data/lib/karafka/web/pro/commanding/matchers/consumer_group_id.rb +58 -0
- data/lib/karafka/web/pro/commanding/matchers/message_type.rb +49 -0
- data/lib/karafka/web/pro/commanding/matchers/partition_id.rb +61 -0
- data/lib/karafka/web/pro/commanding/matchers/process_id.rb +58 -0
- data/lib/karafka/web/pro/commanding/matchers/schema_version.rb +44 -0
- data/lib/karafka/web/pro/commanding/matchers/topic.rb +58 -0
- data/lib/karafka/web/pro/commanding/request.rb +19 -2
- data/lib/karafka/web/pro/commanding.rb +19 -2
- data/lib/karafka/web/pro/loader.rb +20 -3
- data/lib/karafka/web/pro/ui/app.rb +25 -8
- data/lib/karafka/web/pro/ui/controllers/base_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/cluster_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/base_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/commanding_controller.rb +37 -15
- data/lib/karafka/web/pro/ui/controllers/consumers/commands_controller.rb +23 -6
- data/lib/karafka/web/pro/ui/controllers/consumers/consumers_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/controls_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/jobs_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/base_controller.rb +43 -42
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/offsets_controller.rb +36 -17
- data/lib/karafka/web/pro/ui/controllers/consumers/partitions/pauses_controller.rb +59 -33
- data/lib/karafka/web/pro/ui/controllers/consumers/topics/pauses_controller.rb +164 -0
- data/lib/karafka/web/pro/ui/controllers/dashboard_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/dlq_controller.rb +26 -9
- data/lib/karafka/web/pro/ui/controllers/errors_controller.rb +25 -9
- data/lib/karafka/web/pro/ui/controllers/explorer/base_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/explorer/explorer_controller.rb +22 -5
- data/lib/karafka/web/pro/ui/controllers/explorer/messages_controller.rb +26 -9
- data/lib/karafka/web/pro/ui/controllers/explorer/search_controller.rb +23 -6
- data/lib/karafka/web/pro/ui/controllers/health_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/jobs_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/recurring_tasks_controller.rb +22 -5
- data/lib/karafka/web/pro/ui/controllers/routing_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/base_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/explorer_controller.rb +25 -8
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/messages_controller.rb +21 -4
- data/lib/karafka/web/pro/ui/controllers/scheduled_messages/schedules_controller.rb +26 -9
- data/lib/karafka/web/pro/ui/controllers/status_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/support_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/topics/base_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/topics/configs_controller.rb +20 -3
- data/lib/karafka/web/pro/ui/controllers/topics/distributions_controller.rb +20 -3
- data/lib/karafka/web/pro/ui/controllers/topics/offsets_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/controllers/topics/replications_controller.rb +41 -2
- data/lib/karafka/web/pro/ui/controllers/topics/topics_controller.rb +24 -7
- data/lib/karafka/web/pro/ui/controllers/ux_controller.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/branding/config.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/branding/contracts/config.rb +21 -4
- data/lib/karafka/web/pro/ui/lib/branding.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/features.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/patterns_detector.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/policies/config.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/policies/contracts/config.rb +21 -4
- data/lib/karafka/web/pro/ui/lib/policies/messages.rb +20 -3
- data/lib/karafka/web/pro/ui/lib/policies/requests.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/policies.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/safe_runner.rb +20 -3
- data/lib/karafka/web/pro/ui/lib/search/config.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/search/contracts/config.rb +21 -4
- data/lib/karafka/web/pro/ui/lib/search/contracts/form.rb +24 -6
- data/lib/karafka/web/pro/ui/lib/search/matchers/base.rb +21 -4
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_header_includes.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_key_includes.rb +19 -2
- data/lib/karafka/web/pro/ui/lib/search/matchers/raw_payload_includes.rb +20 -3
- data/lib/karafka/web/pro/ui/lib/search/normalizer.rb +26 -9
- data/lib/karafka/web/pro/ui/lib/search/runner.rb +33 -16
- data/lib/karafka/web/pro/ui/lib/search.rb +19 -2
- data/lib/karafka/web/pro/ui/routes/base.rb +19 -2
- data/lib/karafka/web/pro/ui/routes/cluster.rb +21 -4
- data/lib/karafka/web/pro/ui/routes/consumers.rb +83 -49
- data/lib/karafka/web/pro/ui/routes/dashboard.rb +20 -3
- data/lib/karafka/web/pro/ui/routes/dlq.rb +20 -3
- data/lib/karafka/web/pro/ui/routes/errors.rb +21 -4
- data/lib/karafka/web/pro/ui/routes/explorer.rb +33 -16
- data/lib/karafka/web/pro/ui/routes/health.rb +26 -9
- data/lib/karafka/web/pro/ui/routes/jobs.rb +23 -6
- data/lib/karafka/web/pro/ui/routes/recurring_tasks.rb +29 -12
- data/lib/karafka/web/pro/ui/routes/routing.rb +20 -3
- data/lib/karafka/web/pro/ui/routes/scheduled_messages.rb +28 -11
- data/lib/karafka/web/pro/ui/routes/status.rb +20 -3
- data/lib/karafka/web/pro/ui/routes/support.rb +20 -3
- data/lib/karafka/web/pro/ui/routes/topics.rb +29 -12
- data/lib/karafka/web/pro/ui/routes/ux.rb +20 -3
- data/lib/karafka/web/pro/ui/views/cluster/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/cluster/_broker.erb +13 -2
- data/lib/karafka/web/pro/ui/views/cluster/_config.erb +14 -3
- data/lib/karafka/web/pro/ui/views/cluster/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/cluster/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/cluster/show.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_backtrace.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_command.erb +24 -66
- data/lib/karafka/web/pro/ui/views/consumers/commands/_command_details.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_empty.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_command.erb +19 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_schema.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/_table.erb +15 -4
- data/lib/karafka/web/pro/ui/views/consumers/commands/details/_acceptance.erb +19 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/details/_request.erb +19 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/details/_result.erb +27 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_request.erb +52 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_response.erb +46 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_command_name_badge.erb +40 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_request.erb +47 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_response.erb +46 -0
- data/lib/karafka/web/pro/ui/views/consumers/commands/show.erb +14 -15
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer_performance.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_commands.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_consumer_group.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_metrics.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_no_subscriptions.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition.erb +15 -5
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition_edit_options.erb +16 -5
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_stopped.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_subscription_group.erb +31 -7
- data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/details.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/performance.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/consumers/subscriptions.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/controls/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/controls/_controls.erb +14 -3
- data/lib/karafka/web/pro/ui/views/consumers/controls/index.erb +35 -7
- data/lib/karafka/web/pro/ui/views/consumers/jobs/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/jobs/_job.erb +14 -3
- data/lib/karafka/web/pro/ui/views/consumers/jobs/_no_jobs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/jobs/pending.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/jobs/running.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_basics.erb +20 -13
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_breadcrumbs.erb +37 -46
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_form.erb +25 -14
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_not_running_error.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_running_warning.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/edit.erb +17 -6
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_active_not_editable.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_adjusting_warning.erb +14 -3
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_breadcrumbs.erb +40 -48
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_edit_form.erb +18 -8
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_lrj_not_manageable.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_new_form.erb +22 -11
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_not_running.erb +13 -2
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_partition_info.erb +57 -0
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/edit.erb +16 -5
- data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/new.erb +16 -5
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_adjusting_warning.erb +38 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_breadcrumbs.erb +46 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_edit_form.erb +66 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_lrj_not_manageable.erb +30 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_new_form.erb +86 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_not_running.erb +27 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_topic_info.erb +72 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/edit.erb +29 -0
- data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/new.erb +29 -0
- data/lib/karafka/web/pro/ui/views/dashboard/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/dlq/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/dlq/_no_topics.erb +13 -2
- data/lib/karafka/web/pro/ui/views/dlq/_topic.erb +13 -2
- data/lib/karafka/web/pro/ui/views/dlq/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/errors/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/errors/_error.erb +14 -3
- data/lib/karafka/web/pro/ui/views/errors/_partition_option.erb +18 -5
- data/lib/karafka/web/pro/ui/views/errors/_selector.erb +14 -3
- data/lib/karafka/web/pro/ui/views/errors/_table.erb +14 -3
- data/lib/karafka/web/pro/ui/views/errors/index.erb +39 -26
- data/lib/karafka/web/pro/ui/views/errors/partition.erb +50 -37
- data/lib/karafka/web/pro/ui/views/errors/show.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_failed_deserialization.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_filtered.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_message.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_no_topics.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_partition_option.erb +18 -5
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_selector.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/_topic.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_metadata.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_payload.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_resources_utilization.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_too_big_to_be_displayed.erb +15 -4
- data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_detail.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_headers.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_key.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_cleaned.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_empty.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_messages.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_time_selector.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_timestamp_selector.erb +15 -3
- data/lib/karafka/web/pro/ui/views/explorer/explorer/partition.erb +52 -39
- data/lib/karafka/web/pro/ui/views/explorer/explorer/show.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_actions.erb +39 -26
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_empty.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_limited.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/topic.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/messages/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/messages/forward.erb +28 -16
- data/lib/karafka/web/pro/ui/views/explorer/search/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_fix_errors.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_metadata.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_no_results.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_no_search_criteria.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/_search_criteria.erb +14 -3
- data/lib/karafka/web/pro/ui/views/explorer/search/_search_modal.erb +27 -15
- data/lib/karafka/web/pro/ui/views/explorer/search/_timeout.erb +13 -2
- data/lib/karafka/web/pro/ui/views/explorer/search/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_no_data.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_no_partition_data.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_partition.erb +22 -6
- data/lib/karafka/web/pro/ui/views/health/_partition_lags.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_partition_offset.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_partition_times.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_partitions_with_fallback.erb +15 -2
- data/lib/karafka/web/pro/ui/views/health/_table_metadata.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/_topic_edit_options.erb +64 -0
- data/lib/karafka/web/pro/ui/views/health/changes.erb +14 -2
- data/lib/karafka/web/pro/ui/views/health/cluster_lags.erb +13 -2
- data/lib/karafka/web/pro/ui/views/health/lags.erb +14 -2
- data/lib/karafka/web/pro/ui/views/health/offsets.erb +14 -2
- data/lib/karafka/web/pro/ui/views/health/overview.erb +29 -5
- data/lib/karafka/web/pro/ui/views/jobs/_job.erb +14 -3
- data/lib/karafka/web/pro/ui/views/jobs/_no_jobs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/jobs/pending.erb +13 -2
- data/lib/karafka/web/pro/ui/views/jobs/running.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_actions.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_batch_actions.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_log.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_not_active.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/_task.erb +14 -3
- data/lib/karafka/web/pro/ui/views/recurring_tasks/logs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/recurring_tasks/schedule.erb +14 -3
- data/lib/karafka/web/pro/ui/views/routing/_consumer_group.erb +14 -3
- data/lib/karafka/web/pro/ui/views/routing/_detail.erb +13 -2
- data/lib/karafka/web/pro/ui/views/routing/_topic.erb +14 -3
- data/lib/karafka/web/pro/ui/views/routing/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/routing/show.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_key.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_message.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_messages.erb +14 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_cancel.erb +14 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_compacted.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_schedule.erb +14 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_tombstone.erb +14 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_unknown.erb +14 -3
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/partition.erb +52 -39
- data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/topic.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_no_groups.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/show.erb +14 -3
- data/lib/karafka/web/pro/ui/views/shared/_navigation.erb +14 -3
- data/lib/karafka/web/pro/ui/views/shared/_rdkafka_form_error_alert_box.erb +13 -2
- data/lib/karafka/web/pro/ui/views/shared/branding/_label.erb +13 -2
- data/lib/karafka/web/pro/ui/views/shared/branding/_notice.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_config.erb +14 -3
- data/lib/karafka/web/pro/ui/views/topics/configs/_delete_button.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_form.erb +17 -6
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_plan.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/_edit_warning.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/configs/edit.erb +21 -10
- data/lib/karafka/web/pro/ui/views/topics/configs/index.erb +14 -3
- data/lib/karafka/web/pro/ui/views/topics/distributions/_add_partitions_button.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_badges.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_chart.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_form.erb +18 -6
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_hints.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_warnings.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_empty_partitions.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_limited.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/_partition.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/edit.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/distributions/show.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/offsets/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/offsets/_partition.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/offsets/show.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/replications/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/replications/_metric_box.erb +20 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_partition.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/replications/_replication_info.erb +65 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_resilience_success.erb +24 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_warning_low_durability.erb +67 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_warning_no_redundancy.erb +66 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/_warning_zero_fault_tolerance.erb +67 -0
- data/lib/karafka/web/pro/ui/views/topics/replications/show.erb +15 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_breadcrumbs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_create_button.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_create_hints.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_form.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_hints.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_delete_warning.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_new_form.erb +25 -11
- data/lib/karafka/web/pro/ui/views/topics/topics/_tabs.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/_topic.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/edit.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/index.erb +13 -2
- data/lib/karafka/web/pro/ui/views/topics/topics/new.erb +13 -2
- data/lib/karafka/web/processing/consumer.rb +1 -1
- data/lib/karafka/web/processing/consumers/aggregators/metrics.rb +11 -11
- data/lib/karafka/web/processing/consumers/aggregators/state.rb +4 -3
- data/lib/karafka/web/processing/consumers/reports_migrator.rb +2 -2
- data/lib/karafka/web/processing/consumers/schema_manager.rb +1 -1
- data/lib/karafka/web/processing/publisher.rb +2 -2
- data/lib/karafka/web/producer.rb +61 -0
- data/lib/karafka/web/tracking/consumers/contracts/report.rb +2 -2
- data/lib/karafka/web/tracking/consumers/contracts/subscription_group.rb +1 -0
- data/lib/karafka/web/tracking/consumers/listeners/booting.rb +1 -1
- data/lib/karafka/web/tracking/consumers/listeners/connections.rb +7 -2
- data/lib/karafka/web/tracking/consumers/listeners/errors.rb +10 -10
- data/lib/karafka/web/tracking/consumers/listeners/pausing.rb +1 -1
- data/lib/karafka/web/tracking/consumers/listeners/processing.rb +25 -25
- data/lib/karafka/web/tracking/consumers/listeners/statistics.rb +35 -35
- data/lib/karafka/web/tracking/consumers/reporter.rb +2 -2
- data/lib/karafka/web/tracking/consumers/sampler/enrichers/consumer_groups.rb +1 -0
- data/lib/karafka/web/tracking/consumers/sampler/metrics/base.rb +2 -1
- data/lib/karafka/web/tracking/consumers/sampler/metrics/container.rb +15 -15
- data/lib/karafka/web/tracking/consumers/sampler/metrics/network.rb +6 -6
- data/lib/karafka/web/tracking/consumers/sampler/metrics/os.rb +41 -37
- data/lib/karafka/web/tracking/consumers/sampler.rb +7 -7
- data/lib/karafka/web/tracking/helpers/error_info.rb +10 -10
- data/lib/karafka/web/tracking/helpers/sysconf.rb +2 -2
- data/lib/karafka/web/tracking/helpers/ttls/array.rb +1 -1
- data/lib/karafka/web/tracking/helpers/ttls/hash.rb +1 -1
- data/lib/karafka/web/tracking/helpers/ttls/stats.rb +4 -4
- data/lib/karafka/web/tracking/producers/listeners/booting.rb +1 -1
- data/lib/karafka/web/tracking/producers/listeners/errors.rb +2 -2
- data/lib/karafka/web/tracking/producers/reporter.rb +2 -2
- data/lib/karafka/web/tracking/producers/sampler.rb +1 -1
- data/lib/karafka/web/tracking/ui/errors.rb +4 -4
- data/lib/karafka/web/ui/app.rb +2 -2
- data/lib/karafka/web/ui/base.rb +30 -30
- data/lib/karafka/web/ui/controllers/base_controller.rb +24 -24
- data/lib/karafka/web/ui/controllers/cluster_controller.rb +3 -3
- data/lib/karafka/web/ui/controllers/requests/params.rb +6 -6
- data/lib/karafka/web/ui/helpers/application_helper.rb +59 -59
- data/lib/karafka/web/ui/helpers/paths_helper.rb +15 -7
- data/lib/karafka/web/ui/helpers/tailwind_helper.rb +6 -6
- data/lib/karafka/web/ui/helpers/time_helper.rb +1 -1
- data/lib/karafka/web/ui/helpers/topics_helper.rb +4 -4
- data/lib/karafka/web/ui/lib/admin.rb +2 -2
- data/lib/karafka/web/ui/lib/paginations/base.rb +7 -7
- data/lib/karafka/web/ui/lib/paginations/offset_based.rb +2 -2
- data/lib/karafka/web/ui/lib/paginations/page_based.rb +1 -1
- data/lib/karafka/web/ui/lib/paginations/paginators/arrays.rb +3 -3
- data/lib/karafka/web/ui/lib/paginations/watermark_offsets_based.rb +1 -1
- data/lib/karafka/web/ui/lib/sorter.rb +2 -2
- data/lib/karafka/web/ui/models/counters.rb +1 -1
- data/lib/karafka/web/ui/models/health.rb +1 -0
- data/lib/karafka/web/ui/models/jobs.rb +2 -2
- data/lib/karafka/web/ui/models/message.rb +9 -9
- data/lib/karafka/web/ui/models/metrics/charts/aggregated.rb +3 -3
- data/lib/karafka/web/ui/models/metrics/charts/topics.rb +3 -3
- data/lib/karafka/web/ui/models/metrics/topics.rb +8 -8
- data/lib/karafka/web/ui/models/processes.rb +3 -3
- data/lib/karafka/web/ui/models/recurring_tasks/schedule.rb +2 -2
- data/lib/karafka/web/ui/models/status/checks/base.rb +127 -0
- data/lib/karafka/web/ui/models/status/checks/commands_topic_presence.rb +52 -0
- data/lib/karafka/web/ui/models/status/checks/connection.rb +68 -0
- data/lib/karafka/web/ui/models/status/checks/consumers_reports.rb +34 -0
- data/lib/karafka/web/ui/models/status/checks/consumers_reports_schema_state.rb +32 -0
- data/lib/karafka/web/ui/models/status/checks/consumers_schemas.rb +44 -0
- data/lib/karafka/web/ui/models/status/checks/enabled.rb +39 -0
- data/lib/karafka/web/ui/models/status/checks/initial_consumers_metrics.rb +48 -0
- data/lib/karafka/web/ui/models/status/checks/initial_consumers_state.rb +48 -0
- data/lib/karafka/web/ui/models/status/checks/live_reporting.rb +31 -0
- data/lib/karafka/web/ui/models/status/checks/materializing_lag.rb +49 -0
- data/lib/karafka/web/ui/models/status/checks/partitions.rb +45 -0
- data/lib/karafka/web/ui/models/status/checks/pro_subscription.rb +29 -0
- data/lib/karafka/web/ui/models/status/checks/replication.rb +51 -0
- data/lib/karafka/web/ui/models/status/checks/routing_topics_presence.rb +53 -0
- data/lib/karafka/web/ui/models/status/checks/state_calculation.rb +39 -0
- data/lib/karafka/web/ui/models/status/checks/topics.rb +44 -0
- data/lib/karafka/web/ui/models/status/context.rb +142 -0
- data/lib/karafka/web/ui/models/status/step.rb +64 -0
- data/lib/karafka/web/ui/models/status.rb +70 -356
- data/lib/karafka/web/ui/models/topic.rb +2 -2
- data/lib/karafka/web/ui/public/javascripts/application.min.js +1 -1
- data/lib/karafka/web/ui/public/javascripts/application.min.js.br +0 -0
- data/lib/karafka/web/ui/public/javascripts/application.min.js.gz +0 -0
- data/lib/karafka/web/ui/public/javascripts/components/live_poll.js +2 -2
- data/lib/karafka/web/ui/public/stylesheets/application.min.css +4660 -2524
- data/lib/karafka/web/ui/public/stylesheets/application.min.css.br +0 -0
- data/lib/karafka/web/ui/public/stylesheets/application.min.css.gz +0 -0
- data/lib/karafka/web/ui/public/stylesheets/libs/tailwind.css +62 -3
- data/lib/karafka/web/ui/routes/assets.rb +7 -7
- data/lib/karafka/web/ui/routes/cluster.rb +4 -4
- data/lib/karafka/web/ui/routes/consumers.rb +2 -2
- data/lib/karafka/web/ui/routes/dashboard.rb +1 -1
- data/lib/karafka/web/ui/routes/errors.rb +2 -2
- data/lib/karafka/web/ui/routes/jobs.rb +4 -4
- data/lib/karafka/web/ui/routes/routing.rb +1 -1
- data/lib/karafka/web/ui/routes/status.rb +1 -1
- data/lib/karafka/web/ui/routes/support.rb +1 -1
- data/lib/karafka/web/ui/routes/ux.rb +1 -1
- data/lib/karafka/web/ui/views/cluster/_partition.erb +1 -0
- data/lib/karafka/web/ui/views/dashboard/_counters.erb +16 -16
- data/lib/karafka/web/ui/views/errors/_detail.erb +2 -3
- data/lib/karafka/web/ui/views/errors/_error.erb +1 -1
- data/lib/karafka/web/ui/views/errors/index.erb +1 -1
- data/lib/karafka/web/ui/views/errors/show.erb +1 -1
- data/lib/karafka/web/ui/views/jobs/_job.erb +1 -1
- data/lib/karafka/web/ui/views/layout.erb +1 -1
- data/lib/karafka/web/ui/views/routing/_consumer_group.erb +1 -1
- data/lib/karafka/web/ui/views/routing/_topic.erb +1 -1
- data/lib/karafka/web/ui/views/shared/_header.erb +5 -5
- data/lib/karafka/web/ui/views/shared/_navigation.erb +1 -1
- data/lib/karafka/web/ui/views/shared/alerts/_error.erb +2 -2
- data/lib/karafka/web/ui/views/shared/alerts/_info.erb +1 -1
- data/lib/karafka/web/ui/views/shared/alerts/_primary.erb +1 -1
- data/lib/karafka/web/ui/views/shared/alerts/_secondary.erb +1 -1
- data/lib/karafka/web/ui/views/shared/alerts/_success.erb +1 -1
- data/lib/karafka/web/ui/views/shared/alerts/_warning.erb +2 -2
- data/lib/karafka/web/ui/views/shared/exceptions/not_allowed.erb +3 -3
- data/lib/karafka/web/ui/views/shared/exceptions/not_found.erb +4 -4
- data/lib/karafka/web/ui/views/shared/exceptions/pro_only.erb +4 -4
- data/lib/karafka/web/ui/views/shared/exceptions/unhandled_error.erb +4 -4
- data/lib/karafka/web/ui/views/status/show.erb +15 -0
- data/lib/karafka/web/ui/views/status/warnings/_commands_topic_presence.erb +14 -0
- data/lib/karafka/web/ui/views/ux/_code.erb +0 -1
- data/lib/karafka/web/ui/views/ux/_data_table.erb +79 -0
- data/lib/karafka/web/ui/views/ux/_headers.erb +1 -1
- data/lib/karafka/web/ui/views/ux/_pagination.erb +1 -1
- data/lib/karafka/web/version.rb +1 -1
- data/lib/karafka/web.rb +17 -17
- data/package-lock.json +480 -92
- data/package.json +3 -1
- data/renovate.json +12 -11
- data/tailwind.config.js +4 -7
- metadata +72 -3
- data/lib/karafka/web/pro/ui/views/consumers/commands/_metadata.erb +0 -44
|
@@ -19,9 +19,9 @@ module Karafka
|
|
|
19
19
|
# @return [String] JSON with bytes sent and bytes received metrics
|
|
20
20
|
def data_transfers
|
|
21
21
|
scale_factor = Processing::TimeSeriesTracker::TIME_RANGES
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
.fetch(@period)
|
|
23
|
+
.fetch(:resolution)
|
|
24
|
+
.then { |factor| factor / 1_024.to_f }
|
|
25
25
|
|
|
26
26
|
received = bytes_received.map do |element|
|
|
27
27
|
[element[0], element[1] * scale_factor]
|
|
@@ -44,7 +44,7 @@ module Karafka
|
|
|
44
44
|
|
|
45
45
|
# We name it with a space because someone may have a topic called "total" and we
|
|
46
46
|
# want to avoid collisions
|
|
47
|
-
per_topic.merge(
|
|
47
|
+
per_topic.merge("total sum" => total.to_a).to_json
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
# @return [String] JSON with per-topic, highest LSO freeze duration. Useful for
|
|
@@ -53,7 +53,7 @@ module Karafka
|
|
|
53
53
|
topics = Hash.new { |h, k| h[k] = Hash.new { |h2, k2| h2[k2] = [] } }
|
|
54
54
|
|
|
55
55
|
@data.to_h.each do |topic, metrics|
|
|
56
|
-
topic_without_cg = topic.split(
|
|
56
|
+
topic_without_cg = topic.split("[").first
|
|
57
57
|
|
|
58
58
|
metrics.each do |current|
|
|
59
59
|
ls_offset_fd = current.last[:ls_offset_fd] || 0
|
|
@@ -86,7 +86,7 @@ module Karafka
|
|
|
86
86
|
topics = {}
|
|
87
87
|
|
|
88
88
|
@data.to_h.each do |topic, metrics|
|
|
89
|
-
topic_without_cg = topic.split(
|
|
89
|
+
topic_without_cg = topic.split("[").first
|
|
90
90
|
|
|
91
91
|
# If we've already seen this topic data, we can skip
|
|
92
92
|
next if topics.include?(topic_without_cg)
|
|
@@ -61,14 +61,14 @@ module Karafka
|
|
|
61
61
|
# Hash with all potential keys that a single sample metric can have
|
|
62
62
|
# This allows us to fill gaps not only in times but also in values
|
|
63
63
|
base_samples = topics_metrics
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
.values
|
|
65
|
+
.map(&:values)
|
|
66
|
+
.flatten
|
|
67
|
+
.select { |val| val.is_a?(Hash) }
|
|
68
|
+
.flat_map(&:keys)
|
|
69
|
+
.uniq
|
|
70
|
+
.to_h { |key| [key, nil] }
|
|
71
|
+
.freeze
|
|
72
72
|
|
|
73
73
|
# Normalize data in between topics reportings
|
|
74
74
|
# One topic may have a sample in a time moment when a different one does not
|
|
@@ -48,9 +48,9 @@ module Karafka
|
|
|
48
48
|
return [] if processes.empty?
|
|
49
49
|
|
|
50
50
|
offsets = processes
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
.values
|
|
52
|
+
.map { |process| process[:offset] }
|
|
53
|
+
.sort
|
|
54
54
|
|
|
55
55
|
Lib::Admin.read_topic(
|
|
56
56
|
::Karafka::Web.config.topics.consumers.reports.name,
|
|
@@ -32,8 +32,8 @@ module Karafka
|
|
|
32
32
|
|
|
33
33
|
# Out of those messages we pick the most recent persisted schedule
|
|
34
34
|
candidate = messages
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
.reverse
|
|
36
|
+
.find { |message| message.key == "state:schedule" }
|
|
37
37
|
|
|
38
38
|
# If there is a schedule message we use its data to build schedule, if not false
|
|
39
39
|
return false unless candidate
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Web
|
|
5
|
+
module Ui
|
|
6
|
+
module Models
|
|
7
|
+
class Status
|
|
8
|
+
# Namespace for all individual status check classes.
|
|
9
|
+
#
|
|
10
|
+
# Each check is a separate class that inherits from Base and implements
|
|
11
|
+
# the DSL for declaring dependencies and check behavior.
|
|
12
|
+
module Checks
|
|
13
|
+
# Base class for all status checks.
|
|
14
|
+
#
|
|
15
|
+
# Provides a DSL for declaring check dependencies and characteristics,
|
|
16
|
+
# as well as common functionality for executing checks.
|
|
17
|
+
#
|
|
18
|
+
# @example Creating a simple independent check
|
|
19
|
+
# class Enabled < Base
|
|
20
|
+
# independent!
|
|
21
|
+
#
|
|
22
|
+
# def call
|
|
23
|
+
# enabled = ::Karafka::App.routes.map(&:name).include?(
|
|
24
|
+
# ::Karafka::Web.config.group_id
|
|
25
|
+
# )
|
|
26
|
+
# step(enabled ? :success : :failure)
|
|
27
|
+
# end
|
|
28
|
+
# end
|
|
29
|
+
#
|
|
30
|
+
# @example Creating a dependent check
|
|
31
|
+
# class Connection < Base
|
|
32
|
+
# depends_on :enabled
|
|
33
|
+
#
|
|
34
|
+
# def call
|
|
35
|
+
# # Implementation...
|
|
36
|
+
# step(:success, { time: context.connection_time })
|
|
37
|
+
# end
|
|
38
|
+
# end
|
|
39
|
+
class Base
|
|
40
|
+
class << self
|
|
41
|
+
# @return [Symbol, nil] the dependency check name, or nil if independent
|
|
42
|
+
attr_reader :dependency
|
|
43
|
+
|
|
44
|
+
# Declares that this check depends on another check.
|
|
45
|
+
#
|
|
46
|
+
# When a check has a dependency, it will be halted if the dependency
|
|
47
|
+
# fails.
|
|
48
|
+
#
|
|
49
|
+
# @param check_name [Symbol] the name of the check this depends on
|
|
50
|
+
# @return [Symbol] the dependency name
|
|
51
|
+
#
|
|
52
|
+
# @example
|
|
53
|
+
# class Connection < Base
|
|
54
|
+
# depends_on :enabled
|
|
55
|
+
# end
|
|
56
|
+
def depends_on(check_name)
|
|
57
|
+
@dependency = check_name
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Marks this check as independent (no dependencies).
|
|
61
|
+
#
|
|
62
|
+
# Independent checks don't depend on any other check and will
|
|
63
|
+
# always execute regardless of other check results.
|
|
64
|
+
#
|
|
65
|
+
# @return [Boolean] true
|
|
66
|
+
def independent!
|
|
67
|
+
@independent = true
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Checks if this is an independent check.
|
|
71
|
+
#
|
|
72
|
+
# @return [Boolean] true if this check has no dependencies
|
|
73
|
+
def independent?
|
|
74
|
+
@independent || false
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Returns the halted details for this check.
|
|
78
|
+
#
|
|
79
|
+
# Override this method in subclasses to provide specific details
|
|
80
|
+
# when the check is halted due to dependency failure.
|
|
81
|
+
#
|
|
82
|
+
# @return [Hash, Array] the default details for halted state
|
|
83
|
+
def halted_details
|
|
84
|
+
{}
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Initializes the check with a shared context.
|
|
89
|
+
#
|
|
90
|
+
# @param context [Status::Context] the shared context containing
|
|
91
|
+
# cached data and configuration helpers
|
|
92
|
+
def initialize(context)
|
|
93
|
+
@context = context
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Executes the check and returns a Step result.
|
|
97
|
+
#
|
|
98
|
+
# Subclasses must implement this method to perform the actual check.
|
|
99
|
+
#
|
|
100
|
+
# @return [Status::Step] the result of the check
|
|
101
|
+
# @raise [NotImplementedError] if not implemented by subclass
|
|
102
|
+
def call
|
|
103
|
+
raise NotImplementedError, "Subclasses must implement #call"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
private
|
|
107
|
+
|
|
108
|
+
# @return [Status::Context] the shared context
|
|
109
|
+
attr_reader :context
|
|
110
|
+
|
|
111
|
+
# Creates a new Step result.
|
|
112
|
+
#
|
|
113
|
+
# Helper method to create Step instances with less verbosity.
|
|
114
|
+
#
|
|
115
|
+
# @param status [Symbol] the status (:success, :warning, :failure, :halted)
|
|
116
|
+
# @param details [Hash, Array] optional details about the check result
|
|
117
|
+
# @return [Status::Step] a new Step instance
|
|
118
|
+
def step(status, details = {})
|
|
119
|
+
Step.new(status, details)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Web
|
|
5
|
+
module Ui
|
|
6
|
+
module Models
|
|
7
|
+
class Status
|
|
8
|
+
module Checks
|
|
9
|
+
# Checks if the commands topic exists for Pro users.
|
|
10
|
+
#
|
|
11
|
+
# The commands topic (karafka_consumers_commands) is used by Pro features
|
|
12
|
+
# like consumer commanding (pause, resume, trace, etc.). While it's created
|
|
13
|
+
# by CreateTopics for all users (to allow smooth upgrades), it's only
|
|
14
|
+
# actively used by Pro users.
|
|
15
|
+
#
|
|
16
|
+
# For OSS users, this check always succeeds since they don't use commanding.
|
|
17
|
+
# For Pro users, it warns if the topic is missing.
|
|
18
|
+
class CommandsTopicPresence < Base
|
|
19
|
+
depends_on :topics
|
|
20
|
+
|
|
21
|
+
# Executes the commands topic presence check.
|
|
22
|
+
#
|
|
23
|
+
# @return [Status::Step] success if not Pro or if topic exists,
|
|
24
|
+
# warning if Pro and topic is missing
|
|
25
|
+
def call
|
|
26
|
+
# OSS users don't need the commands topic
|
|
27
|
+
return step(:success) unless ::Karafka.pro?
|
|
28
|
+
|
|
29
|
+
topic_name = context.topics_consumers_commands
|
|
30
|
+
present = topic_present?(topic_name)
|
|
31
|
+
|
|
32
|
+
step(present ? :success : :warning, { topic_name: topic_name, present: present })
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
# Checks if a topic exists in the cluster.
|
|
38
|
+
#
|
|
39
|
+
# @param topic_name [String] the topic name to check
|
|
40
|
+
# @return [Boolean] true if the topic exists
|
|
41
|
+
def topic_present?(topic_name)
|
|
42
|
+
context.cluster_info.topics.any? do |topic|
|
|
43
|
+
topic[:topic_name] == topic_name
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Web
|
|
5
|
+
module Ui
|
|
6
|
+
module Models
|
|
7
|
+
class Status
|
|
8
|
+
module Checks
|
|
9
|
+
# Checks if we can connect to Kafka and measures connection latency.
|
|
10
|
+
#
|
|
11
|
+
# Some users try to work with Kafka over the internet with high latency,
|
|
12
|
+
# which can make the connection unstable. This check measures connection
|
|
13
|
+
# time and warns when it's too high.
|
|
14
|
+
#
|
|
15
|
+
# Connection times:
|
|
16
|
+
# - < 1 second: success
|
|
17
|
+
# - 1-1000 seconds: warning (high latency)
|
|
18
|
+
# - > 1000 seconds or failure: failure
|
|
19
|
+
class Connection < Base
|
|
20
|
+
depends_on :enabled
|
|
21
|
+
|
|
22
|
+
class << self
|
|
23
|
+
# @return [Hash] the default details for halted state
|
|
24
|
+
def halted_details
|
|
25
|
+
{ time: nil }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Executes the connection check.
|
|
30
|
+
#
|
|
31
|
+
# Attempts to connect to Kafka and measures the connection time.
|
|
32
|
+
# Caches the result in the context for subsequent checks.
|
|
33
|
+
#
|
|
34
|
+
# @return [Status::Step] result with connection time in details
|
|
35
|
+
def call
|
|
36
|
+
connect unless context.connection_time
|
|
37
|
+
|
|
38
|
+
level = if context.connection_time < 1_000
|
|
39
|
+
:success
|
|
40
|
+
elsif context.connection_time < 1_000_000
|
|
41
|
+
:warning
|
|
42
|
+
else
|
|
43
|
+
:failure
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
step(level, { time: context.connection_time })
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
# Attempts to connect to Kafka and stores connection info in context.
|
|
52
|
+
#
|
|
53
|
+
# On success, stores cluster_info and connection_time.
|
|
54
|
+
# On failure, sets connection_time to 1_000_000 (indicating failure).
|
|
55
|
+
def connect
|
|
56
|
+
started = Time.now.to_f
|
|
57
|
+
context.cluster_info = Models::ClusterInfo.fetch
|
|
58
|
+
context.connection_time = (Time.now.to_f - started) * 1_000
|
|
59
|
+
rescue ::Rdkafka::RdkafkaError
|
|
60
|
+
context.connection_time = 1_000_000
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Web
|
|
5
|
+
module Ui
|
|
6
|
+
module Models
|
|
7
|
+
class Status
|
|
8
|
+
module Checks
|
|
9
|
+
# Checks if we can read and operate on the current processes data.
|
|
10
|
+
#
|
|
11
|
+
# This verifies that the consumers reports can be parsed and loaded
|
|
12
|
+
# into process objects for display in the UI.
|
|
13
|
+
class ConsumersReports < Base
|
|
14
|
+
depends_on :initial_consumers_metrics
|
|
15
|
+
|
|
16
|
+
# Executes the consumers reports check.
|
|
17
|
+
#
|
|
18
|
+
# Attempts to load all processes from the current state. Caches
|
|
19
|
+
# the result in context for subsequent checks.
|
|
20
|
+
#
|
|
21
|
+
# @return [Status::Step] result (success or failure on parse error)
|
|
22
|
+
def call
|
|
23
|
+
context.processes ||= Models::Processes.all(context.current_state)
|
|
24
|
+
step(:success)
|
|
25
|
+
rescue JSON::ParserError
|
|
26
|
+
step(:failure)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Web
|
|
5
|
+
module Ui
|
|
6
|
+
module Models
|
|
7
|
+
class Status
|
|
8
|
+
module Checks
|
|
9
|
+
# Checks if the consumer can digest the consumers reports with its schema.
|
|
10
|
+
#
|
|
11
|
+
# The schema_state in the current state indicates whether the consumer
|
|
12
|
+
# processing reports can properly deserialize them. If incompatible,
|
|
13
|
+
# data may be lost or corrupted.
|
|
14
|
+
class ConsumersReportsSchemaState < Base
|
|
15
|
+
depends_on :state_calculation
|
|
16
|
+
|
|
17
|
+
# Executes the consumers reports schema state check.
|
|
18
|
+
#
|
|
19
|
+
# Verifies that the schema_state is 'compatible'.
|
|
20
|
+
#
|
|
21
|
+
# @return [Status::Step] success if compatible, failure otherwise
|
|
22
|
+
def call
|
|
23
|
+
compatible = context.current_state[:schema_state] == "compatible"
|
|
24
|
+
step(compatible ? :success : :failure)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Web
|
|
5
|
+
module Ui
|
|
6
|
+
module Models
|
|
7
|
+
class Status
|
|
8
|
+
module Checks
|
|
9
|
+
# Checks if any consumer processes have incompatible schemas.
|
|
10
|
+
#
|
|
11
|
+
# Schema compatibility is important for proper data deserialization.
|
|
12
|
+
# This check identifies processes that don't match the expected schema
|
|
13
|
+
# version used by the Web UI.
|
|
14
|
+
#
|
|
15
|
+
# @note This is a warning-only check - incompatible schemas don't block
|
|
16
|
+
# the dependency chain but should be addressed.
|
|
17
|
+
class ConsumersSchemas < Base
|
|
18
|
+
depends_on :consumers_reports
|
|
19
|
+
|
|
20
|
+
class << self
|
|
21
|
+
# @return [Hash] details with empty incompatible list for halted state
|
|
22
|
+
def halted_details
|
|
23
|
+
{ incompatible: [] }
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Executes the consumers schemas check.
|
|
28
|
+
#
|
|
29
|
+
# Identifies processes with incompatible schema versions.
|
|
30
|
+
#
|
|
31
|
+
# @return [Status::Step] success if all compatible, warning if any incompatible
|
|
32
|
+
def call
|
|
33
|
+
incompatible = context.processes.reject(&:schema_compatible?)
|
|
34
|
+
status = incompatible.empty? ? :success : :warning
|
|
35
|
+
|
|
36
|
+
step(status, { incompatible: incompatible })
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Web
|
|
5
|
+
module Ui
|
|
6
|
+
module Models
|
|
7
|
+
class Status
|
|
8
|
+
module Checks
|
|
9
|
+
# Checks if karafka-web is enabled in the karafka.rb routing.
|
|
10
|
+
#
|
|
11
|
+
# This is the first check in the chain and verifies that the consumer group
|
|
12
|
+
# for the Web UI is properly injected into the routing. Without this,
|
|
13
|
+
# the Web UI cannot function.
|
|
14
|
+
#
|
|
15
|
+
# @note This check does NOT verify if the group is active because that may
|
|
16
|
+
# depend on configuration details. It only checks that the routing is
|
|
17
|
+
# aware of the deserializer and other Web UI requirements.
|
|
18
|
+
class Enabled < Base
|
|
19
|
+
independent!
|
|
20
|
+
|
|
21
|
+
# Executes the enabled check.
|
|
22
|
+
#
|
|
23
|
+
# Looks for the Web UI consumer group in the Karafka routing.
|
|
24
|
+
#
|
|
25
|
+
# @return [Status::Step] success if the group is found, failure otherwise
|
|
26
|
+
def call
|
|
27
|
+
enabled = ::Karafka::App.routes.map(&:name).include?(
|
|
28
|
+
::Karafka::Web.config.group_id
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
step(enabled ? :success : :failure)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Web
|
|
5
|
+
module Ui
|
|
6
|
+
module Models
|
|
7
|
+
class Status
|
|
8
|
+
module Checks
|
|
9
|
+
# Checks if the initial consumers metrics are present and can be deserialized.
|
|
10
|
+
#
|
|
11
|
+
# The consumers metrics topic must contain valid data that can be parsed.
|
|
12
|
+
# This check fetches the current metrics and attempts to deserialize it.
|
|
13
|
+
class InitialConsumersMetrics < Base
|
|
14
|
+
depends_on :initial_consumers_state
|
|
15
|
+
|
|
16
|
+
class << self
|
|
17
|
+
# @return [Hash] details indicating presence issue for halted state
|
|
18
|
+
def halted_details
|
|
19
|
+
{ issue_type: :presence }
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Executes the initial consumers metrics check.
|
|
24
|
+
#
|
|
25
|
+
# Fetches the current consumers metrics from Kafka and verifies it can
|
|
26
|
+
# be deserialized. Caches the result in context for subsequent checks.
|
|
27
|
+
#
|
|
28
|
+
# @return [Status::Step] result with issue_type in details
|
|
29
|
+
def call
|
|
30
|
+
details = { issue_type: :presence }
|
|
31
|
+
|
|
32
|
+
begin
|
|
33
|
+
context.current_metrics ||= Models::ConsumersMetrics.current
|
|
34
|
+
status = context.current_metrics ? :success : :failure
|
|
35
|
+
rescue JSON::ParserError
|
|
36
|
+
status = :failure
|
|
37
|
+
details[:issue_type] = :deserialization
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
step(status, details)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Web
|
|
5
|
+
module Ui
|
|
6
|
+
module Models
|
|
7
|
+
class Status
|
|
8
|
+
module Checks
|
|
9
|
+
# Checks if the initial consumers state is present and can be deserialized.
|
|
10
|
+
#
|
|
11
|
+
# The consumers state topic must contain valid data that can be parsed.
|
|
12
|
+
# This check fetches the current state and attempts to deserialize it.
|
|
13
|
+
class InitialConsumersState < Base
|
|
14
|
+
depends_on :replication
|
|
15
|
+
|
|
16
|
+
class << self
|
|
17
|
+
# @return [Hash] details indicating presence issue for halted state
|
|
18
|
+
def halted_details
|
|
19
|
+
{ issue_type: :presence }
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Executes the initial consumers state check.
|
|
24
|
+
#
|
|
25
|
+
# Fetches the current consumers state from Kafka and verifies it can
|
|
26
|
+
# be deserialized. Caches the result in context for subsequent checks.
|
|
27
|
+
#
|
|
28
|
+
# @return [Status::Step] result with issue_type in details
|
|
29
|
+
def call
|
|
30
|
+
details = { issue_type: :presence }
|
|
31
|
+
|
|
32
|
+
begin
|
|
33
|
+
context.current_state ||= Models::ConsumersState.current
|
|
34
|
+
status = context.current_state ? :success : :failure
|
|
35
|
+
rescue JSON::ParserError
|
|
36
|
+
status = :failure
|
|
37
|
+
details[:issue_type] = :deserialization
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
step(status, details)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Web
|
|
5
|
+
module Ui
|
|
6
|
+
module Models
|
|
7
|
+
class Status
|
|
8
|
+
module Checks
|
|
9
|
+
# Checks if there is at least one active Karafka server reporting to the Web UI.
|
|
10
|
+
#
|
|
11
|
+
# If no processes are reporting, the Web UI won't have any data to display.
|
|
12
|
+
# This is a critical check for ensuring the system is actually being monitored.
|
|
13
|
+
class LiveReporting < Base
|
|
14
|
+
depends_on :consumers_reports
|
|
15
|
+
|
|
16
|
+
# Executes the live reporting check.
|
|
17
|
+
#
|
|
18
|
+
# Verifies that there is at least one process in the list.
|
|
19
|
+
#
|
|
20
|
+
# @return [Status::Step] success if processes exist, failure if empty
|
|
21
|
+
def call
|
|
22
|
+
status = context.processes.empty? ? :failure : :success
|
|
23
|
+
step(status)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Web
|
|
5
|
+
module Ui
|
|
6
|
+
module Models
|
|
7
|
+
class Status
|
|
8
|
+
module Checks
|
|
9
|
+
# Checks if there is significant lag in the reporting of aggregated data.
|
|
10
|
+
#
|
|
11
|
+
# If there's a large gap between when data is reported and when it's
|
|
12
|
+
# materialized, the Web UI will show stale information. This often
|
|
13
|
+
# indicates over-saturation on the consumer that materializes states.
|
|
14
|
+
#
|
|
15
|
+
# The maximum acceptable lag is twice the tracking interval.
|
|
16
|
+
#
|
|
17
|
+
# @note Since both states and metrics are reported together, checking
|
|
18
|
+
# one of them is sufficient.
|
|
19
|
+
class MaterializingLag < Base
|
|
20
|
+
depends_on :live_reporting
|
|
21
|
+
|
|
22
|
+
class << self
|
|
23
|
+
# @return [Hash] details with zero lag for halted state
|
|
24
|
+
def halted_details
|
|
25
|
+
max_lag = (Web.config.tracking.interval * 2) / 1_000
|
|
26
|
+
{ lag: 0, max_lag: max_lag }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Executes the materializing lag check.
|
|
31
|
+
#
|
|
32
|
+
# Compares the current state's dispatch time with the current time.
|
|
33
|
+
#
|
|
34
|
+
# @return [Status::Step] success if lag is acceptable, failure if too high
|
|
35
|
+
def call
|
|
36
|
+
max_lag = (Web.config.tracking.interval * 2) / 1_000
|
|
37
|
+
lag = Time.now.to_f - context.current_state.dispatched_at
|
|
38
|
+
|
|
39
|
+
status = (lag > max_lag) ? :failure : :success
|
|
40
|
+
|
|
41
|
+
step(status, { lag: lag, max_lag: max_lag })
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|