aws_sqs_moniter 0.0.1 → 0.0.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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/lib/aws_sqs_moniter.rb +26 -2
  3. data/lib/aws_sqs_moniter/aws/arns.rb +29 -0
  4. data/lib/aws_sqs_moniter/aws/builder.rb +48 -0
  5. data/lib/aws_sqs_moniter/aws/builder/application_policy_builder.rb +73 -0
  6. data/lib/aws_sqs_moniter/aws/builder/queue_builder.rb +100 -0
  7. data/lib/aws_sqs_moniter/aws/builder/subscription_builder.rb +48 -0
  8. data/lib/aws_sqs_moniter/aws/builder/topic_builder.rb +27 -0
  9. data/lib/aws_sqs_moniter/aws/environmental_name.rb +13 -0
  10. data/lib/aws_sqs_moniter/configuration.rb +110 -0
  11. data/lib/aws_sqs_moniter/configuration/queue_configuration.rb +49 -0
  12. data/lib/aws_sqs_moniter/configuration/redrive_policy_configuration.rb +33 -0
  13. data/lib/aws_sqs_moniter/configuration/validatable.rb +15 -0
  14. data/lib/aws_sqs_moniter/dead_letters/retrier.rb +23 -0
  15. data/lib/aws_sqs_moniter/dead_letters/worker.rb +34 -0
  16. data/lib/aws_sqs_moniter/logging.rb +66 -0
  17. data/lib/aws_sqs_moniter/middleware/server/active_record/connection_pool.rb +15 -0
  18. data/lib/aws_sqs_moniter/middleware/server/active_record/idempotence.rb +24 -0
  19. data/lib/aws_sqs_moniter/middleware/server/active_record/retrier.rb +23 -0
  20. data/lib/aws_sqs_moniter/middleware/server/active_record/transaction.rb +36 -0
  21. data/lib/aws_sqs_moniter/middleware/server/airbrake.rb +24 -0
  22. data/lib/aws_sqs_moniter/monkey_patches/forbid_implicit_active_record_connection_checkout.rb +34 -0
  23. data/lib/aws_sqs_moniter/railtie.rb +10 -0
  24. data/lib/aws_sqs_moniter/typed_message.rb +37 -0
  25. data/lib/aws_sqs_moniter/version.rb +1 -1
  26. data/lib/aws_sqs_moniter/worker_registries/typed_message_registry.rb +99 -0
  27. data/lib/generators/aws_sqs_moniter/install_generator.rb +30 -0
  28. data/lib/generators/aws_sqs_moniter/templates/create_dead_letters_migration.rb +11 -0
  29. data/lib/generators/aws_sqs_moniter/templates/create_processed_messages_migration.rb +13 -0
  30. data/lib/generators/aws_sqs_moniter/templates/create_published_messages_migration.rb +20 -0
  31. data/lib/generators/aws_sqs_moniter/templates/dead_letter.rb +14 -0
  32. data/lib/generators/aws_sqs_moniter/templates/initializer.rb +32 -0
  33. data/lib/generators/aws_sqs_moniter/templates/processed_message.rb +12 -0
  34. data/lib/generators/aws_sqs_moniter/templates/published_message.rb +14 -0
  35. data/lib/generators/aws_sqs_moniter/templates/shoryuken.yml +16 -0
  36. data/lib/tasks/aws_sqs_moniter.rake +83 -0
  37. data/lib/tasks/aws_sqs_setup.rake +10 -0
  38. metadata +52 -12
  39. data/.gitignore +0 -14
  40. data/Gemfile +0 -4
  41. data/LICENSE.txt +0 -22
  42. data/README.md +0 -31
  43. data/aws_sqs_moniter-0.0.1.gem +0 -0
  44. data/aws_sqs_moniter.gemspec +0 -36
  45. data/test/test_helper.rb +0 -0
@@ -1,3 +1,3 @@
1
1
  module AwsSqsMoniter
2
- VERSION = "0.0.1"
2
+ VERSION = '0.0.3'
3
3
  end
