karafka-web 0.11.5 → 1.0.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -0
  3. data/Gemfile +10 -10
  4. data/Gemfile.lint +14 -0
  5. data/Gemfile.lint.lock +108 -0
  6. data/Gemfile.lock +69 -93
  7. data/README.md +15 -15
  8. data/Rakefile +28 -2
  9. data/bin/balance_tests +120 -0
  10. data/bin/check_coverage +31 -0
  11. data/bin/collect_timings +79 -0
  12. data/bin/integrations +5 -5
  13. data/bin/rspecs +12 -5
  14. data/bin/tests_parallel +124 -0
  15. data/bin/verify_kafka_warnings +2 -0
  16. data/docker-compose.yml +1 -1
  17. data/gulpfile.js +14 -11
  18. data/karafka-web.gemspec +35 -35
  19. data/lib/karafka/web/cli/base.rb +2 -2
  20. data/lib/karafka/web/cli/help.rb +2 -2
  21. data/lib/karafka/web/cli/install.rb +3 -3
  22. data/lib/karafka/web/cli/migrate.rb +3 -3
  23. data/lib/karafka/web/cli/reset.rb +3 -3
  24. data/lib/karafka/web/cli/uninstall.rb +1 -1
  25. data/lib/karafka/web/config.rb +41 -34
  26. data/lib/karafka/web/contracts/base.rb +2 -2
  27. data/lib/karafka/web/deserializer.rb +5 -5
  28. data/lib/karafka/web/installer.rb +14 -14
  29. data/lib/karafka/web/management/actions/base.rb +5 -5
  30. data/lib/karafka/web/management/actions/clean_boot_file.rb +3 -3
  31. data/lib/karafka/web/management/actions/create_initial_states.rb +8 -8
  32. data/lib/karafka/web/management/actions/enable.rb +4 -5
  33. data/lib/karafka/web/management/actions/extend_boot_file.rb +3 -3
  34. data/lib/karafka/web/management/migrations/base.rb +3 -3
  35. data/lib/karafka/web/management/migrations/consumers_metrics/0_set_initial.rb +1 -1
  36. data/lib/karafka/web/management/migrations/consumers_metrics/1699543515_fill_missing_received_and_sent_bytes.rb +1 -1
  37. data/lib/karafka/web/management/migrations/consumers_metrics/1700234522_introduce_waiting.rb +1 -1
  38. data/lib/karafka/web/management/migrations/consumers_metrics/1700234522_remove_processing.rb +1 -1
  39. data/lib/karafka/web/management/migrations/consumers_metrics/1704722380_split_listeners_into_active_and_paused.rb +7 -7
  40. data/lib/karafka/web/management/migrations/consumers_metrics/1706607960_introduce_lag_total.rb +1 -1
  41. data/lib/karafka/web/management/migrations/consumers_metrics/1706611396_rename_lag_total_to_lag_hybrid.rb +1 -1
  42. data/lib/karafka/web/management/migrations/consumers_metrics/1716218393_populate_jobs_metrics.rb +1 -1
  43. data/lib/karafka/web/management/migrations/consumers_reports/1761645571_rename_process_name_to_id.rb +1 -1
  44. data/lib/karafka/web/management/migrations/consumers_reports/1765657887_add_group_instance_id_to_subscription_groups.rb +42 -0
  45. data/lib/karafka/web/management/migrations/consumers_reports/1772128000_add_poll_interval_to_subscription_groups.rb +48 -0
  46. data/lib/karafka/web/management/migrations/consumers_states/0_set_initial.rb +2 -2
  47. data/lib/karafka/web/management/migrations/consumers_states/1699543515_fill_missing_received_and_sent_bytes.rb +1 -1
  48. data/lib/karafka/web/management/migrations/consumers_states/1700234522_introduce_waiting.rb +1 -1
  49. data/lib/karafka/web/management/migrations/consumers_states/1700234522_remove_processing.rb +1 -1
  50. data/lib/karafka/web/management/migrations/consumers_states/1704722380_split_listeners_into_active_and_paused.rb +7 -7
  51. data/lib/karafka/web/management/migrations/consumers_states/1706607960_introduce_lag_total.rb +1 -1
  52. data/lib/karafka/web/management/migrations/consumers_states/1706611396_rename_lag_total_to_lag_hybrid.rb +1 -1
  53. data/lib/karafka/web/management/migrations/consumers_states/1716218393_add_jobs_counter.rb +1 -1
  54. data/lib/karafka/web/management/migrator.rb +2 -2
  55. data/lib/karafka/web/pro/commanding/commands/base.rb +28 -4
  56. data/lib/karafka/web/pro/commanding/commands/consumers/quiet.rb +30 -5
  57. data/lib/karafka/web/pro/commanding/commands/consumers/stop.rb +30 -5
  58. data/lib/karafka/web/pro/commanding/commands/consumers/trace.rb +29 -4
  59. data/lib/karafka/web/pro/commanding/commands/partitions/pause.rb +28 -3
  60. data/lib/karafka/web/pro/commanding/commands/partitions/resume.rb +28 -3
  61. data/lib/karafka/web/pro/commanding/commands/partitions/seek.rb +28 -3
  62. data/lib/karafka/web/pro/commanding/commands/topics/pause.rb +56 -0
  63. data/lib/karafka/web/pro/commanding/commands/topics/resume.rb +57 -0
  64. data/lib/karafka/web/pro/commanding/config.rb +31 -5
  65. data/lib/karafka/web/pro/commanding/contracts/config.rb +29 -4
  66. data/lib/karafka/web/pro/commanding/dispatcher.rb +69 -26
  67. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/base.rb +28 -3
  68. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/pause.rb +29 -4
  69. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/resume.rb +28 -3
  70. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/seek.rb +32 -7
  71. data/lib/karafka/web/pro/commanding/handlers/partitions/executor.rb +44 -12
  72. data/lib/karafka/web/pro/commanding/handlers/partitions/listener.rb +55 -8
  73. data/lib/karafka/web/pro/commanding/handlers/partitions/tracker.rb +70 -13
  74. data/lib/karafka/web/pro/commanding/handlers/topics/commands/base.rb +117 -0
  75. data/lib/karafka/web/pro/commanding/handlers/topics/commands/pause.rb +84 -0
  76. data/lib/karafka/web/pro/commanding/handlers/topics/commands/resume.rb +64 -0
  77. data/lib/karafka/web/pro/commanding/handlers/topics/executor.rb +83 -0
  78. data/lib/karafka/web/pro/commanding/handlers/topics/listener.rb +90 -0
  79. data/lib/karafka/web/pro/commanding/handlers/topics/tracker.rb +89 -0
  80. data/lib/karafka/web/pro/commanding/listener.rb +31 -6
  81. data/lib/karafka/web/pro/commanding/manager.rb +52 -23
  82. data/lib/karafka/web/pro/commanding/matcher.rb +54 -18
  83. data/lib/karafka/web/pro/commanding/matchers/base.rb +95 -0
  84. data/lib/karafka/web/pro/commanding/matchers/consumer_group_id.rb +66 -0
  85. data/lib/karafka/web/pro/commanding/matchers/message_type.rb +57 -0
  86. data/lib/karafka/web/pro/commanding/matchers/partition_id.rb +69 -0
  87. data/lib/karafka/web/pro/commanding/matchers/process_id.rb +66 -0
  88. data/lib/karafka/web/pro/commanding/matchers/schema_version.rb +52 -0
  89. data/lib/karafka/web/pro/commanding/matchers/topic.rb +66 -0
  90. data/lib/karafka/web/pro/commanding/request.rb +27 -2
  91. data/lib/karafka/web/pro/commanding.rb +27 -2
  92. data/lib/karafka/web/pro/loader.rb +28 -3
  93. data/lib/karafka/web/pro/ui/app.rb +33 -8
  94. data/lib/karafka/web/pro/ui/controllers/base_controller.rb +27 -2
  95. data/lib/karafka/web/pro/ui/controllers/cluster_controller.rb +27 -2
  96. data/lib/karafka/web/pro/ui/controllers/consumers/base_controller.rb +27 -2
  97. data/lib/karafka/web/pro/ui/controllers/consumers/commanding_controller.rb +45 -15
  98. data/lib/karafka/web/pro/ui/controllers/consumers/commands_controller.rb +31 -6
  99. data/lib/karafka/web/pro/ui/controllers/consumers/consumers_controller.rb +27 -2
  100. data/lib/karafka/web/pro/ui/controllers/consumers/controls_controller.rb +27 -2
  101. data/lib/karafka/web/pro/ui/controllers/consumers/jobs_controller.rb +27 -2
  102. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/base_controller.rb +51 -42
  103. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/offsets_controller.rb +44 -17
  104. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/pauses_controller.rb +67 -33
  105. data/lib/karafka/web/pro/ui/controllers/consumers/topics/pauses_controller.rb +172 -0
  106. data/lib/karafka/web/pro/ui/controllers/dashboard_controller.rb +27 -2
  107. data/lib/karafka/web/pro/ui/controllers/dlq_controller.rb +34 -9
  108. data/lib/karafka/web/pro/ui/controllers/errors_controller.rb +33 -9
  109. data/lib/karafka/web/pro/ui/controllers/explorer/base_controller.rb +27 -2
  110. data/lib/karafka/web/pro/ui/controllers/explorer/explorer_controller.rb +33 -5
  111. data/lib/karafka/web/pro/ui/controllers/explorer/messages_controller.rb +42 -10
  112. data/lib/karafka/web/pro/ui/controllers/explorer/search_controller.rb +31 -6
  113. data/lib/karafka/web/pro/ui/controllers/health_controller.rb +27 -2
  114. data/lib/karafka/web/pro/ui/controllers/jobs_controller.rb +27 -2
  115. data/lib/karafka/web/pro/ui/controllers/recurring_tasks_controller.rb +30 -5
  116. data/lib/karafka/web/pro/ui/controllers/routing_controller.rb +27 -2
  117. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/base_controller.rb +27 -2
  118. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/explorer_controller.rb +33 -8
  119. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/messages_controller.rb +29 -4
  120. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/schedules_controller.rb +34 -9
  121. data/lib/karafka/web/pro/ui/controllers/status_controller.rb +27 -2
  122. data/lib/karafka/web/pro/ui/controllers/support_controller.rb +27 -2
  123. data/lib/karafka/web/pro/ui/controllers/topics/base_controller.rb +27 -2
  124. data/lib/karafka/web/pro/ui/controllers/topics/configs_controller.rb +28 -3
  125. data/lib/karafka/web/pro/ui/controllers/topics/distributions_controller.rb +28 -3
  126. data/lib/karafka/web/pro/ui/controllers/topics/offsets_controller.rb +30 -3
  127. data/lib/karafka/web/pro/ui/controllers/topics/replications_controller.rb +49 -2
  128. data/lib/karafka/web/pro/ui/controllers/topics/topics_controller.rb +32 -7
  129. data/lib/karafka/web/pro/ui/controllers/ux_controller.rb +27 -2
  130. data/lib/karafka/web/pro/ui/lib/branding/config.rb +27 -2
  131. data/lib/karafka/web/pro/ui/lib/branding/contracts/config.rb +29 -4
  132. data/lib/karafka/web/pro/ui/lib/branding.rb +27 -2
  133. data/lib/karafka/web/pro/ui/lib/features.rb +27 -2
  134. data/lib/karafka/web/pro/ui/lib/patterns_detector.rb +27 -2
  135. data/lib/karafka/web/pro/ui/lib/policies/config.rb +27 -2
  136. data/lib/karafka/web/pro/ui/lib/policies/contracts/config.rb +29 -4
  137. data/lib/karafka/web/pro/ui/lib/policies/messages.rb +28 -3
  138. data/lib/karafka/web/pro/ui/lib/policies/requests.rb +27 -2
  139. data/lib/karafka/web/pro/ui/lib/policies.rb +27 -2
  140. data/lib/karafka/web/pro/ui/lib/safe_runner.rb +28 -3
  141. data/lib/karafka/web/pro/ui/lib/search/config.rb +27 -2
  142. data/lib/karafka/web/pro/ui/lib/search/contracts/config.rb +29 -4
  143. data/lib/karafka/web/pro/ui/lib/search/contracts/form.rb +32 -6
  144. data/lib/karafka/web/pro/ui/lib/search/matchers/base.rb +29 -4
  145. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_header_includes.rb +27 -2
  146. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_key_includes.rb +27 -2
  147. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_payload_includes.rb +28 -3
  148. data/lib/karafka/web/pro/ui/lib/search/normalizer.rb +34 -9
  149. data/lib/karafka/web/pro/ui/lib/search/runner.rb +40 -16
  150. data/lib/karafka/web/pro/ui/lib/search.rb +27 -2
  151. data/lib/karafka/web/pro/ui/routes/base.rb +27 -2
  152. data/lib/karafka/web/pro/ui/routes/cluster.rb +29 -4
  153. data/lib/karafka/web/pro/ui/routes/consumers.rb +91 -49
  154. data/lib/karafka/web/pro/ui/routes/dashboard.rb +28 -3
  155. data/lib/karafka/web/pro/ui/routes/dlq.rb +28 -3
  156. data/lib/karafka/web/pro/ui/routes/errors.rb +29 -4
  157. data/lib/karafka/web/pro/ui/routes/explorer.rb +41 -16
  158. data/lib/karafka/web/pro/ui/routes/health.rb +34 -9
  159. data/lib/karafka/web/pro/ui/routes/jobs.rb +31 -6
  160. data/lib/karafka/web/pro/ui/routes/recurring_tasks.rb +37 -12
  161. data/lib/karafka/web/pro/ui/routes/routing.rb +28 -3
  162. data/lib/karafka/web/pro/ui/routes/scheduled_messages.rb +36 -11
  163. data/lib/karafka/web/pro/ui/routes/status.rb +28 -3
  164. data/lib/karafka/web/pro/ui/routes/support.rb +28 -3
  165. data/lib/karafka/web/pro/ui/routes/topics.rb +37 -12
  166. data/lib/karafka/web/pro/ui/routes/ux.rb +28 -3
  167. data/lib/karafka/web/pro/ui/views/cluster/_breadcrumbs.erb +19 -2
  168. data/lib/karafka/web/pro/ui/views/cluster/_broker.erb +19 -2
  169. data/lib/karafka/web/pro/ui/views/cluster/_config.erb +20 -3
  170. data/lib/karafka/web/pro/ui/views/cluster/_tabs.erb +19 -2
  171. data/lib/karafka/web/pro/ui/views/cluster/index.erb +19 -2
  172. data/lib/karafka/web/pro/ui/views/cluster/show.erb +19 -2
  173. data/lib/karafka/web/pro/ui/views/consumers/commands/_backtrace.erb +19 -2
  174. data/lib/karafka/web/pro/ui/views/consumers/commands/_breadcrumbs.erb +19 -2
  175. data/lib/karafka/web/pro/ui/views/consumers/commands/_command.erb +30 -66
  176. data/lib/karafka/web/pro/ui/views/consumers/commands/_command_details.erb +19 -2
  177. data/lib/karafka/web/pro/ui/views/consumers/commands/_empty.erb +19 -2
  178. data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_command.erb +25 -0
  179. data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_schema.erb +19 -2
  180. data/lib/karafka/web/pro/ui/views/consumers/commands/_table.erb +21 -4
  181. data/lib/karafka/web/pro/ui/views/consumers/commands/details/_acceptance.erb +25 -0
  182. data/lib/karafka/web/pro/ui/views/consumers/commands/details/_request.erb +25 -0
  183. data/lib/karafka/web/pro/ui/views/consumers/commands/details/_result.erb +33 -0
  184. data/lib/karafka/web/pro/ui/views/consumers/commands/index.erb +19 -2
  185. data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_request.erb +58 -0
  186. data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_response.erb +52 -0
  187. data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_command_name_badge.erb +46 -0
  188. data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_request.erb +53 -0
  189. data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_response.erb +52 -0
  190. data/lib/karafka/web/pro/ui/views/consumers/commands/show.erb +20 -15
  191. data/lib/karafka/web/pro/ui/views/consumers/consumers/_breadcrumbs.erb +19 -2
  192. data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer.erb +19 -2
  193. data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer_performance.erb +19 -2
  194. data/lib/karafka/web/pro/ui/views/consumers/consumers/_tabs.erb +19 -2
  195. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_commands.erb +19 -5
  196. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_consumer_group.erb +19 -2
  197. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_metrics.erb +19 -2
  198. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_no_subscriptions.erb +19 -2
  199. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition.erb +21 -5
  200. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition_edit_options.erb +22 -5
  201. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_stopped.erb +19 -2
  202. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_subscription_group.erb +37 -7
  203. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_tabs.erb +19 -2
  204. data/lib/karafka/web/pro/ui/views/consumers/consumers/details.erb +19 -2
  205. data/lib/karafka/web/pro/ui/views/consumers/consumers/index.erb +19 -2
  206. data/lib/karafka/web/pro/ui/views/consumers/consumers/performance.erb +19 -2
  207. data/lib/karafka/web/pro/ui/views/consumers/consumers/subscriptions.erb +19 -2
  208. data/lib/karafka/web/pro/ui/views/consumers/controls/_breadcrumbs.erb +19 -2
  209. data/lib/karafka/web/pro/ui/views/consumers/controls/_controls.erb +20 -7
  210. data/lib/karafka/web/pro/ui/views/consumers/controls/index.erb +41 -9
  211. data/lib/karafka/web/pro/ui/views/consumers/jobs/_breadcrumbs.erb +19 -2
  212. data/lib/karafka/web/pro/ui/views/consumers/jobs/_job.erb +20 -3
  213. data/lib/karafka/web/pro/ui/views/consumers/jobs/_no_jobs.erb +19 -2
  214. data/lib/karafka/web/pro/ui/views/consumers/jobs/pending.erb +19 -2
  215. data/lib/karafka/web/pro/ui/views/consumers/jobs/running.erb +19 -2
  216. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_basics.erb +26 -13
  217. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_breadcrumbs.erb +43 -46
  218. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_form.erb +31 -15
  219. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_not_running_error.erb +19 -2
  220. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_running_warning.erb +19 -2
  221. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/edit.erb +23 -6
  222. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_active_not_editable.erb +19 -2
  223. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_adjusting_warning.erb +20 -3
  224. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_breadcrumbs.erb +46 -48
  225. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_edit_form.erb +24 -9
  226. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_lrj_not_manageable.erb +19 -2
  227. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_new_form.erb +28 -13
  228. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_not_running.erb +19 -2
  229. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_partition_info.erb +63 -0
  230. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/edit.erb +22 -5
  231. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/new.erb +22 -5
  232. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_adjusting_warning.erb +44 -0
  233. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_breadcrumbs.erb +52 -0
  234. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_edit_form.erb +71 -0
  235. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_lrj_not_manageable.erb +36 -0
  236. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_new_form.erb +90 -0
  237. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_not_running.erb +33 -0
  238. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_topic_info.erb +78 -0
  239. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/edit.erb +35 -0
  240. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/new.erb +35 -0
  241. data/lib/karafka/web/pro/ui/views/dashboard/index.erb +19 -2
  242. data/lib/karafka/web/pro/ui/views/dlq/_breadcrumbs.erb +19 -2
  243. data/lib/karafka/web/pro/ui/views/dlq/_no_topics.erb +19 -2
  244. data/lib/karafka/web/pro/ui/views/dlq/_topic.erb +19 -2
  245. data/lib/karafka/web/pro/ui/views/dlq/index.erb +19 -2
  246. data/lib/karafka/web/pro/ui/views/errors/_breadcrumbs.erb +19 -2
  247. data/lib/karafka/web/pro/ui/views/errors/_error.erb +20 -3
  248. data/lib/karafka/web/pro/ui/views/errors/_partition_option.erb +24 -5
  249. data/lib/karafka/web/pro/ui/views/errors/_selector.erb +20 -3
  250. data/lib/karafka/web/pro/ui/views/errors/_table.erb +20 -3
  251. data/lib/karafka/web/pro/ui/views/errors/index.erb +45 -26
  252. data/lib/karafka/web/pro/ui/views/errors/partition.erb +56 -37
  253. data/lib/karafka/web/pro/ui/views/errors/show.erb +20 -3
  254. data/lib/karafka/web/pro/ui/views/explorer/explorer/_breadcrumbs.erb +19 -2
  255. data/lib/karafka/web/pro/ui/views/explorer/explorer/_failed_deserialization.erb +19 -2
  256. data/lib/karafka/web/pro/ui/views/explorer/explorer/_filtered.erb +19 -2
  257. data/lib/karafka/web/pro/ui/views/explorer/explorer/_message.erb +20 -3
  258. data/lib/karafka/web/pro/ui/views/explorer/explorer/_no_topics.erb +19 -2
  259. data/lib/karafka/web/pro/ui/views/explorer/explorer/_partition_option.erb +24 -5
  260. data/lib/karafka/web/pro/ui/views/explorer/explorer/_selector.erb +20 -3
  261. data/lib/karafka/web/pro/ui/views/explorer/explorer/_topic.erb +19 -2
  262. data/lib/karafka/web/pro/ui/views/explorer/explorer/index.erb +19 -2
  263. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_metadata.erb +19 -2
  264. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_payload.erb +28 -4
  265. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_resources_utilization.erb +19 -2
  266. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_too_big_to_be_displayed.erb +21 -4
  267. data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_detail.erb +19 -2
  268. data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_headers.erb +19 -2
  269. data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_key.erb +19 -2
  270. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_cleaned.erb +19 -2
  271. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_empty.erb +19 -2
  272. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_messages.erb +20 -3
  273. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_time_selector.erb +20 -3
  274. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_timestamp_selector.erb +21 -3
  275. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition.erb +58 -39
  276. data/lib/karafka/web/pro/ui/views/explorer/explorer/show.erb +20 -4
  277. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_actions.erb +45 -26
  278. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_empty.erb +19 -2
  279. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_limited.erb +19 -2
  280. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic.erb +19 -2
  281. data/lib/karafka/web/pro/ui/views/explorer/messages/_breadcrumbs.erb +19 -2
  282. data/lib/karafka/web/pro/ui/views/explorer/messages/forward.erb +34 -18
  283. data/lib/karafka/web/pro/ui/views/explorer/search/_breadcrumbs.erb +19 -2
  284. data/lib/karafka/web/pro/ui/views/explorer/search/_fix_errors.erb +19 -2
  285. data/lib/karafka/web/pro/ui/views/explorer/search/_metadata.erb +19 -2
  286. data/lib/karafka/web/pro/ui/views/explorer/search/_no_results.erb +19 -2
  287. data/lib/karafka/web/pro/ui/views/explorer/search/_no_search_criteria.erb +19 -2
  288. data/lib/karafka/web/pro/ui/views/explorer/search/_search_criteria.erb +20 -3
  289. data/lib/karafka/web/pro/ui/views/explorer/search/_search_modal.erb +33 -15
  290. data/lib/karafka/web/pro/ui/views/explorer/search/_timeout.erb +19 -2
  291. data/lib/karafka/web/pro/ui/views/explorer/search/index.erb +19 -2
  292. data/lib/karafka/web/pro/ui/views/health/_breadcrumbs.erb +19 -2
  293. data/lib/karafka/web/pro/ui/views/health/_no_data.erb +19 -2
  294. data/lib/karafka/web/pro/ui/views/health/_no_partition_data.erb +19 -2
  295. data/lib/karafka/web/pro/ui/views/health/_partition.erb +27 -5
  296. data/lib/karafka/web/pro/ui/views/health/_partition_lags.erb +19 -2
  297. data/lib/karafka/web/pro/ui/views/health/_partition_offset.erb +19 -2
  298. data/lib/karafka/web/pro/ui/views/health/_partition_times.erb +19 -2
  299. data/lib/karafka/web/pro/ui/views/health/_partitions_with_fallback.erb +21 -2
  300. data/lib/karafka/web/pro/ui/views/health/_table_metadata.erb +19 -2
  301. data/lib/karafka/web/pro/ui/views/health/_tabs.erb +19 -2
  302. data/lib/karafka/web/pro/ui/views/health/_topic_edit_options.erb +70 -0
  303. data/lib/karafka/web/pro/ui/views/health/changes.erb +20 -2
  304. data/lib/karafka/web/pro/ui/views/health/cluster_lags.erb +19 -2
  305. data/lib/karafka/web/pro/ui/views/health/lags.erb +20 -2
  306. data/lib/karafka/web/pro/ui/views/health/offsets.erb +20 -2
  307. data/lib/karafka/web/pro/ui/views/health/overview.erb +35 -5
  308. data/lib/karafka/web/pro/ui/views/jobs/_job.erb +20 -3
  309. data/lib/karafka/web/pro/ui/views/jobs/_no_jobs.erb +19 -2
  310. data/lib/karafka/web/pro/ui/views/jobs/pending.erb +19 -2
  311. data/lib/karafka/web/pro/ui/views/jobs/running.erb +19 -2
  312. data/lib/karafka/web/pro/ui/views/recurring_tasks/_actions.erb +19 -5
  313. data/lib/karafka/web/pro/ui/views/recurring_tasks/_batch_actions.erb +19 -5
  314. data/lib/karafka/web/pro/ui/views/recurring_tasks/_breadcrumbs.erb +19 -2
  315. data/lib/karafka/web/pro/ui/views/recurring_tasks/_log.erb +19 -2
  316. data/lib/karafka/web/pro/ui/views/recurring_tasks/_not_active.erb +19 -2
  317. data/lib/karafka/web/pro/ui/views/recurring_tasks/_tabs.erb +19 -2
  318. data/lib/karafka/web/pro/ui/views/recurring_tasks/_task.erb +20 -3
  319. data/lib/karafka/web/pro/ui/views/recurring_tasks/logs.erb +19 -2
  320. data/lib/karafka/web/pro/ui/views/recurring_tasks/schedule.erb +20 -3
  321. data/lib/karafka/web/pro/ui/views/routing/_consumer_group.erb +20 -3
  322. data/lib/karafka/web/pro/ui/views/routing/_detail.erb +19 -2
  323. data/lib/karafka/web/pro/ui/views/routing/_topic.erb +20 -3
  324. data/lib/karafka/web/pro/ui/views/routing/index.erb +19 -2
  325. data/lib/karafka/web/pro/ui/views/routing/show.erb +19 -2
  326. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_breadcrumbs.erb +19 -2
  327. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_key.erb +19 -2
  328. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_message.erb +19 -2
  329. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_messages.erb +20 -3
  330. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_cancel.erb +20 -3
  331. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_compacted.erb +19 -2
  332. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_schedule.erb +20 -4
  333. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_tombstone.erb +20 -3
  334. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_unknown.erb +20 -3
  335. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/partition.erb +58 -39
  336. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/topic.erb +19 -2
  337. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_breadcrumbs.erb +19 -2
  338. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_no_groups.erb +19 -2
  339. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/index.erb +19 -2
  340. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/show.erb +20 -3
  341. data/lib/karafka/web/pro/ui/views/shared/_navigation.erb +20 -3
  342. data/lib/karafka/web/pro/ui/views/shared/_rdkafka_form_error_alert_box.erb +19 -2
  343. data/lib/karafka/web/pro/ui/views/shared/branding/_label.erb +19 -2
  344. data/lib/karafka/web/pro/ui/views/shared/branding/_notice.erb +19 -2
  345. data/lib/karafka/web/pro/ui/views/topics/configs/_breadcrumbs.erb +19 -2
  346. data/lib/karafka/web/pro/ui/views/topics/configs/_config.erb +20 -3
  347. data/lib/karafka/web/pro/ui/views/topics/configs/_delete_button.erb +19 -2
  348. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_form.erb +23 -7
  349. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_plan.erb +19 -2
  350. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_warning.erb +19 -2
  351. data/lib/karafka/web/pro/ui/views/topics/configs/edit.erb +27 -10
  352. data/lib/karafka/web/pro/ui/views/topics/configs/index.erb +20 -3
  353. data/lib/karafka/web/pro/ui/views/topics/distributions/_add_partitions_button.erb +19 -2
  354. data/lib/karafka/web/pro/ui/views/topics/distributions/_badges.erb +19 -2
  355. data/lib/karafka/web/pro/ui/views/topics/distributions/_breadcrumbs.erb +19 -2
  356. data/lib/karafka/web/pro/ui/views/topics/distributions/_chart.erb +19 -2
  357. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_form.erb +24 -7
  358. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_hints.erb +19 -2
  359. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_warnings.erb +19 -2
  360. data/lib/karafka/web/pro/ui/views/topics/distributions/_empty_partitions.erb +22 -3
  361. data/lib/karafka/web/pro/ui/views/topics/distributions/_limited.erb +19 -2
  362. data/lib/karafka/web/pro/ui/views/topics/distributions/_partition.erb +19 -2
  363. data/lib/karafka/web/pro/ui/views/topics/distributions/edit.erb +19 -2
  364. data/lib/karafka/web/pro/ui/views/topics/distributions/show.erb +19 -2
  365. data/lib/karafka/web/pro/ui/views/topics/offsets/_breadcrumbs.erb +19 -2
  366. data/lib/karafka/web/pro/ui/views/topics/offsets/_partition.erb +19 -2
  367. data/lib/karafka/web/pro/ui/views/topics/offsets/show.erb +19 -2
  368. data/lib/karafka/web/pro/ui/views/topics/replications/_breadcrumbs.erb +19 -2
  369. data/lib/karafka/web/pro/ui/views/topics/replications/_metric_box.erb +26 -0
  370. data/lib/karafka/web/pro/ui/views/topics/replications/_partition.erb +19 -2
  371. data/lib/karafka/web/pro/ui/views/topics/replications/_replication_info.erb +71 -0
  372. data/lib/karafka/web/pro/ui/views/topics/replications/_resilience_success.erb +30 -0
  373. data/lib/karafka/web/pro/ui/views/topics/replications/_warning_low_durability.erb +73 -0
  374. data/lib/karafka/web/pro/ui/views/topics/replications/_warning_no_redundancy.erb +72 -0
  375. data/lib/karafka/web/pro/ui/views/topics/replications/_warning_zero_fault_tolerance.erb +73 -0
  376. data/lib/karafka/web/pro/ui/views/topics/replications/show.erb +21 -2
  377. data/lib/karafka/web/pro/ui/views/topics/topics/_breadcrumbs.erb +19 -2
  378. data/lib/karafka/web/pro/ui/views/topics/topics/_create_button.erb +19 -2
  379. data/lib/karafka/web/pro/ui/views/topics/topics/_create_hints.erb +19 -2
  380. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_form.erb +19 -3
  381. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_hints.erb +19 -2
  382. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_warning.erb +19 -2
  383. data/lib/karafka/web/pro/ui/views/topics/topics/_new_form.erb +31 -13
  384. data/lib/karafka/web/pro/ui/views/topics/topics/_tabs.erb +19 -2
  385. data/lib/karafka/web/pro/ui/views/topics/topics/_topic.erb +19 -2
  386. data/lib/karafka/web/pro/ui/views/topics/topics/edit.erb +19 -2
  387. data/lib/karafka/web/pro/ui/views/topics/topics/index.erb +19 -2
  388. data/lib/karafka/web/pro/ui/views/topics/topics/new.erb +19 -2
  389. data/lib/karafka/web/processing/consumer.rb +1 -1
  390. data/lib/karafka/web/processing/consumers/aggregators/metrics.rb +11 -11
  391. data/lib/karafka/web/processing/consumers/aggregators/state.rb +4 -3
  392. data/lib/karafka/web/processing/consumers/reports_migrator.rb +2 -2
  393. data/lib/karafka/web/processing/consumers/schema_manager.rb +1 -1
  394. data/lib/karafka/web/processing/publisher.rb +2 -2
  395. data/lib/karafka/web/processing/time_series_tracker.rb +1 -2
  396. data/lib/karafka/web/producer.rb +62 -0
  397. data/lib/karafka/web/tracking/consumers/contracts/report.rb +3 -3
  398. data/lib/karafka/web/tracking/consumers/contracts/subscription_group.rb +2 -0
  399. data/lib/karafka/web/tracking/consumers/listeners/booting.rb +1 -1
  400. data/lib/karafka/web/tracking/consumers/listeners/connections.rb +12 -2
  401. data/lib/karafka/web/tracking/consumers/listeners/errors.rb +10 -10
  402. data/lib/karafka/web/tracking/consumers/listeners/pausing.rb +1 -1
  403. data/lib/karafka/web/tracking/consumers/listeners/processing.rb +25 -25
  404. data/lib/karafka/web/tracking/consumers/listeners/statistics.rb +35 -35
  405. data/lib/karafka/web/tracking/consumers/listeners/tags.rb +1 -2
  406. data/lib/karafka/web/tracking/consumers/reporter.rb +2 -2
  407. data/lib/karafka/web/tracking/consumers/sampler/enrichers/consumer_groups.rb +2 -0
  408. data/lib/karafka/web/tracking/consumers/sampler/metrics/base.rb +2 -1
  409. data/lib/karafka/web/tracking/consumers/sampler/metrics/container.rb +15 -15
  410. data/lib/karafka/web/tracking/consumers/sampler/metrics/jobs.rb +14 -5
  411. data/lib/karafka/web/tracking/consumers/sampler/metrics/network.rb +6 -6
  412. data/lib/karafka/web/tracking/consumers/sampler/metrics/os.rb +42 -39
  413. data/lib/karafka/web/tracking/consumers/sampler/metrics/server.rb +2 -1
  414. data/lib/karafka/web/tracking/consumers/sampler.rb +16 -10
  415. data/lib/karafka/web/tracking/helpers/error_info.rb +10 -10
  416. data/lib/karafka/web/tracking/helpers/sysconf.rb +2 -2
  417. data/lib/karafka/web/tracking/helpers/ttls/array.rb +1 -1
  418. data/lib/karafka/web/tracking/helpers/ttls/hash.rb +1 -1
  419. data/lib/karafka/web/tracking/helpers/ttls/stats.rb +4 -4
  420. data/lib/karafka/web/tracking/producers/listeners/booting.rb +1 -1
  421. data/lib/karafka/web/tracking/producers/listeners/errors.rb +2 -2
  422. data/lib/karafka/web/tracking/producers/reporter.rb +2 -2
  423. data/lib/karafka/web/tracking/producers/sampler.rb +1 -1
  424. data/lib/karafka/web/tracking/ui/errors.rb +4 -4
  425. data/lib/karafka/web/ui/app.rb +2 -2
  426. data/lib/karafka/web/ui/base.rb +36 -33
  427. data/lib/karafka/web/ui/controllers/base_controller.rb +24 -24
  428. data/lib/karafka/web/ui/controllers/cluster_controller.rb +3 -3
  429. data/lib/karafka/web/ui/controllers/requests/params.rb +6 -6
  430. data/lib/karafka/web/ui/helpers/application_helper.rb +59 -59
  431. data/lib/karafka/web/ui/helpers/paths_helper.rb +15 -7
  432. data/lib/karafka/web/ui/helpers/tailwind_helper.rb +6 -6
  433. data/lib/karafka/web/ui/helpers/time_helper.rb +1 -1
  434. data/lib/karafka/web/ui/helpers/topics_helper.rb +4 -4
  435. data/lib/karafka/web/ui/lib/admin.rb +4 -3
  436. data/lib/karafka/web/ui/lib/hash_proxy.rb +1 -2
  437. data/lib/karafka/web/ui/lib/paginations/base.rb +7 -7
  438. data/lib/karafka/web/ui/lib/paginations/offset_based.rb +2 -2
  439. data/lib/karafka/web/ui/lib/paginations/page_based.rb +1 -1
  440. data/lib/karafka/web/ui/lib/paginations/paginators/arrays.rb +3 -3
  441. data/lib/karafka/web/ui/lib/paginations/watermark_offsets_based.rb +1 -1
  442. data/lib/karafka/web/ui/lib/sorter.rb +2 -2
  443. data/lib/karafka/web/ui/models/counters.rb +23 -25
  444. data/lib/karafka/web/ui/models/health.rb +1 -0
  445. data/lib/karafka/web/ui/models/jobs.rb +2 -2
  446. data/lib/karafka/web/ui/models/message.rb +10 -11
  447. data/lib/karafka/web/ui/models/metrics/charts/aggregated.rb +3 -3
  448. data/lib/karafka/web/ui/models/metrics/charts/topics.rb +3 -3
  449. data/lib/karafka/web/ui/models/metrics/topics.rb +8 -8
  450. data/lib/karafka/web/ui/models/processes.rb +3 -3
  451. data/lib/karafka/web/ui/models/recurring_tasks/schedule.rb +3 -4
  452. data/lib/karafka/web/ui/models/status/checks/base.rb +126 -0
  453. data/lib/karafka/web/ui/models/status/checks/commands_topic_presence.rb +52 -0
  454. data/lib/karafka/web/ui/models/status/checks/connection.rb +68 -0
  455. data/lib/karafka/web/ui/models/status/checks/consumers_reports.rb +34 -0
  456. data/lib/karafka/web/ui/models/status/checks/consumers_reports_schema_state.rb +32 -0
  457. data/lib/karafka/web/ui/models/status/checks/consumers_schemas.rb +44 -0
  458. data/lib/karafka/web/ui/models/status/checks/enabled.rb +39 -0
  459. data/lib/karafka/web/ui/models/status/checks/initial_consumers_metrics.rb +48 -0
  460. data/lib/karafka/web/ui/models/status/checks/initial_consumers_state.rb +48 -0
  461. data/lib/karafka/web/ui/models/status/checks/live_reporting.rb +31 -0
  462. data/lib/karafka/web/ui/models/status/checks/materializing_lag.rb +49 -0
  463. data/lib/karafka/web/ui/models/status/checks/partitions.rb +45 -0
  464. data/lib/karafka/web/ui/models/status/checks/pro_subscription.rb +29 -0
  465. data/lib/karafka/web/ui/models/status/checks/replication.rb +51 -0
  466. data/lib/karafka/web/ui/models/status/checks/routing_topics_presence.rb +53 -0
  467. data/lib/karafka/web/ui/models/status/checks/state_calculation.rb +39 -0
  468. data/lib/karafka/web/ui/models/status/checks/topics.rb +44 -0
  469. data/lib/karafka/web/ui/models/status/context.rb +154 -0
  470. data/lib/karafka/web/ui/models/status/step.rb +64 -0
  471. data/lib/karafka/web/ui/models/status.rb +70 -356
  472. data/lib/karafka/web/ui/models/topic.rb +5 -3
  473. data/lib/karafka/web/ui/public/javascripts/application.min.js +7 -8
  474. data/lib/karafka/web/ui/public/javascripts/application.min.js.br +0 -0
  475. data/lib/karafka/web/ui/public/javascripts/application.min.js.gz +0 -0
  476. data/lib/karafka/web/ui/public/javascripts/components/live_poll.js +2 -2
  477. data/lib/karafka/web/ui/public/stylesheets/application.min.css +4752 -2644
  478. data/lib/karafka/web/ui/public/stylesheets/application.min.css.br +0 -0
  479. data/lib/karafka/web/ui/public/stylesheets/application.min.css.gz +0 -0
  480. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_dark.min.css.gz +0 -0
  481. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_light.min.css.gz +0 -0
  482. data/lib/karafka/web/ui/public/stylesheets/libs/tailwind.css +62 -3
  483. data/lib/karafka/web/ui/routes/assets.rb +7 -7
  484. data/lib/karafka/web/ui/routes/cluster.rb +4 -4
  485. data/lib/karafka/web/ui/routes/consumers.rb +2 -2
  486. data/lib/karafka/web/ui/routes/dashboard.rb +1 -1
  487. data/lib/karafka/web/ui/routes/errors.rb +2 -2
  488. data/lib/karafka/web/ui/routes/jobs.rb +4 -4
  489. data/lib/karafka/web/ui/routes/routing.rb +1 -1
  490. data/lib/karafka/web/ui/routes/status.rb +1 -1
  491. data/lib/karafka/web/ui/routes/support.rb +1 -1
  492. data/lib/karafka/web/ui/routes/ux.rb +1 -1
  493. data/lib/karafka/web/ui/views/cluster/_partition.erb +1 -0
  494. data/lib/karafka/web/ui/views/consumers/_assignments_badges.erb +0 -1
  495. data/lib/karafka/web/ui/views/dashboard/_counters.erb +16 -16
  496. data/lib/karafka/web/ui/views/errors/_detail.erb +2 -3
  497. data/lib/karafka/web/ui/views/errors/_error.erb +1 -1
  498. data/lib/karafka/web/ui/views/errors/index.erb +1 -1
  499. data/lib/karafka/web/ui/views/errors/show.erb +1 -1
  500. data/lib/karafka/web/ui/views/jobs/_job.erb +1 -1
  501. data/lib/karafka/web/ui/views/layout.erb +1 -1
  502. data/lib/karafka/web/ui/views/routing/_consumer_group.erb +1 -1
  503. data/lib/karafka/web/ui/views/routing/_topic.erb +1 -1
  504. data/lib/karafka/web/ui/views/shared/_header.erb +5 -5
  505. data/lib/karafka/web/ui/views/shared/_navigation.erb +1 -1
  506. data/lib/karafka/web/ui/views/shared/alerts/_error.erb +2 -2
  507. data/lib/karafka/web/ui/views/shared/alerts/_info.erb +1 -1
  508. data/lib/karafka/web/ui/views/shared/alerts/_primary.erb +1 -1
  509. data/lib/karafka/web/ui/views/shared/alerts/_secondary.erb +1 -1
  510. data/lib/karafka/web/ui/views/shared/alerts/_success.erb +1 -1
  511. data/lib/karafka/web/ui/views/shared/alerts/_warning.erb +2 -2
  512. data/lib/karafka/web/ui/views/shared/exceptions/not_allowed.erb +3 -3
  513. data/lib/karafka/web/ui/views/shared/exceptions/not_found.erb +4 -4
  514. data/lib/karafka/web/ui/views/shared/exceptions/pro_only.erb +4 -4
  515. data/lib/karafka/web/ui/views/shared/exceptions/unhandled_error.erb +4 -4
  516. data/lib/karafka/web/ui/views/status/show.erb +15 -0
  517. data/lib/karafka/web/ui/views/status/warnings/_commands_topic_presence.erb +14 -0
  518. data/lib/karafka/web/ui/views/ux/_code.erb +0 -1
  519. data/lib/karafka/web/ui/views/ux/_data_table.erb +79 -0
  520. data/lib/karafka/web/ui/views/ux/_headers.erb +1 -1
  521. data/lib/karafka/web/ui/views/ux/_pagination.erb +5 -5
  522. data/lib/karafka/web/ui/views/ux/_tabs.erb +3 -3
  523. data/lib/karafka/web/ui/views/ux/_topic_tiles.erb +4 -4
  524. data/lib/karafka/web/version.rb +1 -1
  525. data/lib/karafka/web.rb +16 -17
  526. data/package-lock.json +1052 -613
  527. data/package.json +4 -3
  528. data/renovate.json +33 -10
  529. data/tailwind.config.js +4 -7
  530. metadata +87 -17
  531. data/lib/karafka/web/pro/ui/views/consumers/commands/_metadata.erb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 24ceb5279e48629e0a1c3a609b1c041323bdedc9faf6cf03dec926c7c0278b4f
