upperkut 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +65 -0
  3. data/.codeclimate.yml +15 -0
  4. data/.github/dependabot.yml +12 -0
  5. data/.gitignore +12 -0
  6. data/.rspec +4 -0
  7. data/.rubocop.yml +73 -0
  8. data/CHANGELOG.md +45 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/Dockerfile +7 -0
  11. data/Gemfile +11 -0
  12. data/Gemfile.lock +61 -0
  13. data/LICENSE.txt +21 -0
  14. data/Makefile +4 -0
  15. data/README.md +162 -0
  16. data/Rakefile +6 -0
  17. data/catalog-info.yaml +15 -0
  18. data/docker-compose.yml +18 -0
  19. data/examples/basic.rb +12 -0
  20. data/examples/priority_worker.rb +21 -0
  21. data/examples/scheduled_worker.rb +19 -0
  22. data/examples/with_middlewares.rb +42 -0
  23. data/lib/upperkut/cli.rb +100 -0
  24. data/lib/upperkut/core_ext.rb +18 -0
  25. data/lib/upperkut/item.rb +22 -0
  26. data/lib/upperkut/logging.rb +36 -0
  27. data/lib/upperkut/manager.rb +50 -0
  28. data/lib/upperkut/middleware.rb +35 -0
  29. data/lib/upperkut/middlewares/datadog.rb +11 -0
  30. data/lib/upperkut/middlewares/new_relic.rb +23 -0
  31. data/lib/upperkut/middlewares/rollbar.rb +25 -0
  32. data/lib/upperkut/processor.rb +64 -0
  33. data/lib/upperkut/redis_pool.rb +29 -0
  34. data/lib/upperkut/strategies/base.rb +56 -0
  35. data/lib/upperkut/strategies/buffered_queue.rb +218 -0
  36. data/lib/upperkut/strategies/priority_queue.rb +217 -0
  37. data/lib/upperkut/strategies/scheduled_queue.rb +162 -0
  38. data/lib/upperkut/util.rb +73 -0
  39. data/lib/upperkut/version.rb +3 -0
  40. data/lib/upperkut/worker.rb +42 -0
  41. data/lib/upperkut/worker_thread.rb +37 -0
  42. data/lib/upperkut.rb +103 -0
  43. data/upperkut.gemspec +29 -0
  44. metadata +44 -2
