karafka-web 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/Gemfile.lock +13 -13
  4. data/lib/karafka/web/management/actions/enable.rb +74 -10
  5. data/lib/karafka/web/pro/ui/app.rb +13 -0
  6. data/lib/karafka/web/pro/ui/controllers/base_controller.rb +4 -0
  7. data/lib/karafka/web/pro/ui/controllers/cluster_controller.rb +66 -4
  8. data/lib/karafka/web/pro/ui/controllers/consumers/consumers_controller.rb +9 -2
  9. data/lib/karafka/web/pro/ui/controllers/consumers/controls_controller.rb +6 -0
  10. data/lib/karafka/web/pro/ui/controllers/consumers/jobs_controller.rb +8 -2
  11. data/lib/karafka/web/pro/ui/controllers/dlq_controller.rb +6 -0
  12. data/lib/karafka/web/pro/ui/controllers/explorer/explorer_controller.rb +6 -0
  13. data/lib/karafka/web/pro/ui/controllers/health_controller.rb +19 -3
  14. data/lib/karafka/web/pro/ui/controllers/jobs_controller.rb +25 -0
  15. data/lib/karafka/web/pro/ui/controllers/recurring_tasks_controller.rb +10 -1
  16. data/lib/karafka/web/pro/ui/controllers/requests/params.rb +67 -0
  17. data/lib/karafka/web/pro/ui/controllers/routing_controller.rb +23 -1
  18. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/schedules_controller.rb +6 -0
  19. data/lib/karafka/web/pro/ui/controllers/topics/configs_controller.rb +6 -1
  20. data/lib/karafka/web/pro/ui/controllers/topics/distributions_controller.rb +1 -1
  21. data/lib/karafka/web/pro/ui/controllers/topics/offsets_controller.rb +1 -1
  22. data/lib/karafka/web/pro/ui/controllers/topics/replications_controller.rb +1 -1
  23. data/lib/karafka/web/pro/ui/controllers/topics/topics_controller.rb +6 -0
  24. data/lib/karafka/web/pro/ui/helpers/filtering_helper.rb +173 -0
  25. data/lib/karafka/web/pro/ui/helpers/topics_filtering_helper.rb +80 -0
  26. data/lib/karafka/web/pro/ui/lib/filtering.rb +128 -0
  27. data/lib/karafka/web/pro/ui/lib/search/matchers/base.rb +2 -2
  28. data/lib/karafka/web/pro/ui/routes/cluster.rb +0 -2
  29. data/lib/karafka/web/pro/ui/views/cluster/_brokers_table.erb +41 -0
  30. data/lib/karafka/web/pro/ui/views/cluster/_configs_table.erb +41 -0
  31. data/lib/karafka/web/pro/ui/views/cluster/_partition.erb +2 -2
  32. data/lib/karafka/web/pro/ui/views/cluster/index.erb +12 -20
  33. data/lib/karafka/web/pro/ui/views/cluster/replication.erb +39 -0
  34. data/lib/karafka/web/pro/ui/views/cluster/show.erb +13 -21
  35. data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer_performances_table.erb +56 -0
  36. data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumers_table.erb +43 -0
  37. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_subscription_group.erb +10 -2
  38. data/lib/karafka/web/pro/ui/views/consumers/consumers/index.erb +8 -24
  39. data/lib/karafka/web/pro/ui/views/consumers/consumers/performance.erb +8 -37
  40. data/lib/karafka/web/pro/ui/views/consumers/consumers/subscriptions.erb +20 -6
  41. data/lib/karafka/web/pro/ui/views/consumers/controls/_processes_table.erb +45 -0
  42. data/lib/karafka/web/pro/ui/views/consumers/controls/index.erb +14 -27
  43. data/lib/karafka/web/pro/ui/views/consumers/jobs/_jobs_table.erb +48 -0
  44. data/lib/karafka/web/pro/ui/views/consumers/jobs/pending.erb +8 -29
  45. data/lib/karafka/web/pro/ui/views/consumers/jobs/running.erb +8 -29
  46. data/lib/karafka/web/pro/ui/views/dlq/index.erb +9 -1
  47. data/lib/karafka/web/pro/ui/views/explorer/explorer/index.erb +9 -1
  48. data/lib/karafka/web/pro/ui/views/health/_changes_table.erb +59 -0
  49. data/lib/karafka/web/pro/ui/views/health/_cluster_lags_table.erb +43 -0
  50. data/lib/karafka/web/pro/ui/views/health/_lags_table.erb +60 -0
  51. data/lib/karafka/web/pro/ui/views/health/_no_data.erb +5 -1
  52. data/lib/karafka/web/pro/ui/views/health/_offsets_table.erb +63 -0
  53. data/lib/karafka/web/pro/ui/views/health/_overview_table.erb +83 -0
  54. data/lib/karafka/web/pro/ui/views/health/_tabs.erb +6 -0
  55. data/lib/karafka/web/pro/ui/views/health/changes.erb +13 -43
  56. data/lib/karafka/web/pro/ui/views/health/cluster_lags.erb +11 -25
  57. data/lib/karafka/web/pro/ui/views/health/lags.erb +13 -44
  58. data/lib/karafka/web/pro/ui/views/health/offsets.erb +13 -47
  59. data/lib/karafka/web/pro/ui/views/health/overview.erb +13 -67
  60. data/lib/karafka/web/pro/ui/views/jobs/_jobs_table.erb +48 -0
  61. data/lib/karafka/web/pro/ui/views/jobs/pending.erb +8 -30
  62. data/lib/karafka/web/pro/ui/views/jobs/running.erb +8 -30
  63. data/lib/karafka/web/pro/ui/views/recurring_tasks/_tasks_table.erb +43 -0
  64. data/lib/karafka/web/pro/ui/views/recurring_tasks/schedule.erb +8 -24
  65. data/lib/karafka/web/pro/ui/views/routing/_consumer_group.erb +36 -32
  66. data/lib/karafka/web/pro/ui/views/routing/_details_table.erb +43 -0
  67. data/lib/karafka/web/pro/ui/views/routing/index.erb +18 -6
  68. data/lib/karafka/web/pro/ui/views/routing/show.erb +12 -40
  69. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/index.erb +7 -1
  70. data/lib/karafka/web/pro/ui/views/shared/_filter_box.erb +61 -0
  71. data/lib/karafka/web/pro/ui/views/topics/configs/_configs_table.erb +42 -0
  72. data/lib/karafka/web/pro/ui/views/topics/configs/index.erb +13 -22
  73. data/lib/karafka/web/pro/ui/views/topics/replications/_partition.erb +2 -2
  74. data/lib/karafka/web/pro/ui/views/topics/replications/show.erb +12 -2
  75. data/lib/karafka/web/pro/ui/views/topics/topics/index.erb +9 -1
  76. data/lib/karafka/web/tracking/consumers/listeners/errors.rb +80 -14
  77. data/lib/karafka/web/ui/base.rb +4 -0
  78. data/lib/karafka/web/ui/controllers/base_controller.rb +1 -1
  79. data/lib/karafka/web/ui/controllers/cluster_controller.rb +21 -22
  80. data/lib/karafka/web/ui/controllers/consumers_controller.rb +1 -1
  81. data/lib/karafka/web/ui/controllers/jobs_controller.rb +23 -27
  82. data/lib/karafka/web/ui/controllers/requests/hookable.rb +5 -0
  83. data/lib/karafka/web/ui/controllers/routing_controller.rb +15 -1
  84. data/lib/karafka/web/ui/helpers/application_helper.rb +3 -278
  85. data/lib/karafka/web/ui/helpers/badges_helper.rb +66 -0
  86. data/lib/karafka/web/ui/helpers/formatting_helper.rb +77 -0
  87. data/lib/karafka/web/ui/helpers/partitions_helper.rb +167 -0
  88. data/lib/karafka/web/ui/helpers/sorting_helper.rb +78 -0
  89. data/lib/karafka/web/ui/lib/filter.rb +377 -0
  90. data/lib/karafka/web/ui/lib/hash_flattener.rb +37 -0
  91. data/lib/karafka/web/ui/lib/sorter.rb +3 -1
  92. data/lib/karafka/web/ui/models/jobs.rb +3 -2
  93. data/lib/karafka/web/ui/models/process.rb +12 -0
  94. data/lib/karafka/web/ui/public/javascripts/application.min.js.gz +0 -0
  95. data/lib/karafka/web/ui/public/stylesheets/application.css +9 -0
  96. data/lib/karafka/web/ui/public/stylesheets/application.min.css +4230 -1258
  97. data/lib/karafka/web/ui/public/stylesheets/application.min.css.br +0 -0
  98. data/lib/karafka/web/ui/public/stylesheets/application.min.css.gz +0 -0
  99. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_dark.min.css.gz +0 -0
  100. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_light.min.css.gz +0 -0
  101. data/lib/karafka/web/ui/views/cluster/_brokers_table.erb +21 -0
  102. data/lib/karafka/web/ui/views/cluster/_partition.erb +2 -2
  103. data/lib/karafka/web/ui/views/cluster/_partitions_table.erb +31 -0
  104. data/lib/karafka/web/ui/views/cluster/brokers.erb +1 -21
  105. data/lib/karafka/web/ui/views/cluster/replication.erb +1 -23
  106. data/lib/karafka/web/ui/views/consumers/_consumers_table.erb +22 -0
  107. data/lib/karafka/web/ui/views/consumers/index.erb +1 -22
  108. data/lib/karafka/web/ui/views/errors/_table.erb +28 -0
  109. data/lib/karafka/web/ui/views/errors/index.erb +1 -28
  110. data/lib/karafka/web/ui/views/jobs/_jobs_table.erb +22 -0
  111. data/lib/karafka/web/ui/views/jobs/pending.erb +1 -22
  112. data/lib/karafka/web/ui/views/jobs/running.erb +1 -22
  113. data/lib/karafka/web/ui/views/routing/_consumer_group.erb +18 -12
  114. data/lib/karafka/web/ui/views/routing/_details_table.erb +23 -0
  115. data/lib/karafka/web/ui/views/routing/show.erb +1 -29
  116. data/lib/karafka/web/ui/views/shared/_no_filter_results.erb +6 -0
  117. data/lib/karafka/web/version.rb +1 -1
  118. data/package-lock.json +98 -61
  119. metadata +35 -1
