job_enqueue_logger 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +87 -0
- data/lib/job_enqueue_logger/delayed_job_adapter.rb +48 -0
- data/lib/job_enqueue_logger/railtie.rb +11 -0
- data/lib/job_enqueue_logger/resque_adapter.rb +62 -0
- data/lib/job_enqueue_logger/sidekiq_adapter.rb +60 -0
- data/lib/job_enqueue_logger/utils.rb +28 -0
- data/lib/job_enqueue_logger/version.rb +5 -0
- data/lib/job_enqueue_logger.rb +33 -0
- metadata +59 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8bd89f4945224bc0c74d429110323c609a26c63f1eef1202c588d58d9a90bb13
|
4
|
+
data.tar.gz: 4bda89a97eb8c1afc974edf24e37b4685ea1b354a184e782bd10e80fd383c8b3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fe5c00d27ef14b4c7da8458cd3500b8dda2af19bdb56f1829588abe3f0a6634f284e8e46b5ca92cdbb2f16a4ed89e1a3be3f9cb578dbd942066b8da809cf11d0
|
7
|
+
data.tar.gz: cc5b8a0463f46332cb03bb5cadd3aeb4b2de8aa6b3f5cd4fbca7c9fe730e5d18f82e95a656683dc5d83daa7eb2ca664c32c63386ff99bded51f40cff1ad5e9fb
|
data/CHANGELOG.md
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2023 fatkodima
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# JobEnqueueLogger
|
2
|
+
|
3
|
+
[![Build Status](https://github.com/fatkodima/job_enqueue_logger/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/fatkodima/job_enqueue_logger/actions/workflows/ci.yml)
|
4
|
+
|
5
|
+
Log background jobs enqueued by your application (additionally with backtraces). Helps with debugging, or just generally understanding what's going on under the hood. Useful for finding where to start when making changes to a large application.
|
6
|
+
|
7
|
+
This is very much a development and debugging tool; it is not recommended to use this in a production environment as it is monkey-patching the respective job queuing implementations. You have been warned - use at your own risk.
|
8
|
+
|
9
|
+
## Example
|
10
|
+
|
11
|
+
When the job is enqueued within the guts of the application, the log line is generated:
|
12
|
+
|
13
|
+
```
|
14
|
+
Enqueued AvatarThumbnailsJob (jid=578b3d10fc5403f97ee0a8e1) to Sidekiq(default) with arguments: 1092412064
|
15
|
+
```
|
16
|
+
|
17
|
+
Or with backtraces enabled:
|
18
|
+
|
19
|
+
```
|
20
|
+
Enqueued AvatarThumbnailsJob (jid=578b3d10fc5403f97ee0a8e1) to Sidekiq(default) with arguments: 1092412064
|
21
|
+
↳ app/models/user.rb:421:in `generate_avatar_thumbnails'
|
22
|
+
app/services/user_creator.rb:21:in `call'
|
23
|
+
app/controllers/users_controller.rb:49:in `create'
|
24
|
+
```
|
25
|
+
|
26
|
+
## Requirements
|
27
|
+
|
28
|
+
Requires ruby > 2.7.
|
29
|
+
|
30
|
+
This gem supports most common job queuing backends:
|
31
|
+
|
32
|
+
* [Sidekiq](https://github.com/sidekiq/sidekiq) >= 6.5.0
|
33
|
+
* [Resque](https://github.com/resque/resque) >= 2.0.0
|
34
|
+
* [DelayedJob](https://github.com/collectiveidea/delayed_job) >= 4.1.5
|
35
|
+
|
36
|
+
If you need support for older rubies or older versions of queuing backends (or additional backends), [open an issue](https://github.com/fatkodima/job_enqueue_logger/issues/new).
|
37
|
+
|
38
|
+
## Installation
|
39
|
+
|
40
|
+
Add this line to your application's Gemfile:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
# Add this *after* your job queuing gem of choice
|
44
|
+
gem 'job_enqueue_logger', group: :development
|
45
|
+
```
|
46
|
+
|
47
|
+
And then execute:
|
48
|
+
|
49
|
+
```sh
|
50
|
+
$ bundle
|
51
|
+
```
|
52
|
+
|
53
|
+
Or install it yourself as:
|
54
|
+
|
55
|
+
```sh
|
56
|
+
$ gem install job_enqueue_logger
|
57
|
+
```
|
58
|
+
|
59
|
+
## Configuration
|
60
|
+
|
61
|
+
You can override the following default options:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
JobEnqueueLogger.configure do |config|
|
65
|
+
# Controls the contents of the printed backtrace.
|
66
|
+
# Is set to default Rails.backtrace_cleaner, when the gem is used in the Rails app.
|
67
|
+
config.backtrace_cleaner = ->(backtrace) { backtrace }
|
68
|
+
|
69
|
+
# Controls whether to print backtraces. Set to `true` to print backtraces, or
|
70
|
+
# a number to limit how many lines to print.
|
71
|
+
config.backtrace = false
|
72
|
+
end
|
73
|
+
```
|
74
|
+
|
75
|
+
## Development
|
76
|
+
|
77
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
78
|
+
|
79
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
80
|
+
|
81
|
+
## Contributing
|
82
|
+
|
83
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/fatkodima/job_enqueue_logger.
|
84
|
+
|
85
|
+
## License
|
86
|
+
|
87
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JobEnqueueLogger
|
4
|
+
module DelayedJobAdapter
|
5
|
+
module Job
|
6
|
+
def enqueue(*args)
|
7
|
+
job = super
|
8
|
+
|
9
|
+
# Job with arguments (instance variables of the job) are serialized
|
10
|
+
# into yaml. There is no easy way to get them, so just skip logging it.
|
11
|
+
if job.persisted?
|
12
|
+
message = "Enqueued #{job.name} (id=#{job.id}) to DelayedJob(#{job.queue})"
|
13
|
+
message += " at #{job.run_at.utc}" if job.run_at > Delayed::Job.db_time_now
|
14
|
+
else
|
15
|
+
message = "Performed inline #{job.name}"
|
16
|
+
end
|
17
|
+
Utils.log_job_enqueue(DelayedJobAdapter.logger, message)
|
18
|
+
|
19
|
+
job
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Worker
|
24
|
+
def start
|
25
|
+
# There is no easy way (compared to Sidekiq) to detect
|
26
|
+
# if we are in server mode.
|
27
|
+
JobEnqueueLogger::DelayedJobAdapter.server = true
|
28
|
+
super
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class << self
|
33
|
+
attr_accessor :server
|
34
|
+
alias server? server
|
35
|
+
|
36
|
+
def logger
|
37
|
+
if !server? && defined?(Rails)
|
38
|
+
Rails.logger
|
39
|
+
else
|
40
|
+
Delayed::Worker.logger
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
Delayed::Job.singleton_class.prepend(JobEnqueueLogger::DelayedJobAdapter::Job)
|
48
|
+
Delayed::Worker.prepend(JobEnqueueLogger::DelayedJobAdapter::Worker)
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JobEnqueueLogger
|
4
|
+
module ResqueAdapter
|
5
|
+
module Enqueuing
|
6
|
+
def enqueue_to(queue, klass, *args)
|
7
|
+
enqueued = super
|
8
|
+
if enqueued
|
9
|
+
message =
|
10
|
+
if Resque.inline?
|
11
|
+
"Performed inline #{klass}" + Utils.args_info(args)
|
12
|
+
else
|
13
|
+
"Enqueued #{klass} to Resque(#{queue})" + Utils.args_info(args)
|
14
|
+
end
|
15
|
+
Utils.log_job_enqueue(ResqueAdapter.logger, message)
|
16
|
+
end
|
17
|
+
enqueued
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module DelayedEnqueuing
|
22
|
+
def delayed_push(timestamp, item)
|
23
|
+
super
|
24
|
+
message = "Enqueued #{item[:class]} to Resque(#{item[:queue]}) at #{timestamp.utc}" +
|
25
|
+
Utils.args_info(item[:args])
|
26
|
+
Utils.log_job_enqueue(ResqueAdapter.logger, message)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
module Worker
|
31
|
+
def work(*)
|
32
|
+
# There is no easy way (compared to Sidekiq) to detect
|
33
|
+
# if we are in server mode.
|
34
|
+
JobEnqueueLogger::ResqueAdapter.server = true
|
35
|
+
super
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class << self
|
40
|
+
attr_accessor :server
|
41
|
+
alias server? server
|
42
|
+
|
43
|
+
def logger
|
44
|
+
if !server? && defined?(Rails)
|
45
|
+
Rails.logger
|
46
|
+
else
|
47
|
+
Resque.logger
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
Resque.singleton_class.prepend(JobEnqueueLogger::ResqueAdapter::Enqueuing)
|
55
|
+
Resque::Worker.prepend(JobEnqueueLogger::ResqueAdapter::Worker)
|
56
|
+
|
57
|
+
begin
|
58
|
+
require "resque-scheduler"
|
59
|
+
Resque.singleton_class.prepend(JobEnqueueLogger::ResqueAdapter::DelayedEnqueuing)
|
60
|
+
rescue LoadError
|
61
|
+
# scheduling gem is not available
|
62
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JobEnqueueLogger
|
4
|
+
module SidekiqAdapter
|
5
|
+
module Job
|
6
|
+
module Setter
|
7
|
+
def perform_inline(*args)
|
8
|
+
performed = super
|
9
|
+
if performed
|
10
|
+
message = "Performed inline #{@klass}" + Utils.args_info(args)
|
11
|
+
Utils.log_job_enqueue(SidekiqAdapter.logger, message)
|
12
|
+
end
|
13
|
+
performed
|
14
|
+
end
|
15
|
+
alias perform_sync perform_inline
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module Client
|
20
|
+
def push(item)
|
21
|
+
jid = super(item)
|
22
|
+
if jid
|
23
|
+
queue = item["queue"] || "default"
|
24
|
+
|
25
|
+
message = "Enqueued #{item['class']} (jid=#{jid}) to Sidekiq(#{queue})"
|
26
|
+
message += " at #{Time.at(item['at']).utc}" if item.key?("at")
|
27
|
+
message += Utils.args_info(item["args"])
|
28
|
+
|
29
|
+
Utils.log_job_enqueue(SidekiqAdapter.logger, message)
|
30
|
+
end
|
31
|
+
jid
|
32
|
+
end
|
33
|
+
|
34
|
+
def push_bulk(items)
|
35
|
+
jids = super(items)
|
36
|
+
real_jids = jids.compact
|
37
|
+
if real_jids.any?
|
38
|
+
queue = items["queue"] || "default"
|
39
|
+
message = "Enqueued"
|
40
|
+
message += " #{real_jids.size}" if real_jids.size > 1
|
41
|
+
message += " #{items['class']} to Sidekiq(#{queue})"
|
42
|
+
|
43
|
+
Utils.log_job_enqueue(SidekiqAdapter.logger, message)
|
44
|
+
end
|
45
|
+
jids
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.logger
|
50
|
+
if !Sidekiq.server? && defined?(Rails)
|
51
|
+
Rails.logger
|
52
|
+
else
|
53
|
+
Sidekiq.logger
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
Sidekiq::Job::Setter.prepend(JobEnqueueLogger::SidekiqAdapter::Job::Setter)
|
60
|
+
Sidekiq::Client.prepend(JobEnqueueLogger::SidekiqAdapter::Client)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JobEnqueueLogger
|
4
|
+
module Utils
|
5
|
+
def self.log_job_enqueue(logger, message)
|
6
|
+
return logger.info(message) unless JobEnqueueLogger.backtrace
|
7
|
+
|
8
|
+
backtrace = caller
|
9
|
+
cleaned_backtrace = JobEnqueueLogger.backtrace_cleaner&.call(backtrace) || backtrace
|
10
|
+
lines =
|
11
|
+
if JobEnqueueLogger.backtrace == true
|
12
|
+
cleaned_backtrace
|
13
|
+
else
|
14
|
+
cleaned_backtrace[0...JobEnqueueLogger.backtrace.to_i]
|
15
|
+
end
|
16
|
+
|
17
|
+
logger.info("#{message}\n↳ #{lines.join("\n ")}")
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.args_info(args)
|
21
|
+
if Array(args).any?
|
22
|
+
" with arguments: #{Array(args).map(&:inspect).join(', ')}"
|
23
|
+
else
|
24
|
+
""
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "job_enqueue_logger/version"
|
4
|
+
require_relative "job_enqueue_logger/utils"
|
5
|
+
|
6
|
+
module JobEnqueueLogger
|
7
|
+
class << self
|
8
|
+
attr_reader :backtrace_cleaner
|
9
|
+
|
10
|
+
def backtrace_cleaner=(cleaner)
|
11
|
+
@backtrace_cleaner =
|
12
|
+
if cleaner.respond_to?(:clean)
|
13
|
+
->(backtrace) { cleaner.clean(backtrace) }
|
14
|
+
else
|
15
|
+
cleaner
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_accessor :backtrace
|
20
|
+
|
21
|
+
def configure
|
22
|
+
yield self
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
self.backtrace_cleaner = ->(backtrace) { backtrace }
|
27
|
+
self.backtrace = false
|
28
|
+
end
|
29
|
+
|
30
|
+
require_relative "job_enqueue_logger/sidekiq_adapter" if defined?(Sidekiq)
|
31
|
+
require_relative "job_enqueue_logger/resque_adapter" if defined?(Resque)
|
32
|
+
require_relative "job_enqueue_logger/delayed_job_adapter" if defined?(Delayed::Job)
|
33
|
+
require_relative "job_enqueue_logger/railtie" if defined?(Rails)
|
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: job_enqueue_logger
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- fatkodima
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-03-30 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: |-
|
14
|
+
Log background jobs enqueued by your application (additionally with backtraces).
|
15
|
+
Helps with debugging, or just generally understanding what's going on under the hood.
|
16
|
+
Useful for finding where to start when making changes to a large application.
|
17
|
+
email:
|
18
|
+
- fatkodima123@gmail.com
|
19
|
+
executables: []
|
20
|
+
extensions: []
|
21
|
+
extra_rdoc_files: []
|
22
|
+
files:
|
23
|
+
- CHANGELOG.md
|
24
|
+
- LICENSE.txt
|
25
|
+
- README.md
|
26
|
+
- lib/job_enqueue_logger.rb
|
27
|
+
- lib/job_enqueue_logger/delayed_job_adapter.rb
|
28
|
+
- lib/job_enqueue_logger/railtie.rb
|
29
|
+
- lib/job_enqueue_logger/resque_adapter.rb
|
30
|
+
- lib/job_enqueue_logger/sidekiq_adapter.rb
|
31
|
+
- lib/job_enqueue_logger/utils.rb
|
32
|
+
- lib/job_enqueue_logger/version.rb
|
33
|
+
homepage: https://github.com/fatkodima/job_enqueue_logger
|
34
|
+
licenses:
|
35
|
+
- MIT
|
36
|
+
metadata:
|
37
|
+
homepage_uri: https://github.com/fatkodima/job_enqueue_logger
|
38
|
+
source_code_uri: https://github.com/fatkodima/job_enqueue_logger
|
39
|
+
changelog_uri: https://github.com/fatkodima/job_enqueue_logger/blob/master/CHANGELOG.md
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options: []
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 2.7.0
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirements: []
|
55
|
+
rubygems_version: 3.4.7
|
56
|
+
signing_key:
|
57
|
+
specification_version: 4
|
58
|
+
summary: Log background jobs enqueued by your application (additionally with backtraces).
|
59
|
+
test_files: []
|