karafka-web 0.10.3 → 0.11.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +64 -176
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +88 -44
  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 +3 -5
  13. data/lib/karafka/web/config.rb +86 -10
  14. data/lib/karafka/web/contracts/config.rb +45 -5
  15. data/lib/karafka/web/errors.rb +10 -0
  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 +32 -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 +101 -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/consumers/_consumer.erb +59 -0
  134. data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer_performance.erb +71 -0
  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/controls/_controls.erb +107 -0
  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 +50 -38
  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/consumers/metrics.rb +1 -1
  307. data/lib/karafka/web/processing/consumers/state.rb +1 -1
  308. data/lib/karafka/web/processing/publisher.rb +4 -4
  309. data/lib/karafka/web/tracking/consumers/contracts/partition.rb +1 -0
  310. data/lib/karafka/web/tracking/consumers/listeners/errors.rb +38 -9
  311. data/lib/karafka/web/tracking/consumers/listeners/pausing.rb +2 -2
  312. data/lib/karafka/web/tracking/consumers/listeners/transactions.rb +44 -0
  313. data/lib/karafka/web/tracking/consumers/reporter.rb +2 -2
  314. data/lib/karafka/web/tracking/consumers/sampler.rb +81 -14
  315. data/lib/karafka/web/tracking/helpers/sysconf.rb +33 -0
  316. data/lib/karafka/web/tracking/producers/reporter.rb +2 -9
  317. data/lib/karafka/web/ui/app.rb +19 -112
  318. data/lib/karafka/web/ui/base.rb +63 -4
  319. data/lib/karafka/web/ui/controllers/base_controller.rb +43 -1
  320. data/lib/karafka/web/ui/controllers/cluster_controller.rb +5 -2
  321. data/lib/karafka/web/ui/controllers/errors_controller.rb +1 -1
  322. data/lib/karafka/web/ui/controllers/requests/execution_wrapper.rb +52 -0
  323. data/lib/karafka/web/ui/controllers/requests/hookable.rb +99 -0
  324. data/lib/karafka/web/ui/controllers/requests/params.rb +39 -1
  325. data/lib/karafka/web/ui/controllers/responses/redirect.rb +0 -5
  326. data/lib/karafka/web/ui/controllers/status_controller.rb +3 -0
  327. data/lib/karafka/web/ui/helpers/application_helper.rb +10 -1
  328. data/lib/karafka/web/ui/helpers/paths_helper.rb +54 -10
  329. data/lib/karafka/web/ui/lib/admin.rb +1 -1
  330. data/lib/karafka/web/ui/lib/cache.rb +135 -0
  331. data/lib/karafka/web/ui/models/broker.rb +1 -2
  332. data/lib/karafka/web/ui/models/cluster_info.rb +15 -21
  333. data/lib/karafka/web/ui/models/consumers_metrics.rb +1 -1
  334. data/lib/karafka/web/ui/models/consumers_state.rb +1 -1
  335. data/lib/karafka/web/ui/models/counters.rb +1 -1
  336. data/lib/karafka/web/ui/models/health.rb +9 -7
  337. data/lib/karafka/web/ui/models/process.rb +14 -0
  338. data/lib/karafka/web/ui/models/processes.rb +2 -2
  339. data/lib/karafka/web/ui/models/recurring_tasks/schedule.rb +1 -1
  340. data/lib/karafka/web/ui/models/status.rb +27 -8
  341. data/lib/karafka/web/ui/models/topic.rb +1 -2
  342. data/lib/karafka/web/ui/public/javascripts/application.js +8 -98
  343. data/lib/karafka/web/ui/public/javascripts/application.min.js +15 -6
  344. data/lib/karafka/web/ui/public/javascripts/application.min.js.br +0 -0
  345. data/lib/karafka/web/ui/public/javascripts/application.min.js.gz +0 -0
  346. data/lib/karafka/web/ui/public/javascripts/components/action_confirmation_manager.js +30 -0
  347. data/lib/karafka/web/ui/public/javascripts/components/alerts.js +39 -0
  348. data/lib/karafka/web/ui/public/javascripts/components/btn_toggle_manager.js +17 -7
  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 +5123 -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 +512 -213
  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 +39 -30
  380. data/lib/karafka/web/ui/views/consumers/_incompatible.erb +13 -0
  381. data/lib/karafka/web/ui/views/consumers/_no_consumers.erb +2 -2
  382. data/lib/karafka/web/ui/views/consumers/_tabs.erb +4 -4
  383. data/lib/karafka/web/ui/views/consumers/index.erb +1 -1
  384. data/lib/karafka/web/ui/views/dashboard/_feature_pro.erb +1 -1
  385. data/lib/karafka/web/ui/views/dashboard/_not_enough_data.erb +2 -2
  386. data/lib/karafka/web/ui/views/dashboard/_ranges_selector.erb +1 -1
  387. data/lib/karafka/web/ui/views/dashboard/index.erb +6 -49
  388. data/lib/karafka/web/ui/views/errors/_detail.erb +3 -3
  389. data/lib/karafka/web/ui/views/errors/index.erb +1 -1
  390. data/lib/karafka/web/ui/views/jobs/_job.erb +38 -29
  391. data/lib/karafka/web/ui/views/jobs/pending.erb +1 -1
  392. data/lib/karafka/web/ui/views/jobs/running.erb +1 -1
  393. data/lib/karafka/web/ui/views/layout.erb +7 -5
  394. data/lib/karafka/web/ui/views/shared/_become_pro.erb +1 -1
  395. data/lib/karafka/web/ui/views/shared/_brand.erb +1 -1
  396. data/lib/karafka/web/ui/views/shared/_breadcrumbs.erb +1 -1
  397. data/lib/karafka/web/ui/views/shared/_content.erb +1 -1
  398. data/lib/karafka/web/ui/views/shared/_controls.erb +10 -3
  399. data/lib/karafka/web/ui/views/shared/_custom_nav.erb +9 -0
  400. data/lib/karafka/web/ui/views/shared/_flashes.erb +3 -5
  401. data/lib/karafka/web/ui/views/shared/_header.erb +25 -2
  402. data/lib/karafka/web/ui/views/shared/_navigation.erb +17 -15
  403. data/lib/karafka/web/ui/views/shared/alerts/_error.erb +8 -0
  404. data/lib/karafka/web/ui/views/shared/alerts/_info.erb +8 -0
  405. data/lib/karafka/web/ui/views/shared/alerts/_primary.erb +8 -0
  406. data/lib/karafka/web/ui/views/shared/alerts/_secondary.erb +8 -0
  407. data/lib/karafka/web/ui/views/shared/alerts/_success.erb +8 -0
  408. data/lib/karafka/web/ui/views/shared/alerts/_warning.erb +8 -0
  409. data/lib/karafka/web/ui/views/shared/exceptions/incompatible_schema.erb +34 -0
  410. data/lib/karafka/web/ui/views/shared/exceptions/not_allowed.erb +4 -0
  411. data/lib/karafka/web/ui/views/shared/exceptions/not_found.erb +5 -1
  412. data/lib/karafka/web/ui/views/shared/exceptions/pro_only.erb +4 -0
  413. data/lib/karafka/web/ui/views/shared/icons/_arrow_left.erb +3 -0
  414. data/lib/karafka/web/ui/views/shared/icons/_arrow_up_tray.erb +3 -0
  415. data/lib/karafka/web/ui/views/shared/icons/_clock.erb +3 -0
  416. data/lib/karafka/web/ui/views/shared/icons/_pencil.erb +3 -0
  417. data/lib/karafka/web/ui/views/shared/icons/_pencil_square.erb +3 -0
  418. data/lib/karafka/web/ui/views/shared/icons/_play_pause.erb +3 -0
  419. data/lib/karafka/web/ui/views/shared/icons/_plus.erb +3 -0
  420. data/lib/karafka/web/ui/views/shared/icons/_trash.erb +3 -0
  421. data/lib/karafka/web/ui/views/status/failures/_live_reporting.erb +1 -1
  422. data/lib/karafka/web/ui/views/status/failures/_partitions.erb +3 -3
  423. data/lib/karafka/web/ui/views/status/failures/_state_calculation.erb +2 -2
  424. data/lib/karafka/web/ui/views/status/info/_components.erb +6 -6
  425. data/lib/karafka/web/ui/views/status/show.erb +15 -0
  426. data/lib/karafka/web/ui/views/status/warnings/_consumers_schemas.erb +31 -0
  427. data/lib/karafka/web/ui/views/ux/_icons.erb +1 -1
  428. data/lib/karafka/web/ui/views/ux/_status_rows.erb +6 -0
  429. data/lib/karafka/web/version.rb +1 -1
  430. data/lib/karafka/web.rb +9 -1
  431. data/package-lock.json +799 -1226
  432. data/package.json +3 -4
  433. data/postcss.config.js +1 -2
  434. data/renovate.json +13 -1
  435. data/tailwind.config.js +0 -4
  436. data.tar.gz.sig +0 -0
  437. metadata +233 -109
  438. metadata.gz.sig +0 -0
  439. data/lib/karafka/web/pro/commanding/commands/quiet.rb +0 -34
  440. data/lib/karafka/web/pro/commanding/commands/stop.rb +0 -34
  441. data/lib/karafka/web/pro/commanding/commands/trace.rb +0 -41
  442. data/lib/karafka/web/pro/ui/controllers/commanding_controller.rb +0 -118
  443. data/lib/karafka/web/pro/ui/controllers/commands_controller.rb +0 -96
  444. data/lib/karafka/web/pro/ui/controllers/consumers_controller.rb +0 -138
  445. data/lib/karafka/web/pro/ui/controllers/explorer_controller.rb +0 -220
  446. data/lib/karafka/web/pro/ui/controllers/messages_controller.rb +0 -107
  447. data/lib/karafka/web/pro/ui/controllers/search_controller.rb +0 -73
  448. data/lib/karafka/web/pro/ui/controllers/topics_controller.rb +0 -130
  449. data/lib/karafka/web/pro/ui/views/commands/_breadcrumbs.erb +0 -21
  450. data/lib/karafka/web/pro/ui/views/commands/_command_details.erb +0 -1
  451. data/lib/karafka/web/pro/ui/views/commands/_empty.erb +0 -3
  452. data/lib/karafka/web/pro/ui/views/commands/show.erb +0 -33
  453. data/lib/karafka/web/pro/ui/views/consumers/_breadcrumbs.erb +0 -55
  454. data/lib/karafka/web/pro/ui/views/consumers/_consumer.erb +0 -47
  455. data/lib/karafka/web/pro/ui/views/consumers/_consumer_controls.erb +0 -95
  456. data/lib/karafka/web/pro/ui/views/consumers/_consumer_performance.erb +0 -59
  457. data/lib/karafka/web/pro/ui/views/consumers/_tabs.erb +0 -33
  458. data/lib/karafka/web/pro/ui/views/consumers/consumer/_commands.erb +0 -72
  459. data/lib/karafka/web/pro/ui/views/consumers/consumer/_consumer_group.erb +0 -8
  460. data/lib/karafka/web/pro/ui/views/consumers/consumer/_no_subscriptions.erb +0 -7
  461. data/lib/karafka/web/pro/ui/views/consumers/details.erb +0 -13
  462. data/lib/karafka/web/pro/ui/views/consumers/subscriptions.erb +0 -25
  463. data/lib/karafka/web/pro/ui/views/explorer/_no_topics.erb +0 -1
  464. data/lib/karafka/web/pro/ui/views/explorer/_topic.erb +0 -10
  465. data/lib/karafka/web/pro/ui/views/explorer/index.erb +0 -14
  466. data/lib/karafka/web/pro/ui/views/explorer/messages/_headers.erb +0 -33
  467. data/lib/karafka/web/pro/ui/views/explorer/partition/_cleaned.erb +0 -3
  468. data/lib/karafka/web/pro/ui/views/explorer/partition/_empty.erb +0 -3
  469. data/lib/karafka/web/pro/ui/views/explorer/topic/_empty.erb +0 -3
  470. data/lib/karafka/web/pro/ui/views/search/_breadcrumbs.erb +0 -1
  471. data/lib/karafka/web/pro/ui/views/search/_fix_errors.erb +0 -3
  472. data/lib/karafka/web/pro/ui/views/search/_no_results.erb +0 -3
  473. data/lib/karafka/web/pro/ui/views/search/_timeout.erb +0 -3
  474. data/lib/karafka/web/pro/ui/views/search/index.erb +0 -29
  475. data/lib/karafka/web/pro/ui/views/topics/_breadcrumbs.erb +0 -45
  476. data/lib/karafka/web/pro/ui/views/topics/_partition_offsets.erb +0 -10
  477. data/lib/karafka/web/pro/ui/views/topics/_topic.erb +0 -9
  478. data/lib/karafka/web/pro/ui/views/topics/distribution/_empty_partitions.erb +0 -1
  479. data/lib/karafka/web/pro/ui/views/topics/distribution/_partition.erb +0 -10
  480. data/lib/karafka/web/pro/ui/views/topics/index.erb +0 -14
  481. data/lib/karafka/web/ui/lib/ttl_cache.rb +0 -82
