karafka-web 0.1.2 → 0.2.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +17 -1
- data/Gemfile +1 -0
- data/Gemfile.lock +23 -11
- data/bin/karafka-web +1 -26
- data/karafka-web.gemspec +2 -2
- data/lib/karafka/web/cli.rb +80 -0
- data/lib/karafka/web/config.rb +5 -0
- data/lib/karafka/web/installer.rb +65 -29
- data/lib/karafka/web/processing/consumer.rb +2 -1
- data/lib/karafka/web/tracking/consumers/contracts/job.rb +1 -0
- data/lib/karafka/web/tracking/consumers/contracts/report.rb +1 -0
- data/lib/karafka/web/tracking/consumers/listeners/errors.rb +1 -1
- data/lib/karafka/web/tracking/consumers/listeners/processing.rb +2 -1
- data/lib/karafka/web/tracking/consumers/sampler.rb +9 -3
- data/lib/karafka/web/tracking/reporter.rb +2 -1
- data/lib/karafka/web/ui/app.rb +5 -0
- data/lib/karafka/web/ui/controllers/status.rb +23 -0
- data/lib/karafka/web/ui/models/process.rb +7 -0
- data/lib/karafka/web/ui/models/status.rb +169 -0
- data/lib/karafka/web/ui/pro/app.rb +5 -0
- data/lib/karafka/web/ui/pro/controllers/status.rb +26 -0
- data/lib/karafka/web/ui/pro/views/consumers/_consumer.erb +15 -7
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_job.erb +4 -0
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_metrics.erb +10 -0
- data/lib/karafka/web/ui/pro/views/jobs/_job.erb +4 -0
- data/lib/karafka/web/ui/pro/views/shared/_navigation.erb +5 -0
- data/lib/karafka/web/ui/views/consumers/_consumer.erb +15 -7
- data/lib/karafka/web/ui/views/jobs/_job.erb +4 -0
- data/lib/karafka/web/ui/views/shared/_navigation.erb +5 -0
- data/lib/karafka/web/ui/views/shared/exceptions/not_found.erb +2 -0
- data/lib/karafka/web/ui/views/status/_breadcrumbs.erb +5 -0
- data/lib/karafka/web/ui/views/status/_failure.erb +14 -0
- data/lib/karafka/web/ui/views/status/_halted.erb +11 -0
- data/lib/karafka/web/ui/views/status/_success.erb +11 -0
- data/lib/karafka/web/ui/views/status/failures/_connection.erb +7 -0
- data/lib/karafka/web/ui/views/status/failures/_initial_state.erb +20 -0
- data/lib/karafka/web/ui/views/status/failures/_live_reporting.erb +7 -0
- data/lib/karafka/web/ui/views/status/failures/_partitions.erb +19 -0
- data/lib/karafka/web/ui/views/status/failures/_state_calculation.erb +8 -0
- data/lib/karafka/web/ui/views/status/failures/_topics.erb +20 -0
- data/lib/karafka/web/ui/views/status/show.erb +94 -0
- data/lib/karafka/web/version.rb +1 -1
- data/lib/karafka/web.rb +0 -6
- data.tar.gz.sig +0 -0
- metadata +21 -6
- 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: eb17bd9d46e6fa0d0125bc665bff74a9d4277be394f1bf29223b6d49ef09e054
|
4
|
+
data.tar.gz: 2f1da7d4fa79116a67ae3300863b56c3ac2215d80dccba89520e33e78c3b1a84
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc9f331aa0b9276c1b3c2d6d4f400b9d8600da174123d472b1699554e0cd95de14ff60b7c4effbb0c4f86a423f24ff27f5facc282ff8215863c146a4b1c0bb41
|
7
|
+
data.tar.gz: 1f638b2ca877b1b34612654a19f0fb8d04ab88e5dc6b560a7090e74a6d1202da0257d4f941f8f182b6b874d8a099db30772a1ab9517b32ebae76161d9314797a
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,24 @@
|
|
1
1
|
# Karafka Web changelog
|
2
2
|
|
3
|
+
## 0.2.0 (2023-02-24)
|
4
|
+
- **[Feature]** Introduce ability to tag `Karafka::Process` to display process-centric tags in the Web UI.
|
5
|
+
- **[Feature]** Introduce ability to tag consumer instances to display consumption-centric tags in the Web UI.
|
6
|
+
- **[Feature]** Introduce a /status page that can validate the setup and tell what is missing (#1318)
|
7
|
+
- [Improvement] Allow for disabling the consumer subscription from Web for multi-tenant Web UI usage (#1331)
|
8
|
+
- [Improvement] Make sure that states and reports are always dispatched to the partition `0`. This should prevent UI from not fully working when someone accidentally creates more partitions than expected.
|
9
|
+
- [Fix] Fix a bug where bootstrapping would create two initial states.
|
10
|
+
- [Fix] Fix a case, where errors listener would try to force encoding on a frozen error message.
|
11
|
+
|
12
|
+
## 0.1.3 (2023-02-14)
|
13
|
+
- Skip topics creation if web topics already exist (do not raise error)
|
14
|
+
- Support ability to provide replication factor in the install command
|
15
|
+
- Provide ability to reset the state with a `reset` command. It will remove and re-create the topics.
|
16
|
+
- Provide ability to uninstall the web via the CLI `uninstall` command
|
17
|
+
- Remove the `Karafka::Web.bootstrap!` method as the install should happen via `bundle exec karafka-web install`
|
18
|
+
|
3
19
|
## 0.1.2 (2023-02-10)
|
4
20
|
- Provide more comprehensive info when lag stored and stored offset are not available.
|
5
|
-
- Setup rspec scaffold
|
21
|
+
- Setup rspec scaffold.
|
6
22
|
|
7
23
|
## 0.1.1 (2023-01-30)
|
8
24
|
- Rename `Karafka::Web.bootstrap_topics!` to `Karafka::Web.bootstrap!` and expand it with the zero state injection.
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,41 +1,51 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
karafka-web (0.
|
4
|
+
karafka-web (0.2.0)
|
5
5
|
erubi (~> 1.4)
|
6
|
-
karafka (>= 2.0.
|
7
|
-
karafka-core (>= 2.0.
|
6
|
+
karafka (>= 2.0.33, < 3.0.0)
|
7
|
+
karafka-core (>= 2.0.12, < 3.0.0)
|
8
8
|
roda (~> 3.63)
|
9
9
|
tilt (~> 2.0)
|
10
10
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
+
activesupport (7.0.4.2)
|
15
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
16
|
+
i18n (>= 1.6, < 2)
|
17
|
+
minitest (>= 5.1)
|
18
|
+
tzinfo (~> 2.0)
|
14
19
|
byebug (11.1.3)
|
15
20
|
concurrent-ruby (1.2.0)
|
16
21
|
diff-lcs (1.5.0)
|
17
22
|
docile (1.4.0)
|
18
23
|
erubi (1.12.0)
|
24
|
+
factory_bot (6.2.1)
|
25
|
+
activesupport (>= 5.0.0)
|
19
26
|
ffi (1.15.5)
|
20
|
-
|
21
|
-
|
27
|
+
i18n (1.12.0)
|
28
|
+
concurrent-ruby (~> 1.0)
|
29
|
+
karafka (2.0.33)
|
30
|
+
karafka-core (>= 2.0.12, < 3.0.0)
|
22
31
|
thor (>= 0.20)
|
23
32
|
waterdrop (>= 2.4.10, < 3.0.0)
|
24
33
|
zeitwerk (~> 2.3)
|
25
|
-
karafka-core (2.0.
|
34
|
+
karafka-core (2.0.12)
|
26
35
|
concurrent-ruby (>= 1.1)
|
27
|
-
karafka-rdkafka (>= 0.12)
|
28
|
-
karafka-rdkafka (0.12.
|
36
|
+
karafka-rdkafka (>= 0.12.1)
|
37
|
+
karafka-rdkafka (0.12.1)
|
29
38
|
ffi (~> 1.15)
|
30
39
|
mini_portile2 (~> 2.6)
|
31
40
|
rake (> 12)
|
32
41
|
mini_portile2 (2.8.1)
|
42
|
+
minitest (5.17.0)
|
33
43
|
rack (3.0.4.1)
|
34
44
|
rackup (0.2.3)
|
35
45
|
rack (>= 3.0.0.beta1)
|
36
46
|
webrick
|
37
47
|
rake (13.0.6)
|
38
|
-
roda (3.
|
48
|
+
roda (3.65.0)
|
39
49
|
rack
|
40
50
|
rspec (3.12.0)
|
41
51
|
rspec-core (~> 3.12.0)
|
@@ -57,7 +67,9 @@ GEM
|
|
57
67
|
simplecov-html (0.12.3)
|
58
68
|
simplecov_json_formatter (0.1.4)
|
59
69
|
thor (1.2.1)
|
60
|
-
tilt (2.0
|
70
|
+
tilt (2.1.0)
|
71
|
+
tzinfo (2.0.6)
|
72
|
+
concurrent-ruby (~> 1.0)
|
61
73
|
waterdrop (2.4.10)
|
62
74
|
karafka-core (>= 2.0.9, < 3.0.0)
|
63
75
|
zeitwerk (~> 2.3)
|
@@ -65,11 +77,11 @@ GEM
|
|
65
77
|
zeitwerk (2.6.7)
|
66
78
|
|
67
79
|
PLATFORMS
|
68
|
-
arm64-darwin-21
|
69
80
|
x86_64-linux
|
70
81
|
|
71
82
|
DEPENDENCIES
|
72
83
|
byebug
|
84
|
+
factory_bot
|
73
85
|
karafka-web!
|
74
86
|
rackup (~> 0.2)
|
75
87
|
rspec
|
data/bin/karafka-web
CHANGED
@@ -4,30 +4,5 @@ require 'karafka'
|
|
4
4
|
require 'karafka/web'
|
5
5
|
|
6
6
|
::Karafka::Cli::Base.load
|
7
|
-
include ::Karafka::Helpers::Colorize
|
8
7
|
|
9
|
-
|
10
|
-
when 'install'
|
11
|
-
puts
|
12
|
-
puts 'Installing Karafka Web UI...'
|
13
|
-
puts
|
14
|
-
puts 'Creating necessary topics and populating state data...'
|
15
|
-
Karafka::Web.bootstrap!
|
16
|
-
puts 'Updating the Karafka boot file...'
|
17
|
-
|
18
|
-
enabler = 'Karafka::Web.enable!'
|
19
|
-
|
20
|
-
if File.read(Karafka.boot_file).include?(enabler)
|
21
|
-
puts "Web UI #{green('already')} installed."
|
22
|
-
else
|
23
|
-
File.open(Karafka.boot_file, 'a') do |f|
|
24
|
-
f << "\n#{enabler}\n"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
puts
|
29
|
-
puts("Installation #{green('completed')}. Have fun!")
|
30
|
-
puts
|
31
|
-
else
|
32
|
-
raise NotImplementedError, "#{ARGV[0]} is not supported"
|
33
|
-
end
|
8
|
+
::Karafka::Web::Cli.start
|
data/karafka-web.gemspec
CHANGED
@@ -17,8 +17,8 @@ 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.0.
|
21
|
-
spec.add_dependency 'karafka-core', '>= 2.0.
|
20
|
+
spec.add_dependency 'karafka', '>= 2.0.33', '< 3.0.0'
|
21
|
+
spec.add_dependency 'karafka-core', '>= 2.0.12', '< 3.0.0'
|
22
22
|
spec.add_dependency 'roda', '~> 3.63'
|
23
23
|
spec.add_dependency 'tilt', '~> 2.0'
|
24
24
|
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
# Karafka itself depends on Thor, so we can use it
|
6
|
+
class Cli < Thor
|
7
|
+
include ::Karafka::Helpers::Colorize
|
8
|
+
|
9
|
+
# Code that is needed in the `karafka.rb` to connect Web UI to Karafka
|
10
|
+
ENABLER_CODE = 'Karafka::Web.enable!'
|
11
|
+
|
12
|
+
private_constant :ENABLER_CODE
|
13
|
+
|
14
|
+
package_name 'Karafka Web'
|
15
|
+
|
16
|
+
desc 'install', 'Installs the Web UI'
|
17
|
+
method_option(
|
18
|
+
:replication_factor,
|
19
|
+
desc: 'Replication factor for created topics',
|
20
|
+
default: 1,
|
21
|
+
type: :numeric
|
22
|
+
)
|
23
|
+
# Installs Karafka Web
|
24
|
+
def install
|
25
|
+
puts
|
26
|
+
puts 'Installing Karafka Web UI...'
|
27
|
+
puts
|
28
|
+
puts 'Creating necessary topics and populating state data...'
|
29
|
+
|
30
|
+
Karafka::Web::Installer.new.bootstrap!(replication_factor: options[:replication_factor])
|
31
|
+
|
32
|
+
puts 'Updating the Karafka boot file...'
|
33
|
+
|
34
|
+
if File.read(Karafka.boot_file).include?(ENABLER_CODE)
|
35
|
+
puts "Web UI #{green('already')} installed."
|
36
|
+
else
|
37
|
+
File.open(Karafka.boot_file, 'a') do |f|
|
38
|
+
f << "\n#{ENABLER_CODE}\n"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
puts
|
43
|
+
puts("Installation #{green('completed')}. Have fun!")
|
44
|
+
puts
|
45
|
+
end
|
46
|
+
|
47
|
+
desc 'reset', 'Resets the Web UI by removing all the Web topics and creating them again'
|
48
|
+
# Resets Karafka Web
|
49
|
+
def reset
|
50
|
+
puts
|
51
|
+
puts 'Resetting Karafka Web UI...'
|
52
|
+
Karafka::Web::Installer.new.reset!
|
53
|
+
puts
|
54
|
+
puts("Resetting #{green('completed')}. Have fun!")
|
55
|
+
puts
|
56
|
+
end
|
57
|
+
|
58
|
+
desc 'uninstall', 'Removes all the Web UI topics and the enabled code'
|
59
|
+
# Uninstalls Karafka Web
|
60
|
+
def uninstall
|
61
|
+
puts
|
62
|
+
puts 'Uninstalling Karafka Web UI...'
|
63
|
+
Karafka::Web::Installer.new.uninstall!
|
64
|
+
|
65
|
+
puts 'Updating the Karafka boot file...'
|
66
|
+
|
67
|
+
karafka_rb = File.readlines(Karafka.boot_file)
|
68
|
+
if karafka_rb.any? { |line| line.include?(ENABLER_CODE) }
|
69
|
+
karafka_rb.delete_if { |line| line.include?(ENABLER_CODE) }
|
70
|
+
|
71
|
+
File.write(Karafka.boot_file, karafka_rb.join)
|
72
|
+
end
|
73
|
+
|
74
|
+
puts
|
75
|
+
puts("Uninstalling #{green('completed')}. Goodbye!")
|
76
|
+
puts
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/karafka/web/config.rb
CHANGED
@@ -56,6 +56,11 @@ module Karafka
|
|
56
56
|
|
57
57
|
# States processing related settings
|
58
58
|
setting :processing do
|
59
|
+
# Should we actively process reports
|
60
|
+
# This can be disabled in case of using a multi-tenant approach where only one of the
|
61
|
+
# apps should materialize the state
|
62
|
+
setting :active, default: true
|
63
|
+
|
59
64
|
# What should be the consumer group name for web consumer
|
60
65
|
setting :consumer_group, default: 'karafka_web'
|
61
66
|
|
@@ -13,6 +13,30 @@ module Karafka
|
|
13
13
|
bootstrap_state!
|
14
14
|
end
|
15
15
|
|
16
|
+
# Removes all the Karafka topics and creates them again with the same replication factor
|
17
|
+
def reset!
|
18
|
+
states_topic = ::Karafka::Web.config.topics.consumers.states
|
19
|
+
replication_factor = ::Karafka::Admin
|
20
|
+
.cluster_info
|
21
|
+
.topics
|
22
|
+
.find { |topic| topic[:topic_name] == states_topic }
|
23
|
+
.fetch(:partitions)
|
24
|
+
.first
|
25
|
+
.fetch(:replica_count)
|
26
|
+
|
27
|
+
uninstall!
|
28
|
+
bootstrap!(replication_factor: replication_factor)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Removes all the Karafka Web topics
|
32
|
+
def uninstall!
|
33
|
+
[
|
34
|
+
::Karafka::Web.config.topics.consumers.states,
|
35
|
+
::Karafka::Web.config.topics.consumers.reports,
|
36
|
+
::Karafka::Web.config.topics.errors
|
37
|
+
].each { |topic_name| ::Karafka::Admin.delete_topic(topic_name) }
|
38
|
+
end
|
39
|
+
|
16
40
|
# Adds the extra needed consumer group, topics and routes for Web UI to be able to operate
|
17
41
|
def enable!
|
18
42
|
::Karafka::App.routes.draw do
|
@@ -21,6 +45,7 @@ module Karafka
|
|
21
45
|
consumer_group ::Karafka::Web.config.processing.consumer_group do
|
22
46
|
# Topic we listen on to materialize the states
|
23
47
|
topic ::Karafka::Web.config.topics.consumers.reports do
|
48
|
+
active ::Karafka::Web.config.processing.active
|
24
49
|
# Since we materialize state in intervals, we can poll for half of this time without
|
25
50
|
# impacting the reporting responsiveness
|
26
51
|
max_wait_time ::Karafka::Web.config.processing.interval / 2
|
@@ -61,38 +86,49 @@ module Karafka
|
|
61
86
|
#
|
62
87
|
# @param replication_factor [Integer]
|
63
88
|
def bootstrap_topics!(replication_factor = 1)
|
64
|
-
|
65
|
-
::Karafka::Admin.create_topic(
|
66
|
-
::Karafka::Web.config.topics.consumers.states,
|
67
|
-
1,
|
68
|
-
replication_factor,
|
69
|
-
# We care only about the most recent state, previous are irrelevant
|
70
|
-
{ 'cleanup.policy': 'compact' }
|
71
|
-
)
|
89
|
+
existing_topics = ::Karafka::Admin.cluster_info.topics.map { |topic| topic[:topic_name] }
|
72
90
|
|
73
|
-
|
74
|
-
::Karafka::
|
75
|
-
|
76
|
-
1,
|
77
|
-
replication_factor,
|
78
|
-
# We do not need to to store this data for longer than 7 days as this data is only used
|
79
|
-
# to materialize the end states
|
80
|
-
# On the other hand we do not want to have it really short-living because in case of a
|
81
|
-
# consumer crash, we may want to use this info to catch up and backfill the state
|
82
|
-
{ 'retention.ms': 7 * 24 * 60 * 60 * 1_000 }
|
83
|
-
)
|
91
|
+
consumers_states_topic = ::Karafka::Web.config.topics.consumers.states
|
92
|
+
consumers_reports_topic = ::Karafka::Web.config.topics.consumers.reports
|
93
|
+
errors_topic = ::Karafka::Web.config.topics.errors
|
84
94
|
|
85
|
-
#
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
95
|
+
# Create only if needed
|
96
|
+
unless existing_topics.include?(consumers_states_topic)
|
97
|
+
# This topic needs to have one partition
|
98
|
+
::Karafka::Admin.create_topic(
|
99
|
+
consumers_states_topic,
|
100
|
+
1,
|
101
|
+
replication_factor,
|
102
|
+
# We care only about the most recent state, previous are irrelevant
|
103
|
+
{ 'cleanup.policy': 'compact' }
|
104
|
+
)
|
105
|
+
end
|
94
106
|
|
95
|
-
|
107
|
+
unless existing_topics.include?(consumers_reports_topic)
|
108
|
+
# This topic needs to have one partition
|
109
|
+
::Karafka::Admin.create_topic(
|
110
|
+
consumers_reports_topic,
|
111
|
+
1,
|
112
|
+
replication_factor,
|
113
|
+
# We do not need to to store this data for longer than 7 days as this data is only used
|
114
|
+
# to materialize the end states
|
115
|
+
# On the other hand we do not want to have it really short-living because in case of a
|
116
|
+
# consumer crash, we may want to use this info to catch up and backfill the state
|
117
|
+
{ 'retention.ms': 7 * 24 * 60 * 60 * 1_000 }
|
118
|
+
)
|
119
|
+
end
|
120
|
+
|
121
|
+
unless existing_topics.include?(errors_topic)
|
122
|
+
# All the errors will be dispatched here
|
123
|
+
# This topic can have multiple partitions but we go with one by default. A single Ruby
|
124
|
+
# process should not crash that often and if there is an expectation of a higher volume
|
125
|
+
# of errors, this can be changed by the end user
|
126
|
+
::Karafka::Admin.create_topic(
|
127
|
+
errors_topic,
|
128
|
+
1,
|
129
|
+
replication_factor
|
130
|
+
)
|
131
|
+
end
|
96
132
|
end
|
97
133
|
|
98
134
|
# Creates the initial state record with all values being empty
|
@@ -57,7 +57,8 @@ module Karafka
|
|
57
57
|
topic: Karafka::Web.config.topics.consumers.states,
|
58
58
|
payload: @consumers_aggregator.to_json,
|
59
59
|
# This will ensure that the consumer states are compacted
|
60
|
-
key: Karafka::Web.config.topics.consumers.states
|
60
|
+
key: Karafka::Web.config.topics.consumers.states,
|
61
|
+
partition: 0
|
61
62
|
)
|
62
63
|
end
|
63
64
|
end
|
@@ -18,6 +18,7 @@ module Karafka
|
|
18
18
|
required(:last_offset) { |val| val.is_a?(Integer) && val >= 0 }
|
19
19
|
required(:comitted_offset) { |val| val.is_a?(Integer) }
|
20
20
|
required(:type) { |val| %w[consume revoked shutdown].include?(val) }
|
21
|
+
required(:tags) { |val| val.is_a?(Karafka::Core::Taggable::Tags) }
|
21
22
|
end
|
22
23
|
end
|
23
24
|
end
|
@@ -27,6 +27,7 @@ module Karafka
|
|
27
27
|
required(:status) { |val| ::Karafka::Status::STATES.key?(val.to_sym) }
|
28
28
|
required(:listeners) { |val| val.is_a?(Integer) && val >= 0 }
|
29
29
|
required(:concurrency) { |val| val.is_a?(Integer) && val.positive? }
|
30
|
+
required(:tags) { |val| val.is_a?(Karafka::Core::Taggable::Tags) }
|
30
31
|
|
31
32
|
required(:cpu_usage) do |val|
|
32
33
|
val.is_a?(Array) &&
|
@@ -74,7 +74,7 @@ module Karafka
|
|
74
74
|
# @param error [StandardError] error that occurred
|
75
75
|
# @return [Array<String, String, String>] array with error name, message and backtrace
|
76
76
|
def extract_error_info(error)
|
77
|
-
error_message = error.message.to_s
|
77
|
+
error_message = error.message.to_s.dup
|
78
78
|
error_message.force_encoding('utf-8')
|
79
79
|
error_message.scrub!
|
80
80
|
|
@@ -11,13 +11,18 @@ module Karafka
|
|
11
11
|
|
12
12
|
attr_reader :counters, :consumer_groups, :errors, :times, :pauses, :jobs
|
13
13
|
|
14
|
+
# Current schema version
|
15
|
+
# This can be used in the future for detecting incompatible changes and writing
|
16
|
+
# migrations
|
17
|
+
SCHEMA_VERSION = '1.0.1'
|
18
|
+
|
14
19
|
# 60 seconds window for time tracked window-based metrics
|
15
20
|
TIMES_TTL = 60
|
16
21
|
|
17
22
|
# Times ttl in ms
|
18
23
|
TIMES_TTL_MS = TIMES_TTL * 1_000
|
19
24
|
|
20
|
-
private_constant :TIMES_TTL, :TIMES_TTL_MS
|
25
|
+
private_constant :TIMES_TTL, :TIMES_TTL_MS, :SCHEMA_VERSION
|
21
26
|
|
22
27
|
def initialize
|
23
28
|
@counters = {
|
@@ -47,7 +52,7 @@ module Karafka
|
|
47
52
|
# @return [Hash] report hash with all the details about consumer operations
|
48
53
|
def to_report
|
49
54
|
{
|
50
|
-
schema_version:
|
55
|
+
schema_version: SCHEMA_VERSION,
|
51
56
|
type: 'consumer',
|
52
57
|
dispatched_at: float_now,
|
53
58
|
|
@@ -61,7 +66,8 @@ module Karafka
|
|
61
66
|
memory_total_usage: memory_total_usage,
|
62
67
|
memory_size: memory_size,
|
63
68
|
cpu_count: cpu_count,
|
64
|
-
cpu_usage: cpu_usage
|
69
|
+
cpu_usage: cpu_usage,
|
70
|
+
tags: Karafka::Process.tags
|
65
71
|
},
|
66
72
|
|
67
73
|
versions: {
|
data/lib/karafka/web/ui/app.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
module Ui
|
6
|
+
module Controllers
|
7
|
+
# View that helps understand the status of the Web UI
|
8
|
+
# Many people reported problems understanding the requirements or misconfigured things.
|
9
|
+
# While all of the things are documented, people are lazy. Hence we provide a status
|
10
|
+
# page where we check that everything is as expected and if not, we can provide some
|
11
|
+
# helpful instructions on how to fix the issues.
|
12
|
+
class Status < Base
|
13
|
+
# Displays the Web UI setup status
|
14
|
+
def show
|
15
|
+
@status = Models::Status.new
|
16
|
+
|
17
|
+
respond
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -40,6 +40,13 @@ module Karafka
|
|
40
40
|
.sort_by(&:started_at)
|
41
41
|
end
|
42
42
|
|
43
|
+
# @return [Array<String>] tags of this consuming process
|
44
|
+
# @note We use direct reference here and a fallback for users that come from the versions
|
45
|
+
# that did not report tags
|
46
|
+
def tags
|
47
|
+
@hash[:process][:tags] || []
|
48
|
+
end
|
49
|
+
|
43
50
|
# @return [Integer] collective lag on this process
|
44
51
|
def lag_stored
|
45
52
|
consumer_groups
|