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 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
@@ -0,0 +1,5 @@
1
+ ## master (unreleased)
2
+
3
+ ## 0.1.0 (2023-03-29)
4
+
5
+ - First release
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,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
4
+
5
+ module JobEnqueueLogger
6
+ class Railtie < Rails::Railtie
7
+ initializer "job_enqueue_logger.backtrace_cleaner" do
8
+ JobEnqueueLogger.backtrace_cleaner = Rails.backtrace_cleaner
9
+ end
10
+ end
11
+ end
@@ -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,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JobEnqueueLogger
4
+ VERSION = "0.1.0"
5
+ 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: []