@@ -22,24 +22,16 @@
22
22
 
23
23
  <%== partial 'cluster/tabs' %>
24
24
 
25
- <div class="col-span-12 mb-3">
26
- <div class="data-table-wrapper">
27
- <table class="data-table">
28
- <thead>
29
- <tr>
30
- <th><%== sort_link('Node ID', :id) %></th>
31
- <th><%== sort_link(:name) %></th>
32
- <th><%== sort_link(:port) %></th>
33
- </tr>
34
- </thead>
35
- <tbody>
36
- <%==
37
- each_partial(
38
- @brokers,
39
- 'cluster/broker'
40
- )
41
- %>
42
- </tbody>
43
- </table>
25
+ <% if filtering? || !@brokers.empty? %>
26
+ <div class="col-span-12 mb-3">
27
+ <%== filter_box(labels: { id: 'Node ID' }) %>
44
28
  </div>
45
- </div>
29
+ <% end %>
30
+
31
+ <% if @brokers.empty? && filtering? %>
32
+ <div class="col-span-12">
33
+ <%== partial 'shared/no_filter_results' %>
34
+ </div>
35
+ <% else %>
36
+ <%== partial 'cluster/brokers_table' %>
37
+ <% end %>
@@ -0,0 +1,39 @@
1
+ <%# Karafka Pro - Source Available Commercial Software %>
2
+ <%# Copyright (c) 2017-present Maciej Mensfeld. All rights reserved. %>
3
+ <%# This software is NOT open source. It is source-available commercial software %>
4
+ <%# requiring a paid license for use. It is NOT covered by LGPL. %>
5
+ <%# The author retains all right, title, and interest in this software, %>
6
+ <%# including all copyrights, patents, and other intellectual property rights. %>
7
+ <%# No patent rights are granted under this license. %>
8
+ <%# PROHIBITED: Use without a valid commercial license %>
9
+ <%# PROHIBITED: Redistribution, modification, or derivative works without authorization %>
10
+ <%# PROHIBITED: Reverse engineering, decompilation, or disassembly of this software %>
11
+ <%# PROHIBITED: Use as training data for AI/ML models or inclusion in datasets %>
12
+ <%# PROHIBITED: Scraping, crawling, or automated collection for any purpose %>
13
+ <%# PERMITTED: Reading, referencing, and linking for personal or commercial use %>
14
+ <%# PERMITTED: Runtime retrieval by AI assistants, coding agents, and RAG systems %>
15
+ <%# PERMITTED: for the purpose of providing contextual help to Karafka users %>
16
+ <%# Receipt, viewing, or possession of this software does not convey or %>
17
+ <%# imply any license or right beyond those expressly stated above. %>
18
+ <%# License: https://karafka.io/docs/Pro-License-Comm/ %>
19
+ <%# Contact: contact@karafka.io %>
20
+
21
+ <%== partial 'cluster/tabs' %>
22
+
23
+ <% if filtering? || !@partitions.empty? %>
24
+ <div class="col-span-12 mb-3">
25
+ <%== filter_box %>
26
+ </div>
27
+ <% end %>
28
+
29
+ <div class="col-span-12 mb-3">
30
+ <% if @partitions.empty? && !filtering? && params.current_page <= 1 %>
31
+ <%== partial 'cluster/no_partitions' %>
32
+ <% elsif @partitions.empty? && filtering? %>
33
+ <%== partial 'shared/no_filter_results' %>
34
+ <% elsif @partitions.empty? %>
35
+ <%== partial 'shared/no_paginated_data' %>
36
+ <% else %>
37
+ <%== partial 'cluster/partitions_table' %>
38
+ <% end %>
39
+ </div>
@@ -20,24 +20,16 @@
20
20
 
