karafka-web 0.8.0 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +16 -0
  4. data/Gemfile.lock +19 -19
  5. data/docker-compose.yml +1 -1
  6. data/lib/karafka/web/config.rb +6 -0
  7. data/lib/karafka/web/contracts/config.rb +1 -0
  8. data/lib/karafka/web/installer.rb +6 -2
  9. data/lib/karafka/web/management/actions/enable.rb +5 -0
  10. data/lib/karafka/web/management/actions/extend_boot_file.rb +3 -1
  11. data/lib/karafka/web/management/migrations/1706607960_introduce_lag_total_in_metrics.rb +38 -0
  12. data/lib/karafka/web/management/migrations/1706607960_introduce_lag_total_in_states.rb +22 -0
  13. data/lib/karafka/web/management/migrations/1706611396_rename_lag_total_to_lag_hybrid_in_metrics.rb +36 -0
  14. data/lib/karafka/web/management/migrations/1706611396_rename_lag_total_to_lag_hybrid_in_states.rb +21 -0
  15. data/lib/karafka/web/processing/consumers/aggregators/metrics.rb +7 -9
  16. data/lib/karafka/web/processing/consumers/aggregators/state.rb +8 -9
  17. data/lib/karafka/web/processing/consumers/contracts/aggregated_stats.rb +1 -2
  18. data/lib/karafka/web/processing/consumers/contracts/topic_stats.rb +1 -2
  19. data/lib/karafka/web/tracking/consumers/contracts/subscription_group.rb +1 -1
  20. data/lib/karafka/web/tracking/consumers/listeners/booting.rb +34 -0
  21. data/lib/karafka/web/tracking/consumers/sampler.rb +8 -2
  22. data/lib/karafka/web/tracking/producers/listeners/booting.rb +24 -0
  23. data/lib/karafka/web/tracking/scheduler.rb +0 -5
  24. data/lib/karafka/web/ui/controllers/consumers.rb +1 -1
  25. data/lib/karafka/web/ui/helpers/application_helper.rb +2 -0
  26. data/lib/karafka/web/ui/models/metrics/charts/topics.rb +5 -5
  27. data/lib/karafka/web/ui/models/partition.rb +22 -0
  28. data/lib/karafka/web/ui/models/process.rb +10 -12
  29. data/lib/karafka/web/ui/pro/app.rb +4 -0
  30. data/lib/karafka/web/ui/pro/controllers/consumers.rb +10 -4
  31. data/lib/karafka/web/ui/pro/controllers/health.rb +12 -0
  32. data/lib/karafka/web/ui/pro/views/consumers/_consumer.erb +1 -1
  33. data/lib/karafka/web/ui/pro/views/consumers/_counters.erb +2 -2
  34. data/lib/karafka/web/ui/pro/views/consumers/consumer/_partition.erb +3 -3
  35. data/lib/karafka/web/ui/pro/views/consumers/consumer/_subscription_group.erb +9 -3
  36. data/lib/karafka/web/ui/pro/views/consumers/index.erb +1 -1
  37. data/lib/karafka/web/ui/pro/views/consumers/subscriptions.erb +11 -11
  38. data/lib/karafka/web/ui/pro/views/dashboard/index.erb +3 -3
  39. data/lib/karafka/web/ui/pro/views/health/_breadcrumbs.erb +8 -0
  40. data/lib/karafka/web/ui/pro/views/health/_consumer_group_header.erb +14 -0
  41. data/lib/karafka/web/ui/pro/views/health/_partition.erb +1 -9
  42. data/lib/karafka/web/ui/pro/views/health/_partition_lags.erb +24 -0
  43. data/lib/karafka/web/ui/pro/views/health/_partition_offset.erb +1 -1
  44. data/lib/karafka/web/ui/pro/views/health/_tabs.erb +9 -0
  45. data/lib/karafka/web/ui/pro/views/health/changes.erb +3 -17
  46. data/lib/karafka/web/ui/pro/views/health/lags.erb +52 -0
  47. data/lib/karafka/web/ui/pro/views/health/offsets.erb +4 -17
  48. data/lib/karafka/web/ui/pro/views/health/overview.erb +4 -19
  49. data/lib/karafka/web/ui/views/consumers/_counters.erb +2 -2
  50. data/lib/karafka/web/ui/views/consumers/index.erb +1 -1
  51. data/lib/karafka/web/ui/views/dashboard/index.erb +3 -3
  52. data/lib/karafka/web/version.rb +1 -1
  53. data/lib/karafka/web.rb +2 -1
  54. data.tar.gz.sig +0 -0
  55. metadata +11 -2
  56. metadata.gz.sig +0 -0
@@ -6,6 +6,28 @@ module Karafka
6
6
  module Models
7
7
  # Single topic partition data representation model
8
8
  class Partition < Lib::HashProxy
9
+ # @param args [Object] anything hash proxy accepts
10
+ def initialize(*args)
11
+ super
12
+
13
+ # We initialize those here because we want to have them stored in the internal has
14
+ # for sorting
15
+ lag_hybrid
16
+ lag_hybrid_d
17
+ end
18
+
19
+ # Because `lag_stored` is not available until first marking, we fallback to the lag
20
+ # value that may be behind but is always available until stored lag is available.
21
+ # @return [Integer] hybrid log value
22
+ def lag_hybrid
23
+ self[:lag_hybrid] ||= lag_stored.negative? ? lag : lag_stored
24
+ end
25
+
26
+ # @return [Integer] hybrid log delta
27
+ def lag_hybrid_d
28
+ self[:lag_hybrid_d] ||= lag_stored.negative? ? lag_d : lag_stored_d
29
+ end
30
+
9
31
  # @return [Symbol] one of three states in which LSO can be in the correlation to given
10
32
  # partition in the context of a consumer group.
11
33
  #
@@ -41,26 +41,24 @@ module Karafka
41
41
  .then { |jobs| Jobs.new(jobs) }
42
42
  end
43
43
 
44
- # @return [Integer] collective stored lag on this process
45
- def lag_stored
44
+ # @return [Integer] collective hybrid lag on this process
45
+ def lag_hybrid
46
46
  consumer_groups
47
47
  .flat_map(&:subscription_groups)
48
48
  .flat_map(&:topics)
49
49
  .flat_map(&:partitions)
50
- .map(&:lag_stored)
50
+ .map(&:lag_hybrid)
51
51
  .delete_if(&:negative?)
52
52
  .sum
53
53
  end
54
54
 
55
- # @return [Integer] collective lag on this process
56
- def lag
57
- consumer_groups
58
- .flat_map(&:subscription_groups)
59
- .flat_map(&:topics)
60
- .flat_map(&:partitions)
61
- .map(&:lag)
62
- .delete_if(&:negative?)
63
- .sum
55
+ # @return [Boolean] true if there are any active subscriptions, otherwise false.
56
+ def subscribed?
57
+ return false if consumer_groups.empty?
58
+
59
+ consumer_groups.any? do |cg|
60
+ !cg.subscription_groups.empty?
61
+ end
64
62
  end
65
63
 
66
64
  # @return [Integer] number of partitions to which we are currently subscribed
@@ -163,6 +163,10 @@ module Karafka
163
163
  r.on 'health' do
164
164
  controller = Controllers::Health.new(params)
165
165
 
166
+ r.get 'lags' do
167
+ controller.lags
168
+ end
169
+
166
170
  r.get 'offsets' do
167
171
  controller.offsets
168
172
  end
@@ -19,11 +19,11 @@ module Karafka
19
19
  # Controller for displaying consumers states and details about them
20
20
  class Consumers < Ui::Controllers::Base
21
21
  self.sortable_attributes = %w[
22
+ id
22
23
  name
23
24
  started_at
24
- lag_stored
25
- id
26
- lag_stored_d
25
+ lag_hybrid
26
+ lag_hybrid_d
27
27
  committed_offset
28
28
  stored_offset
29
29
  fetch_state
@@ -93,7 +93,13 @@ module Karafka
93
93
 
94
94
  # We want to have sorting but on a per subscription group basis and not to sort
95
95
  # everything
96
- @process.consumer_groups.each { |subscription_group| refine(subscription_group) }
96
+ @process.consumer_groups.each do |consumer_group|
97
+ # We need to initialize the whole structure so dynamic fields are also built into
98
+ # the underlying hashes for sorting
99
+ consumer_group.subscription_groups.flat_map(&:topics).flat_map(&:partitions)
100
+
101
+ refine(consumer_group)
102
+ end
97
103
 
98
104
  render
99
105
  end
@@ -20,8 +20,12 @@ module Karafka
20
20
  class Health < Ui::Controllers::Base
21
21
  self.sortable_attributes = %w[
22
22
  id
23
+ lag
24
+ lag_d
23
25
  lag_stored
24
26
  lag_stored_d
27
+ lag_hybrid
28
+ lag_hybrid_d
25
29
  committed_offset
26
30
  committed_offset_fd
27
31
  stored_offset
@@ -50,6 +54,14 @@ module Karafka
50
54
  render
51
55
  end
52
56
 
57
+ # Displays details about lags and their progression/statuses
58
+ def lags
59
+ # Same data as overview but presented differently
60
+ overview
61
+
62
+ render
63
+ end
64
+
53
65
  # Displays details about offsets and their progression/statuses
54
66
  def offsets
55
67
  # Same data as overview but presented differently
@@ -71,6 +71,6 @@
71
71
  </td>
72
72
 
73
73
  <td>
74
- <%= process.lag_stored %>
74
+ <%= process.lag_hybrid %>
75
75
  </td>
76
76
  </tr>
@@ -19,9 +19,9 @@
19
19
  </li>
20
20
  <li class="col-sm">
21
21
  <div class="count mb-1">
22
- <%= number_with_delimiter @counters.lag_stored, ' ' %>
22
+ <%= number_with_delimiter @counters.lag_hybrid, ' ' %>
23
23
  </div>
24
- <div class="desc">Lag stored</div>
24
+ <div class="desc">Total lag</div>
25
25
  </li>
26
26
  <li class="col-sm">
27
27
  <a href="<%= root_path('jobs/running') %>">
@@ -3,11 +3,11 @@
3
3
  <%= partition.id %>
4
4
  </td>
5
5
  <td>
6
- <%== lag_with_label partition.lag_stored %>
6
+ <%== lag_with_label partition.lag_hybrid %>
7
7
  </td>
8
8
  <td>
9
- <span class="badge <%= lag_trend_bg(partition.lag_stored_d) %>">
10
- <%= partition.lag_stored_d %>
9
+ <span class="badge <%= lag_trend_bg(partition.lag_hybrid_d) %>">
10
+ <%= partition.lag_hybrid_d %>
11
11
  </span>
12
12
  </td>
13
13
  <td>
@@ -76,7 +76,13 @@
76
76
 
77
77
  <span class="text-end mt-3">
78
78
  <small>
79
- Last rebalance reason: <%= subscription_group.rebalance_reason %>
79
+ Last rebalance reason:
80
+
81
+ <% if subscription_group.rebalance_reason.empty? %>
82
+ Unknown
83
+ <% else %>
84
+ <%= subscription_group.rebalance_reason %>
85
+ <% end %>
80
86
  </small>
81
87
  </span>
82
88
  </div>
@@ -104,8 +110,8 @@
104
110
  <tr class="align-middle">
105
111
  </tr>
106
112
  <th><%== sort_link('Partition', :id) %></th>
107
- <th><%== sort_link(:lag_stored) %></th>
108
- <th><%== sort_link('Lag stored trend', :lag_stored_d) %></th>
113
+ <th><%== sort_link('Lag', :lag_hybrid) %></th>
114
+ <th><%== sort_link('Lag trend', :lag_hybrid_d) %></th>
109
115
  <th><%== sort_link(:committed_offset) %></th>
110
116
  <th><%== sort_link(:stored_offset) %></th>
111
117
  <th><%== sort_link(:fetch_state) %></th>
@@ -17,7 +17,7 @@
17
17
  <th class="col-sm-1">Memory</th>
18
18
  <th class="col-sm-1">Performance</th>
19
19
  <th class="col-sm-1">Load</th>
20
- <th class="col-sm-1"><%== sort_link(:lag_stored) %></th>
20
+ <th class="col-sm-1"><%== sort_link('Lag', :lag_hybrid) %></th>
21
21
  </tr>
22
22
  </thead>
23
23
  <tbody>
@@ -8,16 +8,16 @@
8
8
 
9
9
  <%== partial 'consumers/consumer/tabs' %>
10
10
 
11
- <% if @process.consumer_groups.empty? %>
11
+ <% if @process.subscribed? %>
12
+ <div class="container">
13
+ <%==
14
+ render_each(
15
+ @process.consumer_groups,
16
+ 'consumers/consumer/_consumer_group',
17
+ local: :consumer_group
18
+ )
19
+ %>
20
+ </div>
21
+ <% else %>
12
22
  <%== partial 'consumers/consumer/no_subscriptions' %>
13
23
  <% end %>
14
-
15
- <div class="container">
16
- <%==
17
- render_each(
18
- @process.consumer_groups,
19
- 'consumers/consumer/_consumer_group',
20
- local: :consumer_group
21
- )
22
- %>
23
- </div>
@@ -13,7 +13,7 @@
13
13
  <ul class="nav nav-tabs" id="graphs1" role="tablist">
14
14
  <%== partial 'shared/tab_nav', locals: { title: 'Messages', id: 'messages', active: true } %>
15
15
  <%== partial 'shared/tab_nav', locals: { title: 'Batches', id: 'batches' } %>
16
- <%== partial 'shared/tab_nav', locals: { title: 'Lags stored', id: 'lags-stored' } %>
16
+ <%== partial 'shared/tab_nav', locals: { title: 'Topics lags', id: 'topics-lags' } %>
17
17
  <%== partial 'shared/tab_nav', locals: { title: 'Topics pace', id: 'topics-pace' } %>
18
18
  <%== partial 'shared/tab_nav', locals: { title: 'Max LSO time', id: 'max-lso-time' } %>
19
19
  </ul>
@@ -29,8 +29,8 @@
29
29
  <%== partial 'shared/chart', locals: { data: data, id: 'batches' } %>
30
30
  </div>
31
31
 
32
- <div class="tab-pane" id="lags-stored" role="tabpanel">
33
- <%== partial 'shared/chart', locals: { data: @topics_charts.lags_stored, id: 'lags-stored' } %>
32
+ <div class="tab-pane" id="topics-lags" role="tabpanel">
33
+ <%== partial 'shared/chart', locals: { data: @topics_charts.lags_hybrid, id: 'topics-lags' } %>
34
34
  </div>
35
35
 
36
36
  <div class="tab-pane" id="topics-pace" role="tabpanel">
@@ -4,6 +4,14 @@
4
4
  </a>
5
5
  </li>
6
6
 
7
+ <% if current_path.include?('/lags') %>
8
+ <li class="breadcrumb-item">
9
+ <a href="<%= root_path('health', 'lags') %>">
10
+ Lags
11
+ </a>
12
+ </li>
13
+ <% end %>
14
+
7
15
  <% if current_path.include?('/overview') %>
8
16
  <li class="breadcrumb-item">
9
17
  <a href="<%= root_path('health', 'overview') %>">
@@ -0,0 +1,14 @@
1
+ <div class="row mb-4">
2
+ <div class="col-sm-8">
3
+ <h4 class="mb-4"><%= cg_name %></h4>
4
+ </div>
5
+
6
+ <div class="col-sm-4">
7
+ <span class="float-end">
8
+ Last rebalance:
9
+ <span class="badge bg-secondary">
10
+ <%== relative_time(details[:rebalanced_at]) %>
11
+ </span>
12
+ </span>
13
+ </div>
14
+ </div>
@@ -3,15 +3,7 @@
3
3
  <%= partition_id %>
4
4
  </td>
5
5
  <td>
6
- <%== lag_with_label details.lag_stored %>
7
- </td>
8
- <td>
9
- <span class="badge <%= lag_trend_bg(details.lag_stored_d) %>">
10
- <%= details.lag_stored_d %>
11
- </span>
12
- </td>
13
- <td>
14
- <%== offset_with_label topic_name, partition_id, details.committed_offset %>
6
+ <%== lag_with_label details.lag_hybrid %>
15
7
  </td>
16
8
  <td>
17
9
  <%== offset_with_label topic_name, partition_id, details.stored_offset %>
@@ -0,0 +1,24 @@
1
+ <tr class="align-middle <%= lso_risk_state_bg(details) %> status-row-<%= details.process.status %>">
2
+ <td>
3
+ <%= partition_id %>
4
+ </td>
5
+ <td>
6
+ <%== lag_with_label details.lag %>
7
+ </td>
8
+ <td>
9
+ <span class="badge <%= lag_trend_bg(details.lag_d) %>">
10
+ <%= details.lag_d %>
11
+ </span>
12
+ </td>
13
+ <td>
14
+ <%== lag_with_label details.lag_stored %>
15
+ </td>
16
+ <td>
17
+ <span class="badge <%= lag_trend_bg(details.lag_stored_d) %>">
18
+ <%= details.lag_stored_d %>
19
+ </span>
20
+ </td>
21
+ <td>
22
+ <%== poll_state_with_change_time_label(details.poll_state, details.poll_state_ch) %>
23
+ </td>
24
+ </tr>
@@ -3,7 +3,7 @@
3
3
  <%= partition_id %>
4
4
  </td>
5
5
  <td>
6
- <%== lag_with_label details.lag_stored %>
6
+ <%== lag_with_label details.lag_hybrid %>
7
7
  </td>
8
8
  <td>
9
9
  <%== offset_with_label topic_name, partition_id, details.committed_offset %>
@@ -12,6 +12,15 @@
12
12
  </a>
13
13
  </li>
14
14
 
15
+ <li class="nav-item">
16
+ <a
17
+ class="nav-link <%= nav_class(include: 'lags') %>"
18
+ href="<%= root_path('health', 'lags') %>"
19
+ >
20
+ Lags
21
+ </a>
22
+ </li>
23
+
15
24
  <li class="nav-item">
16
25
  <a
17
26
  class="nav-link <%= nav_class(include: 'offsets') %>"
@@ -1,28 +1,14 @@
1
1
  <%== view_title('Consumers groups changes details') %>
2
2
 
3
+ <%== partial 'health/tabs' %>
4
+
3
5
  <% if @stats.empty? %>
4
6
  <%== partial 'health/no_data' %>
5
- <% else %>
6
- <%== partial 'health/tabs' %>
7
7
  <% end %>
8
8
 
9
-
10
9
  <% @stats.each_with_index do |(cg_name, details), index| %>
11
10
  <div class="container mb-5">
12
- <div class="row mb-4">
13
- <div class="col-sm-8">
14
- <h4 class="mb-4"><%= cg_name %></h4>
15
- </div>
16
-
17
- <div class="col-sm-4">
18
- <span class="float-end">
19
- Last rebalance:
20
- <span class="badge bg-secondary">
21
- <%== relative_time(details[:rebalanced_at]) %>
22
- </span>
23
- </span>
24
- </div>
25
- </div>
11
+ <%== partial 'health/consumer_group_header', locals: { cg_name: cg_name, details: details } %>
26
12
 
27
13
  <div class="row mb-3">
28
14
  <div class="col-sm-12">
@@ -0,0 +1,52 @@
1
+ <%== view_title('Consumers groups lags details') %>
2
+
3
+ <%== partial 'health/tabs' %>
4
+
5
+ <% if @stats.empty? %>
6
+ <%== partial 'health/no_data' %>
7
+ <% end %>
8
+
9
+ <% @stats.each_with_index do |(cg_name, details), index| %>
10
+ <div class="container mb-5">
11
+ <%== partial 'health/consumer_group_header', locals: { cg_name: cg_name, details: details } %>
12
+
13
+ <div class="row mb-3">
14
+ <div class="col-sm-12">
15
+ <% topics = details[:topics] %>
16
+ <% topics.each_with_index do |(topic_name, partitions), index| %>
17
+ <table class="processes bg-white table table-hover table-bordered table-striped align-middle <%= (index+1 < topics.size) ? 'mb-5' : 'mb-3' %>">
18
+ <thead>
19
+ <tr class="align-middle">
20
+ <th colspan="12">
21
+ <h5 class="mb-0"><%= topic_name %></h4>
22
+ </th>
23
+ </tr>
24
+ <tr class="align-middle">
25
+ <th><%== sort_link('Partition', :id) %></th>
26
+ <th><%== sort_link('Lag', :lag) %></th>
27
+ <th><%== sort_link('Lag trend', :lag_d) %></th>
28
+ <th><%== sort_link('Lag stored', :lag_stored) %></th>
29
+ <th><%== sort_link('Lag stored trend', :lag_stored_d) %></th>
30
+ <th><%== sort_link(:poll_state) %></th>
31
+ </tr>
32
+ </thead>
33
+ <tbody>
34
+ <% partitions.each do |partition_id, details| %>
35
+ <%==
36
+ partial(
37
+ 'health/partition_lags',
38
+ locals: {
39
+ topic_name: topic_name,
40
+ partition_id: partition_id,
41
+ details: details
42
+ }
43
+ )
44
+ %>
45
+ <% end %>
46
+ </tbody>
47
+ </table>
48
+ <% end %>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ <% end %>
@@ -1,27 +1,14 @@
1
1
  <%== view_title('Consumers groups offsets details') %>
2
2
 
3
+ <%== partial 'health/tabs' %>
4
+
3
5
  <% if @stats.empty? %>
4
6
  <%== partial 'health/no_data' %>
5
- <% else %>
6
- <%== partial 'health/tabs' %>
7
7
  <% end %>
8
8
 
9
9
  <% @stats.each_with_index do |(cg_name, details), index| %>
10
10
  <div class="container mb-5">
11
- <div class="row mb-4">
12
- <div class="col-sm-8">
13
- <h4 class="mb-4"><%= cg_name %></h4>
14
- </div>
15
-
16
- <div class="col-sm-4">
17
- <span class="float-end">
18
- Last rebalance:
19
- <span class="badge bg-secondary">
20
- <%== relative_time(details[:rebalanced_at]) %>
21
- </span>
22
- </span>
23
- </div>
24
- </div>
11
+ <%== partial 'health/consumer_group_header', locals: { cg_name: cg_name, details: details } %>
25
12
 
26
13
  <div class="row mb-3">
27
14
  <div class="col-sm-12">
@@ -36,7 +23,7 @@
36
23
  </tr>
37
24
  <tr class="align-middle">
38
25
  <th><%== sort_link('Partition', :id) %></th>
39
- <th><%== sort_link(:lag_stored) %></th>
26
+ <th><%== sort_link('Lag', :lag_hybrid) %></th>
40
27
  <th><%== sort_link(:committed_offset) %></th>
41
28
  <th><%== sort_link('Committed offset change', :committed_offset_fd) %></th>
42
29
  <th><%== sort_link(:stored_offset) %></th>
@@ -1,27 +1,14 @@
1
1
  <%== view_title('Consumers groups overview') %>
2
2
 
3
+ <%== partial 'health/tabs' %>
4
+
3
5
  <% if @stats.empty? %>
4
6
  <%== partial 'health/no_data' %>
5
- <% else %>
6
- <%== partial 'health/tabs' %>
7
7
  <% end %>
8
8
 
9
9
  <% @stats.each_with_index do |(cg_name, details), index| %>
10
10
  <div class="container mb-5">
11
- <div class="row mb-4">
12
- <div class="col-sm-8">
13
- <h4 class="mb-4"><%= cg_name %></h4>
14
- </div>
15
-
16
- <div class="col-sm-4">
17
- <span class="float-end">
18
- Last rebalance:
19
- <span class="badge bg-secondary">
20
- <%== relative_time(details[:rebalanced_at]) %>
21
- </span>
22
- </span>
23
- </div>
24
- </div>
11
+ <%== partial 'health/consumer_group_header', locals: { cg_name: cg_name, details: details } %>
25
12
 
26
13
  <div class="row mb-3">
27
14
  <div class="col-sm-12">
@@ -36,9 +23,7 @@
36
23
  </tr>
37
24
  <tr class="align-middle">
38
25
  <th><%== sort_link('Partition', :id) %></th>
39
- <th><%== sort_link(:lag_stored) %></th>
40
- <th><%== sort_link('Lag stored trend', :lag_stored_d) %></th>
41
- <th><%== sort_link(:committed_offset) %></th>
26
+ <th><%== sort_link('Lag', :lag_hybrid) %></th>
42
27
  <th><%== sort_link(:stored_offset) %></th>
43
28
  <th><%== sort_link(:fetch_state) %></th>
44
29
  <th><%== sort_link(:poll_state) %></th>
@@ -19,9 +19,9 @@
19
19
  </li>
20
20
  <li class="col-sm">
21
21
  <div class="count mb-1">
22
- <%= number_with_delimiter @counters.lag_stored, ' ' %>
22
+ <%= number_with_delimiter @counters.lag_hybrid, ' ' %>
23
23
  </div>
24
- <div class="desc">Lag stored</div>
24
+ <div class="desc">Total lag</div>
25
25
  </li>
26
26
  <li class="col-sm">
27
27
  <a href="<%= root_path('jobs/running') %>">
@@ -16,7 +16,7 @@
16
16
  <th class="col-sm-2"><%== sort_link('Started', :started_at, rev: true) %></th>
17
17
  <th class="col-sm-1">Memory</th>
18
18
  <th class="col-sm-1">Utilization</th>
19
- <th class="col-sm-1"><%== sort_link(:lag_stored) %></th>
19
+ <th class="col-sm-1"><%== sort_link('Lag', :lag_hybrid) %></th>
20
20
  </tr>
21
21
  </thead>
22
22
  <tbody>
@@ -23,7 +23,7 @@
23
23
  <ul class="nav nav-tabs" id="graphs1" role="tablist">
24
24
  <%== partial 'shared/tab_nav', locals: { title: 'Messages', id: 'messages', active: true } %>
25
25
  <%== partial 'shared/tab_nav', locals: { title: 'Batches', id: 'batches' } %>
26
- <%== partial 'shared/tab_nav', locals: { title: 'Lags stored', id: 'lags-stored' } %>
26
+ <%== partial 'shared/tab_nav', locals: { title: 'Topics Lags', id: 'topics-lags' } %>
27
27
  <%== partial 'shared/tab_nav', locals: { title: 'Topics pace', id: 'topics-pace' } %>
28
28
  <%== partial 'shared/tab_nav', locals: { title: 'Max LSO time', id: 'max-lso-time' } %>
29
29
  </ul>
@@ -39,10 +39,10 @@
39
39
  <%== partial 'shared/chart', locals: { data: data, id: 'batches' } %>
40
40
  </div>
41
41
 
42
- <div class="tab-pane" id="lags-stored" role="tabpanel">
42
+ <div class="tab-pane" id="topics-lags" role="tabpanel">
43
43
  <%== partial 'dashboard/feature_pro' %>
44
44
  <% data = { enqueued: set.call, busy: set.call }.to_json %>
45
- <%== partial 'shared/chart', locals: { data: data, id: 'lags-stored', blurred: true } %>
45
+ <%== partial 'shared/chart', locals: { data: data, id: 'topics-lags', blurred: true } %>
46
46
  </div>
47
47
 
48
48
  <div class="tab-pane" id="topics-pace" role="tabpanel">
@@ -3,6 +3,6 @@
3
3
  module Karafka
4
4
  module Web
5
5
  # Current gem version
6
- VERSION = '0.8.0'
6
+ VERSION = '0.8.2'
7
7
  end
8
8
  end
data/lib/karafka/web.rb CHANGED
@@ -15,8 +15,9 @@ module Karafka
15
15
  class << self
16
16
  # @return [WaterDrop::Producer, nil] waterdrop messages producer or nil if not yet fully
17
17
  # initialized. It may not be fully initialized until the configuration is done
18
+ # @note Do NOT memoize producer as it may be updated after forking
18
19
  def producer
19
- @producer ||= Web.config.producer
20
+ Web.config.producer
20
21
  end
21
22
 
22
23
  # @return [String] root path of this gem
data.tar.gz.sig CHANGED
Binary file