4
- data.tar.gz: 4ea8f9aef69bb0ee9ac51cc20e132e64e955df2984f6f2359b1c878421793972
3
+ metadata.gz: 27e32327bc795732ee58f5dc757bd1fbe1dbc24198a8561f67cffbb48c5a4eb3
4
+ data.tar.gz: 81bb5e628233f6acf7d9cf0527ed07517271cc87f4b19cef925dd2e4e3887ef0
5
5
  SHA512:
6
- metadata.gz: 7861ba705d420ddd875053bb9f687302ad8d2719d332e925cab53075edf267245660e2467934c746f3707327f198538321585b77abe60fcb1bcb49c3c8a1771a
7
- data.tar.gz: dd30a59da0ed8590eb471965d1f6e917b15f2a390eb099e4b1527ca1a490dda46695fb3a40cc1e96729f15377a2b74d3a361d593a8b6cf5747fb03ecd4efb461
6
+ metadata.gz: 935b6515910e2eaf6871c5cb00920cda705935d06449de61410e941dfdb185c7437a2e7fa388244997dcb338efd0221ad7cf9c9e207d0b2fa4237fd9f63166e0
7
+ data.tar.gz: 9d3fe3b1c638b6a72b729464a2dc5178202fe9158f88aa3d5c692498d82eda3e65760141d5233e43e7bfd083ecd68bbaf2881f97db6a828825498e1771b4bdcf
data/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # Karafka Web Changelog
2
2
 