21
21
  <% view_title @broker.full_name %>
22
22
 
23
- <div class="data-table-wrapper">
24
- <table class="data-table">
25
- <thead>
26
- <tr>
27
- <th><%== sort_link(:name) %></th>
28
- <th><%== sort_link(:value) %></th>
29
- <th><%== sort_link(:default?) %></th>
30
- <th><%== sort_link(:sensitive?) %></th>
31
- <th><%== sort_link(:read_only?) %></th>
32
- </tr>
33
- </thead>
34
- <tbody>
35
- <%==
36
- each_partial(
37
- @configs,
38
- 'cluster/config'
39
- )
40
- %>
41
- </tbody>
42
- </table>
43
- </div>
23
+ <% if filtering? || !@configs.empty? %>
24
+ <div class="col-span-12 mb-3">
25
+ <%== filter_box %>
26
+ </div>
27
+ <% end %>
28
+
29
+ <% if filtering? && @configs.empty? %>
30
+ <div class="col-span-12">
31
+ <%== partial 'shared/no_filter_results' %>
32
+ </div>
33
+ <% else %>
34
+ <%== partial 'cluster/configs_table' %>
35
+ <% end %>
@@ -0,0 +1,56 @@
1
+ <%# Karafka Pro - Source Available Commercial Software %>
2
+ <%# Copyright (c) 2017-present Maciej Mensfeld. All rights reserved. %>
3
+ <%# This software is NOT open source. It is source-available commercial software %>
4
+ <%# requiring a paid license for use. It is NOT covered by LGPL. %>
5
+ <%# The author retains all right, title, and interest in this software, %>
6
+ <%# including all copyrights, patents, and other intellectual property rights. %>
7
+ <%# No patent rights are granted under this license. %>
8
+ <%# PROHIBITED: Use without a valid commercial license %>
9
+ <%# PROHIBITED: Redistribution, modification, or derivative works without authorization %>
10
+ <%# PROHIBITED: Reverse engineering, decompilation, or disassembly of this software %>
11
+ <%# PROHIBITED: Use as training data for AI/ML models or inclusion in datasets %>
12
+ <%# PROHIBITED: Scraping, crawling, or automated collection for any purpose %>
13
+ <%# PERMITTED: Reading, referencing, and linking for personal or commercial use %>
14
+ <%# PERMITTED: Runtime retrieval by AI assistants, coding agents, and RAG systems %>
15
+ <%# PERMITTED: for the purpose of providing contextual help to Karafka users %>
16
+ <%# Receipt, viewing, or possession of this software does not convey or %>
17
+ <%# imply any license or right beyond those expressly stated above. %>
18
+ <%# License: https://karafka.io/docs/Pro-License-Comm/ %>
19
+ <%# Contact: contact@karafka.io %>
20
+
21
+ <div class="data-table-wrapper">
22
+ <table class="data-table">
23
+ <thead>
24
+ <tr>
25
+ <th colspan="1" rowspan="2"><%== sort_link('Process ID', :id) %></th>
26
+ <th colspan="1" rowspan="2"><%== sort_link(:memory_usage) %></th>
27
+ <th colspan="1" rowspan="2"><%== sort_link(:utilization) %></th>
28
+ <th colspan="1" rowspan="2"><%== sort_link(:threads) %></th>
29
+ <th colspan="3" rowspan="1" class="text-center">Load</th>
30
+ <th colspan="2" class="text-center">Workers</th>
31
+ <th colspan="2" class="text-center">Listeners</th>
32
+ <th colspan="2" class="text-center">Jobs</th>
33
+ </tr>
34
+ <tr>
35
+ <th>1m</th>
36
+ <th>5m</th>
37
+ <th>15m</th>
38
+ <th><%== sort_link('Total', :workers) %></th>
39
+ <th><%== sort_link(:busy) %></th>
40
+ <th><%== sort_link(:active) %></th>
41
+ <th><%== sort_link(:standby) %></th>
42
+ <th><%== sort_link('Running', :running_jobs_count) %></th>
43
+ <th><%== sort_link('Pending', :pending_jobs_count) %></th>
44
+ </tr>
45
+ </thead>
46
+ <tbody>
47
+ <%==
48
+ render_each(
49
+ @processes,
50
+ 'consumers/consumers/_consumer_performance',
51
+ local: :process
52
+ )
53
+ %>
54
+ </tbody>
55
+ </table>
56
+ </div>
@@ -0,0 +1,43 @@
1
+ <%# Karafka Pro - Source Available Commercial Software %>
2
+ <%# Copyright (c) 2017-present Maciej Mensfeld. All rights reserved. %>
3
+ <%# This software is NOT open source. It is source-available commercial software %>
4
+ <%# requiring a paid license for use. It is NOT covered by LGPL. %>
5
+ <%# The author retains all right, title, and interest in this software, %>
6
+ <%# including all copyrights, patents, and other intellectual property rights. %>
7
+ <%# No patent rights are granted under this license. %>
8
+ <%# PROHIBITED: Use without a valid commercial license %>
9
+ <%# PROHIBITED: Redistribution, modification, or derivative works without authorization %>
10
+ <%# PROHIBITED: Reverse engineering, decompilation, or disassembly of this software %>
11
+ <%# PROHIBITED: Use as training data for AI/ML models or inclusion in datasets %>
12
+ <%# PROHIBITED: Scraping, crawling, or automated collection for any purpose %>
13
+ <%# PERMITTED: Reading, referencing, and linking for personal or commercial use %>
14
+ <%# PERMITTED: Runtime retrieval by AI assistants, coding agents, and RAG systems %>
15
+ <%# PERMITTED: for the purpose of providing contextual help to Karafka users %>
16
+ <%# Receipt, viewing, or possession of this software does not convey or %>
17
+ <%# imply any license or right beyond those expressly stated above. %>
18
+ <%# License: https://karafka.io/docs/Pro-License-Comm/ %>
19
+ <%# Contact: contact@karafka.io %>
20
+
21
+ <div class="data-table-wrapper">
22
+ <table class="data-table">
23
+ <thead>
24
+ <tr>
25
+ <th><%== sort_link('Process ID', :id) %></th>
26
+ <th><%== sort_link(:started_at, rev: true) %></th>
27
+ <th>Memory</th>
28
+ <th>Performance</th>
29
+ <th>Load</th>
30
+ <th><%== sort_link(:lag_hybrid) %></th>
31
+ </tr>
32
+ </thead>
33
+ <tbody>
34
+ <%==
35
+ render_each(
36
+ @processes,
37
+ 'consumers/consumers/_consumer',
38
+ local: :process
39
+ )
40
+ %>
41
+ </tbody>
42
+ </table>
43
+ </div>
@@ -18,6 +18,13 @@
18
18
  <%# License: https://karafka.io/docs/Pro-License-Comm/ %>
