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,109 @@
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">
6
+ <%
7
+ update_path = consumer_path(
8
+ @process.id,
9
+ 'partitions',
10
+ @subscription_group.id,
11
+ @topic,
12
+ @partition_id,
13
+ 'offset'
14
+ )
15
+ %>
16
+
17
+ <form
18
+ class="space-y-4 mt-4 w-full"
19
+ method="post"
20
+ action="<%= update_path %>"
21
+ >
22
+ <%== csrf_tag(update_path, 'PUT') %>
23
+ <input type="hidden" name="_method" value="PUT">
24
+ <input type="hidden" name="referrer" value="<%= request.referrer %>">
25
+
26
+ <div class="flex items-center w-full mb-8">
27
+ <label class="w-1/4 text-gray-700">New Offset:</label>
28
+ <div class="w-3/4">
29
+ <input
30
+ type="number"
31
+ min="<%== @partition_stats.lo_offset %>"
32
+ max="<%= @partition_stats.hi_offset %>"
33
+ name="offset"
34
+ class="block input input-bordered w-full"
35
+ placeholder="Enter new offset position"
36
+ required
37
+ />
38
+ </div>
39
+ </div>
40
+
41
+ <div class="flex items-center w-full">
42
+ <label class="w-1/4 text-gray-700">Prevent Overtaking:</label>
43
+ <div class="w-3/4">
44
+ <label class="flex items-center gap-4 cursor-pointer">
45
+ <input type="hidden" name="prevent_overtaking" value="off">
46
+
47
+ <input
48
+ name="prevent_overtaking"
49
+ type="checkbox"
50
+ class="checkbox checkbox-warning"
51
+ checked
52
+ />
53
+
54
+ <div class="space-y-1">
55
+ <div class="flex items-center gap-2">
56
+ Only adjust if consumer hasn't moved beyond requested offset already
57
+ </div>
58
+ <div class="text-sm text-gray-500">
59
+ Prevents seeking back in case the consumer moved forward
60
+ </div>
61
+ </div>
62
+ </label>
63
+ </div>
64
+ </div>
65
+
66
+ <div class="flex items-center w-full mt-4 <%= 'text-muted' if @topic_lrj %>">
67
+ <label class="w-1/4 text-gray-700">Resume Immediately:</label>
68
+ <div class="w-3/4">
69
+ <label class="flex items-center gap-4 cursor-pointer">
70
+ <input type="hidden" name="force_resume" value="off">
71
+ <input
72
+ name="force_resume"
73
+ type="checkbox"
74
+ class="checkbox checkbox-warning"
75
+ <%= 'disabled' if @topic_lrj %>
76
+ />
77
+ <div class="space-y-1">
78
+ <div class="flex items-center gap-2">
79
+ If partition is currently paused, resume processing immediately
80
+ </div>
81
+ <div class="text-sm text-gray-500">
82
+ <% if @topic_lrj %>
83
+ Option not available for Long-Running Jobs topics
84
+ <% elsif @routing_topic %>
85
+ Has no effect if partition is not paused
86
+ <% else %>
87
+ Option not available, since topic not visible in the Web UI routing
88
+ <% end %>
89
+ </div>
90
+ </div>
91
+ </label>
92
+ </div>
93
+ </div>
94
+
95
+ <div class="fieldset text-center mt-6 ">
96
+ <div class="flex gap-4 justify-end">
97
+ <a href="<%= root_path('health', 'overview') %>" class="btn btn-ghost">
98
+ Cancel
99
+ </a>
100
+
101
+ <button type="submit" class="btn btn-warning gap-2 btn-lockable">
102
+ <%== icon(:pencil_square) %>
103
+ Adjust Offset
104
+ </button>
105
+ </div>
106
+ </div>
107
+ </form>
108
+ </div>
109
+ </div>
@@ -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
+ <% alert_box_error 'This Operation Cannot Be Performed' do %>
5
+ <p>
6
+ Consumer offsets can only be modified using Web UI when the consumer is in a running state.
7
+ </p>
8
+ <% end %>
9
+
10
+ <div class="fieldset text-center mt-6">
11
+ <div class="flex justify-end">
12
+ <a href="<%= root_path('health', 'overview') %>" class="btn btn-ghost">
13
+ Cancel
14
+ </a>
15
+ </div>
16
+ </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_warning('Running Consumer Process Operation') do %>
5
+ <p>
6
+ You are about to modify offset for an actively running consumer. This operation:
7
+ </p>
8
+
9
+ <ul class="list-disc ml-6 mt-2">
10
+ <li>Takes effect during the next poll operation</li>
11
+ <li>May affect message processing</li>
12
+ <li>Cannot be undone</li>
13
+ <li>Will take effect only if the current process still owns the assignment</li>
14
+ </ul>
15
+ <% 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 "#{@process.id} - Offset Adjustment - #{@subscription_group_id} - #{@topic}##{@partition_id}" %>
5
+
6
+ <% if @process.status != 'running' %>
7
+ <%== partial 'consumers/partitions/offsets/not_running_error' %>
8
+ <% else %>
9
+ <%== partial 'consumers/partitions/offsets/running_warning' %>
10
+ <%== partial 'consumers/partitions/offsets/basics' %>
11
+ <%== partial 'consumers/partitions/offsets/form' %>
12
+ <% end %>
@@ -0,0 +1,22 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <% alert_box_error 'Cannot Configure Pause Settings' do %>
5
+ <p class="mb-2">
6
+ This partition is currently active and processing messages.
7
+ </p>
8
+ <p class="mb-2">
9
+ Pause settings can only be configured for partitions that are already in a paused state.
10
+ </p>
11
+ <p>
12
+ You can pause this partition first using the pause action from the partitions list.
13
+ </p>
14
+ <% end %>
15
+
16
+ <div class="fieldset text-center mt-6">
17
+ <div class="flex justify-end">
18
+ <a href="<%= root_path('health', 'overview') %>" class="btn btn-ghost">
19
+ Cancel
20
+ </a>
21
+ </div>
22
+ </div>
@@ -0,0 +1,27 @@
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('Running Consumer Process Operation') do %>
5
+ <p>
6
+ You are about to adjust pause for an actively running consumer. This operation:
7
+ </p>
8
+
9
+ <ul class="list-disc ml-6 mt-2 mb-2">
10
+ <li>Takes effect during the next poll operation</li>
11
+ <li>May affect message processing</li>
12
+ <li>Cannot be undone</li>
13
+ <li>Will take effect only if the current process still owns the assignment</li>
14
+ </ul>
15
+
16
+ <hr/>
17
+
18
+ <p class="mt-2">
19
+ During long pauses, lag reporting on this topic partition may stop as librdkafka freezes the last known high watermark.
20
+ </p>
21
+
22
+ <p class="mt-2">
23
+ Real-time, state-independent lag metrics can always be checked in the
24
+ <a href="<%= root_path('health', 'cluster_lags') %>">Cluster Lags</a> tab
25
+ of the <a href="<%= root_path('health') %>">Health</a> section.
26
+ </p>
27
+ <% end %>
@@ -0,0 +1,60 @@
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="<%= consumers_path('overview') %>">
6
+ Consumers
7
+ </a>
8
+ </li>
9
+
10
+ <li>
11
+ <a href="<%= consumer_path(@process.id, 'subscriptions') %>">
12
+ <%== truncate(@process.id, strategy: :middle) %>
13
+ </a>
14
+ </li>
15
+
16
+ <% if @subscription_group_id %>
17
+ <li>
18
+ <a href="<%= consumer_path(@process.id, "subscriptions##{@subscription_group_id}") %>">
19
+ <%= @subscription_group_id %>
20
+ </a>
21
+ </li>
22
+
23
+ <%
24
+ action = current_path.include?('/new') ? 'new' : 'edit'
25
+
26
+ target_path = consumer_path(
27
+ @process.id,
28
+ 'partitions',
29
+ @subscription_group_id,
30
+ @topic,
31
+ @partition_id,
32
+ 'pause',
33
+ action
34
+ )
35
+ %>
36
+
37
+ <li>
38
+ <a href="<%= target_path %>">
39
+ <%= @topic %>
40
+ </a>
41
+ </li>
42
+
43
+ <li>
44
+ <a href="<%= target_path %>">
45
+ <%= @partition_id %>
46
+ </a>
47
+ </li>
48
+
49
+ <li>
50
+ <a href="<%= target_path %>">
51
+ Pauses
52
+ </a>
53
+ </li>
54
+
55
+ <li>
56
+ <a href="<%= target_path %>">
57
+ <%= action.capitalize %>
58
+ </a>
59
+ </li>
60
+ <% end %>
@@ -0,0 +1,59 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <%
5
+ resume_path = consumer_path(
6
+ @process.id,
7
+ 'partitions',
8
+ @subscription_group.id,
9
+ @topic,
10
+ @partition_id,
11
+ 'pause'
12
+ )
13
+ %>
14
+
15
+ <div class="card bg-base-100 mt-4">
16
+ <div class="card-body">
17
+ <form
18
+ class="space-y-4 w-full"
19
+ method="post"
20
+ action="<%= resume_path %>"
21
+ >
22
+ <%== csrf_tag(resume_path, 'DELETE') %>
23
+ <input type="hidden" name="_method" value="delete">
24
+
25
+ <div class="flex items-center w-full">
26
+ <label class="w-1/4 text-gray-700">Reset Counter:</label>
27
+
28
+ <div class="w-3/4">
29
+ <label class="flex items-center gap-4 cursor-pointer">
30
+ <input type="hidden" name="reset_attempts" value="off">
31
+ <input type="checkbox" name="reset_attempts" class="checkbox checkbox-warning" />
32
+ <div class="space-y-1">
33
+ <div class="flex items-center gap-2">
34
+ Reset the processing attempts counter when resuming
35
+ </div>
36
+
37
+ <div class="text-sm text-gray-500">
38
+ Resets retries counter for features like DLQ dispatching. Does not affect message offset position.
39
+ </div>
40
+ </div>
41
+ </label>
42
+ </div>
43
+ </div>
44
+
45
+ <div class="fieldset text-center mt-6">
46
+ <div class="flex gap-4 justify-end">
47
+ <a href="<%= root_path('health', 'overview') %>" class="btn btn-ghost">
48
+ Cancel
49
+ </a>
50
+
51
+ <button type="submit" class="btn btn-warning gap-2 btn-lockable">
52
+ <%== icon(:play) %>
53
+ Resume Processing
54
+ </button>
55
+ </div>
56
+ </div>
57
+ </form>
58
+ </div>
59
+ </div>
@@ -0,0 +1,24 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <% alert_box_error 'Cannot Manage Long-Running Job Partitions Pausing' do %>
5
+ <p class="mb-2">
6
+ Manual pause/resume operations are not supported for topics using Long-Running Jobs.
7
+ </p>
8
+
9
+ <p class="mb-2">
10
+ These topics partitions are automatically paused and resumed based on the message processing flow to ensure reliable and consistent behavior.
11
+ </p>
12
+
13
+ <p>
14
+ Long-Running Jobs handle partition pausing internally to maintain processing stability and prevent message duplication or loss.
15
+ </p>
16
+ <% end %>
17
+
18
+ <div class="fieldset text-center mt-6">
19
+ <div class="flex justify-end">
20
+ <a href="<%= root_path('health', 'overview') %>" class="btn btn-ghost">
21
+ Cancel
22
+ </a>
23
+ </div>
24
+ </div>
@@ -0,0 +1,78 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <%
5
+ pause_path = consumer_path(
6
+ @process.id,
7
+ 'partitions',
8
+ @subscription_group.id,
9
+ @topic,
10
+ @partition_id,
11
+ 'pause'
12
+ )
13
+ %>
14
+
15
+ <div class="card bg-base-100 mt-4">
16
+ <div class="card-body">
17
+ <form class="space-y-4 w-full" method="post" action="<%= pause_path %>">
18
+ <%== csrf_tag(pause_path) %>
19
+
20
+ <div class="flex items-center w-full mb-8">
21
+ <label class="w-1/4 text-gray-700">Pause Duration:</label>
22
+ <div class="w-3/4">
23
+ <input
24
+ type="number"
25
+ min="0"
26
+ max="31536000"
27
+ name="duration"
28
+ class="block input input-bordered w-full"
29
+ placeholder="Enter pause duration in seconds (0 for indefinite)"
30
+ required
31
+ />
32
+
33
+ <div class="text-sm text-gray-500 mt-1">
34
+ Set to 0 for indefinite pause or specify time in seconds
35
+ </div>
36
+ </div>
37
+ </div>
38
+
39
+ <div class="flex items-center w-full">
40
+ <label class="w-1/4 text-gray-700">Safety Check:</label>
41
+ <div class="w-3/4">
42
+ <label class="flex items-center gap-4 cursor-pointer">
43
+ <input type="hidden" name="prevent_override" value="off">
44
+
45
+ <input
46
+ type="checkbox"
47
+ name="prevent_override"
48
+ class="checkbox checkbox-warning"
49
+ checked
50
+ />
51
+
52
+ <div class="space-y-1">
53
+ <div class="flex items-center gap-2">
54
+ Only pause if partition is not already paused
55
+ </div>
56
+ <div class="text-sm text-gray-500">
57
+ Prevents accidental override of existing pause
58
+ </div>
59
+ </div>
60
+ </label>
61
+ </div>
62
+ </div>
63
+
64
+ <div class="fieldset text-center mt-6">
65
+ <div class="flex gap-4 justify-end">
66
+ <a href="<%= root_path('health', 'overview') %>" class="btn btn-ghost">
67
+ Cancel
68
+ </a>
69
+
70
+ <button type="submit" class="btn btn-warning gap-2 btn-lockable">
71
+ <%== icon(:pause) %>
72
+ Set or Update Pause
73
+ </button>
74
+ </div>
75
+ </div>
76
+ </form>
77
+ </div>
78
+ </div>
@@ -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
+ <% alert_box_error 'This Operation Cannot Be Performed' do %>
5
+ <p>
6
+ Consumer pauses can only be managed using Web UI when the consumer is in a running state.
7
+ </p>
8
+ <% end %>
9
+
10
+ <div class="fieldset text-center mt-6">
11
+ <div class="flex justify-end">
12
+ <a href="<%= root_path('health', 'overview') %>" class="btn btn-ghost">
13
+ Cancel
14
+ </a>
15
+ </div>
16
+ </div>
@@ -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
+ <% view_title "#{@process.id} - Pause Adjustment - #{@subscription_group_id} - #{@topic}##{@partition_id}" %>
5
+
6
+ <% if @topic_lrj %>
7
+ <%== partial 'consumers/partitions/pauses/lrj_not_manageable' %>
8
+ <% else %>
9
+ <% if @process.status == 'running' %>
10
+ <% if @partition_stats.poll_state == 'active' %>
11
+ <%== partial 'consumers/partitions/pauses/active_not_editable' %>
12
+ <% else %>
13
+ <%== partial 'consumers/partitions/pauses/adjusting_warning' %>
14
+ <%== partial 'consumers/partitions/offsets/basics' %>
15
+ <%== partial 'consumers/partitions/pauses/edit_form' %>
16
+ <% end %>
17
+ <% else %>
18
+ <%== partial 'consumers/partitions/pauses/not_running' %>
19
+ <% end %>
20
+ <% end %>
@@ -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 "#{@process.id} - Pause Adjustment - #{@subscription_group_id} - #{@topic}##{@partition_id}" %>
5
+
6
+ <% if @topic_lrj %>
7
+ <%== partial 'consumers/partitions/pauses/lrj_not_manageable' %>
8
+ <% else %>
9
+ <% if @process.status == 'running' %>
10
+ <%== partial 'consumers/partitions/pauses/adjusting_warning' %>
11
+ <%== partial 'consumers/partitions/offsets/basics' %>
12
+ <%== partial 'consumers/partitions/pauses/new_form' %>
13
+ <% else %>
14
+ <%== partial 'consumers/partitions/pauses/not_running' %>
15
+ <% end %>
16
+ <% end %>
@@ -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
  <% view_title 'Dashboard' %>
