karafka-web 0.9.1 → 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
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