19
19
  <%# Contact: contact@karafka.io %>
20
20
 
21
+ <%
22
+ # Non-destructively narrow the topics to the current filtering keyword. A subscription group is
23
+ # kept when the keyword matches its consumer/subscription group name or any of its topics.
24
+ topics = visible_topics(subscription_group.topics, consumer_group: consumer_group.id, subscription_group: subscription_group.id)
25
+ %>
26
+
27
+ <% unless filtering? && topics.empty? %>
21
28
  <h2 class="h2 mb-3" id="<%= subscription_group.id %>">
22
29
  <span class="tooltip" data-tip="Consumer Group">
23
30
  <%= consumer_group.id %>
@@ -115,12 +122,12 @@
115
122
  </div>
116
123
 
117
124
 
118
- <% if subscription_group.topics.empty? %>
125
+ <% if topics.empty? %>
119
126
  <div class="mb-6">
120
127
  <% empty_state('This process does not consume any messages from any topics of this subscription group.', icon: 'folder') %>
121
128
  </div>
122
129
  <% else %>
123
- <% subscription_group.topics.each do |topic| %>
130
+ <% topics.each do |topic| %>
124
131
  <div class="data-table-wrapper">
125
132
  <table class="data-table">
126
133
  <thead>
@@ -165,3 +172,4 @@
165
172
  </div>
