karafka-web 0.9.1 → 0.10.1

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 (436) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/workflows/ci.yml +30 -0
  4. data/.gitignore +2 -0
  5. data/.ruby-version +1 -1
  6. data/CHANGELOG.md +98 -1
  7. data/Gemfile +2 -0
  8. data/Gemfile.lock +37 -25
  9. data/LICENSE +1 -1
  10. data/bin/build_assets +51 -0
  11. data/bin/release +6 -0
  12. data/certs/cert.pem +26 -0
  13. data/config/locales/pro_errors.yml +18 -0
  14. data/docker-compose.yml +1 -1
  15. data/gulpfile.js +73 -0
  16. data/karafka-web.gemspec +3 -3
  17. data/lib/karafka/web/config.rb +18 -10
  18. data/lib/karafka/web/contracts/base.rb +2 -0
  19. data/lib/karafka/web/contracts/config.rb +6 -1
  20. data/lib/karafka/web/errors.rb +12 -0
  21. data/lib/karafka/web/inflector.rb +1 -1
  22. data/lib/karafka/web/management/actions/enable.rb +17 -0
  23. data/lib/karafka/web/management/migrations/consumers_metrics/0_set_initial.rb +39 -0
  24. data/lib/karafka/web/management/migrations/consumers_metrics/1699543515_fill_missing_received_and_sent_bytes.rb +28 -0
  25. data/lib/karafka/web/management/migrations/consumers_metrics/1700234522_introduce_waiting.rb +26 -0
  26. data/lib/karafka/web/management/migrations/consumers_metrics/1700234522_remove_processing.rb +26 -0
  27. data/lib/karafka/web/management/migrations/consumers_metrics/1704722380_split_listeners_into_active_and_paused.rb +38 -0
  28. data/lib/karafka/web/management/migrations/consumers_metrics/1706607960_introduce_lag_total.rb +40 -0
  29. data/lib/karafka/web/management/migrations/consumers_metrics/1706611396_rename_lag_total_to_lag_hybrid.rb +38 -0
  30. data/lib/karafka/web/management/migrations/consumers_metrics/1716218393_populate_jobs_metrics.rb +26 -0
  31. data/lib/karafka/web/management/migrations/consumers_states/0_set_initial.rb +46 -0
  32. data/lib/karafka/web/management/migrations/consumers_states/1699543515_fill_missing_received_and_sent_bytes.rb +25 -0
  33. data/lib/karafka/web/management/migrations/consumers_states/1700234522_introduce_waiting.rb +22 -0
  34. data/lib/karafka/web/management/migrations/consumers_states/1700234522_remove_processing.rb +22 -0
  35. data/lib/karafka/web/management/migrations/consumers_states/1704722380_split_listeners_into_active_and_paused.rb +34 -0
  36. data/lib/karafka/web/management/migrations/consumers_states/1706607960_introduce_lag_total.rb +24 -0
  37. data/lib/karafka/web/management/migrations/consumers_states/1706611396_rename_lag_total_to_lag_hybrid.rb +23 -0
  38. data/lib/karafka/web/management/migrations/consumers_states/1716218393_add_jobs_counter.rb +24 -0
  39. data/lib/karafka/web/management/migrator.rb +5 -5
  40. data/lib/karafka/web/pro/commanding/commands/base.rb +8 -0
  41. data/lib/karafka/web/pro/commanding/commands/quiet.rb +4 -1
  42. data/lib/karafka/web/pro/commanding/commands/stop.rb +4 -1
  43. data/lib/karafka/web/pro/loader.rb +8 -0
  44. data/lib/karafka/web/pro/ui/app.rb +84 -7
  45. data/lib/karafka/web/pro/ui/controllers/commanding_controller.rb +4 -4
  46. data/lib/karafka/web/pro/ui/controllers/dlq_controller.rb +1 -1
  47. data/lib/karafka/web/pro/ui/controllers/errors_controller.rb +1 -0
  48. data/lib/karafka/web/pro/ui/controllers/explorer_controller.rb +6 -14
  49. data/lib/karafka/web/pro/ui/controllers/messages_controller.rb +5 -4
  50. data/lib/karafka/web/pro/ui/controllers/recurring_tasks_controller.rb +131 -0
  51. data/lib/karafka/web/pro/ui/controllers/search_controller.rb +73 -0
  52. data/lib/karafka/web/pro/ui/controllers/support_controller.rb +26 -0
  53. data/lib/karafka/web/pro/ui/controllers/topics_controller.rb +31 -0
  54. data/lib/karafka/web/pro/ui/controllers/ux_controller.rb +26 -0
  55. data/lib/karafka/web/pro/ui/lib/policies/config.rb +39 -0
  56. data/lib/karafka/web/pro/ui/lib/policies/contracts/config.rb +46 -0
  57. data/lib/karafka/web/pro/ui/lib/policies/messages.rb +76 -0
  58. data/lib/karafka/web/pro/ui/lib/policies/requests.rb +36 -0
  59. data/lib/karafka/web/pro/ui/lib/policies.rb +34 -0
  60. data/lib/karafka/web/pro/ui/lib/safe_runner.rb +98 -0
  61. data/lib/karafka/web/pro/ui/lib/search/config.rb +53 -0
  62. data/lib/karafka/web/pro/ui/lib/search/contracts/config.rb +101 -0
  63. data/lib/karafka/web/pro/ui/lib/search/contracts/form.rb +111 -0
  64. data/lib/karafka/web/pro/ui/lib/search/matchers/base.rb +59 -0
  65. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_header_includes.rb +57 -0
  66. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_key_includes.rb +41 -0
  67. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_payload_includes.rb +45 -0
  68. data/lib/karafka/web/pro/ui/lib/search/normalizer.rb +47 -0
  69. data/lib/karafka/web/pro/ui/lib/search/runner.rb +230 -0
  70. data/lib/karafka/web/pro/ui/lib/search.rb +36 -0
  71. data/lib/karafka/web/pro/ui/views/cluster/_breadcrumbs.erb +4 -4
  72. data/lib/karafka/web/pro/ui/views/cluster/_tabs.erb +14 -24
  73. data/lib/karafka/web/pro/ui/views/cluster/index.erb +20 -22
  74. data/lib/karafka/web/pro/ui/views/cluster/show.erb +21 -25
  75. data/lib/karafka/web/pro/ui/views/commands/_backtrace.erb +4 -19
  76. data/lib/karafka/web/pro/ui/views/commands/_breadcrumbs.erb +3 -3
  77. data/lib/karafka/web/pro/ui/views/commands/_command.erb +6 -6
  78. data/lib/karafka/web/pro/ui/views/commands/_command_details.erb +1 -11
  79. data/lib/karafka/web/pro/ui/views/commands/_incompatible_schema.erb +3 -14
  80. data/lib/karafka/web/pro/ui/views/commands/_metadata.erb +33 -42
  81. data/lib/karafka/web/pro/ui/views/commands/_table.erb +9 -3
  82. data/lib/karafka/web/pro/ui/views/commands/index.erb +18 -12
  83. data/lib/karafka/web/pro/ui/views/commands/show.erb +24 -29
  84. data/lib/karafka/web/pro/ui/views/consumers/_breadcrumbs.erb +8 -8
  85. data/lib/karafka/web/pro/ui/views/consumers/_consumer.erb +13 -23
  86. data/lib/karafka/web/pro/ui/views/consumers/_consumer_controls.erb +52 -35
  87. data/lib/karafka/web/pro/ui/views/consumers/_consumer_performance.erb +1 -1
  88. data/lib/karafka/web/pro/ui/views/consumers/_tabs.erb +28 -30
  89. data/lib/karafka/web/pro/ui/views/consumers/consumer/_commands.erb +68 -28
  90. data/lib/karafka/web/pro/ui/views/consumers/consumer/_job.erb +1 -1
  91. data/lib/karafka/web/pro/ui/views/consumers/consumer/_metrics.erb +114 -133
  92. data/lib/karafka/web/pro/ui/views/consumers/consumer/_partition.erb +4 -4
  93. data/lib/karafka/web/pro/ui/views/consumers/consumer/_stopped.erb +6 -9
  94. data/lib/karafka/web/pro/ui/views/consumers/consumer/_subscription_group.erb +116 -126
  95. data/lib/karafka/web/pro/ui/views/consumers/consumer/_tabs.erb +26 -31
  96. data/lib/karafka/web/pro/ui/views/consumers/controls.erb +53 -57
  97. data/lib/karafka/web/pro/ui/views/consumers/details.erb +4 -17
  98. data/lib/karafka/web/pro/ui/views/consumers/index.erb +31 -34
  99. data/lib/karafka/web/pro/ui/views/consumers/pending_jobs.erb +41 -46
  100. data/lib/karafka/web/pro/ui/views/consumers/performance.erb +43 -47
  101. data/lib/karafka/web/pro/ui/views/consumers/running_jobs.erb +41 -46
  102. data/lib/karafka/web/pro/ui/views/consumers/subscriptions.erb +14 -17
  103. data/lib/karafka/web/pro/ui/views/dashboard/index.erb +67 -76
  104. data/lib/karafka/web/pro/ui/views/dlq/_breadcrumbs.erb +1 -1
  105. data/lib/karafka/web/pro/ui/views/dlq/_no_topics.erb +1 -7
  106. data/lib/karafka/web/pro/ui/views/dlq/_topic.erb +7 -10
  107. data/lib/karafka/web/pro/ui/views/dlq/index.erb +8 -10
  108. data/lib/karafka/web/pro/ui/views/errors/_breadcrumbs.erb +3 -3
  109. data/lib/karafka/web/pro/ui/views/errors/_error.erb +8 -5
  110. data/lib/karafka/web/pro/ui/views/errors/_selector.erb +12 -0
  111. data/lib/karafka/web/pro/ui/views/errors/_table.erb +5 -4
  112. data/lib/karafka/web/pro/ui/views/errors/index.erb +50 -15
  113. data/lib/karafka/web/pro/ui/views/errors/partition.erb +61 -14
  114. data/lib/karafka/web/pro/ui/views/errors/show.erb +28 -46
  115. data/lib/karafka/web/pro/ui/views/explorer/_breadcrumbs.erb +11 -3
  116. data/lib/karafka/web/pro/ui/views/explorer/_failed_deserialization.erb +8 -3
  117. data/lib/karafka/web/pro/ui/views/explorer/_message.erb +12 -6
  118. data/lib/karafka/web/pro/ui/views/explorer/_no_topics.erb +1 -5
  119. data/lib/karafka/web/pro/ui/views/explorer/_selector.erb +12 -0
  120. data/lib/karafka/web/pro/ui/views/explorer/_topic.erb +6 -8
  121. data/lib/karafka/web/pro/ui/views/explorer/index.erb +13 -15
  122. data/lib/karafka/web/pro/ui/views/explorer/message/_metadata.erb +68 -32
  123. data/lib/karafka/web/pro/ui/views/explorer/message/_payload.erb +17 -16
  124. data/lib/karafka/web/pro/ui/views/explorer/message/_resources_utilization.erb +127 -0
  125. data/lib/karafka/web/pro/ui/views/explorer/message/_too_big_to_be_displayed.erb +20 -0
  126. data/lib/karafka/web/pro/ui/views/explorer/messages/_detail.erb +1 -1
  127. data/lib/karafka/web/pro/ui/views/explorer/partition/_cleaned.erb +3 -5
  128. data/lib/karafka/web/pro/ui/views/explorer/partition/_empty.erb +3 -5
  129. data/lib/karafka/web/pro/ui/views/explorer/partition/_messages.erb +6 -3
  130. data/lib/karafka/web/pro/ui/views/explorer/partition.erb +67 -46
  131. data/lib/karafka/web/pro/ui/views/explorer/show.erb +85 -21
  132. data/lib/karafka/web/pro/ui/views/explorer/topic/_actions.erb +27 -0
  133. data/lib/karafka/web/pro/ui/views/explorer/topic/_empty.erb +3 -5
  134. data/lib/karafka/web/pro/ui/views/explorer/topic/_limited.erb +8 -10
  135. data/lib/karafka/web/pro/ui/views/explorer/topic.erb +24 -44
  136. data/lib/karafka/web/pro/ui/views/health/_breadcrumbs.erb +7 -7
  137. data/lib/karafka/web/pro/ui/views/health/_no_data.erb +1 -7
  138. data/lib/karafka/web/pro/ui/views/health/_partition.erb +3 -3
  139. data/lib/karafka/web/pro/ui/views/health/_partition_lags.erb +3 -3
  140. data/lib/karafka/web/pro/ui/views/health/_partition_offset.erb +2 -2
  141. data/lib/karafka/web/pro/ui/views/health/_partition_times.erb +3 -7
  142. data/lib/karafka/web/pro/ui/views/health/_table_metadata.erb +8 -0
  143. data/lib/karafka/web/pro/ui/views/health/_tabs.erb +32 -49
  144. data/lib/karafka/web/pro/ui/views/health/changes.erb +51 -51
  145. data/lib/karafka/web/pro/ui/views/health/cluster_lags.erb +28 -41
  146. data/lib/karafka/web/pro/ui/views/health/lags.erb +52 -52
  147. data/lib/karafka/web/pro/ui/views/health/offsets.erb +55 -55
  148. data/lib/karafka/web/pro/ui/views/health/overview.erb +60 -60
  149. data/lib/karafka/web/pro/ui/views/jobs/_job.erb +1 -1
  150. data/lib/karafka/web/pro/ui/views/jobs/_no_jobs.erb +1 -7
  151. data/lib/karafka/web/pro/ui/views/jobs/pending.erb +36 -38
  152. data/lib/karafka/web/pro/ui/views/jobs/running.erb +36 -38
  153. data/lib/karafka/web/pro/ui/views/recurring_tasks/_actions.erb +58 -0
  154. data/lib/karafka/web/pro/ui/views/recurring_tasks/_batch_actions.erb +45 -0
  155. data/lib/karafka/web/pro/ui/views/recurring_tasks/_breadcrumbs.erb +22 -0
  156. data/lib/karafka/web/pro/ui/views/recurring_tasks/_log.erb +26 -0
  157. data/lib/karafka/web/pro/ui/views/recurring_tasks/_not_active.erb +12 -0
  158. data/lib/karafka/web/pro/ui/views/recurring_tasks/_tabs.erb +17 -0
  159. data/lib/karafka/web/pro/ui/views/recurring_tasks/_task.erb +46 -0
  160. data/lib/karafka/web/pro/ui/views/recurring_tasks/logs.erb +34 -0
  161. data/lib/karafka/web/pro/ui/views/recurring_tasks/schedule.erb +43 -0
  162. data/lib/karafka/web/pro/ui/views/routing/_consumer_group.erb +7 -12
  163. data/lib/karafka/web/pro/ui/views/routing/_topic.erb +13 -11
  164. data/lib/karafka/web/pro/ui/views/routing/index.erb +7 -9
  165. data/lib/karafka/web/pro/ui/views/routing/show.erb +41 -33
  166. data/lib/karafka/web/pro/ui/views/search/_fix_errors.erb +3 -0
  167. data/lib/karafka/web/pro/ui/views/search/_metadata.erb +71 -0
  168. data/lib/karafka/web/pro/ui/views/search/_no_results.erb +3 -0
  169. data/lib/karafka/web/pro/ui/views/search/_no_search_criteria.erb +5 -0
  170. data/lib/karafka/web/pro/ui/views/search/_search_criteria.erb +37 -0
  171. data/lib/karafka/web/pro/ui/views/search/_search_modal.erb +139 -0
  172. data/lib/karafka/web/pro/ui/views/search/_timeout.erb +3 -0
  173. data/lib/karafka/web/pro/ui/views/search/index.erb +29 -0
  174. data/lib/karafka/web/pro/ui/views/shared/_navigation.erb +90 -28
  175. data/lib/karafka/web/pro/ui/views/topics/_breadcrumbs.erb +14 -6
  176. data/lib/karafka/web/pro/ui/views/topics/_partition_offsets.erb +10 -0
  177. data/lib/karafka/web/pro/ui/views/topics/_tabs.erb +26 -32
  178. data/lib/karafka/web/pro/ui/views/topics/_topic.erb +7 -10
  179. data/lib/karafka/web/pro/ui/views/topics/config.erb +21 -25
  180. data/lib/karafka/web/pro/ui/views/topics/distribution/_badges.erb +10 -5
  181. data/lib/karafka/web/pro/ui/views/topics/distribution/_chart.erb +3 -1
  182. data/lib/karafka/web/pro/ui/views/topics/distribution/_limited.erb +1 -1
  183. data/lib/karafka/web/pro/ui/views/topics/distribution.erb +34 -39
  184. data/lib/karafka/web/pro/ui/views/topics/index.erb +13 -15
  185. data/lib/karafka/web/pro/ui/views/topics/offsets.erb +24 -0
  186. data/lib/karafka/web/pro/ui/views/topics/replication.erb +20 -24
  187. data/lib/karafka/web/processing/consumers/aggregators/metrics.rb +1 -1
  188. data/lib/karafka/web/processing/consumers/aggregators/state.rb +1 -1
  189. data/lib/karafka/web/processing/consumers/contracts/aggregated_stats.rb +1 -0
  190. data/lib/karafka/web/tracking/consumers/contracts/job.rb +1 -1
  191. data/lib/karafka/web/tracking/consumers/contracts/report.rb +6 -0
  192. data/lib/karafka/web/tracking/consumers/listeners/connections.rb +8 -6
  193. data/lib/karafka/web/tracking/consumers/listeners/processing.rb +7 -1
  194. data/lib/karafka/web/tracking/consumers/listeners/tags.rb +1 -1
  195. data/lib/karafka/web/tracking/consumers/reporter.rb +6 -8
  196. data/lib/karafka/web/tracking/consumers/sampler.rb +16 -5
  197. data/lib/karafka/web/ui/app.rb +20 -1
  198. data/lib/karafka/web/ui/base.rb +26 -20
  199. data/lib/karafka/web/ui/controllers/base_controller.rb +7 -5
  200. data/lib/karafka/web/ui/controllers/dashboard_controller.rb +8 -0
  201. data/lib/karafka/web/ui/controllers/requests/params.rb +16 -2
  202. data/lib/karafka/web/ui/controllers/support_controller.rb +17 -0
  203. data/lib/karafka/web/ui/controllers/ux_controller.rb +17 -0
  204. data/lib/karafka/web/ui/helpers/application_helper.rb +83 -43
  205. data/lib/karafka/web/ui/helpers/paths_helper.rb +24 -0
  206. data/lib/karafka/web/ui/helpers/tailwind_helper.rb +90 -0
  207. data/lib/karafka/web/ui/lib/sorter.rb +1 -1
  208. data/lib/karafka/web/ui/models/metrics/aggregated.rb +1 -0
  209. data/lib/karafka/web/ui/models/metrics/charts/topics.rb +36 -20
  210. data/lib/karafka/web/ui/models/recurring_tasks/log.rb +26 -0
  211. data/lib/karafka/web/ui/models/recurring_tasks/schedule.rb +86 -0
  212. data/lib/karafka/web/ui/models/recurring_tasks/task.rb +30 -0
  213. data/lib/karafka/web/ui/models/status.rb +28 -1
  214. data/lib/karafka/web/ui/public/images/calendar.svg +3 -0
  215. data/lib/karafka/web/ui/public/javascripts/application.js +39 -15
  216. data/lib/karafka/web/ui/public/javascripts/application.min.js +64 -0
  217. data/lib/karafka/web/ui/public/javascripts/application.min.js.br +0 -0
  218. data/lib/karafka/web/ui/public/javascripts/application.min.js.gz +0 -0
  219. data/lib/karafka/web/ui/public/javascripts/charts/types/line.js +41 -9
  220. data/lib/karafka/web/ui/public/javascripts/components/btn_toggle_manager.js +37 -0
  221. data/lib/karafka/web/ui/public/javascripts/{live_poll.js → components/live_poll.js} +80 -8
  222. data/lib/karafka/web/ui/public/javascripts/{offset_datetime.js → components/offset_datetime.js} +1 -1
  223. data/lib/karafka/web/ui/public/javascripts/components/search.js +102 -0
  224. data/lib/karafka/web/ui/public/javascripts/components/tabs_manager.js +84 -0
  225. data/lib/karafka/web/ui/public/javascripts/components/theme_manager.js +66 -0
  226. data/lib/karafka/web/ui/public/javascripts/components/turbo_tracker.js +30 -0
  227. data/lib/karafka/web/ui/public/javascripts/libs/datepicker.js +2 -2
  228. data/lib/karafka/web/ui/public/javascripts/libs/turbo.js +6618 -0
  229. data/lib/karafka/web/ui/public/stylesheets/application.css +20 -113
  230. data/lib/karafka/web/ui/public/stylesheets/application.min.css +13 -0
  231. data/lib/karafka/web/ui/public/stylesheets/application.min.css.br +0 -0
  232. data/lib/karafka/web/ui/public/stylesheets/application.min.css.gz +0 -0
  233. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_dark.min.css +8 -0
  234. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_dark.min.css.br +0 -0
  235. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_dark.min.css.gz +0 -0
  236. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_light.min.css.br +0 -0
  237. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_light.min.css.gz +0 -0
  238. data/lib/karafka/web/ui/public/stylesheets/libs/tailwind.css +403 -0
  239. data/lib/karafka/web/ui/views/cluster/_breadcrumbs.erb +3 -3
  240. data/lib/karafka/web/ui/views/cluster/_tabs.erb +14 -24
  241. data/lib/karafka/web/ui/views/cluster/brokers.erb +20 -22
  242. data/lib/karafka/web/ui/views/cluster/replication.erb +28 -32
  243. data/lib/karafka/web/ui/views/consumers/_assignments_badges.erb +1 -1
  244. data/lib/karafka/web/ui/views/consumers/_breadcrumbs.erb +5 -0
  245. data/lib/karafka/web/ui/views/consumers/_consumer.erb +9 -13
  246. data/lib/karafka/web/ui/views/consumers/_no_consumers.erb +2 -8
  247. data/lib/karafka/web/ui/views/consumers/_summary.erb +34 -45
  248. data/lib/karafka/web/ui/views/consumers/_tabs.erb +35 -0
  249. data/lib/karafka/web/ui/views/consumers/index.erb +31 -33
  250. data/lib/karafka/web/ui/views/dashboard/_counters.erb +76 -0
  251. data/lib/karafka/web/ui/views/dashboard/_feature_pro.erb +6 -2
  252. data/lib/karafka/web/ui/views/dashboard/_not_enough_data.erb +3 -15
  253. data/lib/karafka/web/ui/views/dashboard/_ranges_selector.erb +12 -12
  254. data/lib/karafka/web/ui/views/dashboard/index.erb +78 -52
  255. data/lib/karafka/web/ui/views/errors/_breadcrumbs.erb +2 -2
  256. data/lib/karafka/web/ui/views/errors/_detail.erb +1 -3
  257. data/lib/karafka/web/ui/views/errors/_error.erb +3 -5
  258. data/lib/karafka/web/ui/views/errors/index.erb +34 -44
  259. data/lib/karafka/web/ui/views/errors/show.erb +29 -47
  260. data/lib/karafka/web/ui/views/jobs/_breadcrumbs.erb +3 -3
  261. data/lib/karafka/web/ui/views/jobs/_job.erb +1 -1
  262. data/lib/karafka/web/ui/views/jobs/_no_jobs.erb +1 -7
  263. data/lib/karafka/web/ui/views/jobs/_tabs.erb +14 -24
  264. data/lib/karafka/web/ui/views/jobs/pending.erb +30 -32
  265. data/lib/karafka/web/ui/views/jobs/running.erb +30 -32
  266. data/lib/karafka/web/ui/views/layout.erb +37 -21
  267. data/lib/karafka/web/ui/views/routing/_breadcrumbs.erb +2 -2
  268. data/lib/karafka/web/ui/views/routing/_consumer_group.erb +7 -12
  269. data/lib/karafka/web/ui/views/routing/_topic.erb +3 -5
  270. data/lib/karafka/web/ui/views/routing/index.erb +7 -9
  271. data/lib/karafka/web/ui/views/routing/show.erb +30 -22
  272. data/lib/karafka/web/ui/views/shared/_become_pro.erb +8 -8
  273. data/lib/karafka/web/ui/views/shared/_brand.erb +2 -2
  274. data/lib/karafka/web/ui/views/shared/_breadcrumbs.erb +23 -0
  275. data/lib/karafka/web/ui/views/shared/_content.erb +2 -28
  276. data/lib/karafka/web/ui/views/shared/_controls.erb +15 -0
  277. data/lib/karafka/web/ui/views/shared/_flashes.erb +5 -7
  278. data/lib/karafka/web/ui/views/shared/_header.erb +16 -19
  279. data/lib/karafka/web/ui/views/shared/_navigation.erb +95 -28
  280. data/lib/karafka/web/ui/views/shared/_no_paginated_data.erb +5 -9
  281. data/lib/karafka/web/ui/views/shared/_pagination.erb +11 -11
  282. data/lib/karafka/web/ui/views/shared/_tab_nav.erb +4 -5
  283. data/lib/karafka/web/ui/views/shared/_title.erb +5 -0
  284. data/lib/karafka/web/ui/views/shared/alerts/_box_error.erb +15 -0
  285. data/lib/karafka/web/ui/views/shared/alerts/_box_info.erb +15 -0
  286. data/lib/karafka/web/ui/views/shared/alerts/_box_primary.erb +15 -0
  287. data/lib/karafka/web/ui/views/shared/alerts/_box_secondary.erb +15 -0
  288. data/lib/karafka/web/ui/views/shared/alerts/_box_success.erb +15 -0
  289. data/lib/karafka/web/ui/views/shared/alerts/_box_warning.erb +15 -0
  290. data/lib/karafka/web/ui/views/shared/alerts/_error.erb +4 -0
  291. data/lib/karafka/web/ui/views/shared/alerts/_info.erb +5 -2
  292. data/lib/karafka/web/ui/views/shared/alerts/_primary.erb +4 -0
  293. data/lib/karafka/web/ui/views/shared/alerts/_secondary.erb +4 -0
  294. data/lib/karafka/web/ui/views/shared/alerts/_success.erb +4 -0
  295. data/lib/karafka/web/ui/views/shared/alerts/_warning.erb +4 -0
  296. data/lib/karafka/web/ui/views/shared/charts/_line.erb +1 -1
  297. data/lib/karafka/web/ui/views/shared/exceptions/not_allowed.erb +14 -19
  298. data/lib/karafka/web/ui/views/shared/exceptions/not_found.erb +16 -21
  299. data/lib/karafka/web/ui/views/shared/exceptions/pro_only.erb +16 -28
  300. data/lib/karafka/web/ui/views/shared/icons/_arrow_down_on_square.erb +3 -0
  301. data/lib/karafka/web/ui/views/shared/icons/_arrow_down_tray.erb +3 -0
  302. data/lib/karafka/web/ui/views/shared/icons/_arrow_on_squares.erb +3 -0
  303. data/lib/karafka/web/ui/views/shared/icons/_arrow_path_rounded.erb +3 -0
  304. data/lib/karafka/web/ui/views/shared/icons/_arrow_uturn_right.erb +3 -0
  305. data/lib/karafka/web/ui/views/shared/icons/_arrows_right_left.erb +3 -0
  306. data/lib/karafka/web/ui/views/shared/icons/_blocks.erb +3 -0
  307. data/lib/karafka/web/ui/views/shared/icons/_book_open.erb +3 -0
  308. data/lib/karafka/web/ui/views/shared/icons/_bug.erb +3 -0
  309. data/lib/karafka/web/ui/views/shared/icons/_burger.erb +14 -0
  310. data/lib/karafka/web/ui/views/shared/icons/_calendar_days.erb +3 -0
  311. data/lib/karafka/web/ui/views/shared/icons/_chart_bar.erb +3 -0
  312. data/lib/karafka/web/ui/views/shared/icons/_check.erb +3 -0
  313. data/lib/karafka/web/ui/views/shared/icons/_check_badge.erb +3 -0
  314. data/lib/karafka/web/ui/views/shared/icons/_check_circle.erb +3 -0
  315. data/lib/karafka/web/ui/views/shared/icons/_circle_stack.erb +3 -0
  316. data/lib/karafka/web/ui/views/shared/icons/_cpu.erb +3 -0
  317. data/lib/karafka/web/ui/views/shared/icons/_document_glass.erb +3 -0
  318. data/lib/karafka/web/ui/views/shared/icons/_exclamation_triangle.erb +3 -0
  319. data/lib/karafka/web/ui/views/shared/icons/_eye.erb +4 -0
  320. data/lib/karafka/web/ui/views/shared/icons/_gear.erb +4 -0
  321. data/lib/karafka/web/ui/views/shared/icons/_github.erb +13 -0
  322. data/lib/karafka/web/ui/views/shared/icons/_globe.erb +3 -0
  323. data/lib/karafka/web/ui/views/shared/icons/_heart.erb +3 -0
  324. data/lib/karafka/web/ui/views/shared/icons/_home.erb +3 -0
  325. data/lib/karafka/web/ui/views/shared/icons/_info_circle.erb +3 -0
  326. data/lib/karafka/web/ui/views/shared/icons/_lifebuoy.erb +3 -0
  327. data/lib/karafka/web/ui/views/shared/icons/_light_bulb.erb +3 -0
  328. data/lib/karafka/web/ui/views/shared/icons/_list_bullets.erb +3 -0
  329. data/lib/karafka/web/ui/views/shared/icons/_magnifying_glass.erb +3 -0
  330. data/lib/karafka/web/ui/views/shared/icons/_moon.erb +3 -0
  331. data/lib/karafka/web/ui/views/shared/icons/_offices.erb +3 -0
  332. data/lib/karafka/web/ui/views/shared/icons/_pause.erb +3 -0
  333. data/lib/karafka/web/ui/views/shared/icons/_pause_circle.erb +3 -0
  334. data/lib/karafka/web/ui/views/shared/icons/_play.erb +3 -0
  335. data/lib/karafka/web/ui/views/shared/icons/_play_circle.erb +4 -0
  336. data/lib/karafka/web/ui/views/shared/icons/_question_circle.erb +3 -0
  337. data/lib/karafka/web/ui/views/shared/icons/_queue_list.erb +3 -0
  338. data/lib/karafka/web/ui/views/shared/icons/_refresh.erb +3 -0
  339. data/lib/karafka/web/ui/views/shared/icons/_slack.erb +16 -0
  340. data/lib/karafka/web/ui/views/shared/icons/_stop.erb +3 -0
  341. data/lib/karafka/web/ui/views/shared/icons/_sun.erb +3 -0
  342. data/lib/karafka/web/ui/views/shared/icons/_x_circle.erb +3 -0
  343. data/lib/karafka/web/ui/views/shared/icons/_x_mark.erb +3 -0
  344. data/lib/karafka/web/ui/views/status/_breadcrumbs.erb +1 -1
  345. data/lib/karafka/web/ui/views/status/_failure.erb +2 -13
  346. data/lib/karafka/web/ui/views/status/_halted.erb +2 -10
  347. data/lib/karafka/web/ui/views/status/_info.erb +2 -13
  348. data/lib/karafka/web/ui/views/status/_success.erb +2 -10
  349. data/lib/karafka/web/ui/views/status/_warning.erb +2 -13
  350. data/lib/karafka/web/ui/views/status/failures/_connection.erb +2 -2
  351. data/lib/karafka/web/ui/views/status/failures/_consumers_reports.erb +3 -3
  352. data/lib/karafka/web/ui/views/status/failures/_consumers_reports_schema_state.erb +4 -4
  353. data/lib/karafka/web/ui/views/status/failures/_enabled.erb +2 -2
  354. data/lib/karafka/web/ui/views/status/failures/_initial_consumers_metrics.erb +6 -6
  355. data/lib/karafka/web/ui/views/status/failures/_initial_consumers_state.erb +6 -6
  356. data/lib/karafka/web/ui/views/status/failures/_live_reporting.erb +2 -2
  357. data/lib/karafka/web/ui/views/status/failures/_materializing_lag.erb +11 -0
  358. data/lib/karafka/web/ui/views/status/failures/_partitions.erb +3 -3
  359. data/lib/karafka/web/ui/views/status/failures/_state_calculation.erb +2 -2
  360. data/lib/karafka/web/ui/views/status/failures/_topics.erb +3 -3
  361. data/lib/karafka/web/ui/views/status/info/_components.erb +59 -49
  362. data/lib/karafka/web/ui/views/status/show.erb +165 -154
  363. data/lib/karafka/web/ui/views/status/warnings/_connection.erb +3 -3
  364. data/lib/karafka/web/ui/views/status/warnings/_pro_subscription.erb +2 -2
  365. data/lib/karafka/web/ui/views/status/warnings/_replication.erb +2 -2
  366. data/lib/karafka/web/ui/views/status/warnings/_routing_topics_presence.erb +1 -1
  367. data/lib/karafka/web/ui/views/support/_breadcrumbs.erb +5 -0
  368. data/lib/karafka/web/ui/views/support/show.erb +71 -0
  369. data/lib/karafka/web/ui/views/ux/_alerts.erb +25 -0
  370. data/lib/karafka/web/ui/views/ux/_badges.erb +21 -0
  371. data/lib/karafka/web/ui/views/ux/_breadcrumbs.erb +5 -0
  372. data/lib/karafka/web/ui/views/ux/_buttons.erb +47 -0
  373. data/lib/karafka/web/ui/views/ux/_card_detail.erb +15 -0
  374. data/lib/karafka/web/ui/views/ux/_card_metric.erb +123 -0
  375. data/lib/karafka/web/ui/views/ux/_card_summary.erb +72 -0
  376. data/lib/karafka/web/ui/views/ux/_card_support.erb +39 -0
  377. data/lib/karafka/web/ui/views/ux/_code.erb +9 -0
  378. data/lib/karafka/web/ui/views/ux/_data_table.erb +82 -0
  379. data/lib/karafka/web/ui/views/ux/_headers.erb +2 -0
  380. data/lib/karafka/web/ui/views/ux/_icons.erb +9 -0
  381. data/lib/karafka/web/ui/views/ux/_pagination.erb +32 -0
  382. data/lib/karafka/web/ui/views/ux/_row_table.erb +52 -0
  383. data/lib/karafka/web/ui/views/ux/_status_rows.erb +65 -0
  384. data/lib/karafka/web/ui/views/ux/_tabs.erb +14 -0
  385. data/lib/karafka/web/ui/views/ux/_text.erb +2 -0
  386. data/lib/karafka/web/ui/views/ux/_topic_tiles.erb +42 -0
  387. data/lib/karafka/web/ui/views/ux/show.erb +19 -0
  388. data/lib/karafka/web/version.rb +1 -1
  389. data/lib/karafka/web.rb +2 -0
  390. data/package-lock.json +4163 -0
  391. data/package.json +15 -0
  392. data/postcss.config.js +6 -0
  393. data/tailwind.config.js +16 -0
  394. data.tar.gz.sig +0 -0
  395. metadata +209 -69
  396. metadata.gz.sig +1 -4
  397. data/certs/cert_chain.pem +0 -26
  398. data/lib/karafka/web/management/migrations/0_set_initial_consumers_metrics.rb +0 -36
  399. data/lib/karafka/web/management/migrations/0_set_initial_consumers_state.rb +0 -43
  400. data/lib/karafka/web/management/migrations/1699543515_fill_missing_received_and_sent_bytes_in_consumers_metrics.rb +0 -26
  401. data/lib/karafka/web/management/migrations/1699543515_fill_missing_received_and_sent_bytes_in_consumers_state.rb +0 -23
  402. data/lib/karafka/web/management/migrations/1700234522_introduce_waiting_in_consumers_metrics.rb +0 -24
  403. data/lib/karafka/web/management/migrations/1700234522_introduce_waiting_in_consumers_state.rb +0 -20
  404. data/lib/karafka/web/management/migrations/1700234522_remove_processing_from_consumers_metrics.rb +0 -24
  405. data/lib/karafka/web/management/migrations/1700234522_remove_processing_from_consumers_state.rb +0 -20
  406. data/lib/karafka/web/management/migrations/1704722380_split_listeners_into_active_and_paused_in_metrics.rb +0 -36
  407. data/lib/karafka/web/management/migrations/1704722380_split_listeners_into_active_and_paused_in_states.rb +0 -32
  408. data/lib/karafka/web/management/migrations/1706607960_introduce_lag_total_in_metrics.rb +0 -38
  409. data/lib/karafka/web/management/migrations/1706607960_introduce_lag_total_in_states.rb +0 -22
  410. data/lib/karafka/web/management/migrations/1706611396_rename_lag_total_to_lag_hybrid_in_metrics.rb +0 -36
  411. data/lib/karafka/web/management/migrations/1706611396_rename_lag_total_to_lag_hybrid_in_states.rb +0 -21
  412. data/lib/karafka/web/pro/ui/views/cluster/brokers.erb +0 -27
  413. data/lib/karafka/web/pro/ui/views/commands/_details.erb +0 -26
  414. data/lib/karafka/web/pro/ui/views/consumers/_counters.erb +0 -72
  415. data/lib/karafka/web/pro/ui/views/consumers/consumer/_title.erb +0 -5
  416. data/lib/karafka/web/pro/ui/views/errors/_title_with_select.erb +0 -31
  417. data/lib/karafka/web/pro/ui/views/explorer/message/_message_actions.erb +0 -18
  418. data/lib/karafka/web/pro/ui/views/explorer/message/_payload_actions.erb +0 -19
  419. data/lib/karafka/web/pro/ui/views/explorer/partition/_details.erb +0 -35
  420. data/lib/karafka/web/pro/ui/views/explorer/topic/_details.erb +0 -23
  421. data/lib/karafka/web/pro/ui/views/health/_consumer_group_header.erb +0 -14
  422. data/lib/karafka/web/ui/controllers/responses/deny.rb +0 -15
  423. data/lib/karafka/web/ui/helpers/alerts_helper.rb +0 -23
  424. data/lib/karafka/web/ui/lib/safe_runner.rb +0 -59
  425. data/lib/karafka/web/ui/models/visibility_filter.rb +0 -49
  426. data/lib/karafka/web/ui/public/javascripts/libs/bootstrap.min.js +0 -6
  427. data/lib/karafka/web/ui/public/javascripts/tabs_manager.js +0 -57
  428. data/lib/karafka/web/ui/public/stylesheets/libs/bootstrap.min.css +0 -6
  429. data/lib/karafka/web/ui/views/consumers/_counters.erb +0 -62
  430. data/lib/karafka/web/ui/views/errors/_watermark_offsets.erb +0 -10
  431. data/lib/karafka/web/ui/views/shared/_feature_pro.erb +0 -4
  432. data/lib/karafka/web/ui/views/shared/_footer.erb +0 -22
  433. data/lib/karafka/web/ui/views/shared/_live_poll.erb +0 -7
  434. /data/lib/karafka/web/management/migrations/{0_base.rb → base.rb} +0 -0
  435. /data/lib/karafka/web/ui/public/javascripts/{charts.js → components/charts.js} +0 -0
  436. /data/lib/karafka/web/ui/public/stylesheets/libs/{highlight.min.css → highlight_light.min.css} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce075ec71d155adbf35706c5bfa9beab07a707970e53ad9b0f7e6b2fc2196976