3
+ ## 1.0.0 (Unreleased)
4
+ - [Fix] Add `initialize` to `Status::Context` that defines all instance variables upfront in a consistent order, giving every instance the same Ruby object shape and eliminating the `:performance` shape-variation warning.
5
+ - [Enhancement] Add `Warning.process` block to the test helper to turn Ruby warnings originating from the project code into test failures.
6
+ - [Enhancement] Enable all opt-in Ruby warning categories in the test helper via `Warning.categories` (available since Ruby 3.4), so any new categories added in future Ruby versions are automatically enabled without code changes.
7
+ - [Enhancement] Replace sequential per-partition `query_watermark_offsets` consumer calls in `Counters#estimate_errors_count` with a single targeted `topic_info` metadata call followed by a batch `read_watermark_offsets` admin call. This eliminates the consumer connection overhead and reduces Kafka roundtrips from up to N+1 sequential calls to 3 regardless of partition count.
8
+ - [Enhancement] Allow for zero value in number of workers to support dynamic scaling of Karafka workers.
9
+ - [Enhancement] Align concurrency tracking with dynamic thread pool scaling. Workers count is now read from `Karafka::Server.workers.size` instead of the static `Karafka::App.config.concurrency`, so the Web UI accurately reflects runtime thread pool changes.
10
+ - [Enhancement] Track `poll_interval` (max.poll.interval.ms) per subscription group alongside `poll_age` to help users monitor how close they are to the polling timeout limit. Consumer schema version bumped to 1.7.0.
11
+ - [Enhancement] Replace token-based CSRF protection (`route_csrf` plugin) with header-based protection using `Sec-Fetch-Site` header (`sec_fetch_site_csrf` plugin). This eliminates the need for CSRF tokens by leveraging browser-enforced headers that cannot be forged from cross-origin requests. Modern browsers automatically include this header, providing simpler and more robust CSRF protection.
12
+ - [Enhancement] Include a short spec file hash in generated test topic names for traceability. Topic names now follow the `it-{hash}-{uuid}` format, making it easy to identify which test file created a given topic in Kafka logs.
13
+ - [Change] Require Roda `>= 3.100` (previously `~> 3.69`).
14
+ - [Fix] Accept (and ignore) a block in `Karafka::Web::Producer#__getobj__` to silence Ruby 3.4's `strict_unused_block` warning emitted via `SimpleDelegator#method_missing` on every delegated producer call.
15
+ - [Fix] Remove `cgi` as no longer needed.
16
+ - [Fix] Exclude `test/` directory from gem releases to reduce package size.
17
+ - [Fix] Update LinksValidator regexes to match the new `it-{hash}-{uuid}` test topic naming format, fixing test-order dependent failures in explorer controller specs.
18
+ - [Fix] Fix alerts formatting for the distribution view.
19
+ - [Fix] Fix 500 error in the Pro Explorer when a message payload parses as valid JSON but contains strings with invalid UTF-8 byte sequences. `JSON.pretty_generate` would raise `JSON::GeneratorError` outside of any error boundary and propagate as an unhandled 500. The pretty-print step is now wrapped in a dedicated `@safe_pretty_payload` SafeRunner; on failure the raw bytes are displayed alongside a deserialization warning.
20
+ - [Fix] Fix 500 error in the Pro Explorer message JSON export when a payload deserializes correctly but cannot be serialized back to JSON (for example when it contains strings with invalid UTF-8 byte sequences). The export endpoint now responds with 404 in such cases and the export action button is no longer rendered for such messages.
21
+
22
+ ## 0.11.6 (2026-02-01)
23
+ - **[Feature]** Provide ability to pause/resume all partitions of a topic at once across all consumer processes via the Health Overview page (Pro). Topic-level commands are broadcast to all processes, and each process applies the command to partitions it owns within the specified consumer group. This simplifies bulk operations compared to pausing/resuming individual partitions one by one.
24
+ - [Enhancement] Optimize partition command tracker to use index-based lookup instead of iterating over 10,000 partitions during rebalance events. The tracker now maintains a partition index for O(n) lookups where n is the number of partitions with pending commands.
25
+ - [Enhancement] Report `group.instance.id` (static membership ID) per subscription group in consumer reports. This enables identifying consumers using Kafka's static group membership feature. The ID is displayed in the per-consumer subscription view header and in Health Overview below each process ID, making it easy to find a process by its static membership ID. Consumer schema version bumped to 1.6.0.
26
+ - [Enhancement] Display `min.insync.replicas` alongside replication factor on the topic replication page with fault tolerance indicators (Pro). Shows specific warnings for different resilience issues: no redundancy (RF=1), zero fault tolerance (RF ≤ minISR), and low durability (minISR=1). Each warning includes impact details, environment-aware severity messaging, and recommended actions. Helps users identify misconfigured topics that would cause outages or data loss.
27
+ - [Enhancement] Add `.options` CSS class for table columns containing action buttons, providing consistent `width: 1%; white-space: nowrap` styling to prevent column width fluctuation.
28
+ - [Enhancement] Add commands topic presence status check for Pro users. Warns when the `karafka_consumers_commands` topic is missing, which is required for commanding features (pause, resume, trace).
29
+ - [Enhancement] Disable "Quiet All" and "Stop All" buttons when only swarm or embedded consumers are running (Pro). These commands only work on standalone consumer processes.
30
+ - [Enhancement] Use low-ack producer variant (`acks: 0`) for Web UI reporting. Since Web UI reporting serves analytical purposes, fire-and-forget semantics minimize latency and overhead while occasional message loss is acceptable. Falls back to the original producer for idempotent/transactional producers.
31
+ - [Refactor] Refactor Status model into a DSL-based architecture with individual check classes. Each status check is now a separate class in `Karafka::Web::Ui::Models::Status::Checks` that declares its dependencies using `depends_on :check_name` DSL. Shared state is managed through a `Context` class, and the `Step` struct has been extracted to its own file. This improves maintainability, testability, and makes it easier to add new status checks in the future.
32
+ - [Fix] Fix session keys to use strings instead of symbols for compatibility with Roda's session management.
33
+ - [Fix] Fix actions and selector alignment in explorer and errors views by wrapping col-span elements in proper grid container.
34
+
3
35
  ## 0.11.5 (2025-11-14)