166
173
  <% end %>
167
174
  <% end %>
175
+ <% end %>
@@ -24,33 +24,17 @@
24
24
  <%== partial 'consumers/consumers/tabs' %>
25
25
 
26
26
  <div class="col-span-12">
27
- <% if @processes.empty? && params.current_page <= 1 %>
27
+ <% if !@processes.empty? || filtering? %>
28
+ <%== filter_box %>
29
+ <% end %>
30
+
31
+ <% if @processes.empty? && !filtering? && params.current_page <= 1 %>
28
32
  <%== partial 'consumers/no_consumers' %>
33
+ <% elsif @processes.empty? && filtering? %>
34
+ <%== partial 'shared/no_filter_results' %>
29
35
  <% elsif @processes.empty? %>
30
36
  <%== partial 'shared/no_paginated_data' %>
31
37
  <% else %>
32
- <div class="data-table-wrapper">
33
- <table class="data-table">
34
- <thead>
35
- <tr>
36
- <th><%== sort_link('Process ID', :id) %></th>
37
- <th><%== sort_link(:started_at, rev: true) %></th>
38
- <th>Memory</th>
39
- <th>Performance</th>
40
- <th>Load</th>
41
- <th><%== sort_link(:lag_hybrid) %></th>
42
- </tr>
43
- </thead>
44
- <tbody>
45
- <%==
46
- render_each(
47
- @processes,
48
- 'consumers/consumers/_consumer',
49
- local: :process
50
- )
51
- %>
52
- </tbody>
53
- </table>
54
- </div>
38
+ <%== partial 'consumers/consumers/consumers_table' %>
55
39
  <% end %>
56
40
  </div>
@@ -23,46 +23,17 @@
23
23
  <%== partial 'consumers/consumers/tabs' %>
24
24
 
25
25
  <div class="col-span-12">
26
- <% if @processes.empty? && params.current_page <= 1 %>
26
+ <% if !@processes.empty? || filtering? %>
27
+ <%== filter_box %>
28
+ <% end %>
29
+
30
+ <% if @processes.empty? && !filtering? && params.current_page <= 1 %>
27
31
  <%== partial 'consumers/no_consumers' %>
32
+ <% elsif @processes.empty? && filtering? %>
33
+ <%== partial 'shared/no_filter_results' %>
28
34
  <% elsif @processes.empty? %>
29
35
  <%== partial 'shared/no_paginated_data' %>
30
36
  <% else %>