@@ -0,0 +1,99 @@
1
+ require 'aws_sqs_moniter/aws/environmental_name'
2
+ require 'aws_sqs_moniter/typed_message'
3
+
4
+ module AwsSqsMoniter
5
+ module WorkerRegistries
6
+ class TypedMessageRegistry < Shoryuken::WorkerRegistry
7
+ DuplicateSubscriptionError = Class.new StandardError
8
+ InvalidWorkerOptionsError = Class.new StandardError
9
+ UnroutableMessageError = Class.new StandardError
10
+ WorkerNotFoundError = Class.new StandardError
11
+
12
+ def initialize(dead_letter_queue_name)
13
+ @subscriptions = {}
14
+ @dead_letter_queue_name = dead_letter_queue_name
15
+ end
16
+
17
+ def batch_receive_messages?(_queue)
18
+ false
19
+ end
20
+
21
+ def clear
22
+ @subscriptions.clear
23
+ end
24
+
25
+ def fetch_worker(queue, message)
26
+ queue_subscriptions = @subscriptions.fetch(queue) do
27
+ fail UnroutableMessageError, "#{self} does not know how to route messages for queue '#{queue}'."
28
+ end
29
+
30
+ message = TypedMessage.new message
31
+ worker_class = queue_subscriptions[message.type] || queue_subscriptions['*']
32
+
33
+ fail WorkerNotFoundError,
34
+ "Worker not found for message type #{message.type} on queue #{queue}." unless worker_class
35
+
36
+ worker_class.new
37
+ end
38
+
39
+ def queues
40
+ @subscriptions.keys
41
+ end
42
+
43
+ def register_worker(queue, clazz)
44
+ invalid_worker = workers(queue).find do |worker_class|
45
+ worker_class.get_shoryuken_options['batch'] == true || clazz.get_shoryuken_options['batch'] == true
46
+ end
47
+
48
+ fail ArgumentError, "Could not register #{clazz} for '#{queue}', "\
49
+ "because #{invalid_worker} is already registered for this queue, "\
50
+ "and Shoryuken doesn't support a batchable worker for a queue with multiple workers" if invalid_worker
51
+
52
+ worker_subscriptions = clazz.get_shoryuken_options['subscriptions']
53
+
54
+ if worker_subscriptions.nil?
55
+ fail InvalidWorkerOptionsError, "Worker #{clazz} must define "\
56
+ 'a :subscriptions hash ({ queue_name: message_types }) in '\
57
+ "it's shoryuken_options"
58
+ end
59
+
60
+ worker_subscriptions.each do |owning_queue, message_types|
61
+ queue_subscriptions = @subscriptions.fetch_store env_name(owning_queue), {}
62
+
63
+ [message_types].flatten.each do |message_type|
64
+ message_type = message_type.to_s.dasherize
65
+
66
+ if queue_subscriptions.key? message_type
67
+ fail DuplicateSubscriptionError, "Worker #{clazz} cannot "\
68
+ "define another subscription of message #{message_type} "\
69
+ "on queue #{owning_queue} as it is already subscribed to by "\
70
+ "worker #{queue_subscriptions[message_type]}."
71
+ end
72
+
73
+ queue_subscriptions.store message_type, clazz
74
+ end
75
+ end
76
+ end
77
+
78
+ def topics queue = nil
79
+ topic_list = if queue
80
+ @subscriptions.fetch(queue, {}).keys
81
+ else
82
+ @subscriptions.values.map(&:keys).flatten
83
+ end
84
+
85
+ topic_list.uniq - ['*']
86
+ end
87
+
88
+ def workers(queue)
89
+ @subscriptions.fetch(queue, {}).values
90
+ end
91
+
92
+ private
93
+
94
+ def env_name(name)
95
+ AwsSqsMoniter::Aws::EnvironmentalName.new(name.to_s).to_s
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,30 @@
1
+ require 'rails/generators/named_base'
2
+ require 'rails/generators/active_record/migration'
3
+
4
+ module AwsSqsMoniter
5
+ class InstallGenerator < Rails::Generators::Base
6
+ include ActiveRecord::Generators::Migration
7
+
8
+ desc 'Installs models and initializers to Rails Application'
9
+
10
+ source_root File.expand_path('../templates', __FILE__)
11
+
12
+ def install_files
13
+ #copiong initializer to config/intializer of rails application
14
+ copy_file 'initializer.rb', 'config/initializers/aws_sqs_moniter_intializer.rb'
15
+ copy_file 'dead_letter.rb', 'app/models/dead_letter.rb'
16
+ copy_file 'processed_message.rb', 'app/models/processed_message.rb'
17
+ copy_file 'published_message.rb', 'app/models/published_message.rb'
18
+ #coping aws config file to rails application
19
+ copy_file 'shoryuken.yml' , 'config/shoryuken.yml'
20
+ migration_template 'create_dead_letters_migration.rb',
21
+ 'db/migrate/create_dead_letters.rb'
22
+
23
+ migration_template 'create_processed_messages_migration.rb',
24
+ 'db/migrate/create_processed_messages.rb'
25
+
26
+ migration_template 'create_published_messages_migration.rb',
27
+ 'db/migrate/create_published_messages.rb'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ class CreateDeadLetters < ActiveRecord::Migration
2
+ def change
3
+ create_table :dead_letters, id: false do |t|
4
+ t.timestamps
5
+
6
+ t.string :sqs_id, null: false, index: { unique: true }
7
+ t.uuid :message_id, null: false, index: true
8
+ t.json :message, null: false
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ class CreateProcessedMessages < ActiveRecord::Migration
2
+ def change
3
+ create_table :processed_messages, id: :uuid do |t|
4
+ t.timestamps
5
+
6
+ t.uuid :message_id, null: false
7
+ t.string :queue, null: false
8
+ t.json :message, null: false
9
+
10
+ t.index %i(message_id queue), unique: true
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ class CreatePublishedMessages < ActiveRecord::Migration
2
+ def change
3
+ create_table :published_messages, id: :uuid do |t|
4
+ t.timestamps
5
+
6
+ t.string :topic, null: false
7
+ t.json :message, null: false
8
+ t.json :response
9
+
10
+ t.integer :attempts, null: false, default: 0
11
+ t.datetime :attempted_at
12
+
13
+ t.string :published_by
14
+ t.datetime :published_at
15
+
16
+ t.index :published_by
17
+ t.index :published_at
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ class DeadLetter < ActiveRecord::Base
2
+ self.primary_key = 'sqs_id'
3
+
4
+ validates :sqs_id, presence: true
5
+ validates :message_id, presence: true
6
+ validates :message, presence: true
7
+
8
+ def self.retryable sqs_id: nil, message_id: nil
9
+ criteria = all
10
+ criteria = criteria.where(sqs_id: sqs_id) unless sqs_id.blank?
11
+ criteria = criteria.where(message_id: message_id) unless message_id.blank?
12
+ criteria
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ # Load any middlewares you want to use:
2
+ #
3
+ # require 'aws_sqs_moniter/middleware/server/airbrake'
4
+ # require 'aws_sqs_moniter/middleware/server/active_record/connection_pool'
5
+
6
+ # Configure your environment:
7
+ #
8
+ # AwsSqsMoniter.configure do |config|
9
+ # config.use_aws_sqs_moniter_logging
10
+ # config.use_typed_message_registry 'your_dead_letter_queue_name'
11
+
12
+ # if Rails.env.development?
13
+ # config.enable_cmb_mode
14
+ # config.require_application_workers
15
+ # config.require_dead_letter_worker
16
+ # end
17
+
18
+ # config.queue_defaults.delay_seconds = 0
19
+ # config.queue_defaults.message_retention_period = 1_209_600
20
+ # config.queue_defaults.visibility_timeout = 30
21
+
22
+ # config.add_queue('your_dead_letter_queue_name') do |queue|
23
+ # queue.visibility_timeout = 60
24
+ # end
25
+
26
+ # config.add_queue('your_queue_name') do |queue|
27
+ # queue.delay_seconds = 10
28
+ # queue.redrive_policy.dead_letter_queue = 'your_dead_letter_queue_name'
29
+ # queue.redrive_policy.enabled = true
30
+ # queue.redrive_policy.max_receive_count = 5
31
+ # end
32
+ # end
@@ -0,0 +1,12 @@
1
+ class ProcessedMessage < ActiveRecord::Base
2
+ validates :message_id, presence: true
3
+ validates :queue, presence: true
4
+ validates :message, presence: true
5
+
6
+ def self.log message
7
+ create!(
8
+ message_id: message.id,
9
+ queue: message.queue,
10
+ message: message.to_h)
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ class PublishedMessage < ActiveRecord::Base
2
+ def self.unsent
3
+ where(published_at: nil)
4
+ .where('attempted_at IS NULL OR (attempted_at <= ?)', 1.minute.ago)
5
+ .order(created_at: :asc)
6
+ end
7
+
8
+ def self.sent_by publisher_id, timestamp
9
+ where(published_by: publisher_id, attempted_at: timestamp)
10
+ end
11
+
12
+ validates :message, presence: true
13
+ validates :topic, presence: true
14
+ end
@@ -0,0 +1,16 @@
1
+ #AWS credentails need to keep here
2
+ aws:
3
+ access_key_id: "" # or <%= ENV['AWS_ACCESS_KEY_ID'] %>
4
+ secret_access_key: "" # or <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
5
+ region: us-east-1 # or <%= ENV['AWS_REGION'] %>
6
+ receive_message: # See http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SQS/Queue.html#receive_message-instance_method
7
+ # wait_time_seconds: N # The number of seconds to wait for new messages when polling. Defaults to the #wait_time_seconds defined on the queue
8
+ attributes:
9
+ - receive_count
10
+ - sent_at
11
+ concurrency: 25, # The number of allocated threads to process messages. Default 25
12
+ delay: 25, # The delay in seconds to pause a queue when it's empty. Default 0
13
+ queues:
14
+ - [high_priority, 6]
15
+ - [default, 2]
16
+ - [low_priority, 1]
@@ -0,0 +1,83 @@
1
+ namespace :aws_sqs_moniter do
2
+ namespace :aws do
3
+ namespace :build do
4
+ desc 'Builds policies, topics and queues'
5
+ task all: %i(environment topics queues subscriptions policies) do
6
+ end
7
+
8
+ desc 'Builds the application policies'
9
+ task policies: :environment do
10
+ builder.build_policies
11
+ end
12
+
13
+ desc 'Builds the queues'
14
+ task queues: :environment do
15
+ builder.build_queues
16
+ end
17
+
18
+ desc 'Builds the subscriptions'
19
+ task subscriptions: :environment do
20
+ builder.build_subscriptions
21
+ end
22
+
23
+ desc 'Builds the topics'
24
+ task topics: :environment do
25
+ builder.build_topics
26
+ end
27
+
28
+ private
29
+
30
+ def builder
31
+ AwsSqsMoniter.configuration.require_workers
32
+ require 'aws_sqs_moniter/aws/builder'
33
+ AwsSqsMoniter::Aws::Builder.new
34
+ end
35
+ end
36
+
37
+ namespace :destroy do
38
+ desc 'Deletes all topics and queues'
39
+ task all: :environment do
40
+ fail 'This task is only available in development.' unless Rails.env.development?
41
+ builder.delete_all
42
+ end
43
+ end
44
+ end
45
+
46
+ #Queues GET/READ/DELETE
47
+ namespace :queues do
48
+
49
+ desc 'get queues'
50
+ task get: :environment do
51
+ puts "Get Queue list from AWS SQS Account"
52
+ end
53
+
54
+ desc "delete queues"
55
+ task delete: :environment do
56
+ puts "Delete Queues from AWS SQS Account"
57
+ end
58
+
59
+ desc "READ messages from a queue"
60
+ task read: :environment do
61
+ puts "read messages from a queue"
62
+ end
63
+
64
+ end
65
+
66
+ namespace :workers do
67
+
68
+ desc "Start Workers"
69
+ task start: :environment do
70
+ puts "start workers in Background"
71
+ end
72
+
73
+ end
74
+
75
+
76
+ namespace :dead_letters do
77
+ desc 'Retries all dead letters (or pass SQS_ID or MESSAGE_ID to select a specific message).'
78
+ task retry: :environment do
79
+ scope = DeadLetter.retriable sqs_id: ENV['SQS_ID'], message_id: ENV['MESSAGE_ID']
80
+ AwsSqsMoniter::DeadLetterRetrier.new.retry scope
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,10 @@
1
+ namespace :aws_sqs_moniter do
2
+ desc 'setup Aws SQS on your machicne.'
3
+ task setup: :environment do
4
+ puts "coping SQS config file for keeping AWS credentails"
5
+ end
6
+
7
+ task run_migrations: :environment do
8
+ puts "adding migrations to store/persist queue state/status."
9
+ end
10
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws_sqs_moniter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - saikiranmothe
@@ -206,6 +206,20 @@ dependencies:
206
206
  - - '>='