4
36
  - [Enhancement] Utilize newly released Roda session management `:env_key` to isolate Karafka Web session from the main application session.
5
37
 
data/Gemfile CHANGED
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
6
 
7
7
  group :test do
8
- gem 'byebug'
9
- gem 'factory_bot'
10
- gem 'fugit'
8
+ gem "byebug"
9
+ gem "fugit"
10
+ gem "mocha"
11
11
  # Needed for links extraction for visits verification
12
- gem 'nokogiri'
13
- gem 'ostruct'
14
- gem 'rack-test'
15
- gem 'rspec'
16
- gem 'simplecov'
17
- gem 'yard-lint'
12
+ gem "nokogiri"
13
+ gem "ostruct"
14
+ gem "rack-test"
15
+ gem "minitest"
16
+ gem "simplecov"
17
+ gem "warning"
18
18
  end
data/Gemfile.lint ADDED
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Documentation linting
6
+ gem "yard-lint"
7
+
8
+ # Code style (StandardRB via RuboCop)
9
+ gem "standard"
10
+ gem "standard-performance"
11
+ gem "rubocop-performance"
12
+ gem "rubocop-minitest"
13
+ gem "standard-minitest"
14
+ gem "rubocop-thread_safety"
data/Gemfile.lint.lock ADDED
@@ -0,0 +1,108 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ ast (2.4.3)
5
+ json (2.18.0)
6
+ language_server-protocol (3.17.0.5)
7
+ lint_roller (1.1.0)
8
+ parallel (1.27.0)
9
+ parser (3.3.10.1)
10
+ ast (~> 2.4.1)
11
+ racc
12
+ prism (1.8.0)
13
+ racc (1.8.1)
14
+ rainbow (3.1.1)
15
+ regexp_parser (2.11.3)
16
+ rubocop (1.82.1)
17
+ json (~> 2.3)
18
+ language_server-protocol (~> 3.17.0.2)
19
+ lint_roller (~> 1.1.0)
20
+ parallel (~> 1.10)
21
+ parser (>= 3.3.0.2)
22
+ rainbow (>= 2.2.2, < 4.0)
23
+ regexp_parser (>= 2.9.3, < 3.0)
24
+ rubocop-ast (>= 1.48.0, < 2.0)
25
+ ruby-progressbar (~> 1.7)
26
+ unicode-display_width (>= 2.4.0, < 4.0)
27
+ rubocop-ast (1.49.0)
28
+ parser (>= 3.3.7.2)
29
+ prism (~> 1.7)
30
+ rubocop-minitest (0.39.1)
31
+ lint_roller (~> 1.1)
32
+ rubocop (>= 1.75.0, < 2.0)
33
+ rubocop-ast (>= 1.38.0, < 2.0)
34
+ rubocop-performance (1.26.1)
35
+ lint_roller (~> 1.1)
36
+ rubocop (>= 1.75.0, < 2.0)
37
+ rubocop-ast (>= 1.47.1, < 2.0)
38
+ rubocop-thread_safety (0.7.3)
39
+ lint_roller (~> 1.1)
40
+ rubocop (~> 1.72, >= 1.72.1)
41
+ rubocop-ast (>= 1.44.0, < 2.0)
42
+ ruby-progressbar (1.13.0)
43
+ standard (1.53.0)
44
+ language_server-protocol (~> 3.17.0.2)
45
+ lint_roller (~> 1.0)
46
+ rubocop (~> 1.82.0)
47
+ standard-custom (~> 1.0.0)
48
+ standard-performance (~> 1.8)
49
+ standard-custom (1.0.2)
50
+ lint_roller (~> 1.0)
51
+ rubocop (~> 1.50)
52
+ standard-minitest (1.0.0)
53
+ lint_roller (~> 1.0)
54
+ rubocop-minitest
55
+ standard-performance (1.9.0)
56
+ lint_roller (~> 1.1)
57
+ rubocop-performance (~> 1.26.0)
58
+ unicode-display_width (3.2.0)
59
+ unicode-emoji (~> 4.1)
60
+ unicode-emoji (4.2.0)
61
+ yard (0.9.38)
62
+ yard-lint (1.4.0)
63
+ yard (~> 0.9)
64
+ zeitwerk (~> 2.6)
65
+ zeitwerk (2.7.4)
66
+
67
+ PLATFORMS
68
+ ruby
69
+ x86_64-linux
70
+
71
+ DEPENDENCIES
72
+ rubocop-minitest
73
+ rubocop-performance
74
+ rubocop-thread_safety
75
+ standard
76
+ standard-minitest
77
+ standard-performance
78
+ yard-lint
79
+
80
+ CHECKSUMS
81
+ ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
82
+ json (2.18.0) sha256=b10506aee4183f5cf49e0efc48073d7b75843ce3782c68dbeb763351c08fd505
83
+ language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
84
+ lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
85
+ parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130
86
+ parser (3.3.10.1) sha256=06f6a725d2cd91e5e7f2b7c32ba143631e1f7c8ae2fb918fc4cebec187e6a688
87
+ prism (1.8.0) sha256=84453a16ef5530ea62c5f03ec16b52a459575ad4e7b9c2b360fd8ce2c39c1254
88
+ racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
89
+ rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
90
+ regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
91
+ rubocop (1.82.1) sha256=09f1a6a654a960eda767aebea33e47603080f8e9c9a3f019bf9b94c9cab5e273
92
+ rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd
93
+ rubocop-minitest (0.39.1) sha256=998398d6da4026d297f0f9bf709a1eac5f2b6947c24431f94af08138510cf7ed
94
+ rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
95
+ rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
96
+ ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
97
+ standard (1.53.0) sha256=f3c9493385db7079d0abce6f7582f553122156997b81258cd361d3480eeacf9c
98
+ standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
99
+ standard-minitest (1.0.0) sha256=450caa86a64a6e6f6f186cc88601dbb49b6cfaa3b0dce77a73b50ba8cdc15b2a
100
+ standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
101
+ unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
102
+ unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
103
+ yard (0.9.38) sha256=721fb82afb10532aa49860655f6cc2eaa7130889df291b052e1e6b268283010f
104
+ yard-lint (1.4.0) sha256=7dd88fbb08fd77cb840bea899d58812817b36d92291b5693dd0eeb3af9f91f0f
105
+ zeitwerk (2.7.4) sha256=2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b
106
+
107
+ BUNDLED WITH
108
+ 4.0.3
data/Gemfile.lock CHANGED
@@ -1,93 +1,79 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- karafka-web (0.11.5)
4
+ karafka-web (1.0.0.beta1)
5
5
  erubi (~> 1.4)
