ocean-rails 7.2.2 → 7.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|