4
- data.tar.gz: 747b28ece60db10c34cabfcaa70edcc8d7c0aaa63440c6b3dba6b108a35a0435
3
+ metadata.gz: 40794ee9c8b084cf75de0403b904134cbc6a762dbfa338bb9ce574b56e46ac36
4
+ data.tar.gz: dedefe087c54e118abb90e819b36b29aa253c4351aa18bd8a78d01e2c096ce79
5
5
  SHA512:
6
- metadata.gz: 39d4e856b439c83acc929cf17432c52abbbf4c2a063897b0595ed360321fc0cafb62527e5d99f35710d9d731accbd12aaca9a8c0a6c97ead1d5302df1fd400dd
7
- data.tar.gz: fc8eb8d769bc3dd9edeca90fedb05c83ce382c562f26b261290a352f04f09ffc029bdb21627bc6d305924b5673ed8465631d6a60d58c486575b24055f7255c9e
6
+ metadata.gz: 88b9b6ed8082b0484dcd32a20b2cee2b77d4df762b65d0487325e03ef375e1e7ac621d612f81b3f4a6870aa4352e07286979863d656161ca7d8d880e5709d108
7
+ data.tar.gz: f9350f68d872c76d289933fbf2548b692179bae30fb2c0fccf923cdefca7131bbf3e6bf362e21a442c424fc4b43472e8334115b90c32449e80ef45a3518c3228
checksums.yaml.gz.sig CHANGED
Binary file
@@ -22,6 +22,7 @@ jobs:
22
22
  fail-fast: false
