chili_logger 0.0.1 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.byebug_history +88 -0
- data/.gitignore +2 -0
- data/Gemfile +5 -2
- data/Gemfile.lock +29 -8
- data/README.md +720 -25
- data/assets/images/chili-logger-flow.png +0 -0
- data/assets/images/chiligum-logging-system.gif +0 -0
- data/assets/images/rabbit-basic-functioning.png +0 -0
- data/assets/images/rabbit-topic-explanation.webp +0 -0
- data/chili_logger-0.0.6.gem +0 -0
- data/chili_logger-0.0.7.gem +0 -0
- data/chili_logger.gemspec +1 -0
- data/lib/brokers/rabbit_broker.rb +37 -10
- data/lib/brokers/sqs_broker.rb +61 -0
- data/lib/chili_logger.rb +46 -12
- data/lib/chili_logger/version.rb +1 -1
- data/lib/current_log_accessor.rb +77 -53
- data/lib/errors/{config_error.rb → error_messages/config_error.rb} +0 -0
- data/lib/errors/logging_error_handler/logging_error_handler.rb +54 -0
- data/lib/{logs_coverage → helpers/logs_coverage}/chili_logger_coverage.yml +0 -0
- data/lib/{logs_coverage → helpers/logs_coverage}/coverage_writer.rb +20 -14
- data/lib/{logs_coverage → helpers/logs_coverage}/levantamento_provis/303/263rio.yaml +0 -0
- data/lib/helpers/values/default.rb +92 -0
- data/lib/helpers/values/type_uniformizer/desc.rb +64 -0
- data/lib/helpers/values/type_uniformizer/main_content.rb +62 -0
- data/lib/helpers/values/type_uniformizer/user.rb +43 -0
- data/lib/message_writer/aws_ops_metadata.rb +1 -2
- data/lib/message_writer/message_writer.rb +32 -23
- metadata +38 -8
- data/lib/errors/rabbitmq_error.rb +0 -9
- data/lib/helpers/rails_backtrace_cleaner.rb +0 -130
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/chili_logger.gemspec
CHANGED
@@ -11,6 +11,7 @@ Gem::Specification.new do |spec|
|
|
11
11
|
spec.homepage = 'https://gitlab.com/chiligumdev/chili_logger'
|
12
12
|
spec.license = 'MIT'
|
13
13
|
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
14
|
+
spec.add_dependency 'aws-sdk', '~> 2.9', '>= 2.9.0'
|
14
15
|
spec.add_dependency 'bunny'
|
15
16
|
spec.add_dependency 'httparty'
|
16
17
|
|
@@ -1,10 +1,14 @@
|
|
1
1
|
require 'bunny'
|
2
|
-
require '
|
2
|
+
require 'brokers/sqs_broker'
|
3
3
|
|
4
4
|
# class for centralizing Creative's logging logic
|
5
5
|
class ChiliLogger
|
6
6
|
# class that configures and manages the RabbitMQ client
|
7
7
|
class RabbitBroker
|
8
|
+
def initialize(logging_error_handler)
|
9
|
+
@logging_error_handler = logging_error_handler
|
10
|
+
end
|
11
|
+
|
8
12
|
def config(config)
|
9
13
|
validate_config(config)
|
10
14
|
|
@@ -13,7 +17,7 @@ class ChiliLogger
|
|
13
17
|
@ip = config[:ip]
|
14
18
|
@port = config[:port]
|
15
19
|
@exchange_name = config[:exchange_name]
|
16
|
-
@
|
20
|
+
@routing_key_overwriter = config[:routing_key_overwriter]
|
17
21
|
|
18
22
|
connect
|
19
23
|
end
|
@@ -21,15 +25,15 @@ class ChiliLogger
|
|
21
25
|
def connect
|
22
26
|
return if ChiliLogger.instance.deactivated
|
23
27
|
|
24
|
-
@connection = Bunny.new(
|
28
|
+
@connection = Bunny.new(connection_config)
|
25
29
|
@connection.start
|
26
30
|
|
27
31
|
@channel = @connection.create_channel
|
28
32
|
@exchange = @channel.topic(@exchange_name, durable: true)
|
29
33
|
|
30
|
-
|
31
|
-
|
32
|
-
|
34
|
+
rescue StandardError => e
|
35
|
+
puts 'Could not connect to RabbitMQ due to the following error:'
|
36
|
+
puts e
|
33
37
|
end
|
34
38
|
|
35
39
|
def disconnect
|
@@ -40,25 +44,48 @@ class ChiliLogger
|
|
40
44
|
return if ChiliLogger.instance.deactivated
|
41
45
|
|
42
46
|
# if no routing_key was provided when configuring RabbitBroker, than use the one received by the method here
|
43
|
-
# temporary solution so we can
|
44
|
-
key = @
|
47
|
+
# temporary solution so we can force configure ChiliLogger to use a specific routing_key
|
48
|
+
key = @routing_key_overwriter || routing_key
|
49
|
+
puts key
|
50
|
+
puts key
|
51
|
+
puts key
|
52
|
+
puts key
|
53
|
+
puts key
|
54
|
+
puts key
|
45
55
|
@exchange.publish(message.to_json, routing_key: key)
|
56
|
+
|
57
|
+
rescue StandardError => e
|
58
|
+
@logging_error_handler.handle_error(e, message)
|
46
59
|
end
|
47
60
|
|
48
61
|
private
|
49
62
|
|
50
63
|
def invalid_config_format_error
|
51
|
-
'The configuration object must
|
64
|
+
'The configuration object must be a Hash'
|
52
65
|
end
|
53
66
|
|
54
67
|
def config_attr_error(attr)
|
55
68
|
"The configuration object must include a ':#{attr}' attribute"
|
56
69
|
end
|
57
70
|
|
71
|
+
def connection_config
|
72
|
+
# shouldn't try to recover connection,
|
73
|
+
# it may cause app in production to collapse if reconnection doesn't work or takes too many attempts!!!
|
74
|
+
recovery_attempts = 0
|
75
|
+
|
76
|
+
{
|
77
|
+
user: @user,
|
78
|
+
password: @password,
|
79
|
+
host: @ip,
|
80
|
+
port: @port,
|
81
|
+
recovery_attempts: recovery_attempts
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
58
85
|
def validate_config(config)
|
59
86
|
raise(ChiliLogger::ConfigError, invalid_config_format_error) unless config.is_a?(Hash)
|
60
87
|
|
61
|
-
main_config_keys = %i[user password ip port exchange_name
|
88
|
+
main_config_keys = %i[user password ip port exchange_name]
|
62
89
|
main_config_keys.each { |key| raise(ChiliLogger::ConfigError, config_attr_error(key)) unless config[key] }
|
63
90
|
end
|
64
91
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
# class for centralizing Creative's logging logic
|
4
|
+
class ChiliLogger
|
5
|
+
# module with classes using Amazon Web Services services
|
6
|
+
module AWS
|
7
|
+
# class that handles errors when message broker can't be reached, etc...
|
8
|
+
class SqsBroker
|
9
|
+
def initialize(config)
|
10
|
+
@sqs_config = validate_config(config)
|
11
|
+
@queue_name = config[:queue_name]
|
12
|
+
@default = ChiliLogger::Values::Default.new
|
13
|
+
|
14
|
+
@sqs = Aws::SQS::Client.new(@sqs_config)
|
15
|
+
end
|
16
|
+
|
17
|
+
def publish(message = @default.sqs_message)
|
18
|
+
message_body = { body: message }
|
19
|
+
queue_message = queue_message(message_body)
|
20
|
+
|
21
|
+
@sqs.send_message(queue_message)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def queue_message(message_body)
|
27
|
+
{
|
28
|
+
queue_url: queue_url(@queue_name),
|
29
|
+
message_body: message_body.to_json,
|
30
|
+
message_group_id: SecureRandom.hex(8).to_s,
|
31
|
+
message_deduplication_id: SecureRandom.hex(8).to_s
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def queue_url(queue_name)
|
36
|
+
@sqs.get_queue_url(queue_name: queue_name).queue_url
|
37
|
+
end
|
38
|
+
|
39
|
+
def invalid_config_format_error
|
40
|
+
'The :error_hanldler_config object must be a Hash'
|
41
|
+
end
|
42
|
+
|
43
|
+
def config_attr_error(attr)
|
44
|
+
"The configuration object must include a ':#{attr}' attribute"
|
45
|
+
end
|
46
|
+
|
47
|
+
def validate_config(config)
|
48
|
+
raise(ChiliLogger::ConfigError, invalid_config_format_error) unless config.is_a?(Hash)
|
49
|
+
|
50
|
+
main_config_keys = %i[region access_key_id secret_access_key queue_name]
|
51
|
+
main_config_keys.each { |key| raise(ChiliLogger::ConfigError, config_attr_error(key)) unless config[key] }
|
52
|
+
|
53
|
+
{
|
54
|
+
region: config[:region],
|
55
|
+
access_key_id: config[:access_key_id],
|
56
|
+
secret_access_key: config[:secret_access_key]
|
57
|
+
}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/chili_logger.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
require 'chili_logger/version'
|
2
2
|
require 'current_log_accessor'
|
3
|
-
require 'errors/config_error'
|
3
|
+
require 'errors/error_messages/config_error'
|
4
|
+
require 'errors/logging_error_handler/logging_error_handler'
|
4
5
|
require 'brokers/rabbit_broker'
|
5
6
|
require 'message_writer/message_writer'
|
7
|
+
require 'brokers/sqs_broker'
|
8
|
+
require 'helpers/values/default'
|
9
|
+
require 'helpers/values/type_uniformizer/desc'
|
10
|
+
require 'helpers/values/type_uniformizer/user'
|
11
|
+
require 'helpers/values/type_uniformizer/main_content'
|
6
12
|
require 'singleton'
|
7
13
|
|
8
14
|
# class for centralizing Creative's logging logic
|
@@ -13,9 +19,17 @@ class ChiliLogger
|
|
13
19
|
# initialize it with ChiliLogger.instance
|
14
20
|
include Singleton
|
15
21
|
|
22
|
+
def initialize
|
23
|
+
@default = ChiliLogger::Values::Default.new
|
24
|
+
@user_uniformizer = ChiliLogger::Values::TypeUniformizer::User.new
|
25
|
+
@desc_uniformizer = ChiliLogger::Values::TypeUniformizer::Desc.new
|
26
|
+
@main_content_uniformizer = ChiliLogger::Values::TypeUniformizer::MainContent.new
|
27
|
+
end
|
28
|
+
|
16
29
|
def config(config)
|
17
30
|
@deactivated = config[:deactivated] || false # ChilLogger can be deactivated for test environents
|
18
31
|
|
32
|
+
config_logging_error_handler(config)
|
19
33
|
config_msg_writer(config)
|
20
34
|
config_msg_broker(config)
|
21
35
|
|
@@ -26,25 +40,40 @@ class ChiliLogger
|
|
26
40
|
@current_log_accessor
|
27
41
|
end
|
28
42
|
|
29
|
-
def start_new_log(
|
43
|
+
def start_new_log(**options)
|
30
44
|
current_log.clear_log_info
|
31
45
|
|
32
|
-
current_log.
|
33
|
-
current_log.
|
34
|
-
current_log.
|
46
|
+
current_log.update_desc(options[:desc])
|
47
|
+
current_log.update_user(options[:user])
|
48
|
+
current_log.update_main_content(options[:main_content])
|
35
49
|
|
36
50
|
current_log
|
37
51
|
end
|
38
52
|
|
39
|
-
def publish_instant_log(
|
40
|
-
|
41
|
-
|
53
|
+
def publish_instant_log(**options)
|
54
|
+
# enforces that all attributes have valid primitive types
|
55
|
+
if options
|
56
|
+
options[:desc] = @desc_uniformizer.desc(options[:desc])
|
57
|
+
options[:user] = @user_uniformizer.user(options[:user])
|
58
|
+
options[:main_content] = @main_content_uniformizer.main_content(options[:main_content])
|
59
|
+
end
|
60
|
+
|
61
|
+
message = @msg_writer.write(options)
|
62
|
+
routing_key = @msg_writer.write_description_tag(options[:desc])
|
42
63
|
|
43
64
|
@msg_broker.publish(message, routing_key)
|
44
65
|
end
|
45
66
|
|
46
67
|
private
|
47
68
|
|
69
|
+
def config_logging_error_handler(general_config)
|
70
|
+
return @logging_error_handler = nil if @deactivated
|
71
|
+
|
72
|
+
fallback_name = general_config[:fallback_broker]
|
73
|
+
fallback_config = general_config[:fallback_broker_config]
|
74
|
+
@logging_error_handler = LoggingErrorHandler.new(fallback_name, fallback_config)
|
75
|
+
end
|
76
|
+
|
48
77
|
def config_msg_writer(general_config)
|
49
78
|
msg_writer_config = {
|
50
79
|
env: general_config[:log_env],
|
@@ -56,12 +85,17 @@ class ChiliLogger
|
|
56
85
|
@msg_writer = MessageWriter.new(msg_writer_config)
|
57
86
|
end
|
58
87
|
|
59
|
-
def config_msg_broker(
|
60
|
-
msg_broker_name =
|
61
|
-
msg_broker_config =
|
88
|
+
def config_msg_broker(general_config)
|
89
|
+
msg_broker_name = general_config[:msg_broker_name] || @default.msg_broker
|
90
|
+
msg_broker_config = general_config[:msg_broker_config] || @default.msg_broker_config
|
62
91
|
@msg_broker = supported_msg_brokers[msg_broker_name.to_sym]
|
63
92
|
raise(ConfigError, broker_name_error(msg_broker_name)) unless @msg_broker
|
64
93
|
|
94
|
+
# TODO: implement MessageBroker class, an interface between ChiliLogger and possible brokers.
|
95
|
+
# TODO: add "supported_msg_broker", "broker_name_error" and "return @msg_broker if @deactivated" to MessageBroker
|
96
|
+
# prevents broker from even starting connection if ChiliLogger is deactivated
|
97
|
+
return @msg_broker if @deactivated
|
98
|
+
|
65
99
|
@msg_broker.config(msg_broker_config)
|
66
100
|
end
|
67
101
|
|
@@ -71,7 +105,7 @@ class ChiliLogger
|
|
71
105
|
|
72
106
|
def supported_msg_brokers
|
73
107
|
{
|
74
|
-
rabbitmq: RabbitBroker.new
|
108
|
+
rabbitmq: RabbitBroker.new(@logging_error_handler)
|
75
109
|
}
|
76
110
|
end
|
77
111
|
end
|
data/lib/chili_logger/version.rb
CHANGED
data/lib/current_log_accessor.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
require 'message_writer/message_writer'
|
2
|
+
require 'helpers/values/default'
|
3
|
+
require 'helpers/values/type_uniformizer/desc'
|
4
|
+
require 'helpers/values/type_uniformizer/main_content'
|
5
|
+
require 'helpers/values/type_uniformizer/user'
|
2
6
|
require 'byebug'
|
3
7
|
|
4
8
|
# class for centralizing Creative's logging logic
|
@@ -8,14 +12,16 @@ class ChiliLogger
|
|
8
12
|
def initialize(msg_broker, msg_writer)
|
9
13
|
@msg_broker = msg_broker
|
10
14
|
@msg_writer = msg_writer
|
15
|
+
@default = ChiliLogger::Values::Default.new
|
16
|
+
@user_uniformizer = ChiliLogger::Values::TypeUniformizer::User.new
|
17
|
+
@desc_uniformizer = ChiliLogger::Values::TypeUniformizer::Desc.new
|
18
|
+
@main_content_uniformizer = ChiliLogger::Values::TypeUniformizer::MainContent.new
|
11
19
|
end
|
12
20
|
|
13
|
-
def publish(
|
14
|
-
|
15
|
-
overwrite_agent(new_agent) if new_agent
|
16
|
-
overwrite_main_content(new_main_content) if new_main_content
|
21
|
+
def publish(**options)
|
22
|
+
update_current_log(options)
|
17
23
|
|
18
|
-
message = @msg_writer.write(desc,
|
24
|
+
message = @msg_writer.write(desc: desc, user: user, main_content: main_content)
|
19
25
|
routing_key = @msg_writer.write_description_tag(desc)
|
20
26
|
|
21
27
|
@msg_broker.publish(message, routing_key)
|
@@ -23,98 +29,116 @@ class ChiliLogger
|
|
23
29
|
end
|
24
30
|
|
25
31
|
# ACCESSOR METHODS BELOW
|
26
|
-
#
|
27
|
-
|
28
|
-
|
29
|
-
Thread.current[:current_log_agent] ||= 'not_specified'
|
32
|
+
# current log infos are stored in thread variables, so they can be accessed anywhere(controllers, models, tasks...)
|
33
|
+
def user
|
34
|
+
Thread.current[:current_log_user] ||= @default.user
|
30
35
|
end
|
31
36
|
|
32
|
-
def
|
33
|
-
Thread.current[:
|
34
|
-
|
37
|
+
def update_user(new_user)
|
38
|
+
return Thread.current[:current_log_user] = nil if new_user.nil?
|
39
|
+
|
40
|
+
uniformized_user = @user_uniformizer.user(new_user)
|
41
|
+
Thread.current[:current_log_user] = user.merge(uniformized_user)
|
35
42
|
end
|
36
43
|
|
37
44
|
def desc
|
38
|
-
Thread.current[:current_log_desc] ||=
|
45
|
+
Thread.current[:current_log_desc] ||= @default.desc
|
39
46
|
end
|
40
47
|
|
41
|
-
def
|
42
|
-
desc[:type] = new_type_name
|
48
|
+
def update_type(new_type_name)
|
49
|
+
desc[:type] = @desc_uniformizer.type(new_type_name)
|
43
50
|
end
|
44
51
|
|
45
|
-
def
|
46
|
-
desc[:service] = new_service_name
|
52
|
+
def update_service(new_service_name)
|
53
|
+
desc[:service] = @desc_uniformizer.service(new_service_name)
|
47
54
|
end
|
48
55
|
|
49
|
-
def
|
50
|
-
desc[:action] = new_action_name
|
56
|
+
def update_action(new_action_name)
|
57
|
+
desc[:action] = @desc_uniformizer.action(new_action_name)
|
51
58
|
end
|
52
59
|
|
53
|
-
def
|
60
|
+
def update_desc(new_desc)
|
54
61
|
return Thread.current[:current_log_desc] = nil if new_desc.nil?
|
55
|
-
return unless new_desc.is_a?(Hash)
|
56
62
|
|
57
|
-
|
58
|
-
desc
|
63
|
+
uniformized_desc = @desc_uniformizer.desc(new_desc)
|
64
|
+
Thread.current[:current_log_desc] = desc.merge(uniformized_desc)
|
59
65
|
end
|
60
66
|
|
61
67
|
def main_content
|
62
|
-
Thread.current[:current_log_main_content] ||=
|
68
|
+
Thread.current[:current_log_main_content] ||= @default.main_content
|
63
69
|
end
|
64
70
|
|
65
|
-
def
|
66
|
-
return Thread.current[:current_log_main_content] = nil if
|
67
|
-
|
71
|
+
def update_main_content(new_content)
|
72
|
+
return Thread.current[:current_log_main_content] = nil if new_content.nil?
|
73
|
+
|
74
|
+
uniform_content = @main_content_uniformizer.main_content(new_content)
|
75
|
+
uniform_recs = @main_content_uniformizer.modified_records(uniform_content[:modified_records])
|
76
|
+
uniform_errors = @main_content_uniformizer.errors(uniform_content[:errors])
|
68
77
|
|
69
|
-
|
78
|
+
# only overwrite if key was explicitly set
|
79
|
+
main_content[:modified_records] = uniform_recs if uniform_content.key?(:modified_records)
|
80
|
+
main_content[:errors] = uniform_errors if uniform_content.key?(:errors)
|
70
81
|
end
|
71
82
|
|
72
83
|
def add_to_main_content(new_content)
|
73
|
-
|
84
|
+
uniform_content = @main_content_uniformizer.main_content(new_content)
|
85
|
+
uniform_recs = uniform_content[:modified_records]
|
86
|
+
uniform_errs = uniform_content[:errors]
|
74
87
|
|
75
|
-
|
88
|
+
# only overwrite if key was explicitly set
|
89
|
+
main_content[:modified_records] = modified_records.merge(uniform_recs) if uniform_recs
|
90
|
+
main_content[:errors] = errors + uniform_errs if uniform_errs
|
76
91
|
end
|
77
92
|
|
78
93
|
def modified_records
|
79
|
-
main_content[:modified_records] ||=
|
94
|
+
main_content[:modified_records] ||= @default.modified_records
|
80
95
|
end
|
81
96
|
|
82
|
-
def overwrite_modified_records(
|
83
|
-
return
|
84
|
-
return unless modified_records.is_a?(Hash)
|
97
|
+
def overwrite_modified_records(new_mod_recs)
|
98
|
+
return main_content[:modified_records] = nil if new_mod_recs.nil?
|
85
99
|
|
86
|
-
|
100
|
+
uniformized_recs = @main_content_uniformizer.modified_records(new_mod_recs)
|
101
|
+
main_content[:modified_records] = uniformized_recs
|
87
102
|
end
|
88
103
|
|
89
|
-
def add_modified_record(table_name,
|
90
|
-
return unless table_name
|
104
|
+
def add_modified_record(table_name, new_mod_rec)
|
91
105
|
return unless table_name.is_a?(String)
|
92
|
-
return unless modified_record_hash
|
93
|
-
return unless modified_record_hash.is_a?(Hash)
|
94
106
|
|
107
|
+
uniformized_rec = @main_content_uniformizer.modified_record(new_mod_rec)
|
95
108
|
modified_records[table_name] ||= []
|
96
|
-
modified_records[table_name] = modified_records[table_name].push(
|
109
|
+
modified_records[table_name] = modified_records[table_name].push(uniformized_rec)
|
97
110
|
end
|
98
111
|
|
99
|
-
def
|
100
|
-
|
101
|
-
overwrite_agent(nil)
|
102
|
-
overwrite_main_content(nil)
|
112
|
+
def errors
|
113
|
+
main_content[:errors] ||= @default.log_errors
|
103
114
|
end
|
104
115
|
|
105
|
-
|
116
|
+
def overwrite_errors(new_errors)
|
117
|
+
return main_content[:errors] = nil if new_errors.nil?
|
106
118
|
|
107
|
-
|
108
|
-
|
119
|
+
uniformized_errors = @main_content_uniformizer.errors(new_errors)
|
120
|
+
main_content[:errors] = uniformized_errors
|
109
121
|
end
|
110
122
|
|
111
|
-
def
|
112
|
-
|
113
|
-
|
123
|
+
def add_error(error)
|
124
|
+
uniformized_error = @main_content_uniformizer.error(error)
|
125
|
+
|
126
|
+
main_content[:errors] = errors.push(uniformized_error)
|
127
|
+
errors
|
128
|
+
end
|
129
|
+
|
130
|
+
def clear_log_info
|
131
|
+
update_desc(nil)
|
132
|
+
update_user(nil)
|
133
|
+
update_main_content(nil)
|
134
|
+
end
|
135
|
+
|
136
|
+
private
|
114
137
|
|
115
|
-
|
116
|
-
|
117
|
-
|
138
|
+
def update_current_log(options)
|
139
|
+
update_desc(options[:desc]) if options[:desc]
|
140
|
+
update_user(options[:user]) if options[:user]
|
141
|
+
update_main_content(options[:main_content]) if options[:main_content]
|
118
142
|
end
|
119
143
|
end
|
120
144
|
end
|