karafka-web 0.8.2 → 0.9.0

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 (272) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +3 -1
  3. data/.github/workflows/ci.yml +5 -16
  4. data/.ruby-version +1 -1
  5. data/CHANGELOG.md +40 -0
  6. data/Gemfile.lock +23 -25
  7. data/LICENSE +3 -3
  8. data/bin/rspecs +1 -1
  9. data/config/locales/pro_errors.yml +11 -0
  10. data/config/locales/slogans.yml +62 -0
  11. data/docker-compose.yml +1 -1
  12. data/karafka-web.gemspec +4 -2
  13. data/lib/karafka/web/app.rb +1 -1
  14. data/lib/karafka/web/config.rb +23 -3
  15. data/lib/karafka/web/contracts/config.rb +7 -1
  16. data/lib/karafka/web/management/actions/create_topics.rb +21 -0
  17. data/lib/karafka/web/management/actions/delete_topics.rb +1 -0
  18. data/lib/karafka/web/management/actions/enable.rb +12 -6
  19. data/lib/karafka/web/management/migrations/0_base.rb +1 -1
  20. data/lib/karafka/web/pro/commanding/commands/base.rb +33 -0
  21. data/lib/karafka/web/pro/commanding/commands/probe.rb +41 -0
  22. data/lib/karafka/web/pro/commanding/commands/quiet.rb +31 -0
  23. data/lib/karafka/web/pro/commanding/commands/stop.rb +31 -0
  24. data/lib/karafka/web/pro/commanding/config.rb +51 -0
  25. data/lib/karafka/web/pro/commanding/contracts/config.rb +56 -0
  26. data/lib/karafka/web/pro/commanding/dispatcher.rb +103 -0
  27. data/lib/karafka/web/pro/commanding/listener.rb +97 -0
  28. data/lib/karafka/web/pro/commanding/manager.rb +98 -0
  29. data/lib/karafka/web/pro/commanding/matcher.rb +50 -0
  30. data/lib/karafka/web/pro/commanding.rb +40 -0
  31. data/lib/karafka/web/pro/loader.rb +40 -0
  32. data/lib/karafka/web/{ui/pro → pro/ui}/app.rb +103 -22
  33. data/lib/karafka/web/{ui/pro/controllers/cluster.rb → pro/ui/controllers/base_controller.rb} +4 -5
  34. data/lib/karafka/web/pro/ui/controllers/cluster_controller.rb +54 -0
  35. data/lib/karafka/web/pro/ui/controllers/commanding_controller.rb +118 -0
  36. data/lib/karafka/web/pro/ui/controllers/commands_controller.rb +96 -0
  37. data/lib/karafka/web/{ui/pro/controllers/consumers.rb → pro/ui/controllers/consumers_controller.rb} +31 -4
  38. data/lib/karafka/web/{ui/pro/controllers/dashboard.rb → pro/ui/controllers/dashboard_controller.rb} +5 -3
  39. data/lib/karafka/web/pro/ui/controllers/dlq_controller.rb +60 -0
  40. data/lib/karafka/web/{ui/pro/controllers/errors.rb → pro/ui/controllers/errors_controller.rb} +5 -7
  41. data/lib/karafka/web/{ui/pro/controllers/explorer.rb → pro/ui/controllers/explorer_controller.rb} +24 -19
  42. data/lib/karafka/web/{ui/pro/controllers/health.rb → pro/ui/controllers/health_controller.rb} +16 -3
  43. data/lib/karafka/web/{ui/pro/controllers/jobs.rb → pro/ui/controllers/jobs_controller.rb} +4 -4
  44. data/lib/karafka/web/{ui/pro/controllers/messages.rb → pro/ui/controllers/messages_controller.rb} +8 -6
  45. data/lib/karafka/web/{ui/pro/controllers/routing.rb → pro/ui/controllers/routing_controller.rb} +6 -22
  46. data/lib/karafka/web/{ui/pro/controllers/status.rb → pro/ui/controllers/status_controller.rb} +3 -3
  47. data/lib/karafka/web/pro/ui/controllers/topics_controller.rb +99 -0
  48. data/lib/karafka/web/pro/ui/lib/patterns_detector.rb +50 -0
  49. data/lib/karafka/web/pro/ui/views/cluster/_breadcrumbs.erb +29 -0
  50. data/lib/karafka/web/pro/ui/views/cluster/_broker.erb +13 -0
  51. data/lib/karafka/web/pro/ui/views/cluster/_config.erb +13 -0
  52. data/lib/karafka/web/pro/ui/views/cluster/_tabs.erb +27 -0
  53. data/lib/karafka/web/pro/ui/views/cluster/brokers.erb +27 -0
  54. data/lib/karafka/web/pro/ui/views/cluster/index.erb +27 -0
  55. data/lib/karafka/web/pro/ui/views/cluster/show.erb +27 -0
  56. data/lib/karafka/web/pro/ui/views/commands/_backtrace.erb +20 -0
  57. data/lib/karafka/web/pro/ui/views/commands/_breadcrumbs.erb +21 -0
  58. data/lib/karafka/web/pro/ui/views/commands/_command.erb +60 -0
  59. data/lib/karafka/web/pro/ui/views/commands/_command_details.erb +11 -0
  60. data/lib/karafka/web/pro/ui/views/commands/_details.erb +26 -0
  61. data/lib/karafka/web/pro/ui/views/commands/_empty.erb +3 -0
  62. data/lib/karafka/web/pro/ui/views/commands/_incompatible_schema.erb +14 -0
  63. data/lib/karafka/web/pro/ui/views/commands/_metadata.erb +50 -0
  64. data/lib/karafka/web/pro/ui/views/commands/_table.erb +23 -0
  65. data/lib/karafka/web/pro/ui/views/commands/index.erb +17 -0
  66. data/lib/karafka/web/pro/ui/views/commands/show.erb +38 -0
  67. data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/_breadcrumbs.erb +20 -4
  68. data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/_consumer.erb +2 -21
  69. data/lib/karafka/web/pro/ui/views/consumers/_consumer_controls.erb +78 -0
  70. data/lib/karafka/web/pro/ui/views/consumers/_consumer_performance.erb +59 -0
  71. data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/_counters.erb +7 -5
  72. data/lib/karafka/web/pro/ui/views/consumers/_tabs.erb +35 -0
  73. data/lib/karafka/web/pro/ui/views/consumers/consumer/_commands.erb +32 -0
  74. data/lib/karafka/web/pro/ui/views/consumers/consumer/_no_jobs.erb +7 -0
  75. data/lib/karafka/web/pro/ui/views/consumers/consumer/_no_subscriptions.erb +7 -0
  76. data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/consumer/_subscription_group.erb +13 -8
  77. data/lib/karafka/web/pro/ui/views/consumers/consumer/_title.erb +5 -0
  78. data/lib/karafka/web/pro/ui/views/consumers/controls.erb +67 -0
  79. data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/details.erb +6 -1
  80. data/lib/karafka/web/pro/ui/views/consumers/index.erb +39 -0
  81. data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/pending_jobs.erb +15 -7
  82. data/lib/karafka/web/pro/ui/views/consumers/performance.erb +52 -0
  83. data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/running_jobs.erb +15 -7
  84. data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/subscriptions.erb +6 -1
  85. data/lib/karafka/web/{ui/pro → pro/ui}/views/dashboard/index.erb +10 -10
  86. data/lib/karafka/web/pro/ui/views/dlq/_no_topics.erb +7 -0
  87. data/lib/karafka/web/{ui/pro → pro/ui}/views/dlq/index.erb +1 -1
  88. data/lib/karafka/web/{ui/pro → pro/ui}/views/errors/_error.erb +2 -6
  89. data/lib/karafka/web/pro/ui/views/errors/_table.erb +23 -0
  90. data/lib/karafka/web/pro/ui/views/explorer/_failed_deserialization.erb +4 -0
  91. data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/_message.erb +7 -1
  92. data/lib/karafka/web/pro/ui/views/explorer/_no_topics.erb +5 -0
  93. data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/index.erb +1 -6
  94. data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/message/_metadata.erb +33 -9
  95. data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/message/_payload.erb +4 -4
  96. data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/message/_payload_actions.erb +1 -1
  97. data/lib/karafka/web/pro/ui/views/explorer/messages/_headers.erb +33 -0
  98. data/lib/karafka/web/pro/ui/views/explorer/messages/_key.erb +20 -0
  99. data/lib/karafka/web/pro/ui/views/explorer/partition/_cleaned.erb +5 -0
  100. data/lib/karafka/web/pro/ui/views/explorer/partition/_empty.erb +5 -0
  101. data/lib/karafka/web/pro/ui/views/explorer/partition/_messages.erb +21 -0
  102. data/lib/karafka/web/pro/ui/views/explorer/topic/_empty.erb +5 -0
  103. data/lib/karafka/web/pro/ui/views/explorer/topic/_limited.erb +10 -0
  104. data/lib/karafka/web/{ui/pro → pro/ui}/views/health/_breadcrumbs.erb +8 -0
  105. data/lib/karafka/web/pro/ui/views/health/_no_data.erb +7 -0
  106. data/lib/karafka/web/{ui/pro → pro/ui}/views/health/_partition.erb +1 -1
  107. data/lib/karafka/web/{ui/pro → pro/ui}/views/health/_partition_lags.erb +6 -3
  108. data/lib/karafka/web/{ui/pro → pro/ui}/views/health/_tabs.erb +11 -1
  109. data/lib/karafka/web/{ui/pro → pro/ui}/views/health/changes.erb +13 -8
  110. data/lib/karafka/web/pro/ui/views/health/cluster_lags.erb +54 -0
  111. data/lib/karafka/web/{ui/pro → pro/ui}/views/health/lags.erb +14 -8
  112. data/lib/karafka/web/{ui/pro → pro/ui}/views/health/offsets.erb +15 -12
  113. data/lib/karafka/web/{ui/pro → pro/ui}/views/health/overview.erb +21 -7
  114. data/lib/karafka/web/{ui/pro → pro/ui}/views/jobs/_job.erb +1 -1
  115. data/lib/karafka/web/pro/ui/views/jobs/_no_jobs.erb +7 -0
  116. data/lib/karafka/web/{ui/pro → pro/ui}/views/jobs/pending.erb +12 -8
  117. data/lib/karafka/web/{ui/pro → pro/ui}/views/jobs/running.erb +12 -8
  118. data/lib/karafka/web/{ui/pro → pro/ui}/views/routing/_consumer_group.erb +2 -2
  119. data/lib/karafka/web/{ui/pro → pro/ui}/views/routing/index.erb +1 -1
  120. data/lib/karafka/web/{ui/pro → pro/ui}/views/routing/show.erb +1 -1
  121. data/lib/karafka/web/{ui/pro → pro/ui}/views/shared/_navigation.erb +14 -0
  122. data/lib/karafka/web/pro/ui/views/topics/_breadcrumbs.erb +37 -0
  123. data/lib/karafka/web/pro/ui/views/topics/_partition.erb +16 -0
  124. data/lib/karafka/web/pro/ui/views/topics/_tabs.erb +37 -0
  125. data/lib/karafka/web/pro/ui/views/topics/_topic.erb +12 -0
  126. data/lib/karafka/web/pro/ui/views/topics/config.erb +29 -0
  127. data/lib/karafka/web/pro/ui/views/topics/distribution/_badges.erb +7 -0
  128. data/lib/karafka/web/pro/ui/views/topics/distribution/_chart.erb +2 -0
  129. data/lib/karafka/web/pro/ui/views/topics/distribution/_empty_partitions.erb +1 -0
  130. data/lib/karafka/web/pro/ui/views/topics/distribution/_limited.erb +10 -0
  131. data/lib/karafka/web/pro/ui/views/topics/distribution/_partition.erb +10 -0
  132. data/lib/karafka/web/pro/ui/views/topics/distribution.erb +47 -0
  133. data/lib/karafka/web/pro/ui/views/topics/index.erb +16 -0
  134. data/lib/karafka/web/pro/ui/views/topics/replication.erb +28 -0
  135. data/lib/karafka/web/processing/consumers/aggregators/base.rb +1 -1
  136. data/lib/karafka/web/processing/consumers/aggregators/metrics.rb +1 -1
  137. data/lib/karafka/web/processing/consumers/aggregators/state.rb +4 -4
  138. data/lib/karafka/web/tracking/consumers/contracts/report.rb +1 -1
  139. data/lib/karafka/web/tracking/consumers/listeners/booting.rb +3 -1
  140. data/lib/karafka/web/tracking/consumers/listeners/errors.rb +2 -2
  141. data/lib/karafka/web/tracking/consumers/reporter.rb +3 -3
  142. data/lib/karafka/web/tracking/consumers/sampler.rb +2 -2
  143. data/lib/karafka/web/tracking/contracts/error.rb +1 -1
  144. data/lib/karafka/web/tracking/producers/listeners/booting.rb +3 -1
  145. data/lib/karafka/web/tracking/producers/listeners/errors.rb +2 -2
  146. data/lib/karafka/web/tracking/producers/reporter.rb +1 -1
  147. data/lib/karafka/web/tracking/producers/sampler.rb +1 -1
  148. data/lib/karafka/web/tracking/sampler.rb +3 -3
  149. data/lib/karafka/web/ui/app.rb +13 -9
  150. data/lib/karafka/web/ui/base.rb +1 -0
  151. data/lib/karafka/web/ui/controllers/{base.rb → base_controller.rb} +15 -2
  152. data/lib/karafka/web/ui/controllers/{become_pro.rb → become_pro_controller.rb} +1 -1
  153. data/lib/karafka/web/ui/controllers/{cluster.rb → cluster_controller.rb} +4 -4
  154. data/lib/karafka/web/ui/controllers/{consumers.rb → consumers_controller.rb} +3 -3
  155. data/lib/karafka/web/ui/controllers/{dashboard.rb → dashboard_controller.rb} +1 -1
  156. data/lib/karafka/web/ui/controllers/{errors.rb → errors_controller.rb} +2 -2
  157. data/lib/karafka/web/ui/controllers/{jobs.rb → jobs_controller.rb} +5 -5
  158. data/lib/karafka/web/ui/controllers/{routing.rb → routing_controller.rb} +2 -2
  159. data/lib/karafka/web/ui/controllers/{status.rb → status_controller.rb} +1 -1
  160. data/lib/karafka/web/ui/helpers/alerts_helper.rb +23 -0
  161. data/lib/karafka/web/ui/helpers/application_helper.rb +53 -1
  162. data/lib/karafka/web/ui/lib/paginations/offset_based.rb +3 -4
  163. data/lib/karafka/web/ui/lib/safe_runner.rb +59 -0
  164. data/lib/karafka/web/ui/models/broker.rb +66 -0
  165. data/lib/karafka/web/ui/models/health.rb +28 -2
  166. data/lib/karafka/web/ui/models/message.rb +9 -3
  167. data/lib/karafka/web/ui/models/process.rb +10 -5
  168. data/lib/karafka/web/ui/models/processes.rb +2 -2
  169. data/lib/karafka/web/ui/models/status.rb +1 -1
  170. data/lib/karafka/web/ui/models/topic.rb +78 -0
  171. data/lib/karafka/web/ui/public/javascripts/application.js +18 -1
  172. data/lib/karafka/web/ui/public/javascripts/charts/data_formatting_utility.js +71 -0
  173. data/lib/karafka/web/ui/public/javascripts/charts/dataset_state_manager.js +49 -0
  174. data/lib/karafka/web/ui/public/javascripts/charts/types/bar.js +123 -0
  175. data/lib/karafka/web/ui/public/javascripts/charts/types/line.js +143 -0
  176. data/lib/karafka/web/ui/public/javascripts/charts.js +10 -325
  177. data/lib/karafka/web/ui/public/javascripts/live_poll.js +5 -5
  178. data/lib/karafka/web/ui/public/javascripts/tabs_manager.js +57 -0
  179. data/lib/karafka/web/ui/public/stylesheets/application.css +7 -6
  180. data/lib/karafka/web/ui/views/cluster/_breadcrumbs.erb +3 -3
  181. data/lib/karafka/web/ui/views/cluster/_no_partitions.erb +1 -3
  182. data/lib/karafka/web/ui/views/cluster/_tabs.erb +3 -3
  183. data/lib/karafka/web/ui/views/cluster/brokers.erb +19 -19
  184. data/lib/karafka/web/ui/views/cluster/replication.erb +37 -0
  185. data/lib/karafka/web/ui/views/consumers/_assignments_badges.erb +24 -0
  186. data/lib/karafka/web/ui/views/consumers/_consumer.erb +2 -15
  187. data/lib/karafka/web/ui/views/consumers/_counters.erb +1 -1
  188. data/lib/karafka/web/ui/views/consumers/_summary.erb +5 -5
  189. data/lib/karafka/web/ui/views/consumers/index.erb +22 -20
  190. data/lib/karafka/web/ui/views/dashboard/index.erb +9 -9
  191. data/lib/karafka/web/ui/views/errors/_cleaned.erb +1 -3
  192. data/lib/karafka/web/ui/views/errors/_error.erb +2 -6
  193. data/lib/karafka/web/ui/views/errors/_no_errors.erb +1 -3
  194. data/lib/karafka/web/ui/views/errors/index.erb +22 -20
  195. data/lib/karafka/web/ui/views/jobs/_job.erb +4 -1
  196. data/lib/karafka/web/ui/views/jobs/_no_jobs.erb +1 -3
  197. data/lib/karafka/web/ui/views/jobs/pending.erb +5 -4
  198. data/lib/karafka/web/ui/views/jobs/running.erb +5 -4
  199. data/lib/karafka/web/ui/views/routing/_consumer_group.erb +2 -2
  200. data/lib/karafka/web/ui/views/routing/index.erb +1 -1
  201. data/lib/karafka/web/ui/views/routing/show.erb +1 -1
  202. data/lib/karafka/web/ui/views/shared/_become_pro.erb +3 -3
  203. data/lib/karafka/web/ui/views/shared/_header.erb +16 -10
  204. data/lib/karafka/web/ui/views/shared/_navigation.erb +17 -3
  205. data/lib/karafka/web/ui/views/shared/_not_a_message.erb +5 -0
  206. data/lib/karafka/web/ui/views/shared/alerts/_info.erb +3 -0
  207. data/lib/karafka/web/ui/views/shared/charts/_bar.erb +7 -0
  208. data/lib/karafka/web/ui/views/shared/{_chart.erb → charts/_line.erb} +1 -1
  209. data/lib/karafka/web/ui/views/shared/exceptions/not_found.erb +1 -1
  210. data/lib/karafka/web/ui/views/status/show.erb +1 -1
  211. data/lib/karafka/web/version.rb +1 -1
  212. data/lib/karafka/web.rb +17 -1
  213. data.tar.gz.sig +0 -0
  214. metadata +190 -121
  215. metadata.gz.sig +0 -0
  216. data/lib/karafka/web/ui/pro/controllers/dlq.rb +0 -43
  217. data/lib/karafka/web/ui/pro/views/consumers/consumer/_no_jobs.erb +0 -9
  218. data/lib/karafka/web/ui/pro/views/consumers/consumer/_no_subscriptions.erb +0 -9
  219. data/lib/karafka/web/ui/pro/views/consumers/index.erb +0 -36
  220. data/lib/karafka/web/ui/pro/views/dlq/_no_topics.erb +0 -9
  221. data/lib/karafka/web/ui/pro/views/errors/_table.erb +0 -21
  222. data/lib/karafka/web/ui/pro/views/explorer/_failed_deserialization.erb +0 -4
  223. data/lib/karafka/web/ui/pro/views/explorer/_no_topics.erb +0 -7
  224. data/lib/karafka/web/ui/pro/views/explorer/messages/_headers.erb +0 -15
  225. data/lib/karafka/web/ui/pro/views/explorer/messages/_key.erb +0 -12
  226. data/lib/karafka/web/ui/pro/views/explorer/partition/_cleaned.erb +0 -3
  227. data/lib/karafka/web/ui/pro/views/explorer/partition/_empty.erb +0 -3
  228. data/lib/karafka/web/ui/pro/views/explorer/partition/_messages.erb +0 -19
  229. data/lib/karafka/web/ui/pro/views/explorer/topic/_empty.erb +0 -3
  230. data/lib/karafka/web/ui/pro/views/explorer/topic/_limited.erb +0 -4
  231. data/lib/karafka/web/ui/pro/views/health/_no_data.erb +0 -9
  232. data/lib/karafka/web/ui/pro/views/jobs/_no_jobs.erb +0 -9
  233. data/lib/karafka/web/ui/public/javascripts/tabs.js +0 -59
  234. data/lib/karafka/web/ui/views/cluster/topics.erb +0 -35
  235. /data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/consumer/_consumer_group.erb +0 -0
  236. /data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/consumer/_job.erb +0 -0
  237. /data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/consumer/_metrics.erb +0 -0
  238. /data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/consumer/_partition.erb +0 -0
  239. /data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/consumer/_stopped.erb +0 -0
  240. /data/lib/karafka/web/{ui/pro → pro/ui}/views/consumers/consumer/_tabs.erb +0 -0
  241. /data/lib/karafka/web/{ui/pro → pro/ui}/views/dlq/_breadcrumbs.erb +0 -0
  242. /data/lib/karafka/web/{ui/pro → pro/ui}/views/dlq/_topic.erb +0 -0
  243. /data/lib/karafka/web/{ui/pro → pro/ui}/views/errors/_breadcrumbs.erb +0 -0
  244. /data/lib/karafka/web/{ui/pro → pro/ui}/views/errors/_partition_option.erb +0 -0
  245. /data/lib/karafka/web/{ui/pro → pro/ui}/views/errors/_title_with_select.erb +0 -0
  246. /data/lib/karafka/web/{ui/pro → pro/ui}/views/errors/index.erb +0 -0
  247. /data/lib/karafka/web/{ui/pro → pro/ui}/views/errors/partition.erb +0 -0
  248. /data/lib/karafka/web/{ui/pro → pro/ui}/views/errors/show.erb +0 -0
  249. /data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/_breadcrumbs.erb +0 -0
  250. /data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/_filtered.erb +0 -0
  251. /data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/_partition_option.erb +0 -0
  252. /data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/_topic.erb +0 -0
  253. /data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/message/_message_actions.erb +0 -0
  254. /data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/messages/_detail.erb +0 -0
  255. /data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/partition/_details.erb +0 -0
  256. /data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/partition.erb +0 -0
  257. /data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/show.erb +0 -0
  258. /data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/topic/_details.erb +0 -0
  259. /data/lib/karafka/web/{ui/pro → pro/ui}/views/explorer/topic.erb +0 -0
  260. /data/lib/karafka/web/{ui/pro → pro/ui}/views/health/_consumer_group_header.erb +0 -0
  261. /data/lib/karafka/web/{ui/pro → pro/ui}/views/health/_partition_offset.erb +0 -0
  262. /data/lib/karafka/web/{ui/pro → pro/ui}/views/health/_partition_times.erb +0 -0
  263. /data/lib/karafka/web/{ui/pro → pro/ui}/views/routing/_detail.erb +0 -0
  264. /data/lib/karafka/web/{ui/pro → pro/ui}/views/routing/_topic.erb +0 -0
  265. /data/lib/karafka/web/ui/public/javascripts/{bootstrap.min.js → libs/bootstrap.min.js} +0 -0
  266. /data/lib/karafka/web/ui/public/javascripts/{chart.min.js → libs/chart.min.js} +0 -0
  267. /data/lib/karafka/web/ui/public/javascripts/{datepicker.js → libs/datepicker.js} +0 -0
  268. /data/lib/karafka/web/ui/public/javascripts/{highlight.min.js → libs/highlight.min.js} +0 -0
  269. /data/lib/karafka/web/ui/public/javascripts/{timeago.min.js → libs/timeago.min.js} +0 -0
  270. /data/lib/karafka/web/ui/public/stylesheets/{bootstrap.min.css → libs/bootstrap.min.css} +0 -0
  271. /data/lib/karafka/web/ui/public/stylesheets/{datepicker.min.css → libs/datepicker.min.css} +0 -0
  272. /data/lib/karafka/web/ui/public/stylesheets/{highlight.min.css → libs/highlight.min.css} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 457da6c2e847225be5d27f3a30fcf8f99a4a132f8109204315ac042e24d1bd35