23
23
  matrix:
24
24
  ruby:
25
+ - '3.4.0-preview1'
25
26
  - '3.3'
26
27
  - '3.2'
27
28
  - '3.1'
@@ -101,3 +102,32 @@ jobs:
101
102
  CODITSU_API_KEY: ${{ secrets.CODITSU_API_KEY }}
102
103
  CODITSU_API_SECRET: ${{ secrets.CODITSU_API_SECRET }}
103
104
  run: \curl -sSL https://api.coditsu.io/run/ci | bash
105
+
106
+
107
+ assets:
108
+ runs-on: ubuntu-latest
109
+ steps:
110
+ - name: Checkout code
111
+ uses: actions/checkout@v4
112
+
113
+ - name: Set up Node.js
114
+ uses: actions/setup-node@v4
115
+ with:
116
+ node-version: '17'
117
+
118
+ - name: Cache node modules
119
+ uses: actions/cache@v4
120
+ with:
121
+ path: ~/.npm
122
+ key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
123
+ restore-keys: |
124
+ ${{ runner.os }}-node-
125
+
126
+ - name: Install dependencies
127
+ run: npm install
128
+
129
+ - name: Build development assets
130
+ run: ./bin/build_assets
131
+
132
+ - name: Build release assets
133
+ run: KARAFKA_RELEASE=true ./bin/build_assets
data/.gitignore CHANGED
@@ -38,8 +38,10 @@ db/*.sqlite3
38
38
  /capybara-*.html
39
39
  /gems
40
40
  /specifications
41
+ /node_modules
41
42
  rerun.txt
42
43
  pickle-email-*.html
44
+ tailwind.min.css
43
45
 
44
46
  # If you find yourself ignoring temporary files generated by your text editor
45
47
  # or operating system, you probably want to add a global ignore instead:
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.3.1
1
+ 3.3.4
data/CHANGELOG.md CHANGED
@@ -1,4 +1,101 @@
1
- # Karafka Web changelog
1
+ # Karafka Web Changelog
2
+
3
+ ## 0.10.1 (Unreleased)
4
+ - **[Feature]** Support Recurring Tasks management (Pro).
5
+ - [Enhancement] Optimize command buttons so they occupy less space.
6
+ - [Enhancement] Improve tables headers capitalization.
7
+ - [Enhancement] Prevent live-polling when user hovers over actionable links to mitigate race conditions.
8
+ - [Fix] Fix partial lack of tables hover in daily mode.
9
+ - [Fix] Fix lack of tables hover in dark mode.
10
+ - [Fix] Normalize various tables types styling.
11
+ - [Fix] Fix ranges selectors position on wide screens.
12
+
13
+ ## 0.10.0 (2024-08-19)
14
+ - **[Breaking]** Rename and reorganize visibility filter to policies engine since it is not only about visibility.
15
+ - **[Feature]** Replace Bootstrap with with tailwind + DaisyUI.
16
+ - **[Feature]** Redesign the UI and move navigation to the left to make space for future features.
17
+ - **[Feature]** Support per request policies for inspection and operations limitation.
18
+ - **[Feature]** Provide Search capabilities in the Explorer (Pro).
19
+ - **[Feature]** Provide dark mode.
20
+ - [Enhancement] Set `enable.partition.eof` to `false` for Web UI consumer group as it is not needed.
21
+ - [Enhancement] Allow for configuration of extra `kafka` scope options for the Web UI consumer group.
22
+ - [Enhancement] Support Karafka `#eofed` consumer action.
23
+ - [Enhancement] Provide topics watermarks inspection page (Pro).
24
+ - [Enhancement] Use Turbo to improve usability.
25
+ - [Enhancement] Round poll age reporting to precision of 2 reducing the payload size.
26
+ - [Enhancement] Round utilization reporting to precision of 2 reducing the payload size.
27
+ - [Enhancement] Validate states materialization lag in the status view.
28
+ - [Enhancement] Promote topics data pace to OSS.
29
+ - [Enhancement] Rename and normalize dashboard tabs.
30
+ - [Enhancement] Enable live data polling on the first visit so it does not have to be enabled manually.
31
+ - [Enhancement] Allow disabling ability to republish messages via policies.
32
+ - [Enhancement] Display raw numerical timestamp alongside message time.
33
+ - [Enhancement] Support `/topics` root redirect.
34
+ - [Enhancement] Prevent explorer from displaying too big payloads (bigger than 1MB by default)
35
+ - [Enhancement] Include deserialization object allocation stats.
36
+ - [Enhancement] Improve how charts with many topics work.
37
+ - [Enhancement] Count and display executed jobs independently from processed batches.
38
+ - [Enhancement] Prevent karafka-web from being configured before karafka is configured.
39
+ - [Enhancement] Use `ostruct` from RubyGems in testing.
40
+ - [Enhancement] Indicate in the status reporting whether Karafka is OSS or Pro.
41
+ - [Enhancement] Ship JS and CSS assets using Brotli and Gzip when possible.
42
+ - [Enhancement] Introduce a `/ux` page to ease with styling improvements and components management.
43
+ - [Enhancement] disallow usage of `<script>` blocks to prevent XSS.
44
+ - [Enhancement] Display full subscription group information in the Routing view, including injectable defaults.
45
+ - [Enhancement] Report Karafka consumer server execution mode.
46
+ - [Enhancement] Expose `sync_threshold` consumer tracking config to allow aligning of error-intense applications.
47
+ - [Refactor] Optimize subscription group data tracking flow.
48
+ - [Refactor] Namespace migrations so migrations related to each topic data are in an independent directory.
49
+ - [Refactor] Use errors for deny flow so request denials can occur from the inspection layer.
50
+ - [Maintenance] Require `karafka` `2.4.7` due to fixes and API changes.
51
+ - [Fix] Disallow quiet and stop commands for swarm workers.
52
+ - [Fix] Disallow quiet and stop commands for embedded workers.
53
+ - [Fix] Fix invalid deserialization metadata display in the per-message Explorer view.
54
+ - [Fix] Fix a case where started page refresh would update content despite limiters being in place.
55
+ - [Fix] Ruby 3.4.0 preview1 - No such file or directory.
56
+ - [Fix] Fix the live poll button state flickering when disabled.
57
+ - [Fix] Pace computation does not compensate for partial data reported.
58
+ - [Fix] DLQ parent topics get classified as DLQ in the Web.
59
+ - [Fix] Add missing space in the attempt label.
60
+ - [Fix] Fix lack of highlight of "Consumers" navigation when in the "Commands" tab.
61
+ - [Fix] Fix not working page reporting in breadcrumbs.
62
+ - [Fix] Fix invalid redirect when trying to view particular errors partition time location.
63
+ - [Fix] Fix several UI inconsistencies.
64
+ - [Fix] License identifier `LGPL-3.0` is deprecated for SPDX (#2177).
65
+ - [Fix] Do not include prettifying the payload for visibility in the resource computation cost.
66
+
67
+ ### Upgrade Notes
68
+
69
+ This is a **major** release that brings many things to the table.
70
+
71
+ This version of the Karafka Web UI requires Karafka `>= 2.4.7`. You can either upgrade both or upgrade Karafka first and then the Web UI. Karafka `2.4.7` is also compatible with Web UI `0.9.1`; thus, you can upgrade one at a time.
72
+
73
+ #### Configuration
74
+
75
+ Visibility Filters have been reorganized into messages policies.
76
+
77
+ Please read the [Policies API](https://karafka.io/docs/Pro-Web-UI-Policies/) documentation and convert your visibility filters to policies.
78
+
79
+ Your existing message-related visibility filter policies should now be assigned to a new configuration:
80
+
81
+ ```ruby
82
+ Karafka::Web.setup do |config|
83
+ config.ui.policies.messages = MyCustomRequestsPolicy.new
84
+ end
85
+ ```
86
+
87
+ #### Deployment
88
+
89
+ Because of the reporting schema update, it is recommended to:
90
+
91
+ 0. Make sure you have upgraded to `0.9.1` before and that it was fully deployed.
92
+ 1. Test the upgrade on a staging or dev environment.
93
+ 3. The Web UI interface may throw 500 errors during the upgrade because of schema incompatibility (until Puma is deployed and all consumers redeployed). This will have no long-term effects and can be ignored.
94
+ 4. `Karafka::Web::Errors::Processing::IncompatibleSchemaError` **is expected**. It is part of the Karafka Web UI zero-downtime deployment strategy. This error allows the Web UI materialization consumer to back off and wait for it to be replaced with a new one.
95
+ 5. Perform a rolling deployment (or a regular one) and replace all consumer processes.
96
+ 6. Update the Web UI Puma.
97
+ 7. **No** CLI command execution is required.
98
+ 8. Enjoy.
2
99
 
3
100
  ## 0.9.1 (2024-05-03)
4
101
  - [Fix] OSS `lag_stored` for not-subscribed consumers causes Web UI to crash.
data/Gemfile CHANGED
@@ -9,6 +9,8 @@ gemspec
9
9
  group :test do
10
10
  gem 'byebug'
11
11
  gem 'factory_bot'
12
+ gem 'fugit'
13
+ gem 'ostruct'
12
14
  gem 'rack-test'
13
15
  gem 'rspec'
14
16
  gem 'simplecov'
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- karafka-web (0.9.1)
4
+ karafka-web (0.10.1)
5
5
  erubi (~> 1.4)
6
- karafka (>= 2.4.0, < 2.5.0)
6
+ karafka (>= 2.4.9, < 2.5.0)
7
7
  karafka-core (>= 2.4.0, < 2.5.0)
8
8
  roda (~> 3.68, >= 3.69)
9
9
  tilt (~> 2.0)
@@ -11,7 +11,7 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- activesupport (7.1.3.2)
14
+ activesupport (7.1.3.4)
15
15
  base64
16
16
  bigdecimal
17
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -22,40 +22,49 @@ GEM
22
22
  mutex_m
23
23
  tzinfo (~> 2.0)
24
24
  base64 (0.2.0)
25
- bigdecimal (3.1.7)
25
+ bigdecimal (3.1.8)
26
26
  byebug (11.1.3)
27
- concurrent-ruby (1.2.3)
27
+ concurrent-ruby (1.3.3)
28
28
  connection_pool (2.4.1)
29
29
  diff-lcs (1.5.1)
30
30
  docile (1.4.0)
31
31
  drb (2.2.1)
32
- erubi (1.12.0)
32
+ erubi (1.13.0)
33
+ et-orbi (1.2.11)
34
+ tzinfo
33
35
  factory_bot (6.4.6)
34
36
  activesupport (>= 5.0.0)
35
- ffi (1.16.3)
36
- i18n (1.14.4)
37
+ ffi (1.17.0)
38
+ fugit (1.11.1)
39
+ et-orbi (~> 1, >= 1.2.11)
40
+ raabro (~> 1.4)
41
+ i18n (1.14.5)
37
42
  concurrent-ruby (~> 1.0)
38
- karafka (2.4.0)
39
- karafka-core (>= 2.4.0, < 2.5.0)
40
- waterdrop (>= 2.7.0, < 3.0.0)
43
+ karafka (2.4.9)
44
+ base64 (~> 0.2)
45
+ karafka-core (>= 2.4.3, < 2.5.0)
46
+ karafka-rdkafka (>= 0.17.2)
47
+ waterdrop (>= 2.7.3, < 3.0.0)
41
48
  zeitwerk (~> 2.3)
42
- karafka-core (2.4.0)
43
- karafka-rdkafka (>= 0.15.0, < 0.16.0)
44
- karafka-rdkafka (0.15.0)
49
+ karafka-core (2.4.4)
50
+ karafka-rdkafka (>= 0.15.0, < 0.18.0)
51
+ karafka-rdkafka (0.17.3)
45
52
  ffi (~> 1.15)
46
53
  mini_portile2 (~> 2.6)
47
54
  rake (> 12)
48
- mini_portile2 (2.8.6)
49
- minitest (5.22.3)
55
+ mini_portile2 (2.8.7)
56
+ minitest (5.24.0)
50
57
  mutex_m (0.2.0)
51
- rack (3.0.10)
58
+ ostruct (0.6.0)
59
+ raabro (1.4.0)
60
+ rack (3.1.4)
52
61
  rack-test (2.1.0)
53
62
  rack (>= 1.3)
54
63
  rackup (0.2.3)
55
64
  rack (>= 3.0.0.beta1)
56
65
  webrick
57
66
  rake (13.2.1)
58
- roda (3.79.0)
67
+ roda (3.81.0)
59
68
  rack
60
69
  rspec (3.13.0)
61
70
  rspec-core (~> 3.13.0)
@@ -63,10 +72,10 @@ GEM
63
72
  rspec-mocks (~> 3.13.0)
64
73
  rspec-core (3.13.0)
65
74
  rspec-support (~> 3.13.0)
66
- rspec-expectations (3.13.0)
75
+ rspec-expectations (3.13.1)
67
76
  diff-lcs (>= 1.2.0, < 2.0)
68
77
  rspec-support (~> 3.13.0)
69
- rspec-mocks (3.13.0)
78
+ rspec-mocks (3.13.1)
70
79
  diff-lcs (>= 1.2.0, < 2.0)
71
80
  rspec-support (~> 3.13.0)
72
81
  rspec-support (3.13.1)
@@ -76,14 +85,15 @@ GEM
76
85
  simplecov_json_formatter (~> 0.1)
77
86
  simplecov-html (0.12.3)
78
87
  simplecov_json_formatter (0.1.4)
79
- tilt (2.3.0)
88
+ tilt (2.4.0)
80
89
  tzinfo (2.0.6)
81
90
  concurrent-ruby (~> 1.0)
82
- waterdrop (2.7.0)
83
- karafka-core (>= 2.4.0, < 3.0.0)
91
+ waterdrop (2.7.4)
92
+ karafka-core (>= 2.4.3, < 3.0.0)
93
+ karafka-rdkafka (>= 0.15.1)
84
94
  zeitwerk (~> 2.3)
85
95
  webrick (1.8.1)
86
- zeitwerk (2.6.13)
96
+ zeitwerk (2.6.17)
87
97
 
88
98
  PLATFORMS
89
99
  ruby
@@ -92,11 +102,13 @@ PLATFORMS
92
102
  DEPENDENCIES
93
103
  byebug
94
104
  factory_bot
105
+ fugit
95
106
  karafka-web!
107
+ ostruct
96
108
  rack-test
97
109
  rackup (~> 0.2)
98
110
  rspec
99
111
  simplecov
100
112
 
101
113
  BUNDLED WITH
102
- 2.5.9
114
+ 2.5.14
data/LICENSE CHANGED
@@ -1,7 +1,7 @@
1
1
  Copyright (c) Maciej Mensfeld
2
2
 
3
3
  Karafka Web is part of Karafka and it is an Open Source project licensed under the terms of
4
- the LGPLv3 license. Please see <https://github.com/karafka/karafka/blob/master/LGPL>
4
+ the LGPLv3 license. Please see <https://github.com/karafka/karafka/blob/master/LICENSE-LGPL>
5
5
  for license text.
6
6
 
7
7
  Karafka and Karafka Web have also commercial-friendly license, commercial support and commercial components.
data/bin/build_assets ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env bash
2
+
3
+ rm -f lib/karafka/web/ui/public/javascripts/application.min.*
4
+ rm -f lib/karafka/web/ui/public/stylesheets/application.min.*
5
+ rm -f lib/karafka/web/ui/public/stylesheets/libs/highlight_light.min.css.*
6
+ rm -f lib/karafka/web/ui/public/stylesheets/libs/highlight_dark.min.css.*
7
+
8
+ set -e
9
+
10
+ npx postcss \
11
+ lib/karafka/web/ui/public/stylesheets/libs/tailwind.css \
12
+ -o lib/karafka/web/ui/public/stylesheets/libs/tailwind.min.css
13
+
14
+ npx gulp
15
+
16
+ # We remove the intermediate tailwind file because its already bundled with gulp
17
+ rm lib/karafka/web/ui/public/stylesheets/libs/tailwind.min.css
18
+
19
+ compress_file() {
20
+ local input_file="$1"
21
+ local output_dir
22
+ output_dir=$(dirname "$input_file")
23
+ local base_name
24
+ base_name=$(basename "$input_file")
25
+
26
+ # Check if input file exists
27
+ if [ ! -f "$input_file" ]; then
28
+ echo "Input file not found: $input_file"
29
+ return 1
30
+ fi
31
+
32
+ # Compress with Brotli
33
+ brotli -k -q 11 "$input_file" -o "$output_dir/$base_name.br"
34
+ if [ $? -ne 0 ]; then
35
+ echo "Brotli compression failed"
36
+ return 1
37
+ fi
38
+
39
+ # Compress with Gzip
40
+ gzip -k -9 "$input_file" -c > "$output_dir/$base_name.gz"
41
+ if [ $? -ne 0 ]; then
42
+ echo "Gzip compression failed"
43
+ return 1
44
+ fi
45
+ }
46
+
47
+ compress_file "lib/karafka/web/ui/public/stylesheets/application.min.css"
48
+ compress_file "lib/karafka/web/ui/public/javascripts/application.min.js"
49
+
50
+ compress_file "lib/karafka/web/ui/public/stylesheets/libs/highlight_light.min.css"
51
+ compress_file "lib/karafka/web/ui/public/stylesheets/libs/highlight_dark.min.css"
data/bin/release ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Compiles assets in the release mode and creates the web gem
4
+
5
+ KARAFKA_RELEASE=true ./bin/build_assets
6
+ gem build karafka-web.gemspec
data/certs/cert.pem ADDED
@@ -0,0 +1,26 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MRAwDgYDVQQDDAdjb250
3
+ YWN0MRcwFQYKCZImiZPyLGQBGRYHa2FyYWZrYTESMBAGCgmSJomT8ixkARkWAmlv
4
+ MB4XDTI0MDgyMzEwMTkyMFoXDTQ5MDgxNzEwMTkyMFowPzEQMA4GA1UEAwwHY29u
5
+ dGFjdDEXMBUGCgmSJomT8ixkARkWB2thcmFma2ExEjAQBgoJkiaJk/IsZAEZFgJp
6
+ bzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjLhLjQqUlNayxkXnO+
7
+ PsmCDs/KFIzhrsYMfLZRZNaWmzV3ujljMOdDjd4snM2X06C41iVdQPWjpe3j8vVe
8
+ ZXEWR/twSbOP6Eeg8WVH2wCOo0x5i7yhVn4UBLH4JpfEMCbemVcWQ9ry9OMg4WpH
9
+ Uu4dRwxFV7hzCz3p0QfNLRI4miAxnGWcnlD98IJRjBAksTuR1Llj0vbOrDGsL9ZT
10
+ JeXP2gdRLd8SqzAFJEWrbeTBCBU7gfSh3oMg5SVDLjaqf7Kz5wC/8bDZydzanOxB
11
+ T6CDXPsCnllmvTNx2ei2T5rGYJOzJeNTmJLLK6hJWUlAvaQSvCwZRvFJ0tVGLEoS
12
+ flqSr6uGyyl1eMUsNmsH4BqPEYcAV6P2PKTv2vUR8AP0raDvZ3xL1TKvfRb8xRpo
13
+ vPopCGlY5XBWEc6QERHfVLTIVsjnls2/Ujj4h8/TSfqqYnaHKefIMLbuD/tquMjD
14
+ iWQsW2qStBV0T+U7FijKxVfrfqZP7GxQmDAc9o1iiyAa3QIDAQABo3cwdTAJBgNV
15
+ HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU3O4dTXmvE7YpAkszGzR9DdL9
16
+ sbEwHQYDVR0RBBYwFIESY29udGFjdEBrYXJhZmthLmlvMB0GA1UdEgQWMBSBEmNv
17
+ bnRhY3RAa2FyYWZrYS5pbzANBgkqhkiG9w0BAQsFAAOCAYEAVKTfoLXn7mqdSxIR
18
+ eqxcR6Huudg1jes81s1+X0uiRTR3hxxKZ3Y82cPsee9zYWyBrN8TA4KA0WILTru7
19
+ Ygxvzha0SRPsSiaKLmgOJ+61ebI4+bOORzIJLpD6GxCxu1r7MI4+0r1u1xe0EWi8
20
+ agkVo1k4Vi8cKMLm6Gl9b3wG9zQBw6fcgKwmpjKiNnOLP+OytzUANrIUJjoq6oal
21
+ TC+f/Uc0TLaRqUaW/bejxzDWWHoM3SU6aoLPuerglzp9zZVzihXwx3jPLUVKDFpF
22
+ Rl2lcBDxlpYGueGo0/oNzGJAAy6js8jhtHC9+19PD53vk7wHtFTZ/0ugDQYnwQ+x
23
+ oml2fAAuVWpTBCgOVFe6XCQpMKopzoxQ1PjKztW2KYxgJdIBX87SnL3aWuBQmhRd
24
+ i9zWxov0mr44TWegTVeypcWGd/0nxu1+QHVNHJrpqlPBRvwQsUm7fwmRInGpcaB8
25
+ ap8wNYvryYzrzvzUxIVFBVM5PacgkFqRmolCa8I7tdKQN+R1
26
+ -----END CERTIFICATE-----
@@ -9,3 +9,21 @@ en:
9
9
  commanding.pause_timeout_format: needs to be an integer bigger than 0
10
10
  key_must_be_a_symbol: All keys under the kafka settings scope need to be symbols
11
11
  commanding.kafka_format: needs to be a filled hash
12
+ ui.search.matchers_must_have_name_and_call: 'must respond to #name and its instance to #call'
13
+ ui.search.matchers_format: must be an array with matchers
14
+ ui.search.matchers_name_must_be_valid: all matchers names must be non-empty strings
15
+ ui.search.limits_format: all limits need to be integers bigger than 0
16
+ ui.search.timeout_format: must be at least 1 ms
17
+ ui.policies.messages_format: cannot be nil
18
+ ui.policies.requests_format: cannot be nil
19
+
20
+ search_form:
21
+ missing: needs to be present
22
+ timestamp_key_must_be_large_enough: 'must be a Kafka message timestamp with ms precision'
23
+ matcher_format: must match the existing matchers names
24
+ limit_format: must be one of the predefined limits
25
+ phrase_format: must be a non-empty string
26
+ offset_type_format: must be latest, offset or a timestamp
27
+ offset_format: needs to be an integer bigger than 0
28
+ partitions_format: needs to include "all" or partitions ids
29
+ timestamp_format: must be a Kafka message timestamp with ms precision
data/docker-compose.yml CHANGED
@@ -3,7 +3,7 @@ version: '2'
3
3
  services:
4
4
  kafka:
5
5
  container_name: kafka
6
- image: confluentinc/cp-kafka:7.6.1
6
+ image: confluentinc/cp-kafka:7.7.0
7
7
 
8
8
  ports:
9
9
  - 9092:9092
data/gulpfile.js ADDED
@@ -0,0 +1,73 @@
1
+ const gulp = require('gulp');
2
+ const concat = require('gulp-concat');
3
+ const uglify = require('gulp-uglify');
4
+ const through2 = require('through2');
5
+ const path = require('path');
6
+ const cleanCSS = require('gulp-clean-css');
7
+ const sourcemaps = require('gulp-sourcemaps');
8
+
9
+ // Check if we are in development mode
10
+ const isDev = process.env.KARAFKA_RELEASE !== 'true';
11
+
12
+ // Define JavaScript source files
13
+ const jsFiles = [
14
+ 'lib/karafka/web/ui/public/javascripts/libs/**/*.js',
15
+ 'lib/karafka/web/ui/public/javascripts/charts/**/*.js',
16
+ 'lib/karafka/web/ui/public/javascripts/components/**/*.js',
17
+ 'lib/karafka/web/ui/public/javascripts/application.js'
18
+ ];
19
+
20
+ // Define CSS source files
21
+ const cssFiles = [
22
+ 'lib/karafka/web/ui/public/stylesheets/libs/datepicker.min.css',
23
+ 'lib/karafka/web/ui/public/stylesheets/libs/tailwind.min.css',
24
+ 'lib/karafka/web/ui/public/stylesheets/application.css'
25
+ ];
26
+
27
+ // Custom transform stream to add file location comments for JavaScript
28
+ function addFileLocation() {
29
+ return through2.obj(function (file, enc, cb) {
30
+ if (file.isBuffer()) {
31
+ const fileLocationComment = `/*! Source: ${path.relative(__dirname, file.path)} */\n\n`;
32
+ const contents = Buffer.concat([Buffer.from(fileLocationComment), file.contents]);
33
+ file.contents = contents;
34
+ }
35
+ cb(null, file);
36
+ });
37
+ }
38
+
39
+ // JavaScript task
40
+ gulp.task('scripts', function() {
41
+ return gulp.src(jsFiles)
42
+ .pipe(isDev ? sourcemaps.init() : through2.obj()) // Initialize sourcemaps in dev
43
+ .pipe(addFileLocation()) // Add file location comments
44
+ .pipe(concat('application.min.js'))
45
+ .pipe(uglify({
46
+ output: {
47
+ comments: function(node, comment) {
48
+ const text = comment.value;
49
+ const type = comment.type;
50
+ if (type == "comment2") {
51
+ // Preserve comments starting with `/*!` or `/**`
52
+ return /@preserve|@license|@cc_on|^\!/.test(text);
53
+ }
54
+ return false;
55
+ }
56
+ }
57
+ }))
58
+ .pipe(isDev ? sourcemaps.write('.') : through2.obj()) // Write sourcemaps in dev
59
+ .pipe(gulp.dest('lib/karafka/web/ui/public/javascripts'));
60
+ });
61
+
62
+ // CSS task
63
+ gulp.task('styles', function() {
64
+ return gulp.src(cssFiles)
65
+ .pipe(isDev ? sourcemaps.init() : through2.obj()) // Initialize sourcemaps in dev
66
+ .pipe(concat('application.min.css'))
67
+ .pipe(cleanCSS({ level: 2 })) // Minify CSS
68
+ .pipe(isDev ? sourcemaps.write('.') : through2.obj()) // Write sourcemaps in dev
69
+ .pipe(gulp.dest('lib/karafka/web/ui/public/stylesheets'));
70
+ });
71
+
72
+ // Define default task to run both scripts and styles tasks
73
+ gulp.task('default', gulp.series('scripts', 'styles'));
data/karafka-web.gemspec CHANGED
@@ -14,10 +14,10 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = 'https://karafka.io'
15
15
  spec.summary = 'Karafka ecosystem Web UI interface'
