memolog 0.1.0 → 0.3.0

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 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