2
5
 
3
6
  <%== partial 'dashboard/counters' %>
@@ -41,7 +44,7 @@
41
44
  </div>
42
45
  </div>
43
46
 
44
- <h2 class="h2">Utilization Metrics</h2>
47
+ <h2 class="h2 mt-4">Utilization Metrics</h2>
45
48
 
46
49
  <div class="tab-container-wrapper" id="graphs2">
47
50
  <div class="tab-container inline-tabs">
@@ -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
  <li>
2
5
  <a href="<%= root_path('dlq') %>">
3
6
  Dead Letter Queue topics
@@ -1 +1,4 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
1
4
  <%== alert_info('No Dead Letter Queue topics exist in Kafka.') %>
@@ -1,7 +1,10 @@
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="topic-tile">
2
5
  <div class="topic-tile-body">
3
6
  <p class="topic-tile-text">
4
- <a href="<%= explorer_path(topic[:topic_name]) %>" class="topic-tile-link">
7
+ <a href="<%= explorer_topics_path(topic[:topic_name]) %>" class="topic-tile-link">
5
8
  <%= topic[:topic_name] %> / <%= topic[:partition_count] %>
6
9
  </a>
7
10
  </p>
@@ -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
  <% view_title 'Dead Letter Queue Topics' %>
2
5
 