207
207
  - !ruby/object:Gem::Version
208
208
  version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: docsplit
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - '>='
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '>='
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
209
223
  description: AWS SQS Moniter.
210
224
  email:
211
225
  - saikiran.mothe@gmail.com
@@ -213,16 +227,43 @@ executables: []
213
227
  extensions: []
214
228
  extra_rdoc_files: []
215
229
  files:
216
- - .gitignore
217
- - Gemfile
218
- - LICENSE.txt
219
- - README.md
220
- - Rakefile
221
- - aws_sqs_moniter-0.0.1.gem
222
- - aws_sqs_moniter.gemspec
223
- - lib/aws_sqs_moniter.rb
230
+ - lib/aws_sqs_moniter/monkey_patches/forbid_implicit_active_record_connection_checkout.rb
231
+ - lib/aws_sqs_moniter/dead_letters/retrier.rb
232
+ - lib/aws_sqs_moniter/dead_letters/worker.rb
224
233
  - lib/aws_sqs_moniter/version.rb
225
- - test/test_helper.rb
234
+ - lib/aws_sqs_moniter/middleware/server/airbrake.rb
235
+ - lib/aws_sqs_moniter/middleware/server/active_record/transaction.rb
236
+ - lib/aws_sqs_moniter/middleware/server/active_record/retrier.rb
237
+ - lib/aws_sqs_moniter/middleware/server/active_record/idempotence.rb
238
+ - lib/aws_sqs_moniter/middleware/server/active_record/connection_pool.rb
239
+ - lib/aws_sqs_moniter/configuration.rb
240
+ - lib/aws_sqs_moniter/configuration/redrive_policy_configuration.rb
241
+ - lib/aws_sqs_moniter/configuration/validatable.rb
242
+ - lib/aws_sqs_moniter/configuration/queue_configuration.rb
243
+ - lib/aws_sqs_moniter/worker_registries/typed_message_registry.rb
244
+ - lib/aws_sqs_moniter/logging.rb
245
+ - lib/aws_sqs_moniter/typed_message.rb
246
+ - lib/aws_sqs_moniter/railtie.rb
247
+ - lib/aws_sqs_moniter/aws/arns.rb
248
+ - lib/aws_sqs_moniter/aws/builder.rb
249
+ - lib/aws_sqs_moniter/aws/builder/application_policy_builder.rb
250
+ - lib/aws_sqs_moniter/aws/builder/topic_builder.rb
251
+ - lib/aws_sqs_moniter/aws/builder/queue_builder.rb
252
+ - lib/aws_sqs_moniter/aws/builder/subscription_builder.rb
253
+ - lib/aws_sqs_moniter/aws/environmental_name.rb
254
+ - lib/aws_sqs_moniter.rb
255
+ - lib/tasks/aws_sqs_moniter.rake
256
+ - lib/tasks/aws_sqs_setup.rake
257
+ - lib/generators/aws_sqs_moniter/install_generator.rb
258
+ - lib/generators/aws_sqs_moniter/templates/initializer.rb
259
+ - lib/generators/aws_sqs_moniter/templates/shoryuken.yml
260
+ - lib/generators/aws_sqs_moniter/templates/create_published_messages_migration.rb
261
+ - lib/generators/aws_sqs_moniter/templates/create_dead_letters_migration.rb
262
+ - lib/generators/aws_sqs_moniter/templates/processed_message.rb
263
+ - lib/generators/aws_sqs_moniter/templates/dead_letter.rb
264
+ - lib/generators/aws_sqs_moniter/templates/published_message.rb
265
+ - lib/generators/aws_sqs_moniter/templates/create_processed_messages_migration.rb
266
+ - Rakefile
226
267
  homepage: http://saikiranmothe.github.io/aws_sqs_moniter
227
268
  licenses:
228
269
  - MIT
@@ -247,6 +288,5 @@ rubygems_version: 2.0.3
247
288
  signing_key:
248
289
  specification_version: 4
249
290
  summary: AWS SQS Moniter
250
- test_files:
251
- - test/test_helper.rb
291
+ test_files: []
252
292
  has_rdoc: