karafka-web 0.8.0 → 0.8.2
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +16 -0
- data/Gemfile.lock +19 -19
- data/docker-compose.yml +1 -1
- data/lib/karafka/web/config.rb +6 -0
- data/lib/karafka/web/contracts/config.rb +1 -0
- data/lib/karafka/web/installer.rb +6 -2
- data/lib/karafka/web/management/actions/enable.rb +5 -0
- data/lib/karafka/web/management/actions/extend_boot_file.rb +3 -1
- data/lib/karafka/web/management/migrations/1706607960_introduce_lag_total_in_metrics.rb +38 -0
- data/lib/karafka/web/management/migrations/1706607960_introduce_lag_total_in_states.rb +22 -0
- data/lib/karafka/web/management/migrations/1706611396_rename_lag_total_to_lag_hybrid_in_metrics.rb +36 -0
- data/lib/karafka/web/management/migrations/1706611396_rename_lag_total_to_lag_hybrid_in_states.rb +21 -0
- data/lib/karafka/web/processing/consumers/aggregators/metrics.rb +7 -9
- data/lib/karafka/web/processing/consumers/aggregators/state.rb +8 -9
- data/lib/karafka/web/processing/consumers/contracts/aggregated_stats.rb +1 -2
- data/lib/karafka/web/processing/consumers/contracts/topic_stats.rb +1 -2
- data/lib/karafka/web/tracking/consumers/contracts/subscription_group.rb +1 -1
- data/lib/karafka/web/tracking/consumers/listeners/booting.rb +34 -0
- data/lib/karafka/web/tracking/consumers/sampler.rb +8 -2
- data/lib/karafka/web/tracking/producers/listeners/booting.rb +24 -0
- data/lib/karafka/web/tracking/scheduler.rb +0 -5
- data/lib/karafka/web/ui/controllers/consumers.rb +1 -1
- data/lib/karafka/web/ui/helpers/application_helper.rb +2 -0
- data/lib/karafka/web/ui/models/metrics/charts/topics.rb +5 -5
- data/lib/karafka/web/ui/models/partition.rb +22 -0
- data/lib/karafka/web/ui/models/process.rb +10 -12
- data/lib/karafka/web/ui/pro/app.rb +4 -0
- data/lib/karafka/web/ui/pro/controllers/consumers.rb +10 -4
- data/lib/karafka/web/ui/pro/controllers/health.rb +12 -0
- data/lib/karafka/web/ui/pro/views/consumers/_consumer.erb +1 -1
- data/lib/karafka/web/ui/pro/views/consumers/_counters.erb +2 -2
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_partition.erb +3 -3
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_subscription_group.erb +9 -3
- data/lib/karafka/web/ui/pro/views/consumers/index.erb +1 -1
- data/lib/karafka/web/ui/pro/views/consumers/subscriptions.erb +11 -11
- data/lib/karafka/web/ui/pro/views/dashboard/index.erb +3 -3
- data/lib/karafka/web/ui/pro/views/health/_breadcrumbs.erb +8 -0
- data/lib/karafka/web/ui/pro/views/health/_consumer_group_header.erb +14 -0
- data/lib/karafka/web/ui/pro/views/health/_partition.erb +1 -9
- data/lib/karafka/web/ui/pro/views/health/_partition_lags.erb +24 -0
- data/lib/karafka/web/ui/pro/views/health/_partition_offset.erb +1 -1
- data/lib/karafka/web/ui/pro/views/health/_tabs.erb +9 -0
- data/lib/karafka/web/ui/pro/views/health/changes.erb +3 -17
- data/lib/karafka/web/ui/pro/views/health/lags.erb +52 -0
- data/lib/karafka/web/ui/pro/views/health/offsets.erb +4 -17
- data/lib/karafka/web/ui/pro/views/health/overview.erb +4 -19
- data/lib/karafka/web/ui/views/consumers/_counters.erb +2 -2
- data/lib/karafka/web/ui/views/consumers/index.erb +1 -1
- data/lib/karafka/web/ui/views/dashboard/index.erb +3 -3
- data/lib/karafka/web/version.rb +1 -1
- data/lib/karafka/web.rb +2 -1
- data.tar.gz.sig +0 -0
- metadata +11 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 457da6c2e847225be5d27f3a30fcf8f99a4a132f8109204315ac042e24d1bd35
|
4
|
+
data.tar.gz: c277f44c30a34ee2748ac4e9b56833814b522da87f6cc1841d21aca618af58be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ff1df82abd7f4f9f7002ae8a9e3e4e3fef2a71fbac820ff700d52c1926a5a81bf8e141ac6b928693d6276d8c16ef496efc11cada7574da217f4fb31efe31b5b
|
7
|
+
data.tar.gz: 3f39b8155794c25a39464d71c35f33ee82e6b59f92b55301f20ff69f1c58bc2cdf32af976720c548c2262893e25e0f8c8d31b8c033a248feb929bd088bc46d6c
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# Karafka Web changelog
|
2
2
|
|
3
|
+
## 0.8.2 (2024-02-16)
|
4
|
+
- [Enhancement] Defer scheduler background thread creation until needed allowing for forks.
|
5
|
+
- [Enhancement] Tag forks with fork indication + ppid reference when operating in swarm.
|
6
|
+
- [Fix] Fix issue where Health tabs would not be visible when no data reported.
|
7
|
+
- [Fix] Stopped processes subscriptions lacks indicator of no groups.
|
8
|
+
- [Fix] Terminated process state not supported in the web ui.
|
9
|
+
- [Fix] Rebalance reason can be empty on a SG when no network.
|
10
|
+
|
11
|
+
## 0.8.1 (2024-02-01)
|
12
|
+
- [Enhancement] Introduce "Lags" health view.
|
13
|
+
- [Enhancement] Remove "Stored Lag" and "Committed Offset" from Health Overview due to Lags Tab.
|
14
|
+
- [Enhancement] Report lag on consumers that did not yet marked offsets.
|
15
|
+
- [Enhancement] Use more accurate lag reporting that compensates for lack of stored lag.
|
16
|
+
- [Fix] When first message after process start is crashed without DLQ lag is not reported.
|
17
|
+
- [Fix] Wrong order of enabled injection causes fresh install to crash.
|
18
|
+
|
3
19
|
## 0.8.0 (2024-01-26)
|
4
20
|
- **[Feature]** Provide ability to sort table data for part of the views (note: not all attributes can be sorted due to technical limitations of sub-components fetching from Kafka).
|
5
21
|
- **[Feature]** Track and report pause timeouts via "Changes" view in Health.
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
karafka-web (0.8.
|
4
|
+
karafka-web (0.8.2)
|
5
5
|
erubi (~> 1.4)
|
6
6
|
karafka (>= 2.3.0, < 2.4.0)
|
7
7
|
karafka-core (>= 2.3.0, < 2.4.0)
|
@@ -26,7 +26,7 @@ GEM
|
|
26
26
|
byebug (11.1.3)
|
27
27
|
concurrent-ruby (1.2.3)
|
28
28
|
connection_pool (2.4.1)
|
29
|
-
diff-lcs (1.5.
|
29
|
+
diff-lcs (1.5.1)
|
30
30
|
docile (1.4.0)
|
31
31
|
drb (2.2.0)
|
32
32
|
ruby2_keywords
|
@@ -42,14 +42,14 @@ GEM
|
|
42
42
|
zeitwerk (~> 2.3)
|
43
43
|
karafka-core (2.3.0)
|
44
44
|
karafka-rdkafka (>= 0.14.8, < 0.15.0)
|
45
|
-
karafka-rdkafka (0.14.
|
45
|
+
karafka-rdkafka (0.14.9)
|
46
46
|
ffi (~> 1.15)
|
47
47
|
mini_portile2 (~> 2.6)
|
48
48
|
rake (> 12)
|
49
49
|
mini_portile2 (2.8.5)
|
50
|
-
minitest (5.
|
50
|
+
minitest (5.22.0)
|
51
51
|
mutex_m (0.2.0)
|
52
|
-
rack (3.0.
|
52
|
+
rack (3.0.9)
|
53
53
|
rack-test (2.1.0)
|
54
54
|
rack (>= 1.3)
|
55
55
|
rackup (0.2.3)
|
@@ -58,19 +58,19 @@ GEM
|
|
58
58
|
rake (13.1.0)
|
59
59
|
roda (3.76.0)
|
60
60
|
rack
|
61
|
-
rspec (3.
|
62
|
-
rspec-core (~> 3.
|
63
|
-
rspec-expectations (~> 3.
|
64
|
-
rspec-mocks (~> 3.
|
65
|
-
rspec-core (3.
|
66
|
-
rspec-support (~> 3.
|
67
|
-
rspec-expectations (3.
|
61
|
+
rspec (3.13.0)
|
62
|
+
rspec-core (~> 3.13.0)
|
63
|
+
rspec-expectations (~> 3.13.0)
|
64
|
+
rspec-mocks (~> 3.13.0)
|
65
|
+
rspec-core (3.13.0)
|
66
|
+
rspec-support (~> 3.13.0)
|
67
|
+
rspec-expectations (3.13.0)
|
68
68
|
diff-lcs (>= 1.2.0, < 2.0)
|
69
|
-
rspec-support (~> 3.
|
70
|
-
rspec-mocks (3.
|
69
|
+
rspec-support (~> 3.13.0)
|
70
|
+
rspec-mocks (3.13.0)
|
71
71
|
diff-lcs (>= 1.2.0, < 2.0)
|
72
|
-
rspec-support (~> 3.
|
73
|
-
rspec-support (3.
|
72
|
+
rspec-support (~> 3.13.0)
|
73
|
+
rspec-support (3.13.0)
|
74
74
|
ruby2_keywords (0.0.5)
|
75
75
|
simplecov (0.22.0)
|
76
76
|
docile (~> 1.1)
|
@@ -81,11 +81,11 @@ GEM
|
|
81
81
|
tilt (2.3.0)
|
82
82
|
tzinfo (2.0.6)
|
83
83
|
concurrent-ruby (~> 1.0)
|
84
|
-
waterdrop (2.6.
|
84
|
+
waterdrop (2.6.14)
|
85
85
|
karafka-core (>= 2.2.3, < 3.0.0)
|
86
86
|
zeitwerk (~> 2.3)
|
87
87
|
webrick (1.8.1)
|
88
|
-
zeitwerk (2.6.
|
88
|
+
zeitwerk (2.6.13)
|
89
89
|
|
90
90
|
PLATFORMS
|
91
91
|
ruby
|
@@ -101,4 +101,4 @@ DEPENDENCIES
|
|
101
101
|
simplecov
|
102
102
|
|
103
103
|
BUNDLED WITH
|
104
|
-
2.5.
|
104
|
+
2.5.6
|
data/docker-compose.yml
CHANGED
data/lib/karafka/web/config.rb
CHANGED
@@ -6,6 +6,10 @@ module Karafka
|
|
6
6
|
class Config
|
7
7
|
include ::Karafka::Core::Configurable
|
8
8
|
|
9
|
+
# Is the Web UI enabled and things were configured.
|
10
|
+
# Automatically set to true in case things got enabled.
|
11
|
+
setting :enabled, default: false
|
12
|
+
|
9
13
|
# How long do we consider the process alive without receiving status info about it
|
10
14
|
# For this long we also display dead processes (shutdown) in the UI
|
11
15
|
# This is used both in the processing for eviction and in the UI
|
@@ -65,6 +69,7 @@ module Karafka
|
|
65
69
|
|
66
70
|
# Listeners needed for the Web UI to track consumer related changes
|
67
71
|
setting :listeners, default: [
|
72
|
+
Tracking::Consumers::Listeners::Booting.new,
|
68
73
|
Tracking::Consumers::Listeners::Status.new,
|
69
74
|
Tracking::Consumers::Listeners::Errors.new,
|
70
75
|
Tracking::Consumers::Listeners::Connections.new,
|
@@ -84,6 +89,7 @@ module Karafka
|
|
84
89
|
|
85
90
|
# Listeners needed for the Web UI to track producers related stuff
|
86
91
|
setting :listeners, default: [
|
92
|
+
Tracking::Producers::Listeners::Booting.new,
|
87
93
|
Tracking::Producers::Listeners::Errors.new
|
88
94
|
]
|
89
95
|
end
|
@@ -10,6 +10,7 @@ module Karafka
|
|
10
10
|
# Use the same regexp as Karafka for topics validation
|
11
11
|
TOPIC_REGEXP = ::Karafka::Contracts::TOPIC_REGEXP
|
12
12
|
|
13
|
+
required(:enabled) { |val| [true, false, nil].include?(val) }
|
13
14
|
required(:ttl) { |val| val.is_a?(Numeric) && val.positive? }
|
14
15
|
|
15
16
|
nested(:topics) do
|
@@ -12,9 +12,12 @@ module Karafka
|
|
12
12
|
#
|
13
13
|
# @param replication_factor [Integer] replication factor we want to use (1 by default)
|
14
14
|
def install(replication_factor: 1)
|
15
|
+
enable!
|
15
16
|
puts
|
16
17
|
puts 'Installing Karafka Web UI...'
|
17
18
|
puts
|
19
|
+
Management::Actions::ExtendBootFile.new.call
|
20
|
+
puts
|
18
21
|
puts 'Creating necessary topics and populating state data...'
|
19
22
|
puts
|
20
23
|
Management::Actions::CreateTopics.new.call(replication_factor)
|
@@ -24,8 +27,6 @@ module Karafka
|
|
24
27
|
puts 'Running data migrations...'
|
25
28
|
Management::Actions::MigrateStatesData.new.call
|
26
29
|
puts
|
27
|
-
Management::Actions::ExtendBootFile.new.call
|
28
|
-
puts
|
29
30
|
puts("Installation #{green('completed')}. Have fun!")
|
30
31
|
puts
|
31
32
|
end
|
@@ -35,6 +36,7 @@ module Karafka
|
|
35
36
|
#
|
36
37
|
# @param replication_factor [Integer] replication factor we want to use (1 by default)
|
37
38
|
def migrate(replication_factor: 1)
|
39
|
+
enable!
|
38
40
|
puts
|
39
41
|
puts 'Creating necessary topics and populating state data...'
|
40
42
|
puts
|
@@ -52,6 +54,7 @@ module Karafka
|
|
52
54
|
# Removes all the Karafka topics and creates them again with the same replication factor
|
53
55
|
# @param replication_factor [Integer] replication factor we want to use (1 by default)
|
54
56
|
def reset(replication_factor: 1)
|
57
|
+
enable!
|
55
58
|
puts
|
56
59
|
puts 'Resetting Karafka Web UI...'
|
57
60
|
puts
|
@@ -70,6 +73,7 @@ module Karafka
|
|
70
73
|
|
71
74
|
# Removes all the Karafka Web topics and cleans after itself.
|
72
75
|
def uninstall
|
76
|
+
enable!
|
73
77
|
puts
|
74
78
|
puts 'Uninstalling Karafka Web UI...'
|
75
79
|
puts
|
@@ -10,6 +10,11 @@ module Karafka
|
|
10
10
|
class Enable < Base
|
11
11
|
# Enables routing consumer group and subscribes Web-UI listeners
|
12
12
|
def call
|
13
|
+
# Prevent double enabling
|
14
|
+
return if ::Karafka::Web.config.enabled
|
15
|
+
|
16
|
+
::Karafka::Web.config.enabled = true
|
17
|
+
|
13
18
|
extend_routing
|
14
19
|
setup_tracking_activity
|
15
20
|
|
@@ -22,7 +22,9 @@ module Karafka
|
|
22
22
|
|
23
23
|
# Adds needed code
|
24
24
|
def call
|
25
|
-
|
25
|
+
# We detect this that way so in case our template or user has enabled as a comment
|
26
|
+
# it still adds the template and runs install
|
27
|
+
if File.readlines(Karafka.boot_file).any? { |line| line.start_with?(ENABLER_CODE) }
|
26
28
|
puts "Web UI #{already} installed."
|
27
29
|
else
|
28
30
|
puts 'Updating the Karafka boot file...'
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
module Management
|
6
|
+
module Migrations
|
7
|
+
# Moves to using lag total as a normalization for both lags
|
8
|
+
class IntroduceLagTotalInMetrics < Base
|
9
|
+
self.versions_until = '1.2.0'
|
10
|
+
self.type = :consumers_metrics
|
11
|
+
|
12
|
+
# @param state [Hash]
|
13
|
+
def migrate(state)
|
14
|
+
state[:aggregated].each_value do |metrics|
|
15
|
+
metrics.each do |metric|
|
16
|
+
metric.last[:lag_total] = metric.last[:lag_stored]
|
17
|
+
metric.last.delete(:lag_stored)
|
18
|
+
metric.last.delete(:lag)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
state[:consumer_groups].each_value do |metrics|
|
23
|
+
metrics.each do |metric_group|
|
24
|
+
metric_group.last.each_value do |metric|
|
25
|
+
metric.each_value do |sample|
|
26
|
+
sample[:lag_total] = sample[:lag_stored]
|
27
|
+
sample.delete(:lag_stored)
|
28
|
+
sample.delete(:lag)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
module Management
|
6
|
+
module Migrations
|
7
|
+
# Moves to using lag total as a normalization for both lags
|
8
|
+
class IntroduceLagTotalInStates < Base
|
9
|
+
self.versions_until = '1.3.0'
|
10
|
+
self.type = :consumers_state
|
11
|
+
|
12
|
+
# @param state [Hash]
|
13
|
+
def migrate(state)
|
14
|
+
state[:stats][:lag_total] = state[:stats][:lag_stored]
|
15
|
+
state[:stats].delete(:lag)
|
16
|
+
state[:stats].delete(:lag_stored)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/karafka/web/management/migrations/1706611396_rename_lag_total_to_lag_hybrid_in_metrics.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
module Management
|
6
|
+
module Migrations
|
7
|
+
# Renames total lag to hybrid to better represent what it is
|
8
|
+
class RenameLagTotalToLagHybridInMetrics < Base
|
9
|
+
self.versions_until = '1.2.1'
|
10
|
+
self.type = :consumers_metrics
|
11
|
+
|
12
|
+
# @param state [Hash]
|
13
|
+
def migrate(state)
|
14
|
+
state[:aggregated].each_value do |metrics|
|
15
|
+
metrics.each do |metric|
|
16
|
+
metric.last[:lag_hybrid] = metric.last[:lag_total] || 0
|
17
|
+
metric.last.delete(:lag_total)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
state[:consumer_groups].each_value do |metrics|
|
22
|
+
metrics.each do |metric_group|
|
23
|
+
metric_group.last.each_value do |metric|
|
24
|
+
metric.each_value do |sample|
|
25
|
+
sample[:lag_hybrid] = sample[:lag_total]
|
26
|
+
sample.delete(:lag_total)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/karafka/web/management/migrations/1706611396_rename_lag_total_to_lag_hybrid_in_states.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
module Management
|
6
|
+
module Migrations
|
7
|
+
# Renames total lag to hybrid to better represent what it is
|
8
|
+
class RenameLagTotalToLagHybridInStates < Base
|
9
|
+
self.versions_until = '1.3.1'
|
10
|
+
self.type = :consumers_state
|
11
|
+
|
12
|
+
# @param state [Hash]
|
13
|
+
def migrate(state)
|
14
|
+
state[:stats][:lag_hybrid] = state[:stats][:lag_total] || 0
|
15
|
+
state[:stats].delete(:lag_total)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -11,7 +11,7 @@ module Karafka
|
|
11
11
|
class Metrics < Base
|
12
12
|
# Current schema version
|
13
13
|
# This is used for detecting incompatible changes and writing migrations
|
14
|
-
SCHEMA_VERSION = '1.1
|
14
|
+
SCHEMA_VERSION = '1.2.1'
|
15
15
|
|
16
16
|
def initialize
|
17
17
|
super
|
@@ -92,12 +92,11 @@ module Karafka
|
|
92
92
|
cgs = {}
|
93
93
|
|
94
94
|
iterate_partitions_data do |group_name, topic_name, partitions_data|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
.map { |p_details| p_details.fetch(:lag_stored, -1) }
|
95
|
+
lags_hybrid = partitions_data
|
96
|
+
.map do |p_details|
|
97
|
+
lag_stored = p_details.fetch(:lag_stored, -1)
|
98
|
+
lag_stored.negative? ? p_details.fetch(:lag, -1) : lag_stored
|
99
|
+
end
|
101
100
|
.reject(&:negative?)
|
102
101
|
|
103
102
|
offsets_hi = partitions_data
|
@@ -121,8 +120,7 @@ module Karafka
|
|
121
120
|
|
122
121
|
cgs[group_name] ||= {}
|
123
122
|
cgs[group_name][topic_name] = {
|
124
|
-
|
125
|
-
lag: lags.sum,
|
123
|
+
lag_hybrid: lags_hybrid.sum,
|
126
124
|
pace: offsets_hi.sum,
|
127
125
|
# Take max last stable offset duration without any change. This can
|
128
126
|
# indicate a hanging transaction, because the offset will not move forward
|
@@ -20,7 +20,7 @@ module Karafka
|
|
20
20
|
# Current schema version
|
21
21
|
# This can be used in the future for detecting incompatible changes and writing
|
22
22
|
# migrations
|
23
|
-
SCHEMA_VERSION = '1.
|
23
|
+
SCHEMA_VERSION = '1.3.1'
|
24
24
|
|
25
25
|
# @param schema_manager [Karafka::Web::Processing::Consumers::SchemaManager] schema
|
26
26
|
# manager that tracks the compatibility of schemas.
|
@@ -127,8 +127,7 @@ module Karafka
|
|
127
127
|
stats[:processes] = 0
|
128
128
|
stats[:rss] = 0
|
129
129
|
stats[:listeners] = { active: 0, standby: 0 }
|
130
|
-
stats[:
|
131
|
-
stats[:lag_stored] = 0
|
130
|
+
stats[:lag_hybrid] = 0
|
132
131
|
stats[:bytes_received] = 0
|
133
132
|
stats[:bytes_sent] = 0
|
134
133
|
utilization = 0
|
@@ -140,12 +139,13 @@ module Karafka
|
|
140
139
|
report_stats = report[:stats]
|
141
140
|
report_process = report[:process]
|
142
141
|
|
143
|
-
|
144
|
-
lags_stored = []
|
142
|
+
lags_hybrid = []
|
145
143
|
|
146
144
|
iterate_partitions(report) do |partition_stats|
|
147
|
-
|
148
|
-
|
145
|
+
lag_stored = partition_stats[:lag_stored]
|
146
|
+
lag = partition_stats[:lag]
|
147
|
+
|
148
|
+
lags_hybrid << (lag_stored.negative? ? lag : lag_stored)
|
149
149
|
end
|
150
150
|
|
151
151
|
stats[:busy] += report_stats[:busy]
|
@@ -157,8 +157,7 @@ module Karafka
|
|
157
157
|
stats[:listeners][:standby] += report_process[:listeners][:standby]
|
158
158
|
stats[:processes] += 1
|
159
159
|
stats[:rss] += report_process[:memory_usage]
|
160
|
-
stats[:
|
161
|
-
stats[:lag_stored] += lags_stored.compact.reject(&:negative?).sum
|
160
|
+
stats[:lag_hybrid] += lags_hybrid.compact.reject(&:negative?).sum
|
162
161
|
utilization += report_stats[:utilization]
|
163
162
|
end
|
164
163
|
|
@@ -21,8 +21,7 @@ module Karafka
|
|
21
21
|
required(:processes) { |val| val.is_a?(Integer) && val >= 0 }
|
22
22
|
required(:rss) { |val| val.is_a?(Numeric) && val >= 0 }
|
23
23
|
required(:utilization) { |val| val.is_a?(Numeric) && val >= 0 }
|
24
|
-
required(:
|
25
|
-
required(:lag) { |val| val.is_a?(Integer) }
|
24
|
+
required(:lag_hybrid) { |val| val.is_a?(Integer) }
|
26
25
|
|
27
26
|
nested(:listeners) do
|
28
27
|
required(:active) { |val| val.is_a?(Integer) && val >= 0 }
|
@@ -9,8 +9,7 @@ module Karafka
|
|
9
9
|
class TopicStats < Web::Contracts::Base
|
10
10
|
configure
|
11
11
|
|
12
|
-
required(:
|
13
|
-
required(:lag) { |val| val.is_a?(Integer) }
|
12
|
+
required(:lag_hybrid) { |val| val.is_a?(Integer) }
|
14
13
|
required(:pace) { |val| val.is_a?(Integer) }
|
15
14
|
required(:ls_offset_fd) { |val| val.is_a?(Integer) && val >= 0 }
|
16
15
|
end
|
@@ -19,7 +19,7 @@ module Karafka
|
|
19
19
|
required(:stateage) { |val| val.is_a?(Integer) && val >= 0 }
|
20
20
|
required(:rebalance_age) { |val| val.is_a?(Integer) && val >= 0 }
|
21
21
|
required(:rebalance_cnt) { |val| val.is_a?(Integer) && val >= 0 }
|
22
|
-
required(:rebalance_reason) { |val| val.is_a?(String)
|
22
|
+
required(:rebalance_reason) { |val| val.is_a?(String) }
|
23
23
|
required(:poll_age) { |val| val.is_a?(Numeric) && val >= 0 }
|
24
24
|
end
|
25
25
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
module Tracking
|
6
|
+
module Consumers
|
7
|
+
module Listeners
|
8
|
+
# Listener needed to start schedulers and other things that we need to collect and report
|
9
|
+
# data. We do not want to start this when code is loaded because it may not be fork
|
10
|
+
# compatible that way
|
11
|
+
class Booting < Base
|
12
|
+
# Starts (if needed) the Web UI tracking scheduler thread that periodically pings
|
13
|
+
# reporters to report needed data (when it is time).
|
14
|
+
#
|
15
|
+
# @param _event [Karafka::Core::Monitoring::Event]
|
16
|
+
def on_app_running(_event)
|
17
|
+
::Karafka::Web.config.tracking.scheduler.async_call
|
18
|
+
end
|
19
|
+
|
20
|
+
# Updates the web producer after fork if needed and adds ppid to nodes
|
21
|
+
# @param _event [Karafka::Core::Monitoring::Event]
|
22
|
+
def on_swarm_node_after_fork(_event)
|
23
|
+
::Karafka::Process.tags.add(:node_ppid, "ppid:#{::Process.ppid}")
|
24
|
+
|
25
|
+
return if Karafka::Web.config.producer == Karafka::App.config.producer
|
26
|
+
|
27
|
+
Web.config.producer = Karafka::App.config.producer
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -46,7 +46,6 @@ module Karafka
|
|
46
46
|
end
|
47
47
|
@subscription_groups = {}
|
48
48
|
@errors = []
|
49
|
-
@started_at = float_now
|
50
49
|
@pauses = {}
|
51
50
|
@jobs = {}
|
52
51
|
@shell = MemoizedShell.new
|
@@ -71,7 +70,7 @@ module Karafka
|
|
71
70
|
dispatched_at: float_now,
|
72
71
|
|
73
72
|
process: {
|
74
|
-
started_at:
|
73
|
+
started_at: started_at,
|
75
74
|
name: process_name,
|
76
75
|
status: ::Karafka::App.config.internal.status.to_s,
|
77
76
|
listeners: listeners,
|
@@ -129,6 +128,13 @@ module Karafka
|
|
129
128
|
|
130
129
|
private
|
131
130
|
|
131
|
+
# @return [Float] time of start of this process
|
132
|
+
# @note We memoize it on first run as forks should have their creation time matching the
|
133
|
+
# fork time.
|
134
|
+
def started_at
|
135
|
+
@started_at ||= float_now
|
136
|
+
end
|
137
|
+
|
132
138
|
# @return [Numeric] % utilization of all the threads. 100% means all the threads are
|
133
139
|
# utilized all the time within the given time window. 0% means, nothing is happening
|
134
140
|
# most if not all the time.
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
module Tracking
|
6
|
+
module Producers
|
7
|
+
module Listeners
|
8
|
+
# Listener needed to start schedulers and other things that we need to collect and report
|
9
|
+
# data. We do not want to start this when code is loaded because it may not be fork
|
10
|
+
# compatible that way
|
11
|
+
class Booting < Base
|
12
|
+
# Starts (if needed) the Web UI tracking scheduler thread that periodically pings
|
13
|
+
# reporters to report needed data (when it is time).
|
14
|
+
#
|
15
|
+
# @param _event [Karafka::Core::Monitoring::Event]
|
16
|
+
def on_producer_connected(_event)
|
17
|
+
::Karafka::Web.config.tracking.scheduler.async_call
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -41,11 +41,13 @@ module Karafka
|
|
41
41
|
def status_bg(status)
|
42
42
|
case status
|
43
43
|
when 'initialized' then 'bg-success'
|
44
|
+
when 'supervising' then 'bg-success'
|
44
45
|
when 'running' then 'bg-success'
|
45
46
|
when 'quieting' then 'bg-warning'
|
46
47
|
when 'quiet' then 'bg-warning text-dark'
|
47
48
|
when 'stopping' then 'bg-warning text-dark'
|
48
49
|
when 'stopped' then 'bg-danger'
|
50
|
+
when 'terminated' then 'bg-danger'
|
49
51
|
else
|
50
52
|
raise ::Karafka::Errors::UnsupportedCaseError, status
|
51
53
|
end
|
@@ -16,17 +16,17 @@ module Karafka
|
|
16
16
|
|
17
17
|
# @return [String] JSON with lags of each of the topics + total lag of all the topics
|
18
18
|
# from all the consumer groups.
|
19
|
-
def
|
19
|
+
def lags_hybrid
|
20
20
|
total = Hash.new { |h, v| h[v] = 0 }
|
21
21
|
|
22
22
|
@data.to_h.each_value do |metrics|
|
23
23
|
metrics.each do |metric|
|
24
24
|
time = metric.first
|
25
|
-
|
25
|
+
lag_hybrid = metric.last[:lag_hybrid]
|
26
26
|
|
27
|
-
if
|
27
|
+
if lag_hybrid
|
28
28
|
total[time] ||= 0
|
29
|
-
total[time] +=
|
29
|
+
total[time] += lag_hybrid
|
30
30
|
else
|
31
31
|
next if total.key?(time)
|
32
32
|
|
@@ -37,7 +37,7 @@ module Karafka
|
|
37
37
|
|
38
38
|
# Extract the lag stored only from all the data
|
39
39
|
per_topic = @data.to_h.map do |topic, metrics|
|
40
|
-
extracted = metrics.map { |metric| [metric.first, metric.last[:
|
40
|
+
extracted = metrics.map { |metric| [metric.first, metric.last[:lag_hybrid]] }
|
41
41
|
|
42
42
|
[topic, extracted]
|
43
43
|
end.to_h
|