ocean-rails 7.2.2 → 7.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/initializers/_api_constants.rb +29 -42
- data/config/initializers/_ocean_logger.rb +127 -127
- data/lib/ocean/ocean_logger.rb +113 -113
- data/lib/ocean/selective_rack_logger.rb +59 -59
- data/lib/ocean/version.rb +1 -1
- data/lib/ocean/zero_log.rb +188 -188
- data/lib/ocean/zeromq_logger.rb +121 -121
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b60d92cbf6714865555d363a2f998bc41dcadf121749c522020c9def0b06cc9
|
4
|
+
data.tar.gz: 06c7bf20258981bc6b0614fbe795dad279a75be510478c00318ad1790eab198a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ffb4b655ddcfac4444d1fe93515b616ad6865180d6a7605c570b4831321f361071670c362255b49afc952023483d2f2c664c3e170d34676a4b2e84cf0808921
|
7
|
+
data.tar.gz: 36f770a9f7fa754662e669e5cdda7aba1e42e0f60e31b5e49867f02dda5d22d563d0d78274a6fad6440f78498bfb5e54b4f95677edfe010e66631571c1856801
|
@@ -1,49 +1,36 @@
|
|
1
|
-
|
2
|
-
ef = File.join(Rails.root, "config/config.yml.example")
|
1
|
+
f = File.join(Rails.root, "config/config.yml")
|
3
2
|
|
4
|
-
#
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
# If the tailored file doesn't exist, and we're running under TeamCity,
|
11
|
-
# use the example file as-is.
|
12
|
-
unless File.exists?(f)
|
13
|
-
f = ENV['OCEAN_API_HOST'] ? ef : false
|
14
|
-
end
|
3
|
+
# If the tailored file doesn't exist, and we're running under TeamCity,
|
4
|
+
# use the example file as-is.
|
5
|
+
unless File.exists?(f)
|
6
|
+
f = ENV['OCEAN_API_HOST'] ? ef : false
|
7
|
+
end
|
15
8
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
else
|
29
|
-
eval "#{k} = #{override.inspect}"
|
30
|
-
end
|
9
|
+
# If there is a file to process, do so
|
10
|
+
if f
|
11
|
+
cfg = YAML.load(ERB.new(File.read(f)).result)
|
12
|
+
cfg.merge! cfg.fetch(Rails.env, {}) if cfg.fetch(Rails.env, {})
|
13
|
+
cfg.each do |k, v|
|
14
|
+
next if k =~ /[a-z]/
|
15
|
+
override = ENV["OVERRIDE_#{k}"]
|
16
|
+
if override && override != ""
|
17
|
+
master, staging = override.split(',')
|
18
|
+
if staging.present? && k == "API_PASSWORD"
|
19
|
+
pw = (ENV['GIT_BRANCH'] == 'staging' ? staging : master)
|
20
|
+
eval "#{k} = #{pw.inspect}"
|
31
21
|
else
|
32
|
-
eval "#{k} = #{
|
22
|
+
eval "#{k} = #{override.inspect}"
|
33
23
|
end
|
24
|
+
else
|
25
|
+
eval "#{k} = #{v.inspect}"
|
34
26
|
end
|
35
|
-
else
|
36
|
-
# Otherwise print an error message and abort.
|
37
|
-
puts
|
38
|
-
puts "-----------------------------------------------------------------------"
|
39
|
-
puts "Constant definition file missing. Please copy config/config.yml.example"
|
40
|
-
puts "to config/config.yml and tailor its contents to suit your dev setup."
|
41
|
-
puts
|
42
|
-
puts "NB: config.yml is excluded from git version control as it will contain"
|
43
|
-
puts " data private to your Ocean system."
|
44
|
-
puts "-----------------------------------------------------------------------"
|
45
|
-
puts
|
46
|
-
abort
|
47
27
|
end
|
48
|
-
|
28
|
+
else
|
29
|
+
# Otherwise print an error message and abort.
|
30
|
+
puts
|
31
|
+
puts "-----------------------------------------------------------------------"
|
32
|
+
puts "Constant definition file missing."
|
33
|
+
puts "-----------------------------------------------------------------------"
|
34
|
+
puts
|
35
|
+
abort
|
49
36
|
end
|
@@ -1,127 +1,127 @@
|
|
1
|
-
if false # Rails.env == 'production'
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
end
|
1
|
+
# if false # Rails.env == 'production'
|
2
|
+
#
|
3
|
+
# def remove_existing_log_subscriptions
|
4
|
+
# ActiveSupport::LogSubscriber.log_subscribers.each do |subscriber|
|
5
|
+
# case subscriber
|
6
|
+
# when ActionView::LogSubscriber
|
7
|
+
# unsubscribe(:action_view, subscriber)
|
8
|
+
# when ActionController::LogSubscriber
|
9
|
+
# unsubscribe(:action_controller, subscriber)
|
10
|
+
# end
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# def unsubscribe(component, subscriber)
|
15
|
+
# events = subscriber.public_methods(false).reject{ |method| method.to_s == 'call' }
|
16
|
+
# events.each do |event|
|
17
|
+
# ActiveSupport::Notifications.notifier.listeners_for("#{event}.#{component}").each do |listener|
|
18
|
+
# if listener.instance_variable_get('@delegate') == subscriber
|
19
|
+
# ActiveSupport::Notifications.unsubscribe listener
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# remove_existing_log_subscriptions
|
26
|
+
#
|
27
|
+
#
|
28
|
+
# INTERNAL_PARAMS = %w(controller action format _method only_path)
|
29
|
+
#
|
30
|
+
# ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, started, finished, unique_id, payload|
|
31
|
+
# path = payload[:path]
|
32
|
+
# if path != '/alive'
|
33
|
+
#
|
34
|
+
# runtime = finished - started
|
35
|
+
# param_method = payload[:params]['_method']
|
36
|
+
# method = param_method ? param_method.upcase : payload[:method]
|
37
|
+
# status = compute_status(payload)
|
38
|
+
# params = payload[:params].except(*INTERNAL_PARAMS)
|
39
|
+
#
|
40
|
+
# data = {
|
41
|
+
# timestamp: (started.utc.to_f * 1000).to_i,
|
42
|
+
# method: method,
|
43
|
+
# status: status,
|
44
|
+
# runtime: (runtime * 1000).round(0),
|
45
|
+
# view_runtime: (payload[:view_runtime] || 0).round(0),
|
46
|
+
# db_runtime: (payload[:db_runtime] || 0).round(0)
|
47
|
+
# }
|
48
|
+
# data[:params] = params if params.present?
|
49
|
+
# data[:filter] = Thread.current[:filter] if Thread.current[:filter]
|
50
|
+
# data[:token] = Thread.current[:x_api_token] if Thread.current[:x_api_token].present?
|
51
|
+
# data[:username] = Thread.current[:username] if Thread.current[:username].present?
|
52
|
+
# data[:metadata] = Thread.current[:metadata] if Thread.current[:metadata].present?
|
53
|
+
#
|
54
|
+
# Thread.current[:logdata] = data
|
55
|
+
# Thread.current[:filter] = nil
|
56
|
+
# Thread.current[:x_api_token] = nil
|
57
|
+
# Thread.current[:username] = nil
|
58
|
+
# Thread.current[:cache_control] = nil
|
59
|
+
# Thread.current[:metadata] = nil
|
60
|
+
# end
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# def compute_status payload
|
64
|
+
# status = payload[:status]
|
65
|
+
# if status.nil? && payload[:exception].present?
|
66
|
+
# exception_class_name = payload[:exception].first
|
67
|
+
# status = ActionDispatch::ExceptionWrapper.status_code_for_exception(exception_class_name)
|
68
|
+
# end
|
69
|
+
# status
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
#
|
73
|
+
# ActiveSupport::Notifications.subscribe "halted_callback.action_controller" do |*args|
|
74
|
+
# data = args.extract_options!
|
75
|
+
# Thread.current[:filter] = data[:filter]
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
#
|
79
|
+
# ActiveSupport::Notifications.subscribe 'request.action_dispatch' do |*args|
|
80
|
+
# x = args.extract_options!
|
81
|
+
# request = x[:request]
|
82
|
+
#
|
83
|
+
# data = Thread.current[:logdata] || {}
|
84
|
+
# data[:remote_ip] = request.remote_ip
|
85
|
+
# data[:path] = request.filtered_path
|
86
|
+
#
|
87
|
+
# if (ac = request.env["action_controller.instance"]) &&
|
88
|
+
# (response = ac.response) &&
|
89
|
+
# (body = response.body) &&
|
90
|
+
# body.present? &&
|
91
|
+
# body =~ /\A\{"_api_error"/
|
92
|
+
# data[:_api_error] = JSON.parse(body)['_api_error']
|
93
|
+
# end
|
94
|
+
#
|
95
|
+
# if response && response.headers['Cache-Control']
|
96
|
+
# data[:cache_control] = response.headers['Cache-Control']
|
97
|
+
# end
|
98
|
+
#
|
99
|
+
# ex = request.env["action_dispatch.exception"]
|
100
|
+
# if ex
|
101
|
+
# if data[:status] == 404
|
102
|
+
# data[:path] = request.env["REQUEST_PATH"]
|
103
|
+
# else
|
104
|
+
# # We might want to send an email here - exceptions in production
|
105
|
+
# # should be taken seriously
|
106
|
+
# data[:exception_message] = ex.message
|
107
|
+
# data[:exception_backtrace] = ex.backtrace.to_json
|
108
|
+
# end
|
109
|
+
# end
|
110
|
+
#
|
111
|
+
# if (data[:status] || 0) >= 500
|
112
|
+
# Rails.logger.fatal data
|
113
|
+
# elsif (data[:status] || 0) >= 400
|
114
|
+
# Rails.logger.error data
|
115
|
+
# else
|
116
|
+
# Rails.logger.info data
|
117
|
+
# end
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
#
|
121
|
+
# # Announce us
|
122
|
+
# Rails.logger.info "Initialising Rails process"
|
123
|
+
#
|
124
|
+
# # Make sure we log our exit
|
125
|
+
# at_exit { Rails.logger.info "Exiting Rails process" }
|
126
|
+
#
|
127
|
+
# end
|
data/lib/ocean/ocean_logger.rb
CHANGED
@@ -1,114 +1,114 @@
|
|
1
|
+
# #
|
2
|
+
# # This class is a drop-in replacement for the standard Rails logger. It
|
3
|
+
# # implements enough of the Logger interface to allow it to override the
|
4
|
+
# # standard logger.
|
5
|
+
# #
|
6
|
+
# class OceanLogger
|
1
7
|
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
def fatal(*args)
|
110
|
-
return if args.blank?
|
111
|
-
add 4, *args
|
112
|
-
end
|
113
|
-
|
114
|
-
end
|
8
|
+
# attr_accessor :level, :formatter
|
9
|
+
#
|
10
|
+
# #
|
11
|
+
# # Obtains the IP of the current process, initialises the @logger object
|
12
|
+
# # by instantiating a ZeroLog object which then is used to set up the
|
13
|
+
# # log data sender.
|
14
|
+
# #
|
15
|
+
# def initialize
|
16
|
+
# super
|
17
|
+
# # Get info about our environment
|
18
|
+
# @ip = Socket.ip_address_list.detect{|intf| intf.ipv4_private?}.getnameinfo[0]
|
19
|
+
# # Set up the logger
|
20
|
+
# @logger = ZeroLog.new "/tmp/sub_push_#{Process.pid}", @log_hosts
|
21
|
+
# @formatter = ::Logger::Formatter.new
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# #
|
25
|
+
# # Utility function which returns true if the current log level is +DEBUG+ or lower.
|
26
|
+
# #
|
27
|
+
# def debug?() @level <= 0; end
|
28
|
+
#
|
29
|
+
# #
|
30
|
+
# # Utility function which returns true if the current log level is +INFO+ or lower.
|
31
|
+
# #
|
32
|
+
# def info?() @level <= 1; end
|
33
|
+
#
|
34
|
+
# #
|
35
|
+
# # Utility function which returns true if the current log level is +WARN+ or lower.
|
36
|
+
# #
|
37
|
+
# def warn?() @level <= 2; end
|
38
|
+
#
|
39
|
+
# #
|
40
|
+
# # Utility function which returns true if the current log level is +ERROR+ or lower.
|
41
|
+
# #
|
42
|
+
# def error?() @level <= 3; end
|
43
|
+
#
|
44
|
+
# #
|
45
|
+
# # Utility function which returns true if the current log level is +FATAL+ or lower.
|
46
|
+
# #
|
47
|
+
# def fatal?() @level <= 4; end
|
48
|
+
#
|
49
|
+
#
|
50
|
+
# #
|
51
|
+
# # This is the core method to add new log messages to the Rails log. It does nothing
|
52
|
+
# # if the level of the message is lower than the current log level, or if the message
|
53
|
+
# # is blank. Otherwise it creates a JSON log message as a hash, with data for the
|
54
|
+
# # following keys:
|
55
|
+
# #
|
56
|
+
# # +timestamp+: The time in milliseconds since the start of the Unix epoch.
|
57
|
+
# #
|
58
|
+
# # +ip+: The IP of the logging entity.
|
59
|
+
# #
|
60
|
+
# # +pid+: The Process ID of the logging process.
|
61
|
+
# #
|
62
|
+
# # +service+: The name of the service.
|
63
|
+
# #
|
64
|
+
# # +level+: The log level of the message (0=debug, 1=info, 2=warn, etc).
|
65
|
+
# #
|
66
|
+
# # +msg+: The log message itself.
|
67
|
+
# #
|
68
|
+
# def add(level, msg)
|
69
|
+
# return true if level < @level
|
70
|
+
# return true if msg.blank?
|
71
|
+
# # Compensate for bug in Rails 4.2.x
|
72
|
+
# return true if msg =~ /Couldn't find template for digesting/
|
73
|
+
# data = { ip: @ip,
|
74
|
+
# pid: Process.pid,
|
75
|
+
# service: APP_NAME,
|
76
|
+
# level: level
|
77
|
+
# }
|
78
|
+
# data[:token] = Thread.current[:x_api_token] if Thread.current[:x_api_token].present?
|
79
|
+
# data[:username] = Thread.current[:username] if Thread.current[:username].present?
|
80
|
+
# data[:msg] = msg if msg.is_a?(String)
|
81
|
+
# data[:timestamp] = (Time.now.utc.to_f * 1000).to_i unless data[:timestamp]
|
82
|
+
# data[:metadata] = Thread.current[:metadata] if Thread.current[:metadata].present?
|
83
|
+
# data = data.merge msg if msg.is_a?(Hash)
|
84
|
+
# @logger.log data
|
85
|
+
# true
|
86
|
+
# end
|
87
|
+
#
|
88
|
+
#
|
89
|
+
# def debug(*args)
|
90
|
+
# return if args.blank?
|
91
|
+
# add 0, *args
|
92
|
+
# end
|
93
|
+
#
|
94
|
+
# def info(*args)
|
95
|
+
# return if args.blank?
|
96
|
+
# add 1, *args
|
97
|
+
# end
|
98
|
+
#
|
99
|
+
# def warn(*args)
|
100
|
+
# return if args.blank?
|
101
|
+
# add 2, *args
|
102
|
+
# end
|
103
|
+
#
|
104
|
+
# def error(*args)
|
105
|
+
# return if args.blank?
|
106
|
+
# add 3, *args
|
107
|
+
# end
|
108
|
+
#
|
109
|
+
# def fatal(*args)
|
110
|
+
# return if args.blank?
|
111
|
+
# add 4, *args
|
112
|
+
# end
|
113
|
+
#
|
114
|
+
# end
|