@@ -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
+ <% view_title @process.id %>
5
+
6
+ <div class="col-span-12">
7
+ <% if @process.status == 'stopped' %>
8
+ <%== partial 'consumers/consumers/consumer/stopped' %>
9
+ <% end %>
10
+
11
+ <%== partial 'consumers/consumers/consumer/tabs' %>
12
+
13
+ <% if @process.subscribed? %>
14
+ <%==
15
+ render_each(
16
+ @process.consumer_groups,
17
+ 'consumers/consumers/consumer/_consumer_group',
18
+ local: :consumer_group
19
+ )
20
+ %>
21
+ <% else %>
22
+ <%== partial 'consumers/consumers/consumer/no_subscriptions' %>
23
+ <% end %>
24
+ </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
+ <li>
5
+ <a href="<%= consumers_path('overview') %>">
6
+ Consumers
7
+ </a>
8
+ </li>
9
+
10
+ <% if current_path.include?('/controls') %>
11
+ <li>
12
+ <a href="<%= consumers_path('controls') %>">
13
+ Controls
14
+ </a>
15
+ </li>
16
+ <% end %>
@@ -0,0 +1,107 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <% if process.schema_compatible? %>
5
+ <tr class="status-row-<%= process.status %>">
6
+ <td>
7
+ <a href="<%= consumer_path(process.id, 'subscriptions') %>">
8
+ <%== truncate(process.id, strategy: :middle) %>
9
+ </a>
10
+
11
+ <p class="mt-1">
12
+ <%== tags(process.tags) %>
13
+ </p>
14
+ </td>
15
+
16
+ <td>
17
+ <div class="badge <%= status_badge(process.status) %>">
18
+ <%= process.status %>
19
+ </div>
20
+ </td>
21
+
22
+ <td>
23
+ <%== partial 'consumers/assignments_badges', locals: { process: process } %>
24
+ </td>
25
+
26
+ <td>
27
+ <%== relative_time process.started_at %>
28
+ </td>
29
+
30
+ <td>
31
+ <span class="badge badge-primary">
32
+ <%= format_memory process.memory_usage %>
33
+ </span>
34
+ </td>
35
+
36
+ <td>
37
+ <span class="badge badge-primary">
38
+ <%= process.utilization.round(1) %>%
39
+ </span>
40
+ <span class="badge badge-primary">
41
+ <%= process.workers %> /
42
+ <%= process.busy %>
43
+ </span>
44
+ </td>
45
+
46
+ <td>
47
+ <%= process.lag_hybrid %>
48
+ </td>
49
+
50
+ <td class="commands-inline-3">
51
+ <%
52
+ trace_path = consumers_path('commanding', process.id, 'trace')
53
+ disabled_class = process.status != 'stopped' ? '' : 'btn-disabled'
54
+ %>
55
+ <form action="<%= trace_path %>" method="post" class="inline" title="Trace">
56
+ <%== csrf_tag(trace_path) %>
57
+
58
+ <button type="submit" class="btn btn-info btn-sm btn-lockable <%= disabled_class %>">
59
+ <%== icon(:gear) %>
60
+ </button>
61
+ </form>
62
+
63
+ <%
64
+ quiet_path = consumers_path('commanding', process.id, 'quiet')
65
+ disabled_class = process.status == 'running' ? '' : 'btn-disabled'
66
+
67
+ if process.execution_mode == 'standalone'
68
+ title = 'Quiet'
69
+ else
70
+ disabled_class = 'btn-disabled'
71
+ title = 'Supported only in standalone consumer processes'
72
+ end
73
+ %>
74
+ <form action="<%= quiet_path %>" method="post" class="inline" title="<%= title %>">
75
+ <%== csrf_tag(quiet_path) %>
76
+ <button type="submit" class="btn btn-warning btn-sm btn-lockable <%= disabled_class %>">
77
+ <%== icon(:pause) %>
78
+ </button>
79
+ </form>
80
+
81
+ <%
82
+ stop_path = consumers_path('commanding', process.id, 'stop')
83
+ disabled_class = process.status != 'stopping' && process.status != 'stopped' ? '' : 'btn-disabled'
84
+
85
+ if process.execution_mode == 'standalone'
86
+ title = 'Stop'
87
+ else
88
+ disabled_class = 'btn-disabled'
89
+ title = 'Supported only in standalone consumer processes'
90
+ end
91
+ %>
92
+ <form action="<%= stop_path %>" method="post" class="inline" title="<%= title %>">
93
+ <%== csrf_tag(stop_path) %>
94
+ <button type="submit" class="btn btn-error btn-sm btn-lockable <%= disabled_class %>">
95
+ <%== icon(:stop) %>
96
+ </button>
97
+ </form>
98
+ </td>
99
+ </tr>
100
+ <% else %>
101
+ <%==
102
+ partial(
103
+ 'consumers/incompatible',
104
+ locals: { colspan: 7, process: process }
105
+ )
106
+ %>
107
+ <% end %>
@@ -1,11 +1,14 @@
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 'Consumers Controls' %>
2
5
 