6
- karafka (>= 2.5.2, < 2.6.0)
7
- karafka-core (>= 2.5.0, < 2.6.0)
8
- roda (~> 3.69, >= 3.69)
6
+ karafka (>= 2.5.10.rc1, < 2.7.0)
7
+ karafka-core (>= 2.5.0, < 2.7.0)
8
+ roda (>= 3.100, < 4.0)
9
9
  tilt (~> 2.0)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- activesupport (8.1.1)
15
- base64
16
- bigdecimal
17
- concurrent-ruby (~> 1.0, >= 1.3.1)
18
- connection_pool (>= 2.2.5)
19
- drb
20
- i18n (>= 1.6, < 2)
21
- json
22
- logger (>= 1.4.2)
23
- minitest (>= 5.1)
24
- securerandom (>= 0.3)
25
- tzinfo (~> 2.0, >= 2.0.5)
26
- uri (>= 0.13.1)
27
- base64 (0.3.0)
28
- bigdecimal (3.3.1)
29
- byebug (12.0.0)
30
- concurrent-ruby (1.3.5)
31
- connection_pool (2.5.4)
32
- diff-lcs (1.6.2)
14
+ byebug (13.0.0)
15
+ reline (>= 0.6.0)
16
+ concurrent-ruby (1.3.6)
33
17
  docile (1.4.1)
34
18
  drb (2.2.3)
35
19
  erubi (1.13.1)
36
20
  et-orbi (1.4.0)
37
21
  tzinfo
38
- factory_bot (6.5.6)
39
- activesupport (>= 6.1.0)
40
- ffi (1.17.2)
41
- ffi (1.17.2-aarch64-linux-gnu)
42
- ffi (1.17.2-aarch64-linux-musl)
43
- ffi (1.17.2-arm-linux-gnu)
44
- ffi (1.17.2-arm-linux-musl)
45
- ffi (1.17.2-arm64-darwin)
46
- ffi (1.17.2-x86-linux-gnu)
47
- ffi (1.17.2-x86-linux-musl)
48
- ffi (1.17.2-x86_64-darwin)
49
- ffi (1.17.2-x86_64-linux-gnu)
50
- ffi (1.17.2-x86_64-linux-musl)
51
- fugit (1.12.1)
22
+ ffi (1.17.4)
23
+ ffi (1.17.4-aarch64-linux-gnu)
24
+ ffi (1.17.4-aarch64-linux-musl)
25
+ ffi (1.17.4-arm-linux-gnu)
26
+ ffi (1.17.4-arm-linux-musl)
27
+ ffi (1.17.4-arm64-darwin)
28
+ ffi (1.17.4-x86-linux-gnu)
29
+ ffi (1.17.4-x86-linux-musl)
30
+ ffi (1.17.4-x86_64-darwin)
31
+ ffi (1.17.4-x86_64-linux-gnu)
32
+ ffi (1.17.4-x86_64-linux-musl)
33
+ fugit (1.12.2)
52
34
  et-orbi (~> 1.4)
53
35
  raabro (~> 1.4)
54
- i18n (1.14.7)
55
- concurrent-ruby (~> 1.0)
56
- json (2.16.0)
57
- karafka (2.5.2)
58
- base64 (~> 0.2)
59
- karafka-core (>= 2.5.6, < 2.6.0)
60
- karafka-rdkafka (>= 0.22.0)
61
- waterdrop (>= 2.8.9, < 3.0.0)
36
+ io-console (0.8.2)
37
+ json (2.19.7)
38
+ karafka (2.5.10.rc1)
39
+ karafka-core (>= 2.5.13, < 2.6.0)
40
+ karafka-rdkafka (>= 0.26.1)
41
+ waterdrop (>= 2.8.14, < 3.0.0)
62
42
  zeitwerk (~> 2.3)
63
- karafka-core (2.5.7)
43
+ karafka-core (2.5.13)
64
44
  karafka-rdkafka (>= 0.20.0)
65
45
  logger (>= 1.6.0)
66
- karafka-rdkafka (0.23.0)
46
+ karafka-rdkafka (0.27.2)
67
47
  ffi (~> 1.17.1)
68
48
  json (> 2.0)
69
49
  logger
70
50
  mini_portile2 (~> 2.6)
71
51
  rake (> 12)
72
- karafka-rdkafka (0.23.0-aarch64-linux-gnu)
52
+ karafka-rdkafka (0.27.2-aarch64-linux-gnu)
73
53
  ffi (~> 1.17.1)
74
54
  json (> 2.0)
75
55
  logger
76
56
  mini_portile2 (~> 2.6)
77
57
  rake (> 12)
78
- karafka-rdkafka (0.23.0-arm64-darwin)
58
+ karafka-rdkafka (0.27.2-aarch64-linux-musl)
79
59
  ffi (~> 1.17.1)
80
60
  json (> 2.0)
81
61
  logger
82
62
  mini_portile2 (~> 2.6)
83
63
  rake (> 12)
84
- karafka-rdkafka (0.23.0-x86_64-linux-gnu)
64
+ karafka-rdkafka (0.27.2-arm64-darwin)
85
65
  ffi (~> 1.17.1)
86
66
  json (> 2.0)
87
67
  logger
88
68
  mini_portile2 (~> 2.6)
89
69
  rake (> 12)
90
- karafka-rdkafka (0.23.0-x86_64-linux-musl)
70
+ karafka-rdkafka (0.27.2-x86_64-linux-gnu)
71
+ ffi (~> 1.17.1)
72
+ json (> 2.0)
73
+ logger
74
+ mini_portile2 (~> 2.6)
75
+ rake (> 12)
76
+ karafka-rdkafka (0.27.2-x86_64-linux-musl)
91
77
  ffi (~> 1.17.1)
92
78
  json (> 2.0)
93
79
  logger
@@ -95,72 +81,62 @@ GEM
95
81
  rake (> 12)
96
82
  logger (1.7.0)
97
83
  mini_portile2 (2.8.9)
98
- minitest (5.26.1)
99
- nokogiri (1.18.10)
84
+ minitest (6.0.6)
85
+ drb (~> 2.0)
86
+ prism (~> 1.5)
87
+ mocha (3.1.0)
88
+ ruby2_keywords (>= 0.0.5)
89
+ nokogiri (1.19.3)
100
90
  mini_portile2 (~> 2.8.2)
101
91
  racc (~> 1.4)
102
- nokogiri (1.18.10-aarch64-linux-gnu)
92
+ nokogiri (1.19.3-aarch64-linux-gnu)
103
93
  racc (~> 1.4)
104
- nokogiri (1.18.10-aarch64-linux-musl)
94
+ nokogiri (1.19.3-aarch64-linux-musl)
105
95
  racc (~> 1.4)
106
- nokogiri (1.18.10-arm-linux-gnu)
96
+ nokogiri (1.19.3-arm-linux-gnu)
107
97
  racc (~> 1.4)
108
- nokogiri (1.18.10-arm-linux-musl)
98
+ nokogiri (1.19.3-arm-linux-musl)
109
99
  racc (~> 1.4)
110
- nokogiri (1.18.10-arm64-darwin)
100
+ nokogiri (1.19.3-arm64-darwin)
111
101
  racc (~> 1.4)
112
- nokogiri (1.18.10-x86_64-darwin)
102
+ nokogiri (1.19.3-x86_64-darwin)
113
103
  racc (~> 1.4)
114
- nokogiri (1.18.10-x86_64-linux-gnu)
104
+ nokogiri (1.19.3-x86_64-linux-gnu)
115
105
  racc (~> 1.4)
116
- nokogiri (1.18.10-x86_64-linux-musl)
106
+ nokogiri (1.19.3-x86_64-linux-musl)
117
107
  racc (~> 1.4)
118
108
  ostruct (0.6.3)
109
+ prism (1.9.0)
119
110
  raabro (1.4.0)
120
111
  racc (1.8.1)
121
- rack (3.2.4)
112
+ rack (3.2.6)
122
113
  rack-test (2.2.0)
123
114
  rack (>= 1.3)
124
115
  rackup (0.2.3)
125
116
  rack (>= 3.0.0.beta1)
126
117
  webrick
127
- rake (13.3.1)
128
- roda (3.98.0)
118
+ rake (13.4.2)
119
+ reline (0.6.3)
120
+ io-console (~> 0.5)
121
+ roda (3.104.0)
129
122
  rack
130
- rspec (3.13.2)
131
- rspec-core (~> 3.13.0)
132
- rspec-expectations (~> 3.13.0)
133
- rspec-mocks (~> 3.13.0)
134
- rspec-core (3.13.6)
135
- rspec-support (~> 3.13.0)
136
- rspec-expectations (3.13.5)
137
- diff-lcs (>= 1.2.0, < 2.0)
138
- rspec-support (~> 3.13.0)
139
- rspec-mocks (3.13.7)
140
- diff-lcs (>= 1.2.0, < 2.0)
141
- rspec-support (~> 3.13.0)
142
- rspec-support (3.13.6)
143
- securerandom (0.4.1)
123
+ ruby2_keywords (0.0.5)
144
124
  simplecov (0.22.0)
145
125
  docile (~> 1.1)
146
126
  simplecov-html (~> 0.11)
147
127
  simplecov_json_formatter (~> 0.1)
148
128
  simplecov-html (0.13.2)
149
129
  simplecov_json_formatter (0.1.4)
150
- tilt (2.6.1)
130
+ tilt (2.7.0)
151
131
  tzinfo (2.0.6)
152
132
  concurrent-ruby (~> 1.0)
153
- uri (1.1.1)
154
- waterdrop (2.8.13)
155
- karafka-core (>= 2.4.9, < 3.0.0)
156
- karafka-rdkafka (>= 0.20.0)
133
+ warning (1.6.0)
134
+ waterdrop (2.10.1)
135
+ karafka-core (>= 2.5.12, < 3.0.0)
136
+ karafka-rdkafka (>= 0.24.0)
157
137
  zeitwerk (~> 2.3)
158
- webrick (1.9.1)
159
- yard (0.9.37)
160
- yard-lint (1.2.3)
161
- yard (~> 0.9)
162
- zeitwerk (~> 2.6)
163
- zeitwerk (2.7.3)
138
+ webrick (1.9.2)
139
+ zeitwerk (2.8.2)
164
140
 
165
141
  PLATFORMS
166
142
  aarch64-linux-gnu
@@ -177,16 +153,16 @@ PLATFORMS
177
153
 
178
154
  DEPENDENCIES
179
155
  byebug
180
- factory_bot
181
156
  fugit
182
157
  karafka-web!
158
+ minitest
159
+ mocha
183
160
  nokogiri
184
161
  ostruct
185
162
  rack-test
186
163
  rackup (~> 0.2)
187
- rspec
188
164
  simplecov
189
- yard-lint
165
+ warning
190
166
 
191
167
  BUNDLED WITH
192
- 2.7.1
168
+ 4.0.12
data/README.md CHANGED
@@ -4,31 +4,31 @@
4
4
  [![Gem Version](https://badge.fury.io/rb/karafka-web.svg)](http://badge.fury.io/rb/karafka-web)
5
5
  [![Join the chat at https://slack.karafka.io](https://raw.githubusercontent.com/karafka/misc/master/slack.svg)](https://slack.karafka.io)
6
6
 
7
- Karafka Web UI is a user interface for the [Karafka framework](https://github.com/karafka/karafka). The Web UI provides a convenient way for developers to monitor and manage their Karafka-based applications, without the need to use the command line or third party software.
7
+ Karafka Web UI is a web-based interface for the [Karafka framework](https://github.com/karafka/karafka). The Web UI provides a convenient way for developers to monitor and manage their Kafka-based applications, eliminating the need to use command-line tools or third-party software.
8
8
 
9
- It allows for easy access to various metrics, such as the number of messages consumed, the number of errors, and the number of consumers operating. It also provides a way to view the different Kafka topics, consumers, and groups that are being used by the application.
9
+ It provides easy access to various metrics, including the number of messages consumed, the number of errors, and the number of consumers in operation. It also provides a way to view the various Kafka topics, consumers, and groups used by the application.
10
10
 
11
11
  > [!IMPORTANT]
12
- > All of Karafka ecosystems components documentation, including the Web UI, can be found [here](https://karafka.io/docs/#web-ui).
12
+ > Documentation for all ecosystem components, including the Web UI, is available in the [Karafka framework docs Wiki](https://karafka.io/docs/).
13
13
 
14
14
  ## Getting started
15
15
 
16
- Karafka Web UI documentation is part of the Karafka framework documentation and can be found [here](https://karafka.io/docs).
16
+ To get started with the Karafka Web UI, see the [Web UI](https://karafka.io/docs/#web-ui) chapter of the Karafka documentation Wiki.
17
17
 
18
18
  ![karafka web ui dashboard](https://raw.githubusercontent.com/karafka/misc/master/printscreens/web-ui.png)
19
19
 
20
20
  ## Karafka Pro Enhanced Web UI
21
21
 
22
- The Enhanced Web UI, aside from all the features from the OSS version, also offers additional features and capabilities not available in the free version, making it a better option for those looking for more robust monitoring and management capabilities for their Karafka applications. Some of the key benefits of the Enhanced Web UI version include the following:
22
+ The Enhanced Web UI, in addition to all the features from the OSS version, also offers additional features and capabilities not available in the free version, making it a more robust option for those seeking enhanced monitoring and management capabilities for their Karafka applications. Some of the key benefits of the Enhanced Web UI version include the following:
23
23
 
24
- - Real-time and historical processing and utilization metrics.
25
- - Real-time topics lag awareness.
26
- - Enhanced consumers utilization metrics providing much better insights into processes resources utilization.
27
- - Consumer process inspection to quickly analyze the state of a given consuming process.
28
- - Consumer jobs inspection to view currently running jobs on a per-process basis.
29
- - Health dashboard containing general consumption overview information
30
- - Data Explorer allowing for viewing and exploring the data produced to Kafka topics. It understands the routing table and can deserialize data before it is displayed.
31
- - Enhanced error reporting allowing for backtrace inspection and providing multi-partition support.
32
- - DLQ / Dead insights allowing to navigate through DLQ topics and messages that were dispatched to them.
24
+ - Real-time and historical processing and utilization metrics
25
+ - Real-time topics lag awareness
26
+ - Enhanced consumer utilization metrics providing much better insights into process and resource utilization
27
+ - Consumer process inspection to quickly analyze the state of a given consuming process
28
+ - Consumer jobs inspection to view currently running jobs on a per-process basis
29
+ - A health dashboard containing general consumption overview information
30
+ - Data Explorer allowing for viewing and exploring the data produced to Kafka topics and understanding the routing table and deserializing data before it is displayed
31
+ - Enhanced error reporting allowing for backtrace inspection and providing multi-partition support
32
+ - DLQ / Dead insights allowing navigation through DLQ topics and messages dispatched
33
33
 
34
- Help me provide high-quality open-source software. Please see the Karafka [homepage](https://karafka.io) for more details.
34
+ Help me provide high-quality open-source software. For more details, see the Karafka [homepage](https://karafka.io).
data/Rakefile CHANGED
@@ -1,4 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler/setup'
4
- require 'bundler/gem_tasks'
3
+ require "bundler/setup"
4
+ require "bundler/gem_tasks"
5
+ require "minitest/test_task"
6
+
7
+ specs_type = ENV.fetch("SPECS_TYPE", "regular")
8
+
9
+ Minitest::TestTask.create(:test) do |t|
10
+ t.libs << "test"
11
+ t.libs << "lib"
12
+ t.test_prelude = 'require "test_helper"; require "minitest/autorun"'
13
+
14
+ t.test_globs = if specs_type == "pro"
15
+ ["test/lib/karafka/web/pro/**/*_test.rb"]
16
+ else
17
+ # Exclude pro tests from regular test runs
18
+ [
19
+ "test/lib/karafka/web/*_test.rb",
20
+ "test/lib/karafka/web/cli/**/*_test.rb",
21
+ "test/lib/karafka/web/contracts/**/*_test.rb",
22
+ "test/lib/karafka/web/management/**/*_test.rb",
23
+ "test/lib/karafka/web/processing/**/*_test.rb",
24
+ "test/lib/karafka/web/tracking/**/*_test.rb",
25
+ "test/lib/karafka/web/ui/**/*_test.rb"
26
+ ]
27
+ end
28
+ end
29
+
30
+ task default: :test
data/bin/balance_tests ADDED
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Balances test files across N workers using timing data
5
+ # Uses greedy bin-packing: assign each file to worker with lowest total time
6
+ #
7
+ # Usage: bin/balance_tests <regular|pro> <num_workers>
8
+ #
9
+ # Output: JSON array of arrays where each inner array contains the test files
10
+ # assigned to that worker
11
+ #
12
+ # Example:
13
+ # bin/balance_tests regular 4
14
+ # [["test/a.rb","test/d.rb"],["test/b.rb"],["test/c.rb"],["test/e.rb"]]
15
+
16
+ require 'json'
17
+
18
+ TIMINGS_DIR = File.expand_path('../test/timings', __dir__)
19
+ DEFAULT_TIME = 1.0 # Default time for files not in timing data
20
+
21
+ # Loads timing data from a JSON file for the given test type
22
+ #
23
+ # @param tests_type [String] the type of tests ('regular' or 'pro')
24
+ # @return [Hash<String, Float>] hash mapping file paths to execution times in seconds
25
+ def load_timings(tests_type)
26
+ file_path = File.join(TIMINGS_DIR, "#{tests_type}.json")
27
+
28
+ if File.exist?(file_path)
29
+ JSON.parse(File.read(file_path))
30
+ else
31
+ {}
32
+ end
33
+ end
34
+
35
+ # Returns a sorted list of test files for the given test type
36
+ #
37
+ # @param tests_type [String] the type of tests ('regular' or 'pro')
38
+ # @return [Array<String>] sorted array of test file paths
39
+ def get_test_files(tests_type)
40
+ all_tests = Dir.glob('test/lib/karafka/web/**/*_test.rb').sort
41
+
42
+ case tests_type
43
+ when 'pro'
44
+ all_tests.select { |f| f.include?('/pro/') }
45
+ when 'regular'
46
+ all_tests.reject { |f| f.include?('/pro/') }
47
+ else
48
+ warn "Unknown tests type: #{tests_type}"
49
+ exit 1
50
+ end
51
+ end
52
+
53
+ # Balances test files across workers using greedy bin-packing algorithm
54
+ #
55
+ # Files are sorted by execution time (descending) and each file is assigned
56
+ # to the worker with the lowest total time. This minimizes the imbalance
57
+ # between the slowest and fastest workers.
58
+ #
59
+ # @param files [Array<String>] list of test file paths to balance
60
+ # @param timings [Hash<String, Float>] hash mapping file paths to execution times
61
+ # @param num_workers [Integer] number of workers to distribute files across
62
+ # @return [Array<Hash>] array of worker hashes, each with :files and :total_time keys
63
+ def balance_files(files, timings, num_workers)
64
+ # Get timing for each file, using default if not found
65
+ # Handle both "./test/..." and "test/..." path formats
66
+ files_with_times = files.map do |file|
67
+ time = timings[file] || timings["./#{file}"] || DEFAULT_TIME
68
+ [file, time]
69
+ end
70
+
71
+ # Sort by time descending (largest first for better bin packing)
72
+ files_with_times.sort_by! { |_, time| -time }
73
+
74
+ # Initialize workers
75
+ workers = Array.new(num_workers) { { files: [], total_time: 0.0 } }
76
+
77
+ # Greedy assignment: assign each file to worker with lowest total time
78
+ files_with_times.each do |file, time|
79
+ # Find worker with minimum total time
80
+ min_worker = workers.min_by { |w| w[:total_time] }
81
+ min_worker[:files] << file
82
+ min_worker[:total_time] += time
83
+ end
84
+
85
+ workers
86
+ end
87
+
88
+ # Prints balance information to stderr for debugging/visibility
89
+ #
90
+ # @param workers [Array<Hash>] array of worker hashes with :files and :total_time keys
91
+ def print_balance_info(workers)
92
+ total_time = workers.sum { |w| w[:total_time] }
93
+ max_time = workers.max_by { |w| w[:total_time] }[:total_time]
94
+ min_time = workers.min_by { |w| w[:total_time] }[:total_time]
95
+
96
+ warn "Balance info:"
97
+ workers.each_with_index do |worker, i|
98
+ warn " Worker #{i + 1}: #{worker[:files].size} files, #{worker[:total_time].round(1)}s"
99
+ end
100
+ warn " Total: #{total_time.round(1)}s, Max: #{max_time.round(1)}s, Imbalance: #{(max_time - min_time).round(1)}s"
101
+ end
102
+
103
+ # Main
104
+ tests_type = ARGV[0]
105
+ num_workers = (ARGV[1] || '4').to_i
106
+
107
+ unless tests_type
108
+ warn "Usage: bin/balance_tests <regular|pro> <num_workers>"
109
+ exit 1
110
+ end
111
+
112
+ timings = load_timings(tests_type)
113
+ files = get_test_files(tests_type)
114
+ workers = balance_files(files, timings, num_workers)
115
+
116
+ # Print balance info to stderr
117
+ print_balance_info(workers)
118
+
119
+ # Output file lists as JSON array of arrays
120
+ puts JSON.generate(workers.map { |w| w[:files] })