16
16
  spec.description = 'Karafka ecosystem plug-and-play Web UI'
17
- spec.licenses = %w[LGPL-3.0 Commercial]
17
+ spec.licenses = %w[LGPL-3.0-only Commercial]
18
18
 
19
19
  spec.add_dependency 'erubi', '~> 1.4'
20
- spec.add_dependency 'karafka', '>= 2.4.0', '< 2.5.0'
20
+ spec.add_dependency 'karafka', '>= 2.4.9', '< 2.5.0'
21
21
  spec.add_dependency 'karafka-core', '>= 2.4.0', '< 2.5.0'
22
22
  spec.add_dependency 'roda', '~> 3.68', '>= 3.69'
23
23
  spec.add_dependency 'tilt', '~> 2.0'
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
31
31
  end
32
32
 
33
- spec.cert_chain = %w[certs/cert_chain.pem]
33
+ spec.cert_chain = %w[certs/cert.pem]
34
34
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
35
35
  spec.executables = %w[karafka-web]
36
36
  spec.require_paths = %w[lib]
@@ -76,6 +76,11 @@ module Karafka
76
76
  # Reports the metrics collected in the consumer sampler
77
77
  setting :reporter, default: Tracking::Consumers::Reporter.new
78
78
 
79
+ # Minimum number of messages to produce to produce them in sync mode
80
+ # This acts as a small back-off not to overload the system in case we would have
81
+ # extremely big number of errors and reports happening
82
+ setting :sync_threshold, default: 50
83
+
79
84
  # Samples for fetching and storing metrics samples about the consumer process
