ichnite 0.0.5 → 0.0.6
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 +5 -5
- data/lib/ichnite.rb +2 -2
- data/lib/ichnite/action_dispatch/structured_exceptions.rb +28 -0
- data/lib/ichnite/active_support/disable_tagged_logging_patch.rb +11 -0
- data/lib/ichnite/rails.rb +1 -0
- data/lib/ichnite/rails/railtie.rb +24 -0
- data/lib/ichnite/sidekiq.rb +26 -0
- data/lib/ichnite/sidekiq/middleware.rb +108 -0
- data/lib/ichnite/version.rb +1 -1
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 677aac051c83f841ad6c88bcc59e81eec236a16f2073bfcb9ecda926a5ab526e
|
4
|
+
data.tar.gz: eac35f4f44079509b5bd05c690e0810059d6be9e0a29f5c1a54f3dbc404845f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '03299eb5ed6de16539367a015471151d5e4cf094742062e8b6f11594b27824902531fba745032d78048d96bb78bdb177da80496a98721f0dcbfd0171ee781a45'
|
7
|
+
data.tar.gz: e93689adf0c210d474291d70fc50f1ebc855730843c4fd98dc7781c85b23249d220f05a64ca617cc7536fcdd4a31bfb75e054fc71cd878cd95e0f1580754b39c
|
data/lib/ichnite.rb
CHANGED
@@ -44,8 +44,8 @@ module Ichnite
|
|
44
44
|
|
45
45
|
def self.default_logger
|
46
46
|
@default_logger ||=
|
47
|
-
if defined?(Rails)
|
48
|
-
Ichnite::Logger.new(Rails.logger)
|
47
|
+
if defined?(::Rails) && ::Rails.respond_to?(:logger)
|
48
|
+
Ichnite::Logger.new(::Rails.logger)
|
49
49
|
else
|
50
50
|
inner = ::Logger.new($stdout)
|
51
51
|
inner.formatter = proc { |_level, _time, _prog, msg| "#{msg}\n" }
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Ichnite
|
2
|
+
module ActionDispatch
|
3
|
+
module StructuredExceptions
|
4
|
+
def render_exception(_env, e)
|
5
|
+
begin
|
6
|
+
exception_name = e.class.name
|
7
|
+
status = ::ActionDispatch::ExceptionWrapper.status_code_for_exception(exception_name)
|
8
|
+
if status == 500
|
9
|
+
::Ichnite.log('request_error',
|
10
|
+
at: :error,
|
11
|
+
error: exception_name,
|
12
|
+
message: e.message[/\A.+$/].inspect
|
13
|
+
)
|
14
|
+
end
|
15
|
+
rescue Exception => e2
|
16
|
+
# never interfere with the regular exception handling
|
17
|
+
::Rails.logger.error(e2.inspect)
|
18
|
+
end
|
19
|
+
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def log_error(*)
|
24
|
+
# no-logging
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "ichnite/rails/railtie"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'ichnite/action_dispatch/structured_exceptions'
|
2
|
+
|
3
|
+
module Ichnite
|
4
|
+
module Rails
|
5
|
+
class Railtie < ::Rails::Railtie
|
6
|
+
initializer 'ichnite_rails.setup' do |app|
|
7
|
+
Ichnite.default_logger = Ichnite::Logger.new(::Rails.logger)
|
8
|
+
|
9
|
+
ActiveSupport.on_load :action_controller do
|
10
|
+
if defined?(::ActionDispatch::DebugExceptions)
|
11
|
+
::ActionDispatch::DebugExceptions.prepend Ichnite::ActionDispatch::StructuredExceptions
|
12
|
+
elsif defined?(::ActionDispatch::ShowExceptions)
|
13
|
+
::ActionDispatch::ShowExceptions.prepend Ichnite::ActionDispatch::StructuredExceptions
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
if !::Rails.env.test? && !::Rails.env.development?
|
18
|
+
require 'active_support/tagged_logging'
|
19
|
+
require 'ichnite/active_support/disable_tagged_logging_patch'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'ichnite/sidekiq/middleware'
|
2
|
+
|
3
|
+
Sidekiq.logger.level = Logger::WARN
|
4
|
+
|
5
|
+
Sidekiq.configure_server do |config|
|
6
|
+
# Remove Sidekiqs default backtrace logging
|
7
|
+
if !defined?(::Rails) || ::Rails.env.production?
|
8
|
+
config.error_handlers.delete_if { |h| Sidekiq::ExceptionHandler::Logger === h }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
Sidekiq.configure_client do |config|
|
13
|
+
config.client_middleware do |chain|
|
14
|
+
chain.add Sidekiq::Ichnite::ClientMiddleware
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Sidekiq.configure_server do |config|
|
19
|
+
config.client_middleware do |chain|
|
20
|
+
chain.add Sidekiq::Ichnite::ClientMiddleware
|
21
|
+
end
|
22
|
+
|
23
|
+
config.server_middleware do |chain|
|
24
|
+
chain.add Sidekiq::Ichnite::ServerMiddleware
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module Sidekiq
|
2
|
+
module Ichnite
|
3
|
+
def self.job_id(msg)
|
4
|
+
msg['jid']
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.job_class(msg)
|
8
|
+
aj_job_class(msg) || msg['class']
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.aj_job_class(msg)
|
12
|
+
msg['wrapped']
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.job_args(msg)
|
16
|
+
args = msg['args']
|
17
|
+
aj_job_args(args) || args
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.aj_job_args(args)
|
21
|
+
first_arg = args.first
|
22
|
+
|
23
|
+
# check if the first argument looks like a AJ metadata hash
|
24
|
+
if first_arg.is_a?(Hash) && first_arg.key?('arguments')
|
25
|
+
first_arg['arguments'].map do |arg|
|
26
|
+
if arg.is_a?(Hash) && arg.key?('_aj_globalid')
|
27
|
+
arg['_aj_globalid']
|
28
|
+
else
|
29
|
+
arg
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class ClientMiddleware
|
36
|
+
def call(worker_class, msg, queue, _redis_pool)
|
37
|
+
context = {
|
38
|
+
queue: queue,
|
39
|
+
job_id: Sidekiq::Ichnite.job_id(msg),
|
40
|
+
job_class: Sidekiq::Ichnite.job_class(msg)
|
41
|
+
}
|
42
|
+
if at = msg['at']
|
43
|
+
context[:scheduled_at] = Time.at(at).utc
|
44
|
+
::Ichnite.log('job_schedule', context)
|
45
|
+
else
|
46
|
+
context[:args] = Sidekiq::Ichnite.job_args(msg)
|
47
|
+
::Ichnite.log('job_enqueue', context)
|
48
|
+
end
|
49
|
+
yield
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class ServerMiddleware
|
54
|
+
def call(worker, msg, queue)
|
55
|
+
::Ichnite.enter(
|
56
|
+
job_id: Sidekiq::Ichnite.job_id(msg),
|
57
|
+
job_class: Sidekiq::Ichnite.job_class(msg)) do
|
58
|
+
begin
|
59
|
+
context = { queue: queue }
|
60
|
+
|
61
|
+
ts = Time.now.to_f
|
62
|
+
# We are currently not logging start events.
|
63
|
+
# This would most likely blow our SumoLogic limit.
|
64
|
+
# start context, ts
|
65
|
+
yield
|
66
|
+
stop context, msg, ts
|
67
|
+
rescue => ex
|
68
|
+
error context, msg, ex, ts
|
69
|
+
raise ex
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def start(context, _time)
|
75
|
+
::Ichnite.log('job_start', context)
|
76
|
+
end
|
77
|
+
|
78
|
+
def error(context, msg, error, start)
|
79
|
+
data = context.merge(job_timing(msg, start))
|
80
|
+
data.merge!(
|
81
|
+
at: :error,
|
82
|
+
error: error.class.name,
|
83
|
+
message: error.message[/\A.+$/].inspect)
|
84
|
+
::Ichnite.log('job_error', data)
|
85
|
+
end
|
86
|
+
|
87
|
+
def stop(context, msg, start)
|
88
|
+
data = context.merge(job_timing(msg, start))
|
89
|
+
::Ichnite.log('job_stop', data)
|
90
|
+
end
|
91
|
+
|
92
|
+
def job_timing(msg, start)
|
93
|
+
# with clock drift this number can become negative.
|
94
|
+
# Let's take 0 in this case.
|
95
|
+
queued_duration = [0, duration_ms(msg['enqueued_at'], start)].max
|
96
|
+
{
|
97
|
+
queued_for: queued_duration / 1000,
|
98
|
+
duration: duration_ms(start)
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
def duration_ms(from, to = Time.now.to_f)
|
103
|
+
((to - from) * 1000).round
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
data/lib/ichnite/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ichnite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yves Senn
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -69,8 +69,14 @@ files:
|
|
69
69
|
- bin/setup
|
70
70
|
- ichnite.gemspec
|
71
71
|
- lib/ichnite.rb
|
72
|
+
- lib/ichnite/action_dispatch/structured_exceptions.rb
|
73
|
+
- lib/ichnite/active_support/disable_tagged_logging_patch.rb
|
72
74
|
- lib/ichnite/formatters.rb
|
73
75
|
- lib/ichnite/logger.rb
|
76
|
+
- lib/ichnite/rails.rb
|
77
|
+
- lib/ichnite/rails/railtie.rb
|
78
|
+
- lib/ichnite/sidekiq.rb
|
79
|
+
- lib/ichnite/sidekiq/middleware.rb
|
74
80
|
- lib/ichnite/testing.rb
|
75
81
|
- lib/ichnite/version.rb
|
76
82
|
homepage: https://github.com/senny/ichnite
|
@@ -93,9 +99,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
99
|
version: '0'
|
94
100
|
requirements: []
|
95
101
|
rubyforge_project:
|
96
|
-
rubygems_version: 2.
|
102
|
+
rubygems_version: 2.7.6
|
97
103
|
signing_key:
|
98
104
|
specification_version: 4
|
99
105
|
summary: A structured logging library.
|
100
106
|
test_files: []
|
101
|
-
has_rdoc:
|