31
- <div class="data-table-wrapper">
32
- <table class="data-table">
33
- <thead>
34
- <tr>
35
- <th colspan="1" rowspan="2"><%== sort_link('Process ID', :id) %></th>
36
- <th colspan="1" rowspan="2"><%== sort_link(:memory_usage) %></th>
37
- <th colspan="1" rowspan="2"><%== sort_link(:utilization) %></th>
38
- <th colspan="1" rowspan="2"><%== sort_link(:threads) %></th>
39
- <th colspan="3" rowspan="1" class="text-center">Load</th>
40
- <th colspan="2" class="text-center">Workers</th>
41
- <th colspan="2" class="text-center">Listeners</th>
42
- <th colspan="2" class="text-center">Jobs</th>
43
- </tr>
44
- <tr>
45
- <th>1m</th>
46
- <th>5m</th>
47
- <th>15m</th>
48
- <th><%== sort_link('Total', :workers) %></th>
49
- <th><%== sort_link(:busy) %></th>
50
- <th><%== sort_link(:active) %></th>
51
- <th><%== sort_link(:standby) %></th>
52
- <th><%== sort_link('Running', :running_jobs_count) %></th>
53
- <th><%== sort_link('Pending', :pending_jobs_count) %></th>
54
- </tr>
55
- </thead>
56
- <tbody>
57
- <%==
58
- render_each(
59
- @processes,
60
- 'consumers/consumers/_consumer_performance',
61
- local: :process
62
- )
63
- %>
64
- </tbody>
65
- </table>
66
- </div>
37
+ <%== partial 'consumers/consumers/consumer_performances_table' %>
67
38
  <% end %>
68
39
  </div>
@@ -28,13 +28,27 @@
28
28
  <%== partial 'consumers/consumers/consumer/tabs' %>
29
29
 
30
30
  <% if @process.subscribed? %>
31
- <%==
32
- render_each(
33
- @process.consumer_groups,
34
- 'consumers/consumers/consumer/_consumer_group',
35
- local: :consumer_group
36
- )
31
+ <%== filter_box %>
32
+
33
+ <%
34
+ any_visible = @process.consumer_groups.any? do |cg|
35
+ cg.subscription_groups.any? do |sg|
36
+ visible_topics(sg.topics, consumer_group: cg.id, subscription_group: sg.id).any?
37
+ end
38
+ end
37
39
  %>
40
+
41
+ <% if filtering? && !any_visible %>
42
+ <%== partial 'shared/no_filter_results' %>
43
+ <% else %>
44
+ <%==
45
+ render_each(
46
+ @process.consumer_groups,
47
+ 'consumers/consumers/consumer/_consumer_group',
48
+ local: :consumer_group
49
+ )
50
+ %>
51
+ <% end %>
38
52
  <% else %>
39
53
  <%== partial 'consumers/consumers/consumer/no_subscriptions' %>
40
54
  <% end %>
@@ -0,0 +1,45 @@
1
+ <%# Karafka Pro - Source Available Commercial Software %>
2
+ <%# Copyright (c) 2017-present Maciej Mensfeld. All rights reserved. %>
3
+ <%# This software is NOT open source. It is source-available commercial software %>
4
+ <%# requiring a paid license for use. It is NOT covered by LGPL. %>
5
+ <%# The author retains all right, title, and interest in this software, %>
6
+ <%# including all copyrights, patents, and other intellectual property rights. %>
7
+ <%# No patent rights are granted under this license. %>
8
+ <%# PROHIBITED: Use without a valid commercial license %>
9
+ <%# PROHIBITED: Redistribution, modification, or derivative works without authorization %>
10
+ <%# PROHIBITED: Reverse engineering, decompilation, or disassembly of this software %>
11
+ <%# PROHIBITED: Use as training data for AI/ML models or inclusion in datasets %>
12
+ <%# PROHIBITED: Scraping, crawling, or automated collection for any purpose %>
13
+ <%# PERMITTED: Reading, referencing, and linking for personal or commercial use %>
14
+ <%# PERMITTED: Runtime retrieval by AI assistants, coding agents, and RAG systems %>
15
+ <%# PERMITTED: for the purpose of providing contextual help to Karafka users %>
16
+ <%# Receipt, viewing, or possession of this software does not convey or %>
17
+ <%# imply any license or right beyond those expressly stated above. %>
18
+ <%# License: https://karafka.io/docs/Pro-License-Comm/ %>
19
+ <%# Contact: contact@karafka.io %>
20
+
21
+ <div class="data-table-wrapper">
22
+ <table class="data-table">
23
+ <thead>
24
+ <tr>
25
+ <th><%== sort_link('Process ID', :id) %></th>
26
+ <th><%== sort_link(:status) %></th>
27
+ <th>Subscriptions</th>
28
+ <th><%== sort_link(:started_at, rev: true) %></th>
29
+ <th><%== sort_link(:memory_usage) %></th>
30
+ <th>Performance</th>
31
+ <th><%== sort_link(:lag_hybrid) %></th>
32
+ <th class="options">Options</th>
33
+ </tr>
34
+ </thead>
35
+ <tbody>
36
+ <%==
37
+ render_each(
38
+ @processes,
39
+ 'consumers/controls/_controls',
40
+ local: :process
41
+ )
42
+ %>
43
+ </tbody>
44
+ </table>
45
+ </div>
@@ -23,7 +23,12 @@
23
23
  <%== partial 'consumers/consumers/tabs' %>