3
- <%== partial 'consumers/tabs' %>
6
+ <%== partial 'consumers/consumers/tabs' %>
4
7
 
5
8
  <% unless @processes.empty? %>
6
9
  <div class="col-span-12 flex justify-end space-x-2 mb-6">
7
10
  <%
8
- quiet_all_path = root_path('commanding', 'quiet_all')
11
+ quiet_all_path = consumers_path('commanding', 'quiet_all')
9
12
  %>
10
13
  <form action="<%= quiet_all_path %>" method="post" class="inline-flex items-center">
11
14
  <%== csrf_tag(quiet_all_path) %>
@@ -16,7 +19,7 @@
16
19
  </form>
17
20
 
18
21
  <%
19
- stop_all_path = root_path('commanding', 'stop_all')
22
+ stop_all_path = consumers_path('commanding', 'stop_all')
20
23
  %>
21
24
  <form action="<%= stop_all_path %>" method="post" class="inline-flex items-center">
22
25
  <%== csrf_tag(stop_all_path) %>
@@ -38,7 +41,7 @@
38
41
  <table class="data-table">
39
42
  <thead>
40
43
  <tr>
41
- <th><%== sort_link(:id) %></th>
44
+ <th><%== sort_link('Process ID', :id) %></th>
42
45
  <th><%== sort_link(:status) %></th>
43
46
  <th>Subscriptions</th>
44
47
  <th><%== sort_link(:started_at, rev: true) %></th>
@@ -52,7 +55,7 @@
52
55
  <%==
53
56
  render_each(
54
57
  @processes,
55
- 'consumers/_consumer_controls',
58
+ 'consumers/controls/_controls',
56
59
  local: :process
57
60
  )
58
61
  %>
@@ -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
+ <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
+ <li>
17
+ <a href="<%= consumer_path(@process.id, 'jobs') %>">
18
+ Jobs
19
+ </a>
20
+ </li>
21
+
22
+ <% if current_path.include?('/running') %>
23
+ <li>
24
+ <a href="<%= consumer_path(@process.id, 'jobs', 'pending') %>">
25
+ Running
26
+ </a>
27
+ </li>
28
+ <% end %>
29
+
30
+ <% if current_path.include?('/pending') %>
31
+ <li>
32
+ <a href="<%= consumer_path(@process.id, 'jobs', 'pending') %>">
33
+ Pending
34
+ </a>
35
+ </li>
36
+ <% 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
  <tr>
2
5
  <td>
3
6
  <span class="badge badge-secondary" title="Consumer group: <%= job.consumer_group %>">
@@ -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="container mb-4">
2
5
  <div class="row">
3
6
  <div class="col-lg-12">
@@ -1,18 +1,17 @@
1
- <% view_title @process.id %>
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
2
3
 
3
- <%== partial 'consumers/consumer/commands', locals: { process: @process } %>
4
+ <% view_title @process.id %>
4
5
 
5
6
  <div class="col-span-12">
6
7
  <% if @process.status == 'stopped' %>
7
- <%== partial 'consumers/consumer/stopped' %>
8
+ <%== partial 'consumers/consumers/consumer/stopped' %>
8
9
  <% end %>
9
10
 
10
- <%== partial 'consumers/consumer/metrics' %>
11
-
12
- <%== partial 'consumers/consumer/tabs' %>
11
+ <%== partial 'consumers/consumers/consumer/tabs' %>
13
12
 
14
13
  <% if @pending_jobs.empty? %>
15
- <%== partial 'consumers/consumer/no_jobs', locals: { type: 'pending' } %>
14
+ <%== partial 'consumers/jobs/no_jobs', locals: { type: 'pending' } %>
16
15
  <% else %>
17
16
  <div class="data-table-wrapper">
18
17
  <table class="data-table">
@@ -35,7 +34,7 @@
35
34
  <%==
36
35
  render_each(
37
36
  @pending_jobs,
38
- 'consumers/consumer/_job',
37
+ 'consumers/jobs/_job',
39
38
  local: :job
40
39
  )
