memolog 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6bd5031cdc39d67fc6409bbe9d71028129040f13abd8f30445e5b0c4f090a005
4
- data.tar.gz: 8d5e0699f794abd16aa2a2e11562085d538581c567af030bf7d3bd0e3e9bd304
3
+ metadata.gz: e99e3c68b6d46dff6769d0526a9b9638d6ddf479665929a8e03dddb5eeddf618
4
+ data.tar.gz: f7221b929323ff44066403d01a3f02eefb6dd8302c882a2a78df43776acdc03b
5
5
  SHA512:
6
- metadata.gz: a894bc14c69acadbacd0dded2ea7ce4d04f2e607e19ecec70c570160976a0c79b8a9513b1024e305066bf4490e84ac8cc2927cf7a096e9df80cde82fe5f2fabe
7
- data.tar.gz: 0415da3006d84de2b1804d3b2ac7e26d8f793617861a22c0a6eb71291c2d1071ff021b4859b9ee53d23b609bf66aaa4e7cef5e338d6fb9e6fb708fa874f5f197
6
+ metadata.gz: 35f308119cb2c44d09974ce1f9fda973e648212aefb36d6256678d0b281de6784be265bc87781b55f3aa05d5a3d6ddfdd60beb86e77420f629fab02e72e87be7
7
+ data.tar.gz: 3a82f19378b63f47ffcd9ad512ee44a2daa4769ffdaed6b01cd90e867e3cea31c200d264820f91af8307f0e43bb3a2c03944aa0d107bd2beeb6e6464a46cb8c7
data/.gitignore CHANGED
@@ -9,3 +9,5 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+
13
+ memolog-*.gem
data/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
- ## [Unreleased]
1
+ ## 0.3.0
2
2
 
