aws_sqs_moniter 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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: