karafka-web 0.10.4 → 0.11.0.beta2

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 (475) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +54 -176
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +87 -43
  6. data/LICENSE +6 -2
  7. data/bin/verify_kafka_warnings +35 -0
  8. data/bin/verify_topics_naming +35 -0
  9. data/config/locales/pro_errors.yml +1 -0
  10. data/docker-compose.yml +1 -1
  11. data/gulpfile.js +0 -2
  12. data/karafka-web.gemspec +2 -2
  13. data/lib/karafka/web/config.rb +80 -9
  14. data/lib/karafka/web/contracts/config.rb +44 -5
  15. data/lib/karafka/web/errors.rb +10 -12
  16. data/lib/karafka/web/management/actions/create_initial_states.rb +6 -6
  17. data/lib/karafka/web/management/actions/create_topics.rb +30 -64
  18. data/lib/karafka/web/management/actions/delete_topics.rb +5 -5
  19. data/lib/karafka/web/management/actions/enable.rb +5 -5
  20. data/lib/karafka/web/pro/commanding/commands/base.rb +37 -13
  21. data/lib/karafka/web/pro/commanding/commands/consumers/quiet.rb +33 -0
  22. data/lib/karafka/web/pro/commanding/commands/consumers/stop.rb +32 -0
  23. data/lib/karafka/web/pro/commanding/commands/consumers/trace.rb +37 -0
  24. data/lib/karafka/web/pro/commanding/commands/partitions/pause.rb +30 -0
  25. data/lib/karafka/web/pro/commanding/commands/partitions/resume.rb +30 -0
  26. data/lib/karafka/web/pro/commanding/commands/partitions/seek.rb +30 -0
  27. data/lib/karafka/web/pro/commanding/config.rb +6 -10
  28. data/lib/karafka/web/pro/commanding/contracts/config.rb +2 -10
  29. data/lib/karafka/web/pro/commanding/dispatcher.rb +45 -24
  30. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/base.rb +67 -0
  31. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/pause.rb +44 -0
  32. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/resume.rb +29 -0
  33. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/seek.rb +86 -0
  34. data/lib/karafka/web/pro/commanding/handlers/partitions/executor.rb +56 -0
  35. data/lib/karafka/web/pro/commanding/handlers/partitions/listener.rb +55 -0
  36. data/lib/karafka/web/pro/commanding/handlers/partitions/tracker.rb +62 -0
  37. data/lib/karafka/web/pro/commanding/listener.rb +4 -12
  38. data/lib/karafka/web/pro/commanding/manager.rb +36 -24
  39. data/lib/karafka/web/pro/commanding/matcher.rb +7 -17
  40. data/lib/karafka/web/pro/commanding/request.rb +39 -0
  41. data/lib/karafka/web/pro/commanding.rb +2 -10
  42. data/lib/karafka/web/pro/loader.rb +13 -10
  43. data/lib/karafka/web/pro/ui/app.rb +31 -390
  44. data/lib/karafka/web/pro/ui/controllers/base_controller.rb +8 -10
  45. data/lib/karafka/web/pro/ui/controllers/cluster_controller.rb +2 -10
  46. data/lib/karafka/web/pro/ui/controllers/consumers/base_controller.rb +21 -0
  47. data/lib/karafka/web/pro/ui/controllers/consumers/commanding_controller.rb +148 -0
  48. data/lib/karafka/web/pro/ui/controllers/consumers/commands_controller.rb +96 -0
  49. data/lib/karafka/web/pro/ui/controllers/consumers/consumers_controller.rb +99 -0
  50. data/lib/karafka/web/pro/ui/controllers/consumers/controls_controller.rb +36 -0
  51. data/lib/karafka/web/pro/ui/controllers/consumers/jobs_controller.rb +57 -0
  52. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/base_controller.rb +86 -0
  53. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/offsets_controller.rb +75 -0
  54. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/pauses_controller.rb +110 -0
  55. data/lib/karafka/web/pro/ui/controllers/dashboard_controller.rb +2 -10
  56. data/lib/karafka/web/pro/ui/controllers/dlq_controller.rb +2 -10
  57. data/lib/karafka/web/pro/ui/controllers/errors_controller.rb +3 -11
  58. data/lib/karafka/web/pro/ui/controllers/explorer/base_controller.rb +21 -0
  59. data/lib/karafka/web/pro/ui/controllers/explorer/explorer_controller.rb +215 -0
  60. data/lib/karafka/web/pro/ui/controllers/explorer/messages_controller.rb +145 -0
  61. data/lib/karafka/web/pro/ui/controllers/explorer/search_controller.rb +68 -0
  62. data/lib/karafka/web/pro/ui/controllers/health_controller.rb +2 -10
  63. data/lib/karafka/web/pro/ui/controllers/jobs_controller.rb +2 -10
  64. data/lib/karafka/web/pro/ui/controllers/recurring_tasks_controller.rb +12 -13
  65. data/lib/karafka/web/pro/ui/controllers/routing_controller.rb +2 -10
  66. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/base_controller.rb +2 -10
  67. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/explorer_controller.rb +8 -16
  68. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/messages_controller.rb +9 -15
  69. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/schedules_controller.rb +2 -10
  70. data/lib/karafka/web/pro/ui/controllers/status_controller.rb +2 -10
  71. data/lib/karafka/web/pro/ui/controllers/support_controller.rb +2 -10
  72. data/lib/karafka/web/pro/ui/controllers/topics/base_controller.rb +21 -0
  73. data/lib/karafka/web/pro/ui/controllers/topics/configs_controller.rb +86 -0
  74. data/lib/karafka/web/pro/ui/controllers/topics/distributions_controller.rb +91 -0
  75. data/lib/karafka/web/pro/ui/controllers/topics/offsets_controller.rb +55 -0
  76. data/lib/karafka/web/pro/ui/controllers/topics/replications_controller.rb +37 -0
  77. data/lib/karafka/web/pro/ui/controllers/topics/topics_controller.rb +101 -0
  78. data/lib/karafka/web/pro/ui/controllers/ux_controller.rb +2 -10
  79. data/lib/karafka/web/pro/ui/lib/branding/config.rb +2 -10
  80. data/lib/karafka/web/pro/ui/lib/branding/contracts/config.rb +2 -10
  81. data/lib/karafka/web/pro/ui/lib/branding.rb +2 -10
  82. data/lib/karafka/web/pro/ui/lib/features.rb +53 -0
  83. data/lib/karafka/web/pro/ui/lib/patterns_detector.rb +2 -10
  84. data/lib/karafka/web/pro/ui/lib/policies/config.rb +2 -10
  85. data/lib/karafka/web/pro/ui/lib/policies/contracts/config.rb +2 -10
  86. data/lib/karafka/web/pro/ui/lib/policies/messages.rb +2 -10
  87. data/lib/karafka/web/pro/ui/lib/policies/requests.rb +2 -10
  88. data/lib/karafka/web/pro/ui/lib/policies.rb +2 -10
  89. data/lib/karafka/web/pro/ui/lib/safe_runner.rb +5 -0
  90. data/lib/karafka/web/pro/ui/lib/search/config.rb +2 -10
  91. data/lib/karafka/web/pro/ui/lib/search/contracts/config.rb +2 -10
  92. data/lib/karafka/web/pro/ui/lib/search/contracts/form.rb +2 -10
  93. data/lib/karafka/web/pro/ui/lib/search/matchers/base.rb +2 -10
  94. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_header_includes.rb +10 -11
  95. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_key_includes.rb +2 -10
  96. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_payload_includes.rb +23 -11
  97. data/lib/karafka/web/pro/ui/lib/search/normalizer.rb +2 -10
  98. data/lib/karafka/web/pro/ui/lib/search/runner.rb +3 -11
  99. data/lib/karafka/web/pro/ui/lib/search.rb +2 -10
  100. data/lib/karafka/web/pro/ui/routes/base.rb +19 -0
  101. data/lib/karafka/web/pro/ui/routes/cluster.rb +37 -0
  102. data/lib/karafka/web/pro/ui/routes/consumers.rb +145 -0
  103. data/lib/karafka/web/pro/ui/routes/dashboard.rb +25 -0
  104. data/lib/karafka/web/pro/ui/routes/dlq.rb +24 -0
  105. data/lib/karafka/web/pro/ui/routes/errors.rb +39 -0
  106. data/lib/karafka/web/pro/ui/routes/explorer.rb +118 -0
  107. data/lib/karafka/web/pro/ui/routes/health.rb +47 -0
  108. data/lib/karafka/web/pro/ui/routes/jobs.rb +33 -0
  109. data/lib/karafka/web/pro/ui/routes/recurring_tasks.rb +59 -0
  110. data/lib/karafka/web/pro/ui/routes/routing.rb +31 -0
  111. data/lib/karafka/web/pro/ui/routes/scheduled_messages.rb +75 -0
  112. data/lib/karafka/web/pro/ui/routes/status.rb +24 -0
  113. data/lib/karafka/web/pro/ui/routes/support.rb +24 -0
  114. data/lib/karafka/web/pro/ui/routes/topics.rb +90 -0
  115. data/lib/karafka/web/pro/ui/routes/ux.rb +24 -0
  116. data/lib/karafka/web/pro/ui/views/cluster/_breadcrumbs.erb +3 -0
  117. data/lib/karafka/web/pro/ui/views/cluster/_broker.erb +3 -0
  118. data/lib/karafka/web/pro/ui/views/cluster/_config.erb +3 -0
  119. data/lib/karafka/web/pro/ui/views/cluster/_tabs.erb +3 -0
  120. data/lib/karafka/web/pro/ui/views/cluster/index.erb +4 -1
  121. data/lib/karafka/web/pro/ui/views/cluster/show.erb +3 -0
  122. data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/_backtrace.erb +3 -0
  123. data/lib/karafka/web/pro/ui/views/consumers/commands/_breadcrumbs.erb +24 -0
  124. data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/_command.erb +22 -6
  125. data/lib/karafka/web/pro/ui/views/consumers/commands/_command_details.erb +4 -0
  126. data/lib/karafka/web/pro/ui/views/consumers/commands/_empty.erb +6 -0
  127. data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/_incompatible_schema.erb +3 -0
  128. data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/_metadata.erb +4 -1
  129. data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/_table.erb +5 -2
  130. data/lib/karafka/web/pro/ui/views/{commands → consumers/commands}/index.erb +7 -4
  131. data/lib/karafka/web/pro/ui/views/consumers/commands/show.erb +32 -0
  132. data/lib/karafka/web/pro/ui/views/consumers/consumers/_breadcrumbs.erb +46 -0
  133. data/lib/karafka/web/pro/ui/views/consumers/{_consumer.erb → consumers/_consumer.erb} +4 -1
  134. data/lib/karafka/web/pro/ui/views/consumers/{_consumer_performance.erb → consumers/_consumer_performance.erb} +4 -1
  135. data/lib/karafka/web/pro/ui/views/consumers/consumers/_tabs.erb +38 -0
  136. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_commands.erb +80 -0
  137. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_consumer_group.erb +11 -0
  138. data/lib/karafka/web/pro/ui/views/consumers/{consumer → consumers/consumer}/_metrics.erb +3 -0
  139. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_no_subscriptions.erb +10 -0
  140. data/lib/karafka/web/pro/ui/views/consumers/{consumer → consumers/consumer}/_partition.erb +16 -0
  141. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition_edit_options.erb +33 -0
  142. data/lib/karafka/web/pro/ui/views/consumers/{consumer → consumers/consumer}/_stopped.erb +3 -0
  143. data/lib/karafka/web/pro/ui/views/consumers/{consumer → consumers/consumer}/_subscription_group.erb +7 -3
  144. data/lib/karafka/web/pro/ui/views/consumers/{consumer → consumers/consumer}/_tabs.erb +7 -4
  145. data/lib/karafka/web/pro/ui/views/consumers/consumers/details.erb +15 -0
  146. data/lib/karafka/web/pro/ui/views/consumers/{index.erb → consumers/index.erb} +6 -3
  147. data/lib/karafka/web/pro/ui/views/consumers/{performance.erb → consumers/performance.erb} +6 -3
  148. data/lib/karafka/web/pro/ui/views/consumers/consumers/subscriptions.erb +24 -0
  149. data/lib/karafka/web/pro/ui/views/consumers/controls/_breadcrumbs.erb +16 -0
  150. data/lib/karafka/web/pro/ui/views/consumers/{_consumer_controls.erb → controls/_controls.erb} +10 -7
  151. data/lib/karafka/web/pro/ui/views/consumers/{controls.erb → controls/index.erb} +8 -5
  152. data/lib/karafka/web/pro/ui/views/consumers/jobs/_breadcrumbs.erb +36 -0
  153. data/lib/karafka/web/pro/ui/views/consumers/{consumer → jobs}/_job.erb +3 -0
  154. data/lib/karafka/web/pro/ui/views/consumers/{consumer → jobs}/_no_jobs.erb +3 -0
  155. data/lib/karafka/web/pro/ui/views/consumers/{pending_jobs.erb → jobs/pending.erb} +7 -8
  156. data/lib/karafka/web/pro/ui/views/consumers/{running_jobs.erb → jobs/running.erb} +7 -8
  157. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_basics.erb +77 -0
  158. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_breadcrumbs.erb +58 -0
  159. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_form.erb +109 -0
  160. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_not_running_error.erb +16 -0
  161. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_running_warning.erb +15 -0
  162. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/edit.erb +12 -0
  163. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_active_not_editable.erb +22 -0
  164. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_adjusting_warning.erb +27 -0
  165. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_breadcrumbs.erb +60 -0
  166. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_edit_form.erb +59 -0
  167. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_lrj_not_manageable.erb +24 -0
  168. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_new_form.erb +78 -0
  169. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_not_running.erb +16 -0
  170. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/edit.erb +20 -0
  171. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/new.erb +16 -0
  172. data/lib/karafka/web/pro/ui/views/dashboard/index.erb +4 -1
  173. data/lib/karafka/web/pro/ui/views/dlq/_breadcrumbs.erb +3 -0
  174. data/lib/karafka/web/pro/ui/views/dlq/_no_topics.erb +3 -0
  175. data/lib/karafka/web/pro/ui/views/dlq/_topic.erb +4 -1
  176. data/lib/karafka/web/pro/ui/views/dlq/index.erb +3 -0
  177. data/lib/karafka/web/pro/ui/views/errors/_breadcrumbs.erb +3 -0
  178. data/lib/karafka/web/pro/ui/views/errors/_error.erb +3 -0
  179. data/lib/karafka/web/pro/ui/views/errors/_partition_option.erb +3 -0
  180. data/lib/karafka/web/pro/ui/views/errors/_selector.erb +3 -0
  181. data/lib/karafka/web/pro/ui/views/errors/_table.erb +4 -1
  182. data/lib/karafka/web/pro/ui/views/errors/index.erb +6 -3
  183. data/lib/karafka/web/pro/ui/views/errors/partition.erb +5 -2
  184. data/lib/karafka/web/pro/ui/views/errors/show.erb +3 -0
  185. data/lib/karafka/web/pro/ui/views/explorer/{_breadcrumbs.erb → explorer/_breadcrumbs.erb} +7 -4
  186. data/lib/karafka/web/pro/ui/views/explorer/{_failed_deserialization.erb → explorer/_failed_deserialization.erb} +3 -0
  187. data/lib/karafka/web/pro/ui/views/explorer/{_filtered.erb → explorer/_filtered.erb} +3 -0
  188. data/lib/karafka/web/pro/ui/views/explorer/{_message.erb → explorer/_message.erb} +4 -1
  189. data/lib/karafka/web/pro/ui/views/explorer/explorer/_no_topics.erb +4 -0
  190. data/lib/karafka/web/pro/ui/views/explorer/{_partition_option.erb → explorer/_partition_option.erb} +4 -1
  191. data/lib/karafka/web/pro/ui/views/explorer/{_selector.erb → explorer/_selector.erb} +4 -1
  192. data/lib/karafka/web/pro/ui/views/explorer/explorer/_topic.erb +13 -0
  193. data/lib/karafka/web/pro/ui/views/explorer/explorer/index.erb +17 -0
  194. data/lib/karafka/web/pro/ui/views/explorer/{message → explorer/message}/_metadata.erb +10 -7
  195. data/lib/karafka/web/pro/ui/views/explorer/{message → explorer/message}/_payload.erb +6 -3
  196. data/lib/karafka/web/pro/ui/views/explorer/{message → explorer/message}/_resources_utilization.erb +7 -4
  197. data/lib/karafka/web/pro/ui/views/explorer/{message → explorer/message}/_too_big_to_be_displayed.erb +3 -0
  198. data/lib/karafka/web/pro/ui/views/explorer/{messages → explorer/messages}/_detail.erb +3 -0
  199. data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_headers.erb +51 -0
  200. data/lib/karafka/web/pro/ui/views/explorer/{messages → explorer/messages}/_key.erb +3 -0
  201. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_cleaned.erb +6 -0
  202. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_empty.erb +6 -0
  203. data/lib/karafka/web/pro/ui/views/explorer/{partition → explorer/partition}/_messages.erb +4 -1
  204. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_time_selector.erb +16 -0
  205. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_timestamp_selector.erb +33 -0
  206. data/lib/karafka/web/pro/ui/views/explorer/{partition.erb → explorer/partition.erb} +24 -17
  207. data/lib/karafka/web/pro/ui/views/explorer/{show.erb → explorer/show.erb} +17 -19
  208. data/lib/karafka/web/pro/ui/views/explorer/{topic → explorer/topic}/_actions.erb +5 -2
  209. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_empty.erb +6 -0
  210. data/lib/karafka/web/pro/ui/views/explorer/{topic → explorer/topic}/_limited.erb +3 -0
  211. data/lib/karafka/web/pro/ui/views/explorer/{topic.erb → explorer/topic.erb} +7 -4
  212. data/lib/karafka/web/pro/ui/views/explorer/messages/_breadcrumbs.erb +32 -0
  213. data/lib/karafka/web/pro/ui/views/explorer/messages/forward.erb +143 -0
  214. data/lib/karafka/web/pro/ui/views/explorer/search/_breadcrumbs.erb +4 -0
  215. data/lib/karafka/web/pro/ui/views/explorer/search/_fix_errors.erb +6 -0
  216. data/lib/karafka/web/pro/ui/views/{search → explorer/search}/_metadata.erb +3 -0
  217. data/lib/karafka/web/pro/ui/views/explorer/search/_no_results.erb +6 -0
  218. data/lib/karafka/web/pro/ui/views/{search → explorer/search}/_no_search_criteria.erb +3 -0
  219. data/lib/karafka/web/pro/ui/views/{search → explorer/search}/_search_criteria.erb +3 -0
  220. data/lib/karafka/web/pro/ui/views/{search → explorer/search}/_search_modal.erb +5 -2
  221. data/lib/karafka/web/pro/ui/views/explorer/search/_timeout.erb +6 -0
  222. data/lib/karafka/web/pro/ui/views/explorer/search/index.erb +32 -0
  223. data/lib/karafka/web/pro/ui/views/health/_breadcrumbs.erb +3 -0
  224. data/lib/karafka/web/pro/ui/views/health/_no_data.erb +3 -0
  225. data/lib/karafka/web/pro/ui/views/health/_partition.erb +16 -1
  226. data/lib/karafka/web/pro/ui/views/health/_partition_lags.erb +3 -0
  227. data/lib/karafka/web/pro/ui/views/health/_partition_offset.erb +3 -0
  228. data/lib/karafka/web/pro/ui/views/health/_partition_times.erb +3 -0
  229. data/lib/karafka/web/pro/ui/views/health/_table_metadata.erb +4 -1
  230. data/lib/karafka/web/pro/ui/views/health/_tabs.erb +3 -0
  231. data/lib/karafka/web/pro/ui/views/health/changes.erb +4 -1
  232. data/lib/karafka/web/pro/ui/views/health/cluster_lags.erb +3 -0
  233. data/lib/karafka/web/pro/ui/views/health/lags.erb +5 -2
  234. data/lib/karafka/web/pro/ui/views/health/offsets.erb +4 -1
  235. data/lib/karafka/web/pro/ui/views/health/overview.erb +8 -3
  236. data/lib/karafka/web/pro/ui/views/jobs/_job.erb +4 -1
  237. data/lib/karafka/web/pro/ui/views/jobs/_no_jobs.erb +3 -0
  238. data/lib/karafka/web/pro/ui/views/jobs/pending.erb +4 -1
  239. data/lib/karafka/web/pro/ui/views/jobs/running.erb +4 -1
  240. data/lib/karafka/web/pro/ui/views/recurring_tasks/_actions.erb +3 -0
  241. data/lib/karafka/web/pro/ui/views/recurring_tasks/_batch_actions.erb +3 -0
  242. data/lib/karafka/web/pro/ui/views/recurring_tasks/_breadcrumbs.erb +3 -0
  243. data/lib/karafka/web/pro/ui/views/recurring_tasks/_log.erb +3 -0
  244. data/lib/karafka/web/pro/ui/views/recurring_tasks/_not_active.erb +3 -0
  245. data/lib/karafka/web/pro/ui/views/recurring_tasks/_tabs.erb +3 -0
  246. data/lib/karafka/web/pro/ui/views/recurring_tasks/_task.erb +3 -0
  247. data/lib/karafka/web/pro/ui/views/recurring_tasks/logs.erb +3 -0
  248. data/lib/karafka/web/pro/ui/views/recurring_tasks/schedule.erb +3 -0
  249. data/lib/karafka/web/pro/ui/views/routing/_consumer_group.erb +3 -0
  250. data/lib/karafka/web/pro/ui/views/routing/_detail.erb +3 -0
  251. data/lib/karafka/web/pro/ui/views/routing/_topic.erb +3 -0
  252. data/lib/karafka/web/pro/ui/views/routing/index.erb +3 -0
  253. data/lib/karafka/web/pro/ui/views/routing/show.erb +3 -0
  254. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_breadcrumbs.erb +6 -3
  255. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_key.erb +3 -0
  256. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_message.erb +4 -1
  257. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_messages.erb +3 -0
  258. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/partition.erb +23 -16
  259. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/topic.erb +6 -3
  260. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_breadcrumbs.erb +3 -0
  261. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_no_groups.erb +3 -0
  262. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/index.erb +4 -1
  263. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/show.erb +3 -0
  264. data/lib/karafka/web/pro/ui/views/shared/_navigation.erb +25 -17
  265. data/lib/karafka/web/pro/ui/views/shared/_rdkafka_form_error_alert_box.erb +16 -0
  266. data/lib/karafka/web/pro/ui/views/shared/branding/_label.erb +3 -0
  267. data/lib/karafka/web/pro/ui/views/shared/branding/_notice.erb +3 -0
  268. data/lib/karafka/web/pro/ui/views/topics/configs/_breadcrumbs.erb +34 -0
  269. data/lib/karafka/web/pro/ui/views/topics/configs/_config.erb +26 -0
  270. data/lib/karafka/web/pro/ui/views/topics/configs/_delete_button.erb +13 -0
  271. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_form.erb +50 -0
  272. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_plan.erb +16 -0
  273. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_warning.erb +12 -0
  274. data/lib/karafka/web/pro/ui/views/topics/configs/edit.erb +16 -0
  275. data/lib/karafka/web/pro/ui/views/topics/{config.erb → configs/index.erb} +9 -3
  276. data/lib/karafka/web/pro/ui/views/topics/distributions/_add_partitions_button.erb +13 -0
  277. data/lib/karafka/web/pro/ui/views/topics/{distribution → distributions}/_badges.erb +3 -0
  278. data/lib/karafka/web/pro/ui/views/topics/distributions/_breadcrumbs.erb +28 -0
  279. data/lib/karafka/web/pro/ui/views/topics/{distribution → distributions}/_chart.erb +3 -0
  280. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_form.erb +47 -0
  281. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_hints.erb +15 -0
  282. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_warnings.erb +14 -0
  283. data/lib/karafka/web/pro/ui/views/topics/distributions/_empty_partitions.erb +4 -0
  284. data/lib/karafka/web/pro/ui/views/topics/{distribution → distributions}/_limited.erb +3 -0
  285. data/lib/karafka/web/pro/ui/views/topics/distributions/_partition.erb +13 -0
  286. data/lib/karafka/web/pro/ui/views/topics/distributions/edit.erb +16 -0
  287. data/lib/karafka/web/pro/ui/views/topics/{distribution.erb → distributions/show.erb} +11 -7
  288. data/lib/karafka/web/pro/ui/views/topics/offsets/_breadcrumbs.erb +20 -0
  289. data/lib/karafka/web/pro/ui/views/topics/offsets/_partition.erb +13 -0
  290. data/lib/karafka/web/pro/ui/views/topics/{offsets.erb → offsets/show.erb} +6 -3
  291. data/lib/karafka/web/pro/ui/views/topics/replications/_breadcrumbs.erb +20 -0
  292. data/lib/karafka/web/pro/ui/views/topics/{_partition.erb → replications/_partition.erb} +4 -1
  293. data/lib/karafka/web/pro/ui/views/topics/{replication.erb → replications/show.erb} +6 -3
  294. data/lib/karafka/web/pro/ui/views/topics/topics/_breadcrumbs.erb +32 -0
  295. data/lib/karafka/web/pro/ui/views/topics/topics/_create_button.erb +13 -0
  296. data/lib/karafka/web/pro/ui/views/topics/topics/_create_hints.erb +15 -0
  297. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_form.erb +36 -0
  298. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_hints.erb +15 -0
  299. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_warning.erb +13 -0
  300. data/lib/karafka/web/pro/ui/views/topics/topics/_new_form.erb +80 -0
  301. data/lib/karafka/web/pro/ui/views/topics/{_tabs.erb → topics/_tabs.erb} +7 -4
  302. data/lib/karafka/web/pro/ui/views/topics/topics/_topic.erb +12 -0
  303. data/lib/karafka/web/pro/ui/views/topics/topics/edit.erb +10 -0
  304. data/lib/karafka/web/pro/ui/views/topics/topics/index.erb +19 -0
  305. data/lib/karafka/web/pro/ui/views/topics/topics/new.erb +12 -0
  306. data/lib/karafka/web/processing/consumer.rb +7 -7
  307. data/lib/karafka/web/processing/consumers/aggregators/state.rb +14 -14
  308. data/lib/karafka/web/processing/consumers/metrics.rb +1 -1
  309. data/lib/karafka/web/processing/consumers/state.rb +1 -1
  310. data/lib/karafka/web/processing/publisher.rb +4 -4
  311. data/lib/karafka/web/tracking/consumers/contracts/partition.rb +1 -0
  312. data/lib/karafka/web/tracking/consumers/listeners/pausing.rb +2 -2
  313. data/lib/karafka/web/tracking/consumers/listeners/transactions.rb +44 -0
  314. data/lib/karafka/web/tracking/consumers/reporter.rb +2 -2
  315. data/lib/karafka/web/tracking/consumers/sampler.rb +81 -14
  316. data/lib/karafka/web/tracking/helpers/sysconf.rb +33 -0
  317. data/lib/karafka/web/tracking/producers/reporter.rb +1 -1
  318. data/lib/karafka/web/ui/app.rb +19 -112
  319. data/lib/karafka/web/ui/base.rb +58 -3
  320. data/lib/karafka/web/ui/controllers/base_controller.rb +43 -1
  321. data/lib/karafka/web/ui/controllers/cluster_controller.rb +5 -2
  322. data/lib/karafka/web/ui/controllers/errors_controller.rb +1 -1
  323. data/lib/karafka/web/ui/controllers/requests/execution_wrapper.rb +52 -0
  324. data/lib/karafka/web/ui/controllers/requests/hookable.rb +99 -0
  325. data/lib/karafka/web/ui/controllers/requests/params.rb +39 -1
  326. data/lib/karafka/web/ui/controllers/responses/redirect.rb +0 -5
  327. data/lib/karafka/web/ui/controllers/status_controller.rb +3 -0
  328. data/lib/karafka/web/ui/helpers/application_helper.rb +10 -1
  329. data/lib/karafka/web/ui/helpers/paths_helper.rb +54 -10
  330. data/lib/karafka/web/ui/lib/admin.rb +1 -1
  331. data/lib/karafka/web/ui/lib/cache.rb +135 -0
  332. data/lib/karafka/web/ui/models/broker.rb +1 -2
  333. data/lib/karafka/web/ui/models/cluster_info.rb +15 -21
  334. data/lib/karafka/web/ui/models/consumers_metrics.rb +1 -1
  335. data/lib/karafka/web/ui/models/consumers_state.rb +1 -1
  336. data/lib/karafka/web/ui/models/counters.rb +1 -1
  337. data/lib/karafka/web/ui/models/health.rb +9 -7
  338. data/lib/karafka/web/ui/models/process.rb +16 -0
  339. data/lib/karafka/web/ui/models/processes.rb +29 -8
  340. data/lib/karafka/web/ui/models/recurring_tasks/schedule.rb +1 -1
  341. data/lib/karafka/web/ui/models/status.rb +28 -9
  342. data/lib/karafka/web/ui/models/topic.rb +1 -2
  343. data/lib/karafka/web/ui/public/javascripts/application.js +8 -98
  344. data/lib/karafka/web/ui/public/javascripts/application.min.js +12 -4
  345. data/lib/karafka/web/ui/public/javascripts/application.min.js.br +0 -0
  346. data/lib/karafka/web/ui/public/javascripts/application.min.js.gz +0 -0
  347. data/lib/karafka/web/ui/public/javascripts/components/action_confirmation_manager.js +30 -0
  348. data/lib/karafka/web/ui/public/javascripts/components/alerts.js +39 -0
  349. data/lib/karafka/web/ui/public/javascripts/components/button_lock_manager.js +50 -0
  350. data/lib/karafka/web/ui/public/javascripts/components/live_poll.js +71 -19
  351. data/lib/karafka/web/ui/public/javascripts/components/message_republish_manager.js +50 -0
  352. data/lib/karafka/web/ui/public/javascripts/components/page_title_tracker.js +21 -0
  353. data/lib/karafka/web/ui/public/javascripts/components/partition_redirect_manager.js +21 -0
  354. data/lib/karafka/web/ui/public/javascripts/components/time_ago_manager.js +25 -0
  355. data/lib/karafka/web/ui/public/javascripts/components/timestamp_selector.js +30 -0
  356. data/lib/karafka/web/ui/public/javascripts/libs/datepicker.js +2 -2
  357. data/lib/karafka/web/ui/public/stylesheets/application.css +30 -0
  358. data/lib/karafka/web/ui/public/stylesheets/application.min.css +5122 -13
  359. data/lib/karafka/web/ui/public/stylesheets/application.min.css.br +0 -0
  360. data/lib/karafka/web/ui/public/stylesheets/application.min.css.gz +0 -0
  361. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_dark.min.css.gz +0 -0
  362. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_light.min.css.gz +0 -0
  363. data/lib/karafka/web/ui/public/stylesheets/libs/tailwind.css +507 -214
  364. data/lib/karafka/web/ui/routes/assets.rb +53 -0
  365. data/lib/karafka/web/ui/routes/base.rb +36 -0
  366. data/lib/karafka/web/ui/routes/cluster.rb +28 -0
  367. data/lib/karafka/web/ui/routes/consumers.rb +35 -0
  368. data/lib/karafka/web/ui/routes/dashboard.rb +20 -0
  369. data/lib/karafka/web/ui/routes/errors.rb +26 -0
  370. data/lib/karafka/web/ui/routes/jobs.rb +28 -0
  371. data/lib/karafka/web/ui/routes/pro_only.rb +27 -0
  372. data/lib/karafka/web/ui/routes/routing.rb +26 -0
  373. data/lib/karafka/web/ui/routes/status.rb +19 -0
  374. data/lib/karafka/web/ui/routes/support.rb +19 -0
  375. data/lib/karafka/web/ui/routes/ux.rb +19 -0
  376. data/lib/karafka/web/ui/views/cluster/_partition.erb +2 -2
  377. data/lib/karafka/web/ui/views/cluster/brokers.erb +1 -1
  378. data/lib/karafka/web/ui/views/consumers/_breadcrumbs.erb +7 -1
  379. data/lib/karafka/web/ui/views/consumers/_consumer.erb +1 -1
  380. data/lib/karafka/web/ui/views/consumers/_no_consumers.erb +2 -2
  381. data/lib/karafka/web/ui/views/consumers/_tabs.erb +4 -4
  382. data/lib/karafka/web/ui/views/consumers/index.erb +1 -1
  383. data/lib/karafka/web/ui/views/dashboard/_feature_pro.erb +1 -1
  384. data/lib/karafka/web/ui/views/dashboard/_not_enough_data.erb +2 -2
  385. data/lib/karafka/web/ui/views/dashboard/_ranges_selector.erb +1 -1
  386. data/lib/karafka/web/ui/views/dashboard/index.erb +6 -49
  387. data/lib/karafka/web/ui/views/errors/_detail.erb +3 -3
  388. data/lib/karafka/web/ui/views/errors/index.erb +1 -1
  389. data/lib/karafka/web/ui/views/jobs/_job.erb +1 -1
  390. data/lib/karafka/web/ui/views/jobs/pending.erb +1 -1
  391. data/lib/karafka/web/ui/views/jobs/running.erb +1 -1
  392. data/lib/karafka/web/ui/views/layout.erb +7 -5
  393. data/lib/karafka/web/ui/views/shared/_become_pro.erb +1 -1
  394. data/lib/karafka/web/ui/views/shared/_brand.erb +1 -1
  395. data/lib/karafka/web/ui/views/shared/_breadcrumbs.erb +1 -1
  396. data/lib/karafka/web/ui/views/shared/_content.erb +1 -1
  397. data/lib/karafka/web/ui/views/shared/_controls.erb +10 -3
  398. data/lib/karafka/web/ui/views/shared/_custom_nav.erb +9 -0
  399. data/lib/karafka/web/ui/views/shared/_flashes.erb +3 -5
  400. data/lib/karafka/web/ui/views/shared/_header.erb +25 -2
  401. data/lib/karafka/web/ui/views/shared/_navigation.erb +17 -15
  402. data/lib/karafka/web/ui/views/shared/alerts/_error.erb +8 -0
  403. data/lib/karafka/web/ui/views/shared/alerts/_info.erb +8 -0
  404. data/lib/karafka/web/ui/views/shared/alerts/_primary.erb +8 -0
  405. data/lib/karafka/web/ui/views/shared/alerts/_secondary.erb +8 -0
  406. data/lib/karafka/web/ui/views/shared/alerts/_success.erb +8 -0
  407. data/lib/karafka/web/ui/views/shared/alerts/_warning.erb +8 -0
  408. data/lib/karafka/web/ui/views/shared/exceptions/not_allowed.erb +4 -0
  409. data/lib/karafka/web/ui/views/shared/exceptions/not_found.erb +5 -1
  410. data/lib/karafka/web/ui/views/shared/exceptions/pro_only.erb +4 -0
  411. data/lib/karafka/web/ui/views/shared/icons/_arrow_left.erb +3 -0
  412. data/lib/karafka/web/ui/views/shared/icons/_arrow_up_tray.erb +3 -0
  413. data/lib/karafka/web/ui/views/shared/icons/_clock.erb +3 -0
  414. data/lib/karafka/web/ui/views/shared/icons/_pencil.erb +3 -0
  415. data/lib/karafka/web/ui/views/shared/icons/_pencil_square.erb +3 -0
  416. data/lib/karafka/web/ui/views/shared/icons/_play_pause.erb +3 -0
  417. data/lib/karafka/web/ui/views/shared/icons/_plus.erb +3 -0
  418. data/lib/karafka/web/ui/views/shared/icons/_trash.erb +3 -0
  419. data/lib/karafka/web/ui/views/status/failures/_live_reporting.erb +1 -1
  420. data/lib/karafka/web/ui/views/status/failures/_partitions.erb +3 -3
  421. data/lib/karafka/web/ui/views/status/failures/_state_calculation.erb +2 -2
  422. data/lib/karafka/web/ui/views/status/info/_components.erb +6 -6
  423. data/lib/karafka/web/ui/views/status/show.erb +15 -0
  424. data/lib/karafka/web/ui/views/status/warnings/_consumers_schemas.erb +31 -0
  425. data/lib/karafka/web/ui/views/ux/_icons.erb +1 -1
  426. data/lib/karafka/web/version.rb +1 -1
  427. data/lib/karafka/web.rb +3 -0
  428. data/package-lock.json +776 -1208
  429. data/package.json +3 -4
  430. data/postcss.config.js +1 -2
  431. data/renovate.json +13 -1
  432. data/tailwind.config.js +0 -4
  433. data.tar.gz.sig +0 -0
  434. metadata +225 -106
  435. metadata.gz.sig +0 -0
  436. data/lib/karafka/web/pro/commanding/commands/quiet.rb +0 -34
  437. data/lib/karafka/web/pro/commanding/commands/stop.rb +0 -34
  438. data/lib/karafka/web/pro/commanding/commands/trace.rb +0 -41
  439. data/lib/karafka/web/pro/ui/controllers/commanding_controller.rb +0 -118
  440. data/lib/karafka/web/pro/ui/controllers/commands_controller.rb +0 -96
  441. data/lib/karafka/web/pro/ui/controllers/consumers_controller.rb +0 -138
  442. data/lib/karafka/web/pro/ui/controllers/explorer_controller.rb +0 -220
  443. data/lib/karafka/web/pro/ui/controllers/messages_controller.rb +0 -107
  444. data/lib/karafka/web/pro/ui/controllers/search_controller.rb +0 -73
  445. data/lib/karafka/web/pro/ui/controllers/topics_controller.rb +0 -130
  446. data/lib/karafka/web/pro/ui/views/commands/_breadcrumbs.erb +0 -21
  447. data/lib/karafka/web/pro/ui/views/commands/_command_details.erb +0 -1
  448. data/lib/karafka/web/pro/ui/views/commands/_empty.erb +0 -3
  449. data/lib/karafka/web/pro/ui/views/commands/show.erb +0 -33
  450. data/lib/karafka/web/pro/ui/views/consumers/_breadcrumbs.erb +0 -55
  451. data/lib/karafka/web/pro/ui/views/consumers/_tabs.erb +0 -33
  452. data/lib/karafka/web/pro/ui/views/consumers/consumer/_commands.erb +0 -72
  453. data/lib/karafka/web/pro/ui/views/consumers/consumer/_consumer_group.erb +0 -8
  454. data/lib/karafka/web/pro/ui/views/consumers/consumer/_no_subscriptions.erb +0 -7
  455. data/lib/karafka/web/pro/ui/views/consumers/details.erb +0 -13
  456. data/lib/karafka/web/pro/ui/views/consumers/subscriptions.erb +0 -25
  457. data/lib/karafka/web/pro/ui/views/explorer/_no_topics.erb +0 -1
  458. data/lib/karafka/web/pro/ui/views/explorer/_topic.erb +0 -10
  459. data/lib/karafka/web/pro/ui/views/explorer/index.erb +0 -14
  460. data/lib/karafka/web/pro/ui/views/explorer/messages/_headers.erb +0 -33
  461. data/lib/karafka/web/pro/ui/views/explorer/partition/_cleaned.erb +0 -3
  462. data/lib/karafka/web/pro/ui/views/explorer/partition/_empty.erb +0 -3
  463. data/lib/karafka/web/pro/ui/views/explorer/topic/_empty.erb +0 -3
  464. data/lib/karafka/web/pro/ui/views/search/_breadcrumbs.erb +0 -1
  465. data/lib/karafka/web/pro/ui/views/search/_fix_errors.erb +0 -3
  466. data/lib/karafka/web/pro/ui/views/search/_no_results.erb +0 -3
  467. data/lib/karafka/web/pro/ui/views/search/_timeout.erb +0 -3
  468. data/lib/karafka/web/pro/ui/views/search/index.erb +0 -29
  469. data/lib/karafka/web/pro/ui/views/topics/_breadcrumbs.erb +0 -45
  470. data/lib/karafka/web/pro/ui/views/topics/_partition_offsets.erb +0 -10
  471. data/lib/karafka/web/pro/ui/views/topics/_topic.erb +0 -9
  472. data/lib/karafka/web/pro/ui/views/topics/distribution/_empty_partitions.erb +0 -1
  473. data/lib/karafka/web/pro/ui/views/topics/distribution/_partition.erb +0 -10
  474. data/lib/karafka/web/pro/ui/views/topics/index.erb +0 -14
  475. data/lib/karafka/web/ui/lib/ttl_cache.rb +0 -82
@@ -0,0 +1,47 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <div class="card bg-base-100">
5
+ <div class="card-body">
6
+ <% form_path = topics_path(@topic.topic_name, 'distribution') %>
7
+ <form class="space-y-4" method="post" action="<%= form_path %>" data-turbo="false">
8
+ <%== csrf_tag(form_path, 'PUT') %>
9
+ <input type="hidden" name="_method" value="put">
10
+
11
+ <div class="flex items-center w-full mb-8">
12
+ <label class="w-1/4 text-gray-700">Current Partitions:</label>
13
+ <div class="w-3/4">
14
+ <code class="bg-base-200 px-2 py-1 rounded-sm"><%= @topic.partition_count %></code>
15
+ </div>
16
+ </div>
17
+
18
+ <div class="flex items-center w-full mb-8">
19
+ <label class="w-1/4 text-gray-700">New Partition Count:</label>
20
+ <div class="w-3/4">
21
+ <input
22
+ type="number"
23
+ name="partition_count"
24
+ class="block input input-bordered w-full"
25
+ placeholder="Enter new partition count"
26
+ value="<%= params.fetch(:partition_count, @topic.partition_count) %>"
27
+ min="<%= @topic.partition_count + 1 %>"
28
+ required
29
+ />
30
+ <div class="text-sm text-gray-500 mt-1">
31
+ Must be greater than current partition count (<%= @topic.partition_count %>)
32
+ </div>
33
+ </div>
34
+ </div>
35
+
36
+ <div class="flex justify-end gap-4">
37
+ <a href="<%= topics_path(@topic.topic_name, 'distribution') %>" class="btn btn-ghost">
38
+ Cancel
39
+ </a>
40
+ <button type="submit" class="btn btn-primary gap-2 btn-lockable confirm-action">
41
+ <%== icon(:plus) %>
42
+ Increase Partitions
43
+ </button>
44
+ </div>
45
+ </form>
46
+ </div>
47
+ </div>
@@ -0,0 +1,15 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <div class="alert">
5
+ <div class="space-y-2">
6
+ <p>Before increasing partitions:</p>
7
+ <ul class="list-disc ml-6">
8
+ <li>Ensure all consumers support dynamic partition detection</li>
9
+ <li>Consider the impact on message ordering in your applications</li>
10
+ <li>Plan for temporary rebalancing as consumers detect the change</li>
11
+ <li>Monitor consumer lag during and after the operation</li>
12
+ <li>Consider increasing partitions during low-traffic periods</li>
13
+ </ul>
14
+ </div>
15
+ </div>
@@ -0,0 +1,14 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <% alert_box_warning('Partition Update Warning') do %>
5
+ <div class="space-y-4">
6
+ <ul class="list-disc ml-6">
7
+ <li>Increasing partitions is a one-way operation - partition count cannot be decreased later</li>
8
+ <li>Adding partitions affects message ordering and consistent hashing</li>
9
+ <li>Consumers will need to detect the partition count change and rebalance</li>
10
+ <li>Message distribution across partitions may become uneven until data rotates</li>
11
+ <li>Changes may take several minutes to be visible in the UI but will be applied immediately</li>
12
+ </ul>
13
+ </div>
14
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <%== alert_info('Those partitions are empty and do not contain any data.') %>
@@ -1,3 +1,6 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
1
4
  <div class="mb-10">
2
5
  <%==
3
6
  alert_info(
@@ -0,0 +1,13 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <tr>
5
+ <td>
6
+ <a href="<%= explorer_topics_path(@topic.topic_name, partition.partition_id) %>">
7
+ <%= partition.partition_id %>
8
+ </a>
9
+ </td>
10
+ <td><%= partition.count %></td>
11
+ <td><%= partition.share %>%</td>
12
+ <td><%= partition.diff.round(2) %>%</td>
13
+ </tr>
@@ -0,0 +1,16 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <% view_title "Topic #{@topic.topic_name} - Increase Partitions" %>
5
+
6
+ <div class="space-y-4">
7
+ <%== partial 'topics/distributions/edit_warnings' %>
8
+
9
+ <% if @form_error %>
10
+ <%== partial 'shared/rdkafka_form_error_alert_box' %>
11
+ <% else %>
12
+ <%== partial 'topics/distributions/edit_hints' %>
13
+ <% end %>
14
+
15
+ <%== partial 'topics/distributions/edit_form' %>
16
+ </div>
@@ -1,21 +1,25 @@
1
- <% view_title @topic.topic_name %>
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
2
3
 
3
- <%== partial 'topics/tabs' %>
4
+ <% view_title "#{@topic.topic_name} Data Distribution" %>
5
+
6
+ <%== partial 'topics/topics/tabs' %>
7
+ <%== partial 'topics/distributions/add_partitions_button' %>
4
8
 
5
9
  <% if @limited %>
6
- <%== partial 'topics/distribution/limited' %>
10
+ <%== partial 'topics/distributions/limited' %>
7
11
  <% end %>
8
12
 
9
13
  <% if @aggregated.sum.zero? %>
10
- <%== partial 'topics/distribution/empty_partitions' %>
14
+ <%== partial 'topics/distributions/empty_partitions' %>
11
15
  <% else %>
12
16
  <div class="col-span-12 mb-3">
13
17
  <% if @active_partitions.size >= 2 %>
14
- <%== partial 'topics/distribution/chart' %>
18
+ <%== partial 'topics/distributions/chart' %>
15
19
  <% end %>
16
20
 
17
21
  <div id="refreshable" class="mt-4">
18
- <%== partial 'topics/distribution/badges' %>
22
+ <%== partial 'topics/distributions/badges' %>
19
23
 
20
24
  <div class="data-table-wrapper">
21
25
  <table class="data-table">
@@ -31,7 +35,7 @@
31
35
  <%==
32
36
  each_partial(
33
37
  @distribution,
34
- 'topics/distribution/partition'
38
+ 'topics/distributions/partition'
35
39
  )
36
40
  %>
37
41
  </tbody>
@@ -0,0 +1,20 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <li>
5
+ <a href="<%= topics_path %>">
6
+ Topics
7
+ </a>
8
+ </li>
9
+
10
+ <li>
11
+ <a href="<%= topics_path(@topic.topic_name, 'config') %>">
12
+ <%= @topic.topic_name %>
13
+ </a>
14
+ </li>
15
+
16
+ <li>
17
+ <a href="<%= topics_path(@topic.topic_name, 'offsets') %>">
18
+ Offsets
19
+ </a>
20
+ </li>
@@ -0,0 +1,13 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <tr>
5
+ <td>
6
+ <a href="<%= explorer_topics_path(@topic[:topic_name], partition[:partition_id]) %>">
7
+ <%= partition[:partition_id] %>
8
+ </a>
9
+ </td>
10
+ <td><%= partition[:low] %></td>
11
+ <td><%= partition[:high] %></td>
12
+ <td><%= partition[:diff] %></td>
13
+ </tr>
@@ -1,6 +1,9 @@
1
- <% view_title @topic.topic_name %>
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
2
3
 
3
- <%== partial 'topics/tabs' %>
4
+ <% view_title "#{@topic.topic_name} Offsets" %>
5
+
6
+ <%== partial 'topics/topics/tabs' %>
4
7
 
5
8
  <div class="data-table-wrapper">
6
9
  <table class="data-table">
@@ -16,7 +19,7 @@
16
19
  <%==
17
20
  each_partial(
18
21
  @offsets,
19
- 'topics/partition_offsets'
22
+ 'topics/offsets/partition'
20
23
  )
21
24
  %>
22
25
  </tbody>
@@ -0,0 +1,20 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <li>
5
+ <a href="<%= topics_path %>">
6
+ Topics
7
+ </a>
8
+ </li>
9
+
10
+ <li>
11
+ <a href="<%= topics_path(@topic.topic_name, 'config') %>">
12
+ <%= @topic.topic_name %>
13
+ </a>
14
+ </li>
15
+
16
+ <li>
17
+ <a href="<%= topics_path(@topic.topic_name, 'replication') %>">
18
+ Replication
19
+ </a>
20
+ </li>
@@ -1,6 +1,9 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
1
4
  <tr>
2
5
  <td>
3
- <a href="<%= explorer_path(@topic[:topic_name], partition[:partition_id]) %>">
6
+ <a href="<%= explorer_topics_path(@topic[:topic_name], partition[:partition_id]) %>">
4
7
  <%= partition[:partition_id] %>
5
8
  </a>
6
9
  </td>
@@ -1,6 +1,9 @@
1
- <% view_title @topic.topic_name %>
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
2
3
 
3
- <%== partial 'topics/tabs' %>
4
+ <% view_title "#{@topic.topic_name} Replication" %>
5
+
6
+ <%== partial 'topics/topics/tabs' %>
4
7
 
5
8
  <div class="data-table-wrapper">
6
9
  <table class="data-table">
@@ -16,7 +19,7 @@
16
19
  <%==
17
20
  each_partial(
18
21
  @partitions,
19
- 'topics/partition'
22
+ 'topics/replications/partition'
20
23
  )
21
24
  %>
22
25
  </tbody>
@@ -0,0 +1,32 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <li>
5
+ <a href="<%= topics_path %>">
6
+ Topics
7
+ </a>
8
+ </li>
9
+
10
+ <% if action?(:new, :create) %>
11
+ <li>
12
+ <a href="<%= topics_path('new') %>">
13
+ Creating New Topic
14
+ </a>
15
+ </li>
16
+ <% end %>
17
+
18
+ <% if @topic %>
19
+ <li>
20
+ <a href="<%= topics_path(@topic.topic_name, 'config') %>">
21
+ <%= @topic.topic_name %>
22
+ </a>
23
+ </li>
24
+ <% end %>
25
+
26
+ <% if action?(:edit) %>
27
+ <li>
28
+ <a href="<%= topics_path(@topic.topic_name, 'delete') %>">
29
+ Removal Confirmation
30
+ </a>
31
+ </li>
32
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <div class="col-span-12 flex justify-end space-x-2 mb-6">
5
+ <a
6
+ class="btn btn-primary btn-sm <%= 'btn-disabled' unless features.topics_management? %>"
7
+ href="<%= topics_path('new') %>"
8
+ title="Create new topic"
9
+ >
10
+ <%== icon(:plus) %>
11
+ Create Topic
12
+ </a>
13
+ </div>
@@ -0,0 +1,15 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <% alert_box_info('Topic Creation Settings') do %>
5
+ <p>
6
+ You are about to create a new Kafka topic. Please note:
7
+ </p>
8
+ <ul class="list-disc ml-6 mt-2">
9
+ <li>Topic name cannot be changed after creation</li>
10
+ <li>Number of partitions can only be increased, never decreased</li>
11
+ <li>Additional settings can be configured from the topic configuration page</li>
12
+ <li>It may take Kafka up to few minutes to fully synchronize the new topic</li>
13
+ <li>Consumers may require additional time to discover the topic, depending on their metadata refresh frequency</li>
14
+ </ul>
15
+ <% end %>
@@ -0,0 +1,36 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <div class="card bg-base-100">
5
+ <div class="card-body">
6
+ <div class="alert alert-error">
7
+ <div class="flex items-center gap-4">
8
+ <%== icon(:trash) %>
9
+ <span>
10
+ You are about to delete topic:
11
+ <span class="font-bold ml-1"><%= @topic.topic_name %></span>
12
+ with
13
+ <span class="font-bold ml-1"><%= @topic.partition_count %></span>
14
+ partitions
15
+ </span>
16
+ </div>
17
+ </div>
18
+
19
+ <% path = topics_path(@topic.topic_name) %>
20
+ <form action="<%= path %>" method="post" class="mt-6" data-turbo="false">
21
+ <%== csrf_tag(path, 'DELETE') %>
22
+ <input type="hidden" name="_method" value="delete">
23
+
24
+ <div class="flex justify-end gap-4">
25
+ <a href="<%= topics_path(@topic.topic_name, 'config') %>" class="btn btn-ghost">
26
+ Cancel
27
+ </a>
28
+
29
+ <button type="submit" class="btn btn-error gap-2 btn-lockable confirm-action">
30
+ <%== icon(:trash) %>
31
+ Delete Topic
32
+ </button>
33
+ </div>
34
+ </form>
35
+ </div>
36
+ </div>
@@ -0,0 +1,15 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <div class="alert">
5
+ <div class="space-y-2">
6
+ <p>Before proceeding, ensure that:</p>
7
+
8
+ <ul class="list-disc ml-6">
9
+ <li>All applications consuming from this topic have been properly shut down</li>
10
+ <li>All producers to this topic have been stopped</li>
11
+ <li>You have backed up any critical data if needed</li>
12
+ <li>You have notified relevant team members about this deletion</li>
13
+ </ul>
14
+ </div>
15
+ </div>
@@ -0,0 +1,13 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <% alert_box_warning('Topic Removal Warning') do %>
5
+ <div class="space-y-4">
6
+ <ul class="list-disc ml-6">
7
+ <li>All data in this topic will be permanently deleted and cannot be recovered</li>
8
+ <li>All consumers and producers for this topic will stop functioning</li>
9
+ <li>Applications dependent on this topic may experience errors or disruptions</li>
10
+ <li>Consumer group offsets associated with this topic will be lost</li>
11
+ </ul>
12
+ </div>
13
+ <% end %>
@@ -0,0 +1,80 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <div class="card bg-base-100 mt-4">
5
+ <div class="card-body border-error">
6
+ <form class="space-y-4 w-full" method="post" action="<%= topics_path %>" data-turbo="false">
7
+ <%== csrf_tag(topics_path) %>
8
+
9
+ <div class="flex items-center w-full mb-8">
10
+ <label class="w-1/4 text-gray-700">Topic Name:</label>
11
+ <div class="w-3/4">
12
+ <input
13
+ type="text"
14
+ name="topic_name"
15
+ class="block input input-bordered w-full"
16
+ placeholder="Enter topic name"
17
+ pattern="[A-Za-z0-9\-_.]+"
18
+ minlength="1"
19
+ maxlength="249"
20
+ value="<%= params.fetch(:topic_name, '') %>"
21
+ required
22
+ />
23
+ <div class="text-sm text-gray-500 mt-1">
24
+ Only alphanumeric characters, dots, underscores, and hyphens are allowed
25
+ </div>
26
+ </div>
27
+ </div>
28
+
29
+ <div class="flex items-center w-full mb-8">
30
+ <label class="w-1/4 text-gray-700">Number of Partitions:</label>
31
+ <div class="w-3/4">
32
+ <input
33
+ type="number"
34
+ min="1"
35
+ max="10000"
36
+ name="partitions_count"
37
+ class="block input input-bordered w-full"
38
+ placeholder="Enter number of partitions"
39
+ value="<%= params.fetch(:partitions_count, 5) %>"
40
+ required
41
+ />
42
+ <div class="text-sm text-gray-500 mt-1">
43
+ Minimum 1 partition, cannot be decreased after creation
44
+ </div>
45
+ </div>
46
+ </div>
47
+
48
+ <div class="flex items-center w-full">
49
+ <label class="w-1/4 text-gray-700">Replication Factor:</label>
50
+ <div class="w-3/4">
51
+ <input
52
+ type="number"
53
+ min="1"
54
+ max="100"
55
+ name="replication_factor"
56
+ class="block input input-bordered w-full"
57
+ placeholder="Enter replication factor"
58
+ value="<%= params.fetch(:replication_factor, 1) %>"
59
+ required
60
+ />
61
+ <div class="text-sm text-gray-500 mt-1">
62
+ Number of replicas for each partition (minimum 1, recommended 3 for production)
63
+ </div>
64
+ </div>
65
+ </div>
66
+
67
+ <div class="fieldset text-center mt-6">
68
+ <div class="flex gap-4 justify-end">
69
+ <a href="<%= topics_path %>" class="btn btn-ghost">
70
+ Cancel
71
+ </a>
72
+ <button type="submit" class="btn btn-primary gap-2 btn-lockable">
73
+ <%== icon(:plus) %>
74
+ Create Topic
75
+ </button>
76
+ </div>
77
+ </div>
78
+ </form>
79
+ </div>
80
+ </div>
@@ -1,28 +1,31 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
1
4
  <div class="tab-container-wrapper">
2
5
  <div class="tab-container">
3
6
  <a
4
- href="<%= root_path('topics', @topic.topic_name, 'config') %>"
7
+ href="<%= topics_path(@topic.topic_name, 'config') %>"
5
8
  class="custom-tab <%= nav_class(end_with: 'config') %>"
6
9
  >
7
10
  Configuration
8
11
  </a>
9
12
 
10
13
  <a
11
- href="<%= root_path('topics', @topic.topic_name, 'replication') %>"
14
+ href="<%= topics_path(@topic.topic_name, 'replication') %>"
12
15
  class="custom-tab <%= nav_class(end_with: 'replication') %>"
13
16
  >
14
17
  Replication
15
18
  </a>
16
19
 
17
20
  <a
18
- href="<%= root_path('topics', @topic.topic_name, 'distribution') %>"
21
+ href="<%= topics_path(@topic.topic_name, 'distribution') %>"
19
22
  class="custom-tab <%= nav_class(end_with: 'distribution') %>"
20
23
  >
21
24
  Distribution
22
25
  </a>
23
26
 
24
27
  <a
25
- href="<%= root_path('topics', @topic.topic_name, 'offsets') %>"
28
+ href="<%= topics_path(@topic.topic_name, 'offsets') %>"
26
29
  class="custom-tab <%= nav_class(end_with: 'offsets') %>"
27
30
  >
28
31
  Offsets
@@ -0,0 +1,12 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <div class="topic-tile">
5
+ <div class="topic-tile-body">
6
+ <p class="topic-tile-text">
7
+ <a href="<%= topics_path(topic.topic_name, 'config') %>" class="topic-tile-link">
8
+ <%= topic.topic_name %> / <%= topic.partition_count %>
9
+ </a>
10
+ </p>
11
+ </div>
12
+ </div>
@@ -0,0 +1,10 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <% view_title "Topic #{@topic.topic_name} Removal Confirmation" %>
5
+
6
+ <div class="space-y-4">
7
+ <%== partial 'topics/topics/delete_warning' %>
8
+ <%== partial 'topics/topics/delete_hints' %>
9
+ <%== partial 'topics/topics/delete_form' %>
10
+ </div>
@@ -0,0 +1,19 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <% view_title 'Topics' %>
5
+
6
+ <%== partial 'topics/topics/create_button' %>
7
+
8
+ <% if @topics.empty? %>
9
+ <%== partial 'explorer/explorer/no_topics' %>
10
+ <% else %>
11
+ <div class="topic-tiles">
12
+ <%==
13
+ each_partial(
14
+ @topics,
15
+ 'topics/topics/topic'
16
+ )
17
+ %>
18
+ </div>
19
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <% view_title "Creating New Topic" %>
5
+
6
+ <% if @form_error %>
7
+ <%== partial 'shared/rdkafka_form_error_alert_box' %>
8
+ <% else %>
9
+ <%== partial 'topics/topics/create_hints' %>
10
+ <% end %>
11
+
12
+ <%== partial 'topics/topics/new_form' %>
@@ -29,14 +29,14 @@ module Karafka
29
29
 
30
30
  raise ::Karafka::Web::Errors::Processing::IncompatibleSchemaError
31
31
  # Older reports mean someone is in the middle of upgrade. Schema change related
32
- # upgrades always should happen without a rolling-upgrade, hence we can reject those
33
- # requests without significant or any impact on data quality but without having to
34
- # worry about backwards compatibility. Errors are tracked independently, so it should
35
- # not be a problem.
36
- #
37
- # In case user wants to do a rolling upgrade, the user docs state that this can happen
38
- # and it is something user should be aware
32
+ # upgrades always should happen without a rolling-upgrade. For such, since we cannot
33
+ # reason about their statistics structure, we only track state, so we can provide
34
+ # basic upgrade reporting details in the status page. All other data is rejected and
35
+ # since in most cases this is intermediate due to rolling upgrades, this should not
36
+ # significantly impact the state tracking and processing.
39
37
  when :older
38
+ @state_aggregator.add_state(message.payload, message.offset)
39
+
40
40
  next
41
41
  else
42
42
  raise ::Karafka::Errors::UnsupportedCaseError