41
40
  %>
@@ -1,18 +1,17 @@
1
- <% view_title @process.id %>
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
2
3
 
3
- <%== partial 'consumers/consumer/commands', locals: { process: @process } %>
4
+ <% view_title @process.id %>
4
5
 
5
6
  <div class="col-span-12">
6
7
  <% if @process.status == 'stopped' %>
7
- <%== partial 'consumers/consumer/stopped' %>
8
+ <%== partial 'consumers/consumers/consumer/stopped' %>
8
9
  <% end %>
9
10
 
10
- <%== partial 'consumers/consumer/metrics' %>
11
-
12
- <%== partial 'consumers/consumer/tabs' %>
11
+ <%== partial 'consumers/consumers/consumer/tabs' %>
13
12
 
14
13
  <% if @running_jobs.empty? %>
15
- <%== partial 'consumers/consumer/no_jobs', locals: { type: 'running' } %>
14
+ <%== partial 'consumers/jobs/no_jobs', locals: { type: 'running' } %>
16
15
  <% else %>
17
16
  <div class="data-table-wrapper">
18
17
  <table class="data-table">
@@ -35,7 +34,7 @@
35
34
  <%==
36
35
  render_each(
37
36
  @running_jobs,
38
- 'consumers/consumer/_job',
37
+ 'consumers/jobs/_job',
39
38
  local: :job
40
39
  )
41
40
  %>
@@ -0,0 +1,77 @@
1
+ <%# This code is part of Karafka Pro, a commercial component not licensed under LGPL. %>
2
+ <%# See LICENSE for details. %>
3
+
4
+ <div class="grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-4 gap-4 mb-6 mt-6">
5
+ <div class="card-metric">
6
+ <h3>Basic Info</h3>
7
+ <ul>
8
+ <li>
9
+ Process ID:
10
+ <%== badge_primary @process.id %>
11
+ </li>
12
+ <li>
13
+ Topic:
14
+ <%== badge_info @topic %>
15
+ </li>
16
+ <li>
17
+ Partition:
18
+ <%== badge_info @partition_id %>
19
+ </li>
20
+ </ul>
21
+ </div>
22
+
23
+ <div class="card-metric">
24
+ <h3>Consumer Details</h3>
25
+ <ul>
26
+ <li>
27
+ Consumer Group:
28
+ <%== badge_secondary @consumer_group.id %>
29
+ </li>
30
+ <li>
31
+ Subscription Group:
32
+ <%== badge_secondary @subscription_group.id %>
33
+ </li>
34
+ <li>
35
+ Poll State:
36
+ <%== poll_state_with_change_time_label(@partition_stats.poll_state, @partition_stats.poll_state_ch) %>
37
+ </li>
38
+ </ul>
39
+ </div>
40
+
41
+ <div class="card-metric">
42
+ <h3>Current Position</h3>
43
+ <ul>
44
+ <li>
45
+ Committed Offset:
46
+ <%== badge_secondary(normalized_metric(@partition_stats.committed_offset)) %>
47
+ </li>
48
+ <li>
49
+ Stored Offset:
50
+ <%== badge_secondary(normalized_metric(@partition_stats.stored_offset)) %>
51
+ </li>
52
+ <li>
53
+ Lag:
54
+
55
+ <%== badge_secondary(normalized_metric(@partition_stats.lag_hybrid)) %>
56
+ </li>
57
+ </ul>
58
+ </div>
59
+
60
+ <div class="card-metric">
61
+ <h3>Partition Details</h3>
62
+ <ul>
63
+ <li>
64
+ High Offset:
65
+ <%== badge_info(normalized_metric(@partition_stats.hi_offset)) %>
66
+ </li>
67
+ <li>
68
+ Low Offset:
69
+ <%== badge_info(normalized_metric(@partition_stats.lo_offset)) %>
70
+ </li>
71
+ <li>
72
+ EOF Offset:
73
+ <%== badge_info(normalized_metric(@partition_stats.eof_offset)) %>
74
+ </li>
75
+ </ul>
76
+ </div>
77
+ </div>
@@ -0,0 +1,58 @@
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
+ edit_path = consumer_path(
25
+ @process.id,
26
+ 'partitions',
27
+ @subscription_group_id,
28
+ @topic,
29
+ @partition_id,
30
+ 'offset',
31
+ 'edit'
32
+ )
33
+ %>
34
+
35
+ <li>
36
+ <a href="<%= edit_path %>">
37
+ <%= @topic %>
38
+ </a>
39
+ </li>
40
+
41
+ <li>
42
+ <a href="<%= edit_path %>">
43
+ <%= @partition_id %>
44
+ </a>
45
+ </li>
46
+
47
+ <li>
48
+ <a href="<%= edit_path %>">
49
+ Offsets
50
+ </a>
51
+ </li>
52
+
53
+ <li>
54
+ <a href="<%= edit_path %>">
55
+ Edit
56
+ </a>
57
+ </li>
58
+ <% end %>
@@ -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 %>