insque 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: bc23ed058d9cee97359aa01f09f125531c53dc58
4
- data.tar.gz: bac388403d7c9b289723ce47f078d7b9531f89b0
2
+ SHA256:
3
+ metadata.gz: 4f1434665ea4206ce27e4120c4a08830a43f1e33ee50a7e68c986977f76b6fa4
4
+ data.tar.gz: 220ebc3acda7272151365db0532938362fddaea061511b5cda4281314014457c
5
5
  SHA512:
6
- metadata.gz: 898027b6d227a907b8edb87a7a3d3ccfb0fb2ba0e888f63e01429773b2ab363a77668111bba6008d32c1f063003f8d418fda437f85aa177b3dcdb098f2d9a8c6
7
- data.tar.gz: cb589c1f9a3d0e77ad0669d8fffdc62cf20a770d70de4dc9b2fcb336bd8ff1a3860aec56c249bdd77e6e28a446cafcf25a7ec2ad1f78fb228a8e5268e3875aeb
6
+ metadata.gz: 8bbad94b06e41bc20b709a3f70ebe8c8c7171a2dbe2d07cff93f8bd349ee5a95abaa22c1e839177ad79d638e48fd37096f3a9e4a3ec4cf49c9d2481cdd3917d2
7
+ data.tar.gz: 5b4348daa91b43d70fc609a15741a1c99c0933bcf14d376243f8a00dc20295d9cfb399ee3c1570b61ade85ffd53d1fb7bebfe30be6ec61b5ada01936deab7727
data/insque.local.yml CHANGED
@@ -3,6 +3,7 @@ version: '3.2'
3
3
  services:
4
4
  redis:
5
5
  image: redis
6
+ command: redis-server --save "" --appendonly no
6
7
  ports:
7
8
  - target: 6379
8
9
  published: 63790
@@ -0,0 +1,21 @@
1
+ module Insque
2
+ class JsonFormatter < ::Logger::Formatter
3
+ def call(severity, time, progname, msg, additional_fields = {})
4
+ message = case msg
5
+ when ::String
6
+ { message: msg }
7
+ when ::Hash
8
+ msg
9
+ when ::Exception
10
+ {
11
+ error: "#{ msg.message } (#{ msg.class })",
12
+ error_class: "#{msg.class}",
13
+ backtrace: (msg.backtrace || []).join("\n\t")
14
+ }
15
+ else
16
+ { message: msg.inspect }
17
+ end
18
+ "#{message.merge(timestamp: time, level: severity).merge(additional_fields).to_json}\n"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Insque
2
+ class JsonLogger < ::Logger
3
+ attr_accessor :additional_fields
4
+
5
+ def format_message(severity, datetime, progname, msg)
6
+ @json_formatter ||= JsonFormatter.new
7
+ @additional_fields ||= {}
8
+ (@formatter || @json_formatter).call(severity, datetime, progname, msg, @additional_fields)
9
+ end
10
+
11
+ private
12
+ # Severity label for logging (max 5 chars).
13
+ SEV_LABEL = %w(debug info warn error fatal any).each(&:freeze).freeze
14
+
15
+ def format_severity(severity)
16
+ SEV_LABEL[severity] || 'any'
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module Insque
2
- VERSION = "0.6.3"
2
+ VERSION = "0.7.0"
3
3
  end
data/lib/insque.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require "insque/version"
2
2
  require "redis"
3
- require 'json'
3
+ require "json"
4
+ require "insque/json_formatter"
5
+ require "insque/json_logger"
4
6
  require "insque/railtie" if defined?(Rails)
5
7
 
6
8
  module Insque
@@ -23,10 +25,6 @@ module Insque
23
25
  @processing_ttl || DEFAULT_PROCESSING_TTL
24
26
  end
25
27
 
26
- def self.debug= debug
27
- @debug = debug
28
- end
29
-
30
28
  def self.redis= redis
31
29
  @redis = redis
32
30
  end
@@ -35,6 +33,18 @@ module Insque
35
33
  @redis
36
34
  end
37
35
 
36
+ def self.logger= l
37
+ @logger = l
38
+ end
39
+
40
+ def self.logger
41
+ unless @logger
42
+ @logger = JsonLogger.new(STDOUT)
43
+ @logger.additional_fields = { tag: 'insque' }
44
+ end
45
+ @logger
46
+ end
47
+
38
48
  def self.redis_class= klass
39
49
  @redis_class = klass
40
50
  end
@@ -72,7 +82,7 @@ module Insque
72
82
  keys = recipient.is_a?(Array) ? recipient : [recipient]
73
83
  end
74
84
  value = { message: "#{@sender}_#{message}", params: params, broadcasted_at: Time.now.utc }
75
- log "SENDING: #{value.to_json} TO #{keys.to_json}" if @debug
85
+ logger.debug sending: value, to: keys
76
86
  @redis.multi do |r|
77
87
  keys.each {|k| r.lpush k, value.to_json}
78
88
  end
@@ -97,19 +107,17 @@ module Insque
97
107
 
98
108
  private
99
109
  def self.do_listen inbox, processing, redis, worker_name, pointer=nil
100
- log "#{worker_name} START LISTENING #{inbox}"
110
+ logger.info starting: worker_name, listening: inbox
101
111
  loop do
102
112
  redis.setex(pointer, inbox_ttl, inbox) if pointer
103
113
  message = redis.brpoplpush(inbox, processing, 0)
104
114
  begin
105
- log "#{worker_name} RECEIVING: #{message}" if @debug
106
115
  parsed_message = JSON.parse message
116
+ logger.debug receiving: parsed_message, worker: worker_name
107
117
  send(parsed_message['message'], parsed_message)
108
118
  rescue NoMethodError
109
119
  rescue => e
110
- log "#{worker_name} ========== BROKEN_MESSAGE: #{message} =========="
111
- log e.inspect
112
- log e.backtrace
120
+ logger.error e
113
121
  ensure
114
122
  redis.lrem processing, 0, message
115
123
  end
@@ -134,9 +142,7 @@ private
134
142
  delete << m
135
143
  end
136
144
  rescue => e
137
- log "========== JANITOR_BROKEN_MESSAGE: #{m} =========="
138
- log e.inspect
139
- log e.backtrace
145
+ logger.error e
140
146
  end
141
147
  end
142
148
  result = redis.multi do |r|
@@ -144,11 +150,11 @@ private
144
150
  delete.each {|m| r.lrem processing, 0, m }
145
151
  end
146
152
  if result
147
- errors.each {|m| log "ERROR: #{m.to_json}" }
148
- restart.each {|m| log "RESTART: #{m.to_json}" }
149
- log "CLEANING #{inbox} SUCCESSFULL"
153
+ errors.each {|m| logger.info deleting: m }
154
+ restart.each {|m| logger.info restarting: m }
155
+ logger.info cleaning: 'success', inbox: inbox
150
156
  else
151
- log "CLEANING #{inbox} FAILED"
157
+ logger.info cleaning: 'failed', inbox: inbox
152
158
  end
153
159
  sleep(Random.rand((inbox_ttl.to_f / 10).ceil) + 1)
154
160
  end
@@ -158,11 +164,6 @@ private
158
164
  (@redis_class || Redis).new @redis_config
159
165
  end
160
166
 
161
- def self.log message
162
- print "#{Time.now.utc} #{message}\n"
163
- STDOUT.flush if @debug
164
- end
165
-
166
167
  def self.create_send_later_handler
167
168
  define_singleton_method("#{@sender}_send_later") do |msg|
168
169
  Kernel.const_get(msg['params']['class']).unscoped.find(msg['params']['id']).send(msg['params']['method'], *msg['params']['args'])
data/spec/insque_spec.rb CHANGED
@@ -36,7 +36,7 @@ RSpec.describe 'insque' do
36
36
  system "docker stack deploy -c insque.local.yml insque"
37
37
  sleep 10
38
38
  Thread.abort_on_exception=true
39
- Insque.debug = true
39
+ Insque.logger.level = :error
40
40
  Insque.sender = 'myapp'
41
41
  Insque.inbox_ttl = 3
42
42
  Insque.redis_config = { host: 'localhost', port: 63790 }
@@ -54,6 +54,9 @@ RSpec.describe 'insque' do
54
54
 
55
55
  before(:each) do
56
56
  Insque.redis.flushall
57
+ rescue
58
+ sleep 10
59
+ Insque.redis.flushall
57
60
  end
58
61
 
59
62
  it "can broadcast without listeners" do
@@ -76,7 +79,7 @@ RSpec.describe 'insque' do
76
79
  it "restarts broken message" do
77
80
  janitor = Thread.new { Insque.janitor }
78
81
  Insque.redis.lpush('{insque}processing_myapp', { message: 'myapp_test', broadcasted_at: 1.hour.ago }.to_json)
79
- sleep 3
82
+ sleep 4
80
83
  expect(Insque.redis.llen '{insque}processing_myapp').to eq(0)
81
84
  expect(Insque.redis.llen '{insque}inbox_myapp').to eq(1)
82
85
  janitor.exit
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: insque
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuri Gomozov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-21 00:00:00.000000000 Z
11
+ date: 2019-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -113,6 +113,8 @@ files:
113
113
  - lib/generators/insque/templates/insque.erb
114
114
  - lib/generators/insque/templates/redis.yml
115
115
  - lib/insque.rb
116
+ - lib/insque/json_formatter.rb
117
+ - lib/insque/json_logger.rb
116
118
  - lib/insque/railtie.rb
117
119
  - lib/insque/version.rb
118
120
  - lib/tasks/insque.rake
@@ -138,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
140
  version: '0'
139
141
  requirements: []
140
142
  rubyforge_project:
141
- rubygems_version: 2.5.1
143
+ rubygems_version: 2.7.8
142
144
  signing_key:
143
145
  specification_version: 4
144
146
  summary: Redis-based multi-threaded queue