80
85
  setting :sampler, default: Tracking::Consumers::Sampler.new
81
86
 
@@ -118,6 +123,15 @@ module Karafka
118
123
  # By default we flush the states twice as often as the data reporting.
119
124
  # This will allow us to have closer to real-time reporting.
120
125
  setting :interval, default: 2_500
126
+
127
+ # Extra kafka level settings that we merge to the defaults when building the Web consumer
128
+ # group. User may want different things than we in regard to operations, thus effectively
129
+ # crippling responsiveness or stability of reporting.
130
+ setting :kafka, default: {
131
+ # We do not use at the moment the `#eofed` flag for anything, thus there is no point in
132
+ # having it set to true if user users it.
133
+ 'enable.partition.eof': false
134
+ }.freeze
121
135
  end
122
136
 
123
137
  setting :ui do
@@ -139,11 +153,6 @@ module Karafka
139
153
  )
140
154
 
141
155
  setting :visibility do
142
- # Allows to manage visibility of payload, headers and message key in the UI
143
- # In some cases you may want to limit what is being displayed due to the type of data you
144
- # are dealing with
145
- setting :filter, default: Ui::Models::VisibilityFilter.new
146
-
147
156
  # Should we display internal topics of Kafka. The once starting with `__`
148
157
  # By default we do not display them as they are not usable from regular users perspective