24
24
 
25
25
  <% unless @processes.empty? %>
26
- <div class="col-span-12 flex justify-end space-x-2 mb-6">
26
+ <div class="col-span-12 flex justify-end items-center space-x-2 mb-6">
27
+ <% if filtering? %>
28
+ <span class="text-muted text-sm">
29
+ These actions apply to all processes, not just the filtered ones
30
+ </span>
31
+ <% end %>
27
32
  <%
28
33
  quiet_all_path = consumers_path('commanding', 'quiet_all')
29
34
  has_standalone = @processes.any? { |p| p.execution_mode == 'standalone' }
@@ -64,35 +69,17 @@
64
69
  <% end %>
65
70
 
66
71
  <div class="col-span-12">
67
- <% if @processes.empty? && params.current_page <= 1 %>
72
+ <% if !@processes.empty? || filtering? %>
73
+ <%== filter_box %>
74
+ <% end %>
75
+
76
+ <% if @processes.empty? && !filtering? && params.current_page <= 1 %>
68
77
  <%== partial 'consumers/no_consumers' %>
78
+ <% elsif @processes.empty? && filtering? %>
79
+ <%== partial 'shared/no_filter_results' %>
69
80
  <% elsif @processes.empty? %>
70
81
  <%== partial 'shared/no_paginated_data' %>
71
82
  <% else %>
72
- <div class="data-table-wrapper">
73
- <table class="data-table">
74
- <thead>
75
- <tr>
76
- <th><%== sort_link('Process ID', :id) %></th>
77
- <th><%== sort_link(:status) %></th>
78
- <th>Subscriptions</th>
79
- <th><%== sort_link(:started_at, rev: true) %></th>
80
- <th><%== sort_link(:memory_usage) %></th>
81
- <th>Performance</th>
82
- <th><%== sort_link(:lag_hybrid) %></th>
83
- <th class="options">Options</th>
84
- </tr>
85
- </thead>
86
- <tbody>
87
- <%==
88
- render_each(
89
- @processes,
90
- 'consumers/controls/_controls',
91
- local: :process
92
- )
93
- %>
94
- </tbody>
95
- </table>
96
- </div>
83
+ <%== partial 'consumers/controls/processes_table' %>
97
84
  <% end %>
98
85
  </div>
@@ -0,0 +1,48 @@
1
+ <%# Karafka Pro - Source Available Commercial Software %>
2
+ <%# Copyright (c) 2017-present Maciej Mensfeld. All rights reserved. %>
3
+ <%# This software is NOT open source. It is source-available commercial software %>
4
+ <%# requiring a paid license for use. It is NOT covered by LGPL. %>
5
+ <%# The author retains all right, title, and interest in this software, %>
6
+ <%# including all copyrights, patents, and other intellectual property rights. %>
7
+ <%# No patent rights are granted under this license. %>
8
+ <%# PROHIBITED: Use without a valid commercial license %>
9
+ <%# PROHIBITED: Redistribution, modification, or derivative works without authorization %>
10
+ <%# PROHIBITED: Reverse engineering, decompilation, or disassembly of this software %>
11
+ <%# PROHIBITED: Use as training data for AI/ML models or inclusion in datasets %>
12
+ <%# PROHIBITED: Scraping, crawling, or automated collection for any purpose %>
13
+ <%# PERMITTED: Reading, referencing, and linking for personal or commercial use %>
14
+ <%# PERMITTED: Runtime retrieval by AI assistants, coding agents, and RAG systems %>
15
+ <%# PERMITTED: for the purpose of providing contextual help to Karafka users %>
16
+ <%# Receipt, viewing, or possession of this software does not convey or %>
17
+ <%# imply any license or right beyond those expressly stated above. %>
18
+ <%# License: https://karafka.io/docs/Pro-License-Comm/ %>
19
+ <%# Contact: contact@karafka.io %>
20
+
21
+ <div class="data-table-wrapper">
22
+ <table class="data-table">
23
+ <thead>
24
+ <tr>
25
+ <th rowspan="2"><%== sort_link(:topic) %></th>
26
+ <th rowspan="2"><%== sort_link(:consumer) %></th>
27
+ <th rowspan="2"><%== sort_link(:type) %></th>
28
+ <th rowspan="2"><%== sort_link(:messages) %></th>
29
+ <th colspan="3" class="text-center">Offsets</th>
30
+ <th rowspan="2"><%== sort_link('Started', :updated_at, rev: true) %></th>
31
+ </tr>
32
+ <tr>
33
+ <th><%== sort_link(:first_offset) %></th>
34
+ <th><%== sort_link(:last_offset) %></th>
35
+ <th><%== sort_link(:committed_offset) %></th>
36
+ </tr>
37
+ </thead>
38
+ <tbody>
39
+ <%==
40
+ render_each(
41
+ jobs,
42
+ 'consumers/jobs/_job',
43
+ local: :job
44
+ )
45
+ %>
46
+ </tbody>
47
+ </table>
48
+ </div>
@@ -27,36 +27,15 @@
27
27
 