4
- data.tar.gz: c277f44c30a34ee2748ac4e9b56833814b522da87f6cc1841d21aca618af58be
3
+ metadata.gz: 44b742d8357ff3fe62967b1a64d7f5f44e8a3f8c7c4206dee13af6d537f50c28
4
+ data.tar.gz: 6c3c2509188837dc16e02c8870d79d75ed6bc9ee865ac99db7ae0ddfc81b5985
5
5
  SHA512:
6
- metadata.gz: 9ff1df82abd7f4f9f7002ae8a9e3e4e3fef2a71fbac820ff700d52c1926a5a81bf8e141ac6b928693d6276d8c16ef496efc11cada7574da217f4fb31efe31b5b
7
- data.tar.gz: 3f39b8155794c25a39464d71c35f33ee82e6b59f92b55301f20ff69f1c58bc2cdf32af976720c548c2262893e25e0f8c8d31b8c033a248feb929bd088bc46d6c
6
+ metadata.gz: 9f3b07cad8c42eecde5ece84cd536db986d69a4e392610ca0eeaf2fcd3f2e07beab58023c1f5b643a9ed6c7deffbc0c53378af7cf6232c4aba0cdbb8537905c7
7
+ data.tar.gz: b9cd0b3bec95ded4ecca47db054278d95d405ffc04c002c9bed0d0526c19ca7518fc7083d951c2a0be5e76c4398b44336e6e4de0edd0cd67fad0312ae206299a
checksums.yaml.gz.sig CHANGED
@@ -1 +1,3 @@
1
- v��0z�`,�������J��+����^��j�:��21ȡ����;�С���#`X��J��.5ϹT.�w ##0����N�Ӭ{����He0g��t�it���[x�Ƴe�򔥋����h�ۻcS&� ;��
1
+ �ދ��'!����@F6|�$OZ�4z�8�A�ƒ���م�@:�µ��y�Ss�Lnϵ�1ۇ��=R�T��b%�5�Hy�]�֮g���s]�7�~]XM�ykg*>!O=�-o���q:��P�����꿇�%���݋~>��C�<�w����F带�� �2�Z�����IW� ��{�Up-�H�3O��6O&Kb9��
2
+ &��78��7�3�"ʺ����2R=07,����.jq�~��:�J2W�����Z�jBh䎣��S׏e�< b�@��X�Z�𪫔��?'�����h� �IE
3
+ �N����,\,�-R����1}v�^�q��ْr{y�@|��Br`���U���� _^�k@��]1�{A$?�x�a�7�
@@ -26,7 +26,6 @@ jobs:
26
26
  - '3.2'
27
27
  - '3.1'
28
28
  - '3.0'
29
- - '2.7'
30
29
  include:
31
30
  - ruby: '3.3'
32
31
  coverage: 'true'
@@ -35,9 +34,9 @@ jobs:
35
34
  - name: Install package dependencies
36
35
  run: "[ -e $APT_DEPS ] || sudo apt-get install -y --no-install-recommends $APT_DEPS"
37
36
 
38
- - name: Start Kafka with docker-compose
37
+ - name: Start Kafka with docker compose
39
38
  run: |
40
- docker-compose up -d || (sleep 5 && docker-compose up -d)
39
+ docker compose up -d || (sleep 5 && docker compose up -d)
41
40
 
42
41
  - name: Set up Ruby
43
42
  uses: ruby/setup-ruby@v1
@@ -48,25 +47,15 @@ jobs:
48
47
 
49
48
  - name: Install latest bundler
50
49
  run: |
51
- if [[ "$(ruby -v | awk '{print $2}')" == 2.7.8* ]]; then
52
- gem install bundler -v 2.4.22 --no-document
53
- gem update --system 3.4.22 --no-document
54
- else
55
- gem install bundler --no-document
56
- gem update --system --no-document
57
- fi
50
+ gem install bundler --no-document
51
+ gem update --system --no-document
58
52
 
59
53
  bundle config set without 'tools benchmarks docs'
60
54
 
61
55
  - name: Bundle install
62
56
  run: |
63
57
  bundle config set without development
64
-
65
- if [[ "$(ruby -v | awk '{print $2}')" == 2.7.8* ]]; then
66
- BUNDLER_VERSION=2.4.22 bundle install --jobs 4 --retry 3
67
- else
68
- bundle install --jobs 4 --retry 3
69
- fi
58
+ bundle install --jobs 4 --retry 3
70
59
 
71
60
  - name: Wait for Kafka
72
61
  run: |
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.3.0
1
+ 3.3.1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # Karafka Web changelog
2
2
 
3
+ ## 0.9.0 (2024-04-26)
4
+ - **[Breaking]** Drop Ruby `2.7` support.
5
+ - **[Feature]** Provide ability to stop and quiet running consumers (Pro).
6
+ - **[Feature]** Provide ability to probe (get backtraces) of any running consumer (Pro).
7
+ - **[Feature]** Provide cluster lags in Health (Pro).
8
+ - **[Feature]** Provide ability to inspect cluster nodes configuration (Pro).
9
+ - **[Feature]** Provide ability to inspect cluster topics configuration (Pro).
10
+ - **[Feature]** Provide messages distribution graph statistics for topics (Pro).
11
+ - [Enhancement] Provide first offset in the OSS jobs tab.
12
+ - [Enhancement] Support failover for custom deserialization of headers and key in the explorer (Pro).
13
+ - [Enhancement] Support failover for custom deserialization of headers and key in the explorer (Pro).
14
+ - [Enhancement] Limit length of `key` presented in the list view of the explorer.
15
+ - [Enhancement] Improve responsiveness on big screens by increasing max width.
16
+ - [Enhancement] Auto-qualify topics with dlq/dead_letter case insensitive name components to DLQ view.
17
+ - [Enhancement] Make tables responsive.
18
+ - [Enhancement] Provide page titles for ease of navigation.
19
+ - [Change] Rename Cluster => Topics to Cluster => Replication to better align with what is shows.
20
+ - [Change] Make support messages more entertaining.
21
+ - [Change] Rename `processing.consumer_group` to `admin.group_id` for consistency with Karafka.
22
+ - [Refactor] Normalize what is process name and process id.
23
+ - [Refactor] Create one `pro/` namespace for all Web related sub-modules.
24
+ - [Refactor] Extract alerts into a common component.
25
+ - [Refactor] Generalize charts generation.
26
+ - [Fix] Fix invalid return when paginating with offsets.
27
+ - [Fix] Improve responsiveness of summary in the consumers view for lower resolutions.
28
+ - [Fix] Align pages titles format.
29
+ - [Fix] Fix missing link from lag counter to Health.
30
+ - [Fix] Fix a case where on mobile charts would not load correctly.
31
+ - [Fix] Fix cases where long consumer names would break UI.
32
+ - [Fix] Explorer deserializer wrongly selected for pattern matched topics.
33
+ - [Fix] Fix 404 error page invalid recommendation of `install` instead of `migrate`.
34
+ - [Fix] Fix dangling `console.log`.
35
+ - [Fix] Fix a case where consumer assignments would not be truncated on the consumers view.
36
+
37
+ ### Upgrade Notes
38
+
39
+ This is a **major** release that brings many things to the table.
40
+
41
+ This version of the Karafka Web UI should be upgraded together with Karafka. All upgrade documentation for Karafka and Web UI `0.9` can be found [here](https://karafka.io/docs/Upgrades-2.4/).
42
+
3
43
  ## 0.8.2 (2024-02-16)
4
44
  - [Enhancement] Defer scheduler background thread creation until needed allowing for forks.
5
45
  - [Enhancement] Tag forks with fork indication + ppid reference when operating in swarm.
data/Gemfile.lock CHANGED
@@ -1,17 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- karafka-web (0.8.2)
4
+ karafka-web (0.9.0)
5
5
  erubi (~> 1.4)
6
- karafka (>= 2.3.0, < 2.4.0)
7
- karafka-core (>= 2.3.0, < 2.4.0)
6
+ karafka (>= 2.4.0, < 2.5.0)
7
+ karafka-core (>= 2.4.0, < 2.5.0)
8
8
  roda (~> 3.68, >= 3.69)
9
9
  tilt (~> 2.0)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- activesupport (7.1.3)
14
+ activesupport (7.1.3.2)
15
15
  base64
16
16
  bigdecimal
17
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -22,41 +22,40 @@ GEM
22
22
  mutex_m
23
23
  tzinfo (~> 2.0)
24
24
  base64 (0.2.0)
25
- bigdecimal (3.1.6)
25
+ bigdecimal (3.1.7)
26
26
  byebug (11.1.3)
27
27
  concurrent-ruby (1.2.3)
28
28
  connection_pool (2.4.1)
29
29
  diff-lcs (1.5.1)
30
30
  docile (1.4.0)
31
- drb (2.2.0)
32
- ruby2_keywords
31
+ drb (2.2.1)
33
32
  erubi (1.12.0)
34
- factory_bot (6.4.5)
33
+ factory_bot (6.4.6)
35
34
  activesupport (>= 5.0.0)
36
35
  ffi (1.16.3)
37
- i18n (1.14.1)
36
+ i18n (1.14.4)
38
37
  concurrent-ruby (~> 1.0)
39
- karafka (2.3.0)
40
- karafka-core (>= 2.3.0, < 2.4.0)
41
- waterdrop (>= 2.6.12, < 3.0.0)
38
+ karafka (2.4.0)
39
+ karafka-core (>= 2.4.0, < 2.5.0)
40
+ waterdrop (>= 2.7.0, < 3.0.0)
42
41
  zeitwerk (~> 2.3)
43
- karafka-core (2.3.0)
44
- karafka-rdkafka (>= 0.14.8, < 0.15.0)
45
- karafka-rdkafka (0.14.9)
42
+ karafka-core (2.4.0)
43
+ karafka-rdkafka (>= 0.15.0, < 0.16.0)
44
+ karafka-rdkafka (0.15.0)
46
45
  ffi (~> 1.15)
47
46
  mini_portile2 (~> 2.6)
48
47
  rake (> 12)
49
- mini_portile2 (2.8.5)
50
- minitest (5.22.0)
48
+ mini_portile2 (2.8.6)
49
+ minitest (5.22.3)
51
50
  mutex_m (0.2.0)
52
- rack (3.0.9)
51
+ rack (3.0.10)
53
52
  rack-test (2.1.0)
54
53
  rack (>= 1.3)
55
54
  rackup (0.2.3)
56
55
  rack (>= 3.0.0.beta1)
57
56
  webrick
58
- rake (13.1.0)
59
- roda (3.76.0)
57
+ rake (13.2.1)
58
+ roda (3.79.0)
60
59
  rack
61
60
  rspec (3.13.0)
62
61
  rspec-core (~> 3.13.0)
@@ -70,8 +69,7 @@ GEM
70
69
  rspec-mocks (3.13.0)
71
70
  diff-lcs (>= 1.2.0, < 2.0)
72
71
  rspec-support (~> 3.13.0)
73
- rspec-support (3.13.0)
74
- ruby2_keywords (0.0.5)
72
+ rspec-support (3.13.1)
75
73
  simplecov (0.22.0)
76
74
  docile (~> 1.1)
77
75
  simplecov-html (~> 0.11)
@@ -81,8 +79,8 @@ GEM
81
79
  tilt (2.3.0)
82
80
  tzinfo (2.0.6)
83
81
  concurrent-ruby (~> 1.0)
84
- waterdrop (2.6.14)
85
- karafka-core (>= 2.2.3, < 3.0.0)
82
+ waterdrop (2.7.0)
83
+ karafka-core (>= 2.4.0, < 3.0.0)
86
84
  zeitwerk (~> 2.3)
87
85
  webrick (1.8.1)
88
86
  zeitwerk (2.6.13)
@@ -101,4 +99,4 @@ DEPENDENCIES
101
99
  simplecov
102
100
 
103
101
  BUNDLED WITH
104
- 2.5.6
102
+ 2.5.9
data/LICENSE CHANGED
@@ -4,14 +4,14 @@ Karafka Web is part of Karafka and it is an Open Source project licensed under t
4
4
  the LGPLv3 license. Please see <https://github.com/karafka/karafka/blob/master/LGPL>
5
5
  for license text.
6
6
 
7
- Karafka has also commercial-friendly license, commercial support and commercial components.
7
+ Karafka and Karafka Web have also commercial-friendly license, commercial support and commercial components.
8
8
 
9
- All of the commercial components are present in the lib/karafka/pro and lib/karafka/web/ui/pro
9
+ All of the commercial components are present in the lib/karafka/pro and lib/karafka/web/pro
10
10
  directory of this repository and their usage requires commercial license agreement.
11
11
 
12
12
  By sending a pull request to the pro components, you are agreeing to transfer the copyright of your
13
13
  code to Maciej Mensfeld.
14
14
 
15
- You can find the commercial license in LICENSE-COMM.
15
+ You can find the commercial license in LICENSE-COMM <https://github.com/karafka/karafka/blob/master/LICENSE-COMM>.
16
16
 
17
17
  Please see https://karafka.io for purchasing options.
data/bin/rspecs CHANGED
@@ -3,4 +3,4 @@
3
3
  set -e
4
4
 
5
5
  SPECS_TYPE=regular bundle exec rspec --exclude-pattern "**/pro/**/*_spec.rb"
6
- SPECS_TYPE=pro bundle exec rspec --pattern "**/pro/**/*_spec.rb"
6
+ SPECS_TYPE=pro bundle exec rspec spec/lib/karafka/web/pro
@@ -0,0 +1,11 @@
1
+ en:
2
+ validations:
3
+ config:
4
+ missing: needs to be present
5
+
6
+ commanding.active_format: needs to be either true or false
7
+ commanding.consumer_group_format: 'needs to be a string with a Kafka accepted format'
8
+ commanding.max_wait_time_format: needs to be an integer bigger than 0
9
+ commanding.pause_timeout_format: needs to be an integer bigger than 0
10
+ key_must_be_a_symbol: All keys under the kafka settings scope need to be symbols
11
+ commanding.kafka_format: needs to be a filled hash
@@ -0,0 +1,62 @@
1
+ en:
2
+ slogans:
3
+ - "Unlock the full potential of Karafka with our Pro plan – Your support fuels innovation!"
4
+ - "Elevate your Karafka experience! Go Pro and access exclusive features today."
5
+ - "Support Karafka's future developments by upgrading to Pro. Together, we can achieve more!"
6
+ - "Maximize your productivity with Karafka Pro. Upgrade today for a seamless experience."
7
+ - "Be a part of something bigger. Your Pro subscription helps me innovate continuously."
8
+ - "Unlock premium features and dedicated support by upgrading to Karafka Pro."
9
+ - "Experience the best of Karafka with Pro: More features, more power."
10
+ - "Karafka Pro awaits with open arms. Upgrade now for a richer development experience."
11
+ - "Lead, innovate, and excel with Karafka Pro. Upgrade today to unlock your potential."
12
+ - "Your projects deserve the best. Upgrade to Karafka Pro for unmatched features."
13
+ - "Speed up your development timeline with Karafka's Pro advanced tools. Upgrade for efficiency!"
14
+ - "Get more done quickly with Karafka's Pro exclusive features. Upgrade to accelerate."
15
+ - "Fast-forward your projects with Karafka Pro. Efficiency is just an upgrade away."
16
+ - "Elevate your coding speed and project quality with Karafka Pro. Time to upgrade!"
17
+ - "Karafka Pro: Because your time is invaluable. Upgrade for a seamless, speedy workflow."
18
+ - "Your Pro upgrade powers my innovation - support Karafka's growth and OSS commitment."
19
+ - "Go Pro and become a pillar of the Karafka ecosystem. Support development, support OSS."
20
+ - "By choosing Pro, you're fueling our ability to enhance and expand the Karafka ecosystem."
21
+ - "Support us in shaping the future of Karafka. Your Pro subscription invests in OSS excellence."
22
+ - "Your support through Pro enables me to innovate and give back to the OSS community."
23
+ - "Enhance your impact on the OSS world. Upgrade to Karafka Pro and support our ecosystem."
24
+ - "Every Pro subscriber helps us invest more in Karafka and the broader OSS community."
25
+ - "Upgrade to Pro: Fuel Karafka's innovation and our dedication to OSS progress."
26
+ - "Your Pro subscription helps me reinvest in Karafka and contribute more to OSS."
27
+ - "Leverage Delayed Topics in Karafka Pro for precise message processing timing."
28
+ - "Automatically manage message lifecycles with the Expiring Messages feature in Karafka Pro."
29
+ - "Control consumption pace wisely with Rate Limiting, available in Karafka Pro."
30
+ - "Quickly access data with the Iterator API, a unique Karafka Pro feature."
31
+ - "Enhance throughput with Multiplexing, enabling parallel processing in Karafka Pro."
32
+ - "Need to process data faster? Explore Karafka Pro for parallel processing enhancements."
33
+ - "Struggling with data integrity? Karafka's Pro transaction features ensure reliability."
34
+ - "Want more control over message timing? Delayed Topics in Karafka Pro make scheduling easy."
35
+ - "Need to automate regular tasks? Periodic Jobs in Karafka Pro have got you covered."
36
+ - "Worried about message overload? Karafka's Pro Expiring Messages keep your queues clean."
37
+ - "Want to filter messages efficiently? Filtering API in Pro makes it simple."
38
+ - "Concerned about memory during batch operations? Cleaner API in Karafka Pro is the answer."
39
+ - "Need to increase processing speed? Karafka's Pro Multiplexing feature boosts throughput."
40
+ - "Looking for better message management? Enhanced Dead Letter Queue in Karafka Pro is key."
41
+ - "Concerned about Karafka licensing? Karafka Pro offers a commercial-friendly option."
42
+ - "Need coupled message operations? Transactions in Karafka Pro enhance data integrity."
43
+ - "Are you concerned about managing large data flows? Virtual Partitions in Karafka Pro simplify data processing, offering unparalleled efficiency and scalability."
44
+ - "Looking for flexible scheduling solutions? Karafka's Pro Periodic Jobs feature allows precise task timing and execution, enhancing your application's performance and reliability."
45
+ - "Need advanced routing capabilities? Routing Patterns in Karafka Pro provide dynamic message routing, improving your system's adaptability and efficiency."
46
+ - "Are you Seeking to control your workload? With Rate Limiting in Karafka Pro, you can effectively manage and balance your system's load, ensuring optimal performance under any conditions."
47
+ - "Need quick data access methods? The Iterator API in Karafka Pro provides efficient data retrieval methods."
48
+ - "Want more nuanced error handling? Discover Granular Backoffs in Karafka Pro, which allows for detailed control over retry mechanisms and error recovery processes."
49
+ - "Need a boost in data processing speed? Multiplexing in Karafka Pro enables parallel processing, significantly increasing throughput and reducing processing times."
50
+ - "Need advanced monitoring and management? Karafka Pro goes beyond basic features, offering comprehensive tools for detailed insight and control over your Kafka ecosystem."
51
+ - "Let's Build the Future of Karafka Together: Your Pro support brings next-gen features to life."
52
+ - "Karafka Pro: A Partnership for Progress. Your subscription drives our development."
53
+ - "With Karafka Pro, you're not just upgrading; you're fueling the future of efficient coding."
54
+ - "Dare to Support, Dare to Grow: Karafka Pro is your contribution to a boundary-pushing ecosystem."
55
+ - "Invest in Karafka Pro to ensure ongoing enhancements and a dynamic, evolving platform."
56
+ - "Advance with us. Your Karafka Pro subscription is a stepping stone for collective innovation."
57
+ - "Together, we can push boundaries. Support Karafka's growth by upgrading to Pro."
58
+ - "Karafka's continuous improvement is powered by our community. Consider going Pro to contribute."
59
+ - "By choosing Karafka Pro, you're investing in a more robust, feature-rich future for your projects."
60
+ - "Help me help you. Karafka's future developments depend on your support through Pro."
61
+ - "Supporting Karafka through Pro enables me to continually enhance its features and support your business better."
62
+ - "Your upgrade to Karafka Pro directly fuels our capacity to innovate and improve. Let's grow together."
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.0
6
+ image: confluentinc/cp-kafka:7.6.1
7
7
 
8
8
  ports:
9
9
  - 9092:9092
data/karafka-web.gemspec CHANGED
@@ -17,13 +17,15 @@ Gem::Specification.new do |spec|
17
17
  spec.licenses = %w[LGPL-3.0 Commercial]
18
18
 
19
19
  spec.add_dependency 'erubi', '~> 1.4'
20
- spec.add_dependency 'karafka', '>= 2.3.0', '< 2.4.0'
21
- spec.add_dependency 'karafka-core', '>= 2.3.0', '< 2.4.0'
20
+ spec.add_dependency 'karafka', '>= 2.4.0', '< 2.5.0'
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'
24
24
 
25
25
  spec.add_development_dependency 'rackup', '~> 0.2'
26
26
 
27
+ spec.required_ruby_version = '>= 3.0.0'
28
+
27
29
  if $PROGRAM_NAME.end_with?('gem')
28
30
  spec.signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
29
31
  end
@@ -13,7 +13,7 @@ module Karafka
13
13
 
14
14
  # @return [Class] regular or pro Web engine
15
15
  def engine
16
- ::Karafka.pro? ? Ui::Pro::App : Ui::App
16
+ ::Karafka.pro? ? Pro::Ui::App : Ui::App
17
17
  end
18
18
  end
19
19
  end
@@ -26,6 +26,12 @@ module Karafka
26
26
  lazy: true
27
27
  )
28
28
 
29
+ # What should be the consumer group name for web UI consumer
30
+ # Karafka Web UI uses the Admin API for many operations, but there are few
31
+ # (like states materialization) where a distinct consumer group is needed. In cases like that
32
+ # this group id will be used
33
+ setting :group_id, default: 'karafka_web'
34
+
29
35
  # Topics naming - used for processing and UI
30
36
  setting :topics do
31
37
  # All the errors encountered will be dispatched to this topic for inspection
@@ -41,6 +47,12 @@ module Karafka
41
47
 
42
48
  # Topic for storing consumers historical metrics info
43
49
  setting :metrics, default: 'karafka_consumers_metrics'
50
+
51
+ # Topic for storing commands and their results
52
+ # This is used only in Pro, however we do setup it in OSS in case of upgrade so the
53
+ # transition from one to another is smooth. Otherwise upgrade would require changes
54
+ # to topics (migration) which may be more complex
55
+ setting :commands, default: 'karafka_consumers_commands'
44
56
  end
45
57
  end
46
58
 
@@ -102,9 +114,6 @@ module Karafka
102
114
  # apps should materialize the state
103
115
  setting :active, default: true
104
116
 
105
- # What should be the consumer group name for web consumer
106
- setting :consumer_group, default: 'karafka_web'
107
-
108
117
  # How often should we report the aggregated state and metrics
109
118
  # By default we flush the states twice as often as the data reporting.
110
119
  # This will allow us to have closer to real-time reporting.
@@ -138,6 +147,11 @@ module Karafka
138
147
  # Should we display internal topics of Kafka. The once starting with `__`
139
148
  # By default we do not display them as they are not usable from regular users perspective
140
149
  setting :internal_topics, default: false
150
+
151
+ # Should we display cluster lags only for active topics
152
+ # Useful for multi-app setups where the web-ui routing does not match the routing setup
153
+ # of micro-services and topics are not active but lags reporting should be in use
154
+ setting :active_topics_cluster_lags_only, default: true
141
155
  end
142
156
 
143
157
  # How many elements should we display on pages that support pagination
@@ -153,6 +167,12 @@ module Karafka
153
167
  # are dealing with
154
168
  setting :visibility_filter, default: Ui::Models::VisibilityFilter.new
155
169
 
170
+ # Consider any topic matching those names as a DLQ topic for the DLQ view
171
+ # Web UI uses auto DLQ discovery based on routing but this may not be fully operable when
172
+ # using a multi-app setup. This config allows to add extra topics if needed without having
173
+ # to explicitly define routing
174
+ setting :dlq_patterns, default: [/(dlq)|(dead_letter)/i]
175
+
156
176
  # Specific kafka settings that are tuned to operate within the Web UI interface.
157
177
  #
158
178
  # Please do not change them unless you know what you are doing as their misconfiguration
@@ -12,6 +12,7 @@ module Karafka
12
12
 
13
13
  required(:enabled) { |val| [true, false, nil].include?(val) }
14
14
  required(:ttl) { |val| val.is_a?(Numeric) && val.positive? }
15
+ required(:group_id) { |val| val.is_a?(String) && TOPIC_REGEXP.match?(val) }
15
16
 
16
17
  nested(:topics) do
17
18
  required(:errors) { |val| val.is_a?(String) && TOPIC_REGEXP.match?(val) }
@@ -44,7 +45,6 @@ module Karafka
44
45
 
45
46
  nested(:processing) do
46
47
  required(:active) { |val| [true, false].include?(val) }
47
- required(:consumer_group) { |val| val.is_a?(String) && TOPIC_REGEXP.match?(val) }
48
48
  # Do not update data more often not to overload and not to generate too much data
49
49
  required(:interval) { |val| val.is_a?(Integer) && val >= 1_000 }
50
50
  end
@@ -58,9 +58,15 @@ module Karafka
58
58
  required(:cache) { |val| !val.nil? }
59
59
  required(:per_page) { |val| val.is_a?(Integer) && val >= 1 && val <= 100 }
60
60
 
61
+ required(:dlq_patterns) do |val|
62
+ val.is_a?(Array) &&
63
+ val.all? { |attr| attr.is_a?(String) || attr.is_a?(Regexp) }
64
+ end
65
+
61
66
  nested(:visibility) do
62
67
  required(:filter) { |val| !val.nil? }
63
68
  required(:internal_topics) { |val| [true, false].include?(val) }
69
+ required(:active_topics_cluster_lags_only) { |val| [true, false].include?(val) }
64
70
  end
65
71
  end
66
72
  end
@@ -20,6 +20,7 @@ module Karafka
20
20
  consumers_states_topic = ::Karafka::Web.config.topics.consumers.states
21
21
  consumers_metrics_topic = ::Karafka::Web.config.topics.consumers.metrics
22
22
  consumers_reports_topic = ::Karafka::Web.config.topics.consumers.reports
23
+ consumers_commands_topic = ::Karafka::Web.config.topics.consumers.commands
23
24
  errors_topic = ::Karafka::Web.config.topics.errors
24
25
 
25
26
  if existing_topics_names.include?(errors_topic)
@@ -88,6 +89,26 @@ module Karafka
88
89
  created(consumers_metrics_topic)
89
90
  end
90
91
 
92
+ if existing_topics_names.include?(consumers_commands_topic)
93
+ exists(consumers_commands_topic)
94
+ else
95
+ creating(consumers_commands_topic)
96
+ # Commands are suppose to live short and be used for controlling processes and some
97
+ # debug. Their data can be removed safely fast.
98
+ ::Karafka::Admin.create_topic(
99
+ consumers_commands_topic,
100
+ 1,
101
+ replication_factor,
102
+ {
103
+ 'cleanup.policy': 'delete',
104
+ 'retention.ms': 7 * 24 * 60 * 60 * 1_000, # 7 days
105
+ 'segment.ms': 24 * 60 * 60 * 1_000, # 1 day
106
+ 'segment.bytes': 104_857_600 # 100MB
107
+ }
108
+ )
109
+ created(consumers_commands_topic)
110
+ end
111
+
91
112
  # Create only if needed
92
113
  if existing_topics_names.include?(consumers_states_topic)
93
114
  exists(consumers_states_topic)
@@ -12,6 +12,7 @@ module Karafka
12
12
  ::Karafka::Web.config.topics.consumers.states,
13
13
  ::Karafka::Web.config.topics.consumers.reports,
14
14
  ::Karafka::Web.config.topics.consumers.metrics,
15
+ ::Karafka::Web.config.topics.consumers.commands,
15
16
  ::Karafka::Web.config.topics.errors
16
17
  ].each do |topic_name|
17
18
  if existing_topics_names.include?(topic_name.to_s)
@@ -37,9 +37,9 @@ module Karafka
37
37
  # Enables all the needed routes
38
38
  def extend_routing
39
39
  ::Karafka::App.routes.draw do
40
- web_deserializer = ::Karafka::Web::Deserializer.new
40
+ payload_deserializer = ::Karafka::Web::Deserializer.new
41
41
 
42
- consumer_group ::Karafka::Web.config.processing.consumer_group do
42
+ consumer_group ::Karafka::Web.config.group_id do
43
43
  # Topic we listen on to materialize the states
44
44
  topic ::Karafka::Web.config.topics.consumers.reports do
45
45
  config(active: false)
@@ -52,7 +52,7 @@ module Karafka
52
52
  # This needs to be true in order not to reload the consumer in dev. This consumer
53
53
  # should not be affected by the end user development process
54
54
  consumer_persistence true
55
- deserializer web_deserializer
55
+ deserializers(payload: payload_deserializer)
56
56
  manual_offset_management true
57
57
  # Start from the most recent data, do not materialize historical states
58
58
  # This prevents us from dealing with cases, where client id would be changed and
@@ -66,19 +66,25 @@ module Karafka
66
66
  topic ::Karafka::Web.config.topics.consumers.states do
67
67
  config(active: false)
68
68
  active false
69
- deserializer web_deserializer
69
+ deserializers(payload: payload_deserializer)
70
70
  end
71
71
 
72
72
  topic ::Karafka::Web.config.topics.consumers.metrics do
73
73
  config(active: false)
74
74
  active false
75
- deserializer web_deserializer
75
+ deserializers(payload: payload_deserializer)
76
+ end
77
+
78
+ topic ::Karafka::Web.config.topics.consumers.commands do
79
+ config(active: false)
80
+ active false
81
+ deserializers(payload: payload_deserializer)
76
82
  end
77
83
 
78
84
  topic ::Karafka::Web.config.topics.errors do
79
85
  config(active: false)
80
86
  active false
81
- deserializer web_deserializer
87
+ deserializers(payload: payload_deserializer)
82
88
  end
83
89
  end
84
90
  end
@@ -47,7 +47,7 @@ module Karafka
47
47
  def sorted_descendants
48
48
  ObjectSpace
49
49
  .each_object(Class)
50
- .select { |klass| klass < self }
50
+ .select { |klass| klass != self && klass.ancestors.include?(self) }
51
51
  .sort_by(&:index)
52
52
  end
53
53
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This Karafka component is a Pro component under a commercial license.
4
+ # This Karafka component is NOT licensed under LGPL.
5
+ #
6
+ # All of the commercial components are present in the lib/karafka/pro directory of this
7
+ # repository and their usage requires commercial license agreement.
8
+ #
9
+ # Karafka has also commercial-friendly license, commercial support and commercial components.
10
+ #
11
+ # By sending a pull request to the pro components, you are agreeing to transfer the copyright of
12
+ # your code to Maciej Mensfeld.
13
+
14
+ module Karafka
15
+ module Web
16
+ module Pro
17
+ module Commanding
18
+ # Namespace for commands the process can react to
19
+ module Commands
20
+ # Base for all the commands
21
+ class Base
22
+ private
23
+
24
+ # @return [String] current process id
25
+ def process_id
26
+ @process_id ||= ::Karafka::Web.config.tracking.consumers.sampler.process_id
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This Karafka component is a Pro component under a commercial license.
4
+ # This Karafka component is NOT licensed under LGPL.
5
+ #
6
+ # All of the commercial components are present in the lib/karafka/pro directory of this
7
+ # repository and their usage requires commercial license agreement.
8
+ #
9
+ # Karafka has also commercial-friendly license, commercial support and commercial components.
10
+ #
11
+ # By sending a pull request to the pro components, you are agreeing to transfer the copyright of
12
+ # your code to Maciej Mensfeld.
13
+
14
+ module Karafka
15
+ module Web
16
+ module Pro
17
+ module Commanding
18
+ # Namespace for commands the process can react to
19
+ module Commands
20
+ # Collects all backtraces from the available Ruby threads and publishes their details
21
+ # back to Kafka for debug.
22
+ class Probe < Base
23
+ # Runs probing and publishes result back to Kafka
24
+ def call
25
+ threads = {}
26
+
27
+ Thread.list.each do |thread|
28
+ tid = (thread.object_id ^ ::Process.pid).to_s(36)
29
+ t_d = threads[tid] = {}
30
+ t_d[:label] = "Thread TID-#{tid} #{thread.name}"
31
+ t_d[:backtrace] = (thread.backtrace || ['<no backtrace available>']).join("\n")
32
+ end
33
+
34
+ Dispatcher.result(threads, process_id, 'probe')
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end