149
158
  setting :internal_topics, default: false
@@ -162,17 +171,16 @@ module Karafka
162
171
  # transaction that will cause given consumer group to halt processing and wait
163
172
  setting :lso_threshold, default: 5 * 60 * 1_000
164
173
 
165
- # Allows to manage visibility of payload, headers and message key in the UI
166
- # In some cases you may want to limit what is being displayed due to the type of data you
167
- # are dealing with
168
- setting :visibility_filter, default: Ui::Models::VisibilityFilter.new
169
-
170
174
  # Consider any topic matching those names as a DLQ topic for the DLQ view
171
175
  # Web UI uses auto DLQ discovery based on routing but this may not be fully operable when
172
176
  # using a multi-app setup. This config allows to add extra topics if needed without having
173
177
  # to explicitly define routing
174
178
  setting :dlq_patterns, default: [/(dlq)|(dead_letter)/i]
175
179
 
180
+ # Maximum in-memory size of payload that we will render. Anything bigger than this by
181
+ # default will not be displayed not to hang the browser. 512KB of serialized data is a lot.
182
+ setting :max_visible_payload_size, default: 524_288
183
+
176
184
  # Specific kafka settings that are tuned to operate within the Web UI interface.
177
185
  #
178
186
  # Please do not change them unless you know what you are doing as their misconfiguration