28
28
  <%== partial 'consumers/consumers/consumer/tabs' %>
29
29
 
30
- <% if @pending_jobs.empty? %>
30
+ <% if filtering? || !@pending_jobs.empty? %>
31
+ <%== filter_box %>
32
+ <% end %>
33
+
34
+ <% if @pending_jobs.empty? && filtering? %>
35
+ <%== partial 'shared/no_filter_results' %>
36
+ <% elsif @pending_jobs.empty? %>
31
37
  <%== partial 'consumers/jobs/no_jobs', locals: { type: 'pending' } %>
32
38
  <% else %>
33
- <div class="data-table-wrapper">
34
- <table class="data-table">
35
- <thead>
36
- <tr>
37
- <th rowspan="2"><%== sort_link(:topic) %></th>
38
- <th rowspan="2"><%== sort_link(:consumer) %></th>
39
- <th rowspan="2"><%== sort_link(:type) %></th>
40
- <th rowspan="2"><%== sort_link(:messages) %></th>
41
- <th colspan="3" class="text-center">Offsets</th>
42
- <th rowspan="2"><%== sort_link('Started', :updated_at, rev: true) %></th>
43
- </tr>
44
- <tr>
45
- <th><%== sort_link(:first_offset) %></th>
46
- <th><%== sort_link(:last_offset) %></th>
47
- <th><%== sort_link(:committed_offset) %></th>
48
- </tr>
49
- </thead>
50
- <tbody>
51
- <%==
52
- render_each(
53
- @pending_jobs,
54
- 'consumers/jobs/_job',
55
- local: :job
56
- )
57
- %>
58
- </tbody>
59
- </table>
60
- </div>
39
+ <%== partial 'consumers/jobs/jobs_table', locals: { jobs: @pending_jobs } %>
61
40
  <% end %>
62
41
  </div>
@@ -27,36 +27,15 @@
27
27
 
28
28
  <%== partial 'consumers/consumers/consumer/tabs' %>
29
29
 
30
- <% if @running_jobs.empty? %>
30
+ <% if filtering? || !@running_jobs.empty? %>
31
+ <%== filter_box %>
32
+ <% end %>
33
+
34
+ <% if @running_jobs.empty? && filtering? %>
35
+ <%== partial 'shared/no_filter_results' %>
36
+ <% elsif @running_jobs.empty? %>
31
37
  <%== partial 'consumers/jobs/no_jobs', locals: { type: 'running' } %>
32
38
  <% else %>
33
- <div class="data-table-wrapper">
34
- <table class="data-table">
35
- <thead>
36
- <tr>
37
- <th rowspan="2"><%== sort_link(:topic) %></th>
38
- <th rowspan="2"><%== sort_link(:consumer) %></th>
39
- <th rowspan="2"><%== sort_link(:type) %></th>
40
- <th rowspan="2"><%== sort_link(:messages) %></th>
41
- <th colspan="3" class="text-center">Offsets</th>
42
- <th rowspan="2"><%== sort_link('Started', :updated_at, rev: true) %></th>
43
- </tr>
44
- <tr>
45
- <th><%== sort_link(:first_offset) %></th>
46
- <th><%== sort_link(:last_offset) %></th>
47
- <th><%== sort_link(:committed_offset) %></th>
48
- </tr>
49
- </thead>
50
- <tbody>
51
- <%==
52
- render_each(
53
- @running_jobs,
54
- 'consumers/jobs/_job',
55
- local: :job
56
- )
57
- %>
58
- </tbody>
59
- </table>
60
- </div>
39
+ <%== partial 'consumers/jobs/jobs_table', locals: { jobs: @running_jobs } %>
61
40
  <% end %>
62
41
  </div>
@@ -20,8 +20,16 @@
20
20
 
21
21
  <% view_title 'Dead Letter Queue Topics' %>
22
22
 
23
- <% if @dlq_topics.empty? %>
23
+ <% if filtering? || !@dlq_topics.empty? %>
24
+ <div class="col-span-12 mb-3">
25
+ <%== filter_box %>
26
+ </div>
27
+ <% end %>
28
+
29
+ <% if @dlq_topics.empty? && !filtering? %>
24
30
  <%== partial 'dlq/no_topics' %>
31
+ <% elsif @dlq_topics.empty? %>
32
+ <%== partial 'shared/no_filter_results' %>
25
33
  <% else %>
26
34
  <div class="topic-tiles">
27
35
  <%==