@@ -0,0 +1,37 @@
1
+ require_relative 'processor'
2
+
3
+ module Upperkut
4
+ class WorkerThread
5
+ def initialize(manager, processor)
6
+ @manager = manager
7
+ @processor = processor
8
+ end
9
+
10
+ def run
11
+ @thread ||= Thread.new do
12
+ begin
13
+ @processor.blocking_process
14
+ rescue Exception => e
15
+ @manager.logger.debug(
16
+ action: :processor_killed,
17
+ reason: e,
18
+ stacktrace: e.backtrace
19
+ )
20
+
21
+ @manager.notify_killed_processor(self)
22
+ end
23
+ end
24
+ end
25
+
26
+ def stop
27
+ @processor.stop
28
+ end
29
+
30
+ def kill
31
+ return unless @thread
32
+
33
+ @thread.raise Upperkut::Shutdown
34
+ @thread.value # wait
35
+ end
36
+ end
37
+ end
data/lib/upperkut.rb ADDED
@@ -0,0 +1,103 @@
1
+ require_relative 'upperkut/version'
2
+ require_relative 'upperkut/worker'
3
+ require 'redis'
4
+
5
+ # Public: Upperkut is a batch background processing tool for Ruby.
6
+ #
7
+ # Examples:
8
+ #
9
+ # 1) Create a Worker class and the define how to process the batch;
10
+ #
11
+ # class MyWorker
12
+ # include Upperkut::Worker
13
+ #
14
+ # # This is optional
15
+ #
16
+ # setup_upperkut do |config|
17
+ # # Define which redis instance you want to use
18
+ # config.strategy = Upperkut::Strategy.new(
19
+ # self,
20
+ # redis: { url: ENV['ANOTHER_REDIS_URL'] }
21
+ # )
22
+ #
23
+ # # Define the amount of items must be accumulated
24
+ # config.batch_size = 2_000 # The default value is 1_000
25
+ #
26
+ # # How frequent the Processor should hit redis looking for elegible
27
+ # # batch. The default value is 5 seconds. You can also set the env
28
+ # # UPPERKUT_POLLING_INTERVAL.
29
+ # config.polling_interval = 4
30
+ #
31
+ # # How long the Processor should wait in seconds to process batch
32
+ # # even though the amount of items did not reached the batch_size.
33
+ # config.max_wait = 300
34
+ # end
35
+ #
36
+ # def perform(batch_items)
37
+ # SidekiqJobA.perform_async(batch_items)
38
+ # SidekiqJobB.perform_async(batch_items)
39
+ #
40
+ # process_metrics(batch_items)
41
+ # end
42
+ # end
43
+ #
44
+ # 2) Start pushings items;
45
+ #
46
+ # Myworker.push_items(
47
+ # [{'id' => SecureRandom.uuid, 'name' => 'Robert C Hall', 'action' => 'EMAIL_OPENNED'}]
48
+ # )
49
+ #
50
+ # 3) Start Upperkut;
51
+ #
52
+ # $ bundle exec upperkut -worker MyWorker --concurrency 10
53
+ #
54
+ # 4) That's it :)
55
+ module Upperkut
56
+ class Configuration
57
+ attr_accessor :strategy, :polling_interval
58
+
59
+ def self.default
60
+ new.tap do |config|
61
+ config.polling_interval = Float(ENV['UPPERKUT_POLLING_INTERVAL'] || 5)
62
+ end
63
+ end
64
+
65
+ def server_middlewares
66
+ @server_middlewares ||= init_middleware_chain
67
+ yield @server_middlewares if block_given?
68
+ @server_middlewares
69
+ end
70
+
71
+ def client_middlewares
72
+ @client_middlewares ||= Middleware::Chain.new
73
+ yield @client_middlewares if block_given?
74
+ @client_middlewares
75
+ end
76
+
77
+ private
78
+
79
+ def init_middleware_chain
80
+ chain = Middleware::Chain.new
81
+
82
+ if defined?(NewRelic::Agent)
83
+ require_relative 'upperkut/middlewares/new_relic'
84
+ chain.add(Upperkut::Middlewares::NewRelic)
85
+ end
86
+
87
+ if defined?(Rollbar::VERSION)
88
+ require_relative 'upperkut/middlewares/rollbar'
89
+ chain.add(Upperkut::Middlewares::Rollbar)
90
+ end
91
+
92
+ if defined?(Datadog)
93
+ require_relative 'upperkut/middlewares/datadog'
94
+ chain.add(Upperkut::Middlewares::Datadog)
95
+ end
96
+
97
+ chain
98
+ end
99
+ end
100
+
101
+ # Error class responsible to signal the shutdown process
102
+ class Shutdown < StandardError; end
103
+ end
data/upperkut.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'upperkut/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'upperkut'
7
+ spec.version = Upperkut::VERSION
8
+ spec.authors = ['Nando Sousa']
9
+ spec.email = ['nandosousafr@gmail.com']
10
+
11
+ spec.summary = 'Batch background processing tool'
12
+ spec.description = 'Batch background processing tool'
13
+ spec.homepage = 'http://shipit.resultadosdigitais.com.br/open-source/'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.executables = ['upperkut']
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.required_ruby_version = '>= 3.0'
23
+
24
+ spec.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.2'
25
+ spec.add_dependency 'redis', '>= 4.1.0', '< 6.0.0'
26
+ spec.add_development_dependency 'bundler', '>= 1.16'
27
+ spec.add_development_dependency 'rake', '~> 13.0'
28
+ spec.add_development_dependency 'rspec', '~> 3.0'
29
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: upperkut
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Sousa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-13 00:00:00.000000000 Z
11
+ date: 2023-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -100,7 +100,49 @@ executables:
100
100
  extensions: []
101
101
  extra_rdoc_files: []
102
102
  files:
103
+ - ".circleci/config.yml"
104
+ - ".codeclimate.yml"
105
+ - ".github/dependabot.yml"
106
+ - ".gitignore"
107
+ - ".rspec"
108
+ - ".rubocop.yml"
109
+ - CHANGELOG.md
110
+ - CODE_OF_CONDUCT.md
111
+ - Dockerfile
112
+ - Gemfile
113
+ - Gemfile.lock
114
+ - LICENSE.txt
115
+ - Makefile
116
+ - README.md
117
+ - Rakefile
103
118
  - bin/upperkut
119
+ - catalog-info.yaml
120
+ - docker-compose.yml
121
+ - examples/basic.rb
122
+ - examples/priority_worker.rb
123
+ - examples/scheduled_worker.rb
124
+ - examples/with_middlewares.rb
125
+ - lib/upperkut.rb
126
+ - lib/upperkut/cli.rb
127
+ - lib/upperkut/core_ext.rb
128
+ - lib/upperkut/item.rb
129
+ - lib/upperkut/logging.rb
130
+ - lib/upperkut/manager.rb
131
+ - lib/upperkut/middleware.rb
132
+ - lib/upperkut/middlewares/datadog.rb
133
+ - lib/upperkut/middlewares/new_relic.rb
134
+ - lib/upperkut/middlewares/rollbar.rb
135
+ - lib/upperkut/processor.rb
136
+ - lib/upperkut/redis_pool.rb
137
+ - lib/upperkut/strategies/base.rb
138
+ - lib/upperkut/strategies/buffered_queue.rb
139
+ - lib/upperkut/strategies/priority_queue.rb
140
+ - lib/upperkut/strategies/scheduled_queue.rb
141
+ - lib/upperkut/util.rb
142
+ - lib/upperkut/version.rb
143
+ - lib/upperkut/worker.rb
144
+ - lib/upperkut/worker_thread.rb
145
+ - upperkut.gemspec
104
146
  homepage: http://shipit.resultadosdigitais.com.br/open-source/
105
147
  licenses:
106
148
  - MIT