@@ -10,6 +10,8 @@ module Karafka
10
10
  # This layer is not for users extensive feedback, thus we can easily use the minimum
11
11
  # error messaging there is.
12
12
  def configure
13
+ return super if block_given?
14
+
13
15
  super do |config|
14
16
  config.error_messages = YAML.safe_load(
15
17
  File.read(
@@ -34,6 +34,7 @@ module Karafka
34
34
  required(:reporter) { |val| !val.nil? }
35
35
  required(:sampler) { |val| !val.nil? }
36
36
  required(:listeners) { |val| val.is_a?(Array) }
37
+ required(:sync_threshold) { |val| val.is_a?(Integer) && val.positive? }
37
38
  end
38
39
 
39
40
  nested(:producers) do
@@ -47,6 +48,9 @@ module Karafka
47
48
  required(:active) { |val| [true, false].include?(val) }
48
49
  # Do not update data more often not to overload and not to generate too much data
49
50
  required(:interval) { |val| val.is_a?(Integer) && val >= 1_000 }
51
+
52
+ # Extra Kafka setup for our processing consumer
53
+ required(:kafka) { |val| val.is_a?(Hash) }
50
54
  end
51
55
 
52
56
  nested(:ui) do
@@ -57,6 +61,8 @@ module Karafka
57
61
 
58
62
  required(:cache) { |val| !val.nil? }
59
63
  required(:per_page) { |val| val.is_a?(Integer) && val >= 1 && val <= 100 }
64
+ required(:max_visible_payload_size) { |val| val.is_a?(Integer) && val >= 1 }
65
+ required(:kafka) { |val| val.is_a?(Hash) }
60
66
 
61
67
  required(:dlq_patterns) do |val|
62
68
  val.is_a?(Array) &&
@@ -64,7 +70,6 @@ module Karafka
64
70
  end
65
71
 
66
72
  nested(:visibility) do
67
- required(:filter) { |val| !val.nil? }
68
73
  required(:internal_topics) { |val| [true, false].include?(val) }
69
74
  required(:active_topics_cluster_lags_only) { |val| [true, false].include?(val) }
70
75
  end