3
- ## [0.1.0] - 2021-09-27
3
+ - Apply a prepend patch with `Sentry::Scope#apply_to_event` method.
4
+ - Check constant definition via `Object.const_defined?`
5
+ - Moving `Sentry::Sidekiq` scheme to monkey patch `Sentry::Sidekiq::SentryContextServerMiddleware`
6
+ - More specs
7
+
8
+ ## 0.2.2
9
+
10
+ - Do not init Rails middleware in Sidekiq server.
11
+
12
+ ## 0.2.1
13
+
14
+ - Better Rails middleware initialization.
15
+
16
+ ## 0.2.0
17
+
18
+ - Uprade gem due [CVE-2021-41098](https://github.com/advisories/GHSA-2rr5-8q37-2w7h)
19
+ - Add initializers config option, available initializers are [rails, sentry, sidekiq].
20
+ - Move debug option to config.
21
+
22
+ ## 0.1.0
4
23
 
5
24
  - Test version for publish and test workflow.
data/Gemfile CHANGED
@@ -4,3 +4,12 @@ source "https://rubygems.org"
4
4
 
5
5
  # Specify your gem's dependencies in memolog.gemspec
6
6
  gemspec
7
+
8
+ gem "pry"
9
+ gem "rails"
10
+ gem "rake"
11
+ gem "rspec"
12
+ gem "rubocop-config-umbrellio"
13
+ gem "sentry-ruby"
14
+ gem "sentry-sidekiq"
15
+ gem "sidekiq"
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- memolog (0.1.0)
5
- logger
6
- securerandom
4
+ memolog (0.3.0)
5
+ logger (~> 1.4.3)
6
+ securerandom (~> 0.1.0)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
@@ -98,7 +98,7 @@ GEM
98
98
  activesupport (>= 5.0)
99
99
  i18n (1.8.10)
100
100
  concurrent-ruby (~> 1.0)
101
- logger (1.4.3)
101
+ logger (1.4.4)
102
102
  loofah (2.12.0)
103
103
  crass (~> 1.0.2)
104
104
  nokogiri (>= 1.5.9)
@@ -110,9 +110,9 @@ GEM
110
110
  minitest (5.14.4)
111
111
  multipart-post (2.1.1)
112
112
  nio4r (2.5.8)
113
- nokogiri (1.12.4-x86_64-darwin)
113
+ nokogiri (1.12.5-x86_64-darwin)
114
114
  racc (~> 1.4)
115
- nokogiri (1.12.4-x86_64-linux)
115
+ nokogiri (1.12.5-x86_64-linux)
116
116
  racc (~> 1.4)
117
117
  parallel (1.21.0)
118
118
  parser (3.0.2.0)
@@ -177,7 +177,7 @@ GEM
177
177
  rubocop-ast (>= 1.7.0, < 2.0)
178
178
  ruby-progressbar (~> 1.7)
179
179
  unicode-display_width (>= 1.4.0, < 3.0)
180
- rubocop-ast (1.11.0)
180
+ rubocop-ast (1.12.0)
181
181
  parser (>= 3.0.1.1)
182
182
  rubocop-config-umbrellio (1.17.0.53)
183
183
  rubocop (= 1.17.0)
@@ -202,7 +202,7 @@ GEM
202
202
  rubocop (~> 1.0)
203
203
  ruby-progressbar (1.11.0)
204
204
  ruby2_keywords (0.0.5)
205
- securerandom (0.1.0)
205
+ securerandom (0.1.1)
206
206
  sentry-ruby (4.7.3)
207
207
  concurrent-ruby (~> 1.0, >= 1.0.2)
208
208
  faraday (>= 1.0)
@@ -210,6 +210,9 @@ GEM
210
210
  sentry-ruby-core (4.7.3)
211
211
  concurrent-ruby
212
212
  faraday
213
+ sentry-sidekiq (4.7.3)
214
+ sentry-ruby-core (~> 4.7.0)
215
+ sidekiq (>= 3.0)
213
216
  sidekiq (6.2.2)
214
217
  connection_pool (>= 2.2.2)
215
218
  rack (~> 2.0)
@@ -242,6 +245,7 @@ DEPENDENCIES
242
245
  rspec
243
246
  rubocop-config-umbrellio
244
247
  sentry-ruby
248
+ sentry-sidekiq
245
249
  sidekiq
246
250
 
247
251
  BUNDLED WITH
data/README.md CHANGED
@@ -20,10 +20,40 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install memolog
22
22
 
23
+ ## Configuration
24
+
25
+ Use this example during application initialization process (this example implement default values):
26
+
27
+ ```ruby
28
+ Memolog.configure do |config|
29
+ config.debug = false
30
+ config.formatter = ::Memolog::Formatter.new
31
+ config.initializers = %i[rails sentry sidekiq]
32
+ config.log_size_limit = 50_000
33
+ config.sentry_key = :memolog
34
+ config.uuid_callable = -> { SecureRandom.uuid }
35
+ end
36
+
37
+ Memolog.init!
38
+ ```
39
+
40
+ Available options are:
41
+ - `debug` - set it to true if you need to leave Memolog.dump result outside `Memolog.run {}` block.
42
+ - `formatter` - setup your own formatter.
43
+ - `initializers` - define here what you want to initialize in `#init!` call.
44
+ - `log_size_limit` - max log length in Sentry event.
45
+ - `sentry_key` - key name in Sentry extra object.
46
+ - `uuid_callable` - Memolog add unique value to logs, here you can redefine uuid generation.
47
+
23
48
  ## Usage
24
49
 
50
+ Please call `Memolog.extend_logger(Rails.logger)` or any other logger you want to collect.
51
+ After that when error occured you can check your Sentry report and see `memolog` section with all
52
+ logs collected before error. Also there will be unique identifier to find logs behaviour on your
53
+ server or log collection system.
54
+
25
55
  Memolog has init code for Rails (Middleware), Sentry (Extension) and Sidekiq (Middleware).
26
- It implement all hacks on the load process.
56
+ It implement all hacks on the `Memolog.init!` call.
27
57
  Also you can add `Memolog.run {}` around logs you want to collect and release it with `Memolog.dump`
28
58
  inside this block.
29
59
 
@@ -1,10 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- Memolog::Config = Struct.new(:formatter, :uuid_callable, :sentry_key, :log_size_limit) do
3
+ Memolog::Config = Struct.new(
4
+ :debug,
5
+ :formatter,
6
+ :initializers,
7
+ :log_size_limit,
8
+ :sentry_key,
9
+ :uuid_callable,
10
+ ) do
4
11
  def initialize
12
+ self.debug = false
5
13
  self.formatter = ::Memolog::Formatter.new
6
- self.uuid_callable = -> { SecureRandom.uuid }
7
- self.sentry_key = :memolog
14
+ self.initializers = %i[rails sentry sidekiq]
8
15
  self.log_size_limit = 50_000
16
+ self.sentry_key = :memolog
17
+ self.uuid_callable = -> { SecureRandom.uuid }
9
18
  end
10
19
  end
data/lib/memolog/init.rb CHANGED
@@ -1,17 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- if defined?(Rails::Railtie)
4
- require "memolog/railtie"
5
- end
3
+ class Memolog::Init
4
+ def call
5
+ init_rails!
6
+ init_sentry!
7
+ init_sidekiq!
8
+ end
6
9
 
7
- if defined?(Sentry::Scope)
8
- Sentry::Scope.prepend(Memolog::SentryScopeExtension)
9
- end
10
+ private
11
+
12
+ def init_rails!
13
+ return unless Memolog.config.initializers.include?(:rails)
14
+ return unless Object.const_defined?("Rails")
15
+ return if Object.const_defined?("Sidekiq") && Sidekiq.server?
16
+
17
+ Rails.application.middleware.insert_before(0, Memolog::Middleware)
18
+ end
19
+
20
+ def init_sentry!
21
+ return unless Memolog.config.initializers.include?(:sentry)
22
+ return unless Object.const_defined?("Sentry::Scope")
23
+
24
+ Sentry::Scope.prepend(Memolog::SentryScopeExtension)
25
+ end
26
+
27
+ def init_sidekiq!
28
+ return unless Memolog.config.initializers.include?(:sidekiq)
29
+ return unless Object.const_defined?("Sentry::Sidekiq::SentryContextServerMiddleware")
10
30
 
11
- if defined?(Sidekiq)
12
- Sidekiq.configure_server do |config|
13
- config.server_middleware do |chain|
14
- chain.prepend(Memolog::SentrySidekiqMiddleware)
15
- end
31
+ Sentry::Sidekiq::SentryContextServerMiddleware.prepend(
32
+ Memolog::SentrySidekiqMiddlewareExtension,
33
+ )
16
34
  end
17
35
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Memolog::SentryScopeExtension
4
- def extra
4
+ def apply_to_event(scope, hint = nil)
5
5
  memolog_dump = Memolog.dump
6
- memolog_dump.present? ? super.merge!(Memolog.config.sentry_key => memolog_dump) : super
6
+ set_extras(Memolog.config.sentry_key => memolog_dump) if memolog_dump
7
+
8
+ super
7
9
  end
8
10
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Memolog::SentrySidekiqMiddlewareExtension
4
+ def call(worker, job, queue)
5
+ Memolog.run { super }
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Memolog
4
- VERSION = "0.1.0"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/memolog.rb CHANGED
@@ -2,52 +2,55 @@
2
2
 
3
3
  require "logger"
4
4
  require "securerandom"
5
+ require "stringio"
6
+
7
+ require "memolog/version"
8
+ require "memolog/config"
9
+ require "memolog/extension"
10
+ require "memolog/formatter"
11
+ require "memolog/init"
12
+ require "memolog/middleware"
13
+ require "memolog/sentry_scope_extension"
14
+ require "memolog/sentry_sidekiq_middleware_extension"
5
15
 
6
16
  module Memolog
7
17
  extend self
8
18
 
9
- autoload :VERSION, "memolog/version"
10
- autoload :Config, "memolog/config"
11
- autoload :Extension, "memolog/extension"
12
- autoload :Formatter, "memolog/formatter"
13
- autoload :Middleware, "memolog/middleware"
14
- autoload :SentryScopeExtension, "memolog/sentry_scope_extension"
15
- autoload :SentrySidekiqMiddleware, "memolog/sentry_sidekiq_middleware"
19
+ attr_accessor :config, :logdevs
16
20
 
17
- attr_accessor :debug, :logdevs
18
-
19
- self.debug = false
20
- self.logdevs = []
21
+ @config = Memolog::Config.new
22
+ @logdevs = []
21
23
 
22
24
  def configure
23
- @config ||= Memolog::Config.new
24
- yield(@config) if block_given?
25
- @config
25
+ yield(config) if block_given?
26
+ end
27
+
28
+ def init!
29
+ Memolog::Init.new.call
26
30
  end
27
- alias config configure
28
31
 
29
32
  def extend_logger(other_logger)
30
33
  other_logger.extend(Memolog::Extension)
31
34
  other_logger.formatter = config.formatter
32
35
  end
33
36
 
34
- def logger
35
- Thread.current[:memolog_logger] ||= Logger.new(nil, formatter: config.formatter)
36
- end
37
-
38
37
  def uuid
39
38
  Thread.current[:memolog_uuid]
40
39
  end
41
40
 
41
+ def logger
42
+ Thread.current[:memolog_logger] ||= Logger.new(nil, formatter: config.formatter)
43
+ end
44
+
42
45
  def run
43
- Thread.current[:memolog_uuid] = Memolog.config.uuid_callable.call
46
+ Thread.current[:memolog_uuid] = config.uuid_callable.call
44
47
 
45
48
  logdevs.push(StringIO.new)
46
49
  logger.instance_variable_set(:@logdev, logdevs.last)
47
50
 
48
51
  yield
49
52
  ensure
50
- logdevs.pop unless debug
53
+ logdevs.pop unless config.debug
51
54
  end
52
55
 
53
56
  def dump
@@ -56,8 +59,6 @@ module Memolog
56
59
  beginning = logdevs.last.string.length - config.log_size_limit
57
60
  beginning = 0 if beginning.negative?
58
61
 
59
- logdevs.last.string.slice(beginning, config.log_size_limit)
62
+ logdevs.last.string.slice(beginning, config.log_size_limit).presence
60
63
  end
61
64
  end
62
-
63
- require "memolog/init"
metadata CHANGED
@@ -1,141 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: memolog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stepan Kirushkin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-27 00:00:00.000000000 Z
11
+ date: 2021-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logger
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 1.4.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 1.4.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: securerandom
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 0.1.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: pry
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: rails
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: rake
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rspec
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rubocop-config-umbrellio
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: sentry-ruby
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: sidekiq
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0'
40
+ version: 0.1.0
139
41
  description: |2
140
42
  Memolog is an in-memory logger, which extend any other logger.
141
43
  Designed to work with Sentry.
@@ -163,9 +65,8 @@ files:
163
65
  - lib/memolog/formatter.rb
164
66
  - lib/memolog/init.rb
165
67
  - lib/memolog/middleware.rb
166
- - lib/memolog/railtie.rb
167
68
  - lib/memolog/sentry_scope_extension.rb
168
- - lib/memolog/sentry_sidekiq_middleware.rb
69
+ - lib/memolog/sentry_sidekiq_middleware_extension.rb
169
70
  - lib/memolog/version.rb
170
71
  homepage: https://github.com/skirushkin/memolog
171
72
  licenses:
@@ -173,7 +74,7 @@ licenses:
173
74
  metadata:
174
75
  homepage_uri: https://github.com/skirushkin/memolog
175
76
  source_code_uri: https://github.com/skirushkin/memolog
176
- changelog_uri: https://github.com/skirushkin/memolog
77
+ changelog_uri: https://github.com/skirushkin/memolog/blob/master/CHANGELOG.md
177
78
  post_install_message:
178
79
  rdoc_options: []
179
80
  require_paths:
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Memolog::Railtie < Rails::Railtie
4
- initializer "memolog.configure_rails_initialization" do |app|
5
- app.middleware.insert_before(0, Memolog::Middleware)
6
- end
7
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Memolog::SentrySidekiqMiddleware
4
- def call(*)
5
- Memolog.run do
6
- yield
7
- rescue => error
8
- memolog_dump = Memolog.dump
9
- Sentry.set_extras(Memolog.config.sentry_key => memolog_dump) if memolog_dump
10
- raise error
11
- end
12
- end
13
- end