3
6
  <% if @dlq_topics.empty? %>
@@ -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
  <li>
2
5
  <a href="<%= root_path('errors') %>">
3
6
  Errors
@@ -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
  <% if error_msg.is_a?(Array) %>
2
5
  <%== partial 'shared/not_a_message' %>
3
6
  <% else %>
@@ -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
  <% if @partition_id == partition %>
2
5
  <option value="<%= root_path('errors', partition) %>" selected=selected>
3
6
  <% else %>
@@ -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
  <p class="w-full">
2
5
  <label class="text-gray-700">Partition:</label>
3
6
  <select class="select select-bordered w-full max-w-xs select-sm ml-1" id="current-partition">
@@ -1,9 +1,12 @@
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="row-table-wrapper">
2
5
  <table class="row-table">
3
6
  <thead>
4
7
  <tr>
5
8
  <th>Origin</th>
6
- <th>ID</th>
9
+ <th>Process ID</th>
7
10
  <th>Error</th>
8
11
  <th>Occurred</th>
9
12
  <th></th>
@@ -1,10 +1,13 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
1
4
  <% view_title 'Errors' %>
2
5
 
3
6
  <div class="col-span-4">
4
7
  <section class="actions">
5
8
  <% if @error_messages && !@error_messages.empty? %>
6
9
  <a
7
- href="<%= explorer_path(@topic_id, 'recent') %>"
10
+ href="<%= explorer_topics_path(@topic_id, 'recent') %>"
8
11
  class="btn-action"
9
12
  title="Display the most recent message for this topic with auto-refresh"
10
13
  >
@@ -30,11 +33,11 @@
30
33
 
31
34
  <div class="col-span-12">
32
35
  <% if @limited %>
33
- <%== partial('explorer/topic/limited') %>
36
+ <%== partial('explorer/explorer/topic/limited') %>
34
37
  <% end %>
35
38
 
36
39
  <% if @error_messages.empty? && params.current_page == 1 %>
37
- <%== partial 'explorer/topic/empty' %>
40
+ <%== partial 'explorer/explorer/topic/empty' %>
38
41
  <% else %>
39
42
  <% content_for :table_metadata do %>
40
43
  <p class="table_metadata">
@@ -1,10 +1,13 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
1
4
  <% view_title "Partition #{@partition_id}" %>
2
5
 
3
6
  <div class="col-span-4">
4
7
  <section class="actions">
5
8
  <% if @error_messages && !@error_messages.empty? %>
6
9
  <a
7
- href="<%= explorer_path(@topic_id, @partition_id, 'recent') %>"
10
+ href="<%= explorer_topics_path(@topic_id, @partition_id, 'recent') %>"
8
11
  class="btn-action"
9
12
  title="Display the most recent message for this partition with auto-refresh"
10
13
  >
@@ -19,7 +22,7 @@
19
22
  <%== icon(:magnifying_glass) %>
20
23
  </a>
21
24
 
22
- <% closest_path = explorer_path(@topic_id, @partition_id) %>
25
+ <% closest_path = explorer_topics_path(@topic_id, @partition_id, 'closest') %>
23
26
  <input
24
27
  type="image"
25
28
  src="<%= asset_path('images/calendar.svg') %>"
@@ -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
  <%
2
5
  type = @error_message.payload[:type]
3
6
  error_class = @error_message.payload[:error_class]