fleck 2.2.0 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,88 +1,88 @@
1
- # frozen_string_literal: true
2
-
3
- module Fleck
4
- module Core
5
- class Consumer
6
- module Logger
7
- def self.included(base)
8
- base.extend ClassMethods
9
- base.send :include, InstanceMethods
10
- end
11
-
12
- # Defines class methods to import when `Logger` module is imported.
13
- module ClassMethods
14
- attr_accessor :logger
15
- end
16
-
17
- # Defines instance methods to import when `Logger` module is imported.
18
- module InstanceMethods
19
- def logger
20
- return @logger if @logger
21
-
22
- @logger = self.class.logger.clone
23
- @logger.progname = self.class.name.to_s + (configs[:concurrency].to_i <= 1 ? '' : "[#{consumer_id}]")
24
-
25
- @logger
26
- end
27
-
28
- private
29
-
30
- def log_request
31
- status = final_response_status
32
- message = log_formatted_message
33
-
34
- if status >= 500
35
- logger.error message
36
- elsif status >= 400 || response.deprecated?
37
- logger.warn message
38
- else
39
- logger.info message
40
- end
41
- end
42
-
43
- def exchange_type_code
44
- rmq_exchange_type.to_s[0].upcase
45
- end
46
-
47
- def final_response_status
48
- return 406 if request.rejected?
49
- return 503 if channel.closed?
50
-
51
- response.status
52
- end
53
-
54
- def log_formatted_message
55
- [
56
- request_origin,
57
- exchange_and_queue_name,
58
- request_metadata,
59
- request_execution_time,
60
- deprecation_message
61
- ].join
62
- end
63
-
64
- def request_origin
65
- "#{request.ip} #{request.app_id} => "
66
- end
67
-
68
- def exchange_and_queue_name
69
- ex_name = rmq_exchange_name.to_s == '' ? ''.inspect : rmq_exchange_name
70
- "(#{ex_name}|#{exchange_type_code}|#{queue_name}) "
71
- end
72
-
73
- def request_metadata
74
- "##{request.id} \"#{request.action} /#{request.version || 'v1'}\" #{final_response_status} "
75
- end
76
-
77
- def request_execution_time
78
- "(#{request.execution_time}ms)"
79
- end
80
-
81
- def deprecation_message
82
- response.deprecated? ? ' DEPRECATED' : ''
83
- end
84
- end
85
- end
86
- end
87
- end
88
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Fleck
4
+ module Core
5
+ class Consumer
6
+ module Logger
7
+ def self.included(base)
8
+ base.extend ClassMethods
9
+ base.send :include, InstanceMethods
10
+ end
11
+
12
+ # Defines class methods to import when `Logger` module is imported.
13
+ module ClassMethods
14
+ attr_accessor :logger
15
+ end
16
+
17
+ # Defines instance methods to import when `Logger` module is imported.
18
+ module InstanceMethods
19
+ def logger
20
+ return @logger if @logger
21
+
22
+ @logger = self.class.logger.clone
23
+ @logger.progname = self.class.name.to_s + (configs[:concurrency].to_i <= 1 ? '' : "[#{consumer_id}]")
24
+
25
+ @logger
26
+ end
27
+
28
+ private
29
+
30
+ def log_request
31
+ status = final_response_status
32
+ message = log_formatted_message
33
+
34
+ if status >= 500
35
+ logger.error message
36
+ elsif status >= 400 || response.deprecated?
37
+ logger.warn message
38
+ else
39
+ logger.info message
40
+ end
41
+ end
42
+
43
+ def exchange_type_code
44
+ rmq_exchange_type.to_s[0].upcase
45
+ end
46
+
47
+ def final_response_status
48
+ return 406 if request.rejected?
49
+ return 503 if channel.closed?
50
+
51
+ response.status
52
+ end
53
+
54
+ def log_formatted_message
55
+ [
56
+ request_origin,
57
+ exchange_and_queue_name,
58
+ request_metadata,
59
+ request_execution_time,
60
+ deprecation_message
61
+ ].join
62
+ end
63
+
64
+ def request_origin
65
+ "#{request.ip} #{request.app_id} => "
66
+ end
67
+
68
+ def exchange_and_queue_name
69
+ ex_name = rmq_exchange_name.to_s == '' ? ''.inspect : rmq_exchange_name
70
+ "(#{ex_name}|#{exchange_type_code}|#{queue_name}) "
71
+ end
72
+
73
+ def request_metadata
74
+ "##{request.id} \"#{request.action} /#{request.version || 'v1'}\" #{final_response_status} "
75
+ end
76
+
77
+ def request_execution_time
78
+ "(#{request.execution_time}ms)"
79
+ end
80
+
81
+ def deprecation_message
82
+ response.deprecated? ? ' DEPRECATED' : ''
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -1,100 +1,100 @@
1
- # frozen_string_literal: true
2
-
3
- module Fleck
4
- module Core
5
- class Consumer
6
- class Request
7
- include Fleck::Loggable
8
-
9
- attr_reader :id, :response, :metadata, :payload, :action, :data, :headers, :version, :ip, :params, :status, :errors,
10
- :delivery_tag, :app_id, :reply_to, :created_at, :processed_at
11
-
12
- def initialize(metadata, payload, delivery_info)
13
- @created_at = Time.now
14
- @id = metadata.correlation_id
15
- logger.progname += " #{@id}"
16
-
17
- @response = Fleck::Core::Consumer::Response.new(metadata.correlation_id)
18
- @metadata = metadata
19
- @app_id = metadata[:app_id]
20
- @reply_to = @metadata.reply_to
21
- @payload = payload
22
- @exchange = delivery_info.exchange
23
- @queue = delivery_info.routing_key
24
- @delivery_tag = delivery_info.delivery_tag
25
- @data = {}
26
- @headers = (@metadata.headers || {}).to_hash_with_indifferent_access
27
- @action = @metadata.type
28
- @version = nil
29
- @ip = nil
30
- @params = {}
31
- @failed = false
32
- @rejected = false
33
- @requeue = false
34
-
35
- parse_request!
36
- end
37
-
38
- def processed!
39
- @processed_at = Time.now
40
- end
41
-
42
- def execution_time
43
- ((@processed_at.to_f - @created_at.to_f) * 1000).round(2)
44
- end
45
-
46
- def failed?
47
- @failed
48
- end
49
-
50
- def reject!(requeue: false)
51
- @rejected = true
52
- @requeue = requeue
53
- processed!
54
- end
55
-
56
- def rejected?
57
- @rejected
58
- end
59
-
60
- def requeue?
61
- @requeue
62
- end
63
-
64
- def log_headers_and_params!
65
- queue_name = "(#{@exchange == '' ? @queue : "#{@queue}@#{@exchange}"})".color(:red)
66
- endpoint = "/#{action} :#{@version || 'v1'}".color(:red)
67
- message = "\n" \
68
- "#{ip} - #{queue_name} #{endpoint} [#{@id}]\n" \
69
- " ~ headers ~ #{headers.inspect.color(:green)}\n" \
70
- " @params #{params.inspect.color(:green)}"
71
- logger.debug message
72
- end
73
-
74
- protected
75
-
76
- def parse_request!
77
- @data = Oj.load(@payload, mode: :compat).to_hash_with_indifferent_access.filtered!
78
- @headers.merge!(@data['headers'] || {}).filtered!
79
-
80
- logger.debug "Request (exchange: #{@exchange.inspect}, queue: #{@queue.inspect}, " \
81
- "options: #{@headers}, message: #{@data})"
82
-
83
- @action ||= @headers['action']
84
- @headers['action'] ||= @action
85
- @version = @headers['version']
86
- @ip = @headers['ip']
87
- @params = @data['params'] || {}
88
- rescue Oj::ParseError => e
89
- log_error(e)
90
- response.render_error(400, 'Bad request', e.inspect)
91
- @failed = true
92
- rescue StandardError => e
93
- log_error(e)
94
- response.render_error(500, 'Internal Server Error', e.inspect)
95
- @failed = true
96
- end
97
- end
98
- end
99
- end
100
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Fleck
4
+ module Core
5
+ class Consumer
6
+ class Request
7
+ include Fleck::Loggable
8
+
9
+ attr_reader :id, :response, :metadata, :payload, :action, :data, :headers, :version, :ip, :params, :status, :errors,
10
+ :delivery_tag, :app_id, :reply_to, :created_at, :processed_at
11
+
12
+ def initialize(metadata, payload, delivery_info)
13
+ @created_at = Time.now
14
+ @id = metadata.correlation_id
15
+ logger.progname += " #{@id}"
16
+
17
+ @response = Fleck::Core::Consumer::Response.new(metadata.correlation_id)
18
+ @metadata = metadata
19
+ @app_id = metadata[:app_id]
20
+ @reply_to = @metadata.reply_to
21
+ @payload = payload
22
+ @exchange = delivery_info.exchange
23
+ @queue = delivery_info.routing_key
24
+ @delivery_tag = delivery_info.delivery_tag
25
+ @data = {}
26
+ @headers = (@metadata.headers || {}).to_hash_with_indifferent_access
27
+ @action = @metadata.type
28
+ @version = nil
29
+ @ip = nil
30
+ @params = {}
31
+ @failed = false
32
+ @rejected = false
33
+ @requeue = false
34
+
35
+ parse_request!
36
+ end
37
+
38
+ def processed!
39
+ @processed_at = Time.now
40
+ end
41
+
42
+ def execution_time
43
+ ((@processed_at.to_f - @created_at.to_f) * 1000).round(2)
44
+ end
45
+
46
+ def failed?
47
+ @failed
48
+ end
49
+
50
+ def reject!(requeue: false)
51
+ @rejected = true
52
+ @requeue = requeue
53
+ processed!
54
+ end
55
+
56
+ def rejected?
57
+ @rejected
58
+ end
59
+
60
+ def requeue?
61
+ @requeue
62
+ end
63
+
64
+ def log_headers_and_params!
65
+ queue_name = "(#{@exchange == '' ? @queue : "#{@queue}@#{@exchange}"})".color(:red)
66
+ endpoint = "/#{action} :#{@version || 'v1'}".color(:red)
67
+ message = "\n" \
68
+ "#{ip} - #{queue_name} #{endpoint} [#{@id}]\n" \
69
+ " ~ headers ~ #{headers.inspect.color(:green)}\n" \
70
+ " @params #{params.inspect.color(:green)}"
71
+ logger.debug message
72
+ end
73
+
74
+ protected
75
+
76
+ def parse_request!
77
+ @data = Oj.load(@payload, mode: :compat).to_hash_with_indifferent_access.filtered!
78
+ @headers.merge!(@data['headers'] || {}).filtered!
79
+
80
+ logger.debug "Request (exchange: #{@exchange.inspect}, queue: #{@queue.inspect}, " \
81
+ "options: #{@headers}, message: #{@data})"
82
+
83
+ @action ||= @headers['action']
84
+ @headers['action'] ||= @action
85
+ @version = @headers['version']
86
+ @ip = @headers['ip']
87
+ @params = @data['params'] || {}
88
+ rescue Oj::ParseError => e
89
+ log_error(e)
90
+ response.render_error(400, 'Bad request', e.inspect)
91
+ @failed = true
92
+ rescue StandardError => e
93
+ log_error(e)
94
+ response.render_error(500, 'Internal Server Error', e.inspect)
95
+ @failed = true
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -1,77 +1,77 @@
1
-
2
- module Fleck
3
- module Core
4
- class Consumer
5
- class Response
6
- include Fleck::Loggable
7
-
8
- attr_accessor :id, :status, :errors, :headers, :body
9
-
10
- def initialize(request_id)
11
- @id = request_id
12
- logger.progname += " #{@id}"
13
-
14
- @status = 200
15
- @errors = []
16
- @headers = {}
17
- @body = nil
18
- @deprecated = false
19
- end
20
-
21
- def errors?
22
- !@errors.empty?
23
- end
24
-
25
- def deprecated!
26
- @deprecated = true
27
- end
28
-
29
- def deprecated?
30
- @deprecated
31
- end
32
-
33
- def not_found(msg = nil)
34
- @status = 404
35
- @errors << 'Resource Not Found'
36
- @errors << msg if msg
37
- end
38
-
39
- def render_error(status, msg = [])
40
- raise ArgumentError, "Invalid status code: #{status.inspect}" unless (400..599).cover?(status.to_i)
41
-
42
- @status = status.to_i
43
- if msg.is_a?(Array)
44
- @errors += msg
45
- else
46
- @errors << msg
47
- end
48
-
49
- @errors.compact!
50
- end
51
-
52
- def to_json(filter: false)
53
- data = {
54
- "status" => @status,
55
- "errors" => @errors,
56
- "headers" => @headers,
57
- "body" => @body,
58
- "deprecated" => @deprecated
59
- }
60
- data.filter! if filter
61
-
62
- return Oj.dump(data, mode: :compat)
63
- rescue => e
64
- logger.error e.inspect + "\n" + e.backtrace.join("\n")
65
- return Oj.dump({
66
- "status" => 500,
67
- "errors" => ['Internal Server Error', 'Failed to dump the response to JSON']
68
- }, mode: :compat)
69
- end
70
-
71
- def to_s
72
- return "#<#{self.class} #{self.to_json(filter: true)}>"
73
- end
74
- end
75
- end
76
- end
77
- end
1
+
2
+ module Fleck
3
+ module Core
4
+ class Consumer
5
+ class Response
6
+ include Fleck::Loggable
7
+
8
+ attr_accessor :id, :status, :errors, :headers, :body
9
+
10
+ def initialize(request_id)
11
+ @id = request_id
12
+ logger.progname += " #{@id}"
13
+
14
+ @status = 200
15
+ @errors = []
16
+ @headers = {}
17
+ @body = nil
18
+ @deprecated = false
19
+ end
20
+
21
+ def errors?
22
+ !@errors.empty?
23
+ end
24
+
25
+ def deprecated!
26
+ @deprecated = true
27
+ end
28
+
29
+ def deprecated?
30
+ @deprecated
31
+ end
32
+
33
+ def not_found(msg = nil)
34
+ @status = 404
35
+ @errors << 'Resource Not Found'
36
+ @errors << msg if msg
37
+ end
38
+
39
+ def render_error(status, msg = [])
40
+ raise ArgumentError, "Invalid status code: #{status.inspect}" unless (400..599).cover?(status.to_i)
41
+
42
+ @status = status.to_i
43
+ if msg.is_a?(Array)
44
+ @errors += msg
45
+ else
46
+ @errors << msg
47
+ end
48
+
49
+ @errors.compact!
50
+ end
51
+
52
+ def to_json(filter: false)
53
+ data = {
54
+ "status" => @status,
55
+ "errors" => @errors,
56
+ "headers" => @headers,
57
+ "body" => @body,
58
+ "deprecated" => @deprecated
59
+ }
60
+ data.filter! if filter
61
+
62
+ return Oj.dump(data, mode: :compat)
63
+ rescue => e
64
+ logger.error e.inspect + "\n" + e.backtrace.join("\n")
65
+ return Oj.dump({
66
+ "status" => 500,
67
+ "errors" => ['Internal Server Error', 'Failed to dump the response to JSON']
68
+ }, mode: :compat)
69
+ end
70
+
71
+ def to_s
72
+ return "#<#{self.class} #{self.to_json(filter: true)}>"
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end