karafka-web 0.1.2 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1ffbcae8c8e094bdd72518fa41694bb9b6b658c713010ca09ff9f3ca8f857666
4
- data.tar.gz: 4e9d38e683197bb003afb3732e333a19d603e2b8fd3e8ff4fa7b8d0d1cc5f3c3
3
+ metadata.gz: 3a70fc5cb35d0e6e60a348e3efe91113b54d0c62310b7c3af4e7584aa70cfb70
4
+ data.tar.gz: 43a96b7e7a4622721dbc6ba144852335aecbfe907049bc47ab563ea07f40eb54
5
5
  SHA512:
6
- metadata.gz: ba7f91646a8062b56380afe9ccde45802c18c12d5a7581fce4b99db24480b730aa0f9743af825dd24006725424887f63cf5a2dbf17d32c541d7a4df83f823c34
7
- data.tar.gz: 19084a9683d9d8023fbef859a428d418a375c2b44d588ad9d065de6e2a89f913cc505258836f717c2e5a095e3a0d76b15d0d2d6c23df95682d41e042ec1d16f8
6
+ metadata.gz: db0b153569ca93f1164a851216e0f224acc56e6a7533a35a86a44f6f2f8bffc1630e5ccf7c2e53a14455206401c45b59b1728eb266c59360be8f952794d3011b
7
+ data.tar.gz: 794c77edb27f7f9a397c3de891b146f9020653b84bad46e1f1b537a1d547ffc793211e7bd5ffb0f426c0b8fa9b6359230bb3fe3ee8fa5ec668cb0e1d39782d5a
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,8 +1,15 @@
1
1
  # Karafka Web changelog
2
2
 
3
+ ## 0.1.3 (2023-02-14)
4
+ - Skip topics creation if web topics already exist (do not raise error)
5
+ - Support ability to provide replication factor in the install command
6
+ - Provide ability to reset the state with a `reset` command. It will remove and re-create the topics.
7
+ - Provide ability to uninstall the web via the CLI `uninstall` command
8
+ - Remove the `Karafka::Web.bootstrap!` method as the install should happen via `bundle exec karafka-web install`
9
+
3
10
  ## 0.1.2 (2023-02-10)
4
11
  - Provide more comprehensive info when lag stored and stored offset are not available.
5
- - Setup rspec scaffold
12
+ - Setup rspec scaffold.
6
13
 
7
14
  ## 0.1.1 (2023-01-30)
8
15
  - Rename `Karafka::Web.bootstrap_topics!` to `Karafka::Web.bootstrap!` and expand it with the zero state injection.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- karafka-web (0.1.2)
4
+ karafka-web (0.1.3)
5
5
  erubi (~> 1.4)
6
6
  karafka (>= 2.0.29, < 3.0.0)
7
7
  karafka-core (>= 2.0.10, < 3.0.0)
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
- case ARGV[0]
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
@@ -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
@@ -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
@@ -61,36 +85,49 @@ module Karafka
61
85
  #
62
86
  # @param replication_factor [Integer]
63
87
  def bootstrap_topics!(replication_factor = 1)
64
- # This topic needs to have one partition
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
- )
88
+ existing_topics = ::Karafka::Admin.cluster_info.topics.map { |topic| topic[:topic_name] }
72
89
 
73
- # This topic needs to have one partition
74
- ::Karafka::Admin.create_topic(
75
- ::Karafka::Web.config.topics.consumers.reports,
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
- )
90
+ consumers_states_topic = ::Karafka::Web.config.topics.consumers.states
91
+ consumers_reports_topic = ::Karafka::Web.config.topics.consumers.reports
92
+ errors_topic = ::Karafka::Web.config.topics.errors
84
93
 
85
- # All the errors will be dispatched here
86
- # This topic can have multiple partitions but we go with one by default. A single Ruby
87
- # process should not crash that often and if there is an expectation of a higher volume
88
- # of errors, this can be changed by the end user
89
- ::Karafka::Admin.create_topic(
90
- ::Karafka::Web.config.topics.errors,
91
- 1,
92
- replication_factor
93
- )
94
+ # Create only if needed
95
+ unless existing_topics.include?(consumers_states_topic)
96
+ # This topic needs to have one partition
97
+ ::Karafka::Admin.create_topic(
98
+ consumers_states_topic,
99
+ 1,
100
+ replication_factor,
101
+ # We care only about the most recent state, previous are irrelevant
102
+ { 'cleanup.policy': 'compact' }
103
+ )
104
+ end
105
+
106
+ unless existing_topics.include?(consumers_reports_topic)
107
+ # This topic needs to have one partition
108
+ ::Karafka::Admin.create_topic(
109
+ consumers_reports_topic,
110
+ 1,
111
+ replication_factor,
112
+ # We do not need to to store this data for longer than 7 days as this data is only used
113
+ # to materialize the end states
114
+ # On the other hand we do not want to have it really short-living because in case of a
115
+ # consumer crash, we may want to use this info to catch up and backfill the state
116
+ { 'retention.ms': 7 * 24 * 60 * 60 * 1_000 }
117
+ )
118
+ end
119
+
120
+ unless existing_topics.include?(errors_topic)
121
+ # All the errors will be dispatched here
122
+ # This topic can have multiple partitions but we go with one by default. A single Ruby
123
+ # process should not crash that often and if there is an expectation of a higher volume
124
+ # of errors, this can be changed by the end user
125
+ ::Karafka::Admin.create_topic(
126
+ errors_topic,
127
+ 1,
128
+ replication_factor
129
+ )
130
+ end
94
131
 
95
132
  bootstrap_state!
96
133
  end
@@ -3,6 +3,6 @@
3
3
  module Karafka
4
4
  module Web
5
5
  # Current gem version
6
- VERSION = '0.1.2'
6
+ VERSION = '0.1.3'
7
7
  end
8
8
  end
data/lib/karafka/web.rb CHANGED
@@ -27,12 +27,6 @@ module Karafka
27
27
  Config.config
28
28
  end
29
29
 
30
- # Creates all the needed topics for the admin UI to work and populates initial (empty) set
31
- # of data, so the UI will work even when no Karafka servers are started
32
- def bootstrap!
33
- Installer.new.bootstrap!
34
- end
35
-
36
30
  # Activates all the needed routing and sets up listener, etc
37
31
  # This needs to run **after** the optional configuration of the web component
38
32
  def enable!
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: karafka-web
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maciej Mensfeld
@@ -35,7 +35,7 @@ cert_chain:
35
35
  Qf04B9ceLUaC4fPVEz10FyobjaFoY4i32xRto3XnrzeAgfEe4swLq8bQsR3w/EF3
36
36
  MGU0FeSV2Yj7Xc2x/7BzLK8xQn5l7Yy75iPF+KP3vVmDHnNl
37
37
  -----END CERTIFICATE-----
38
- date: 2023-02-10 00:00:00.000000000 Z
38
+ date: 2023-02-14 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: erubi
@@ -163,6 +163,7 @@ files:
163
163
  - karafka-web.gemspec
164
164
  - lib/karafka/web.rb
165
165
  - lib/karafka/web/app.rb
166
+ - lib/karafka/web/cli.rb
166
167
  - lib/karafka/web/config.rb
167
168
  - lib/karafka/web/deserializer.rb
168
169
  - lib/karafka/web/errors.rb
metadata.gz.sig CHANGED
Binary file