Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remedy logic, gemfile, gemspec, CI #1

Merged
merged 14 commits into from
Oct 29, 2024
37 changes: 37 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: CI
on: [pull_request, push]
jobs:
rubocop:
strategy:
fail-fast: true
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: 3.1
bundler-cache: true
- run: bundle exec rubocop
rspec:
strategy:
fail-fast: false
matrix:
ruby: ['3.1', '3.2', '3.3']
runs-on: ubuntu-latest
services:
redis:
image: redis
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
bundler-cache: true
- run: bundle exec rake
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,6 @@

# rspec failure tracking
.rspec_status

# Ignore Gemfile.lock
Gemfile.lock
114 changes: 114 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
require:
- rubocop-performance
- rubocop-rspec

inherit_mode:
merge:
- Exclude

AllCops:
NewCops: enable
TargetRubyVersion: 3.1
Exclude:
- "db/**/*"
- "bin/**/*"
- "tmp/**/*"
- "log/**/*"
- "vendor/**/*"
- "spec/rails_helper.rb"

Layout/FrozenStringLiteralComment:
Enabled: true

Layout/ArgumentAlignment:
EnforcedStyle: with_fixed_indentation

Layout/ArrayAlignment:
EnforcedStyle: with_fixed_indentation

Layout/EmptyLineBetweenDefs:
AllowAdjacentOneLineDefs: true

Layout/EndAlignment:
EnforcedStyleAlignWith: variable

Layout/FirstArgumentIndentation:
EnforcedStyle: consistent

Layout/FirstArrayElementIndentation:
EnforcedStyle: consistent

Layout/FirstHashElementIndentation:
EnforcedStyle: consistent

Layout/MultilineMethodCallIndentation:
EnforcedStyle: indented

Layout/MultilineOperationIndentation:
EnforcedStyle: indented

Layout/ParameterAlignment:
EnforcedStyle: with_fixed_indentation

Layout/SpaceBeforeBrackets:
Enabled: false


Lint/UnusedMethodArgument:
AllowUnusedKeywordArguments: true

Lint/AmbiguousBlockAssociation:
Exclude:
- 'spec/**/*'


Naming/FileName:
EnforcedStyle: snake_case
Exclude:
- 'lib/sidekiq-poison-pill-remedy.rb'

Naming/VariableNumber:
EnforcedStyle: snake_case


RSpec/MultipleExpectations:
Max: 20

RSpec/NestedGroups:
Max: 10

RSpec/ExampleLength:
Max: 15
Exclude:
- 'spec/sidekiq_poison_pill_remedy_spec.rb'

RSpec/VerifiedDoubles:
Exclude:
- 'spec/**/*.rb'


Metrics/AbcSize:
Max: 15
Exclude:
- 'lib/sidekiq_poison_pill_remedy.rb'


Metrics/MethodLength:
Max: 20

Metrics/BlockLength:
Exclude:
- 'lib/sidekiq_poison_pill_remedy.rb'

Layout/LineLength:
Max: 125


Style/StringLiterals:
EnforcedStyle: double_quotes
ConsistentQuotesInMultiline: true

Style/Documentation:
Enabled: false


10 changes: 9 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,13 @@ source "https://rubygems.org"
gemspec

gem "rake", "~> 13.0"
gem "sentry-ruby"

gem "rspec", "~> 3.0"
group :development, :test do
gem "rspec", "~> 3.0"
gem "rspec-sidekiq"
gem "rubocop", "~> 1.40", require: false
gem "rubocop-performance"
gem "rubocop-rake"
gem "rubocop-rspec"
end
29 changes: 18 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,31 @@
# Sidekiq::Poison::Pill::Remedy
# SidekiqPoisonPillRemedy

TODO: Delete this and the text below, and describe your gem

Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/sidekiq/poison/pill/remedy`. To experiment with that code, run `bin/console` for an interactive prompt.
The Sidekiq Poison Pill Remedy gem enhances Sidekiq's job processing by automatically handling and rescheduling failed jobs (poison pills) with integrated logging and error tracking through Sentry, ultimately improving reliability and performance optimization.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI or own copywriting? ;P

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wanted this to be pro so AI 🤖

## Installation

TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
Add this line to your application's Gemfile:

`gem 'sidekiq-poison-pill-remedy'`

Install the gem and add to the application's Gemfile by executing:
And then execute:

$ bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
`$ bundle install`

If bundler is not being used to manage dependencies, install the gem by executing:
Or install it yourself as:

$ gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
`$ gem install sidekiq-poison-pill-remedy`

## Usage

TODO: Write usage instructions here
The gem is supposed to be used in the following way when added to the application

Check Sidekiq super_fetch:[here](https://github.com/sidekiq/sidekiq/wiki/Reliability#using-super_fetch)

Remedy is supposed to be use like:
`config.super_fetch!(&SidekiqPoisonPillRemedy.remedy)`

Azdaroth marked this conversation as resolved.
Show resolved Hide resolved
When a job fails, the SidekiqPoisonPillRemedy captures the failure and determines whether the job should be moved to a dedicated poison_pill queue.

## Development
Robgra13 marked this conversation as resolved.
Show resolved Hide resolved

Expand All @@ -28,7 +35,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/sidekiq-poison-pill-remedy.
Bug reports and pull requests are welcome on GitHub at https://github.com/BookingSync/sidekiq-poison-pill-remedy.

## License

Expand Down
6 changes: 3 additions & 3 deletions bin/console
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
#!/usr/bin/env ruby
# frozen_string_literal: true

require "bundler/setup"
require "sidekiq/poison/pill/remedy"
require 'bundler/setup'
require 'sidekiq/poison/pill/remedy'

# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.

require "irb"
require 'irb'
IRB.start(__FILE__)
12 changes: 12 additions & 0 deletions lib/jobs/my_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# frozen_string_literal: true

require "sidekiq"
Robgra13 marked this conversation as resolved.
Show resolved Hide resolved

class MyJob
include Sidekiq::Job
sidekiq_options retry: 1

def perform(arg)
raise StandardError, "Forced failure for testing" if arg == "fail"
end
end
3 changes: 3 additions & 0 deletions lib/sidekiq-poison-pill-remedy.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# frozen_string_literal: true

require "sidekiq_poison_pill_remedy"
14 changes: 0 additions & 14 deletions lib/sidekiq/poison/pill/remedy.rb

This file was deleted.

11 changes: 0 additions & 11 deletions lib/sidekiq/poison/pill/remedy/version.rb

This file was deleted.

39 changes: 39 additions & 0 deletions lib/sidekiq_poison_pill_remedy.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# frozen_string_literal: true

module SidekiqPoisonPillRemedy
def self.remedy
proc do |_jobstr, pill|
next unless pill

job = Sidekiq::DeadSet.new.find_job(pill.jid)

if job.queue == "poison_pill"
capture_sentry_message(
"#{job.klass} failed in the `#{job.queue}`, this means that it has to be urgently optimized on memory usage",
level: :critical,
job_item: job.item
)
else
capture_sentry_message(
"#{job.klass} was marked as `poison pill`, please create the job memory optimizations ticket timely",
level: :warning,
job_item: job.item
)
job.klass.constantize.set(queue: :poison_pill).perform_async(*job.args)
job.delete
end
end
end

def self.capture_sentry_message(message, level:, job_item:)
if defined?(Sentry)
Sentry.capture_message(
message,
level:,
extra: { job_item: }
)
end

Sidekiq.logger.fatal(message)
end
end
8 changes: 8 additions & 0 deletions lib/sidekiq_worker_loader.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# frozen_string_literal: true

require "sidekiq"
require "sidekiq/api"
require "sidekiq/testing"
require "rspec-sidekiq"
require "sidekiq-poison-pill-remedy"
require_relative "jobs/my_job"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

given that this is only for testing, please don't include this on a gem level, but rather on a spec_helper level

7 changes: 7 additions & 0 deletions lib/version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

module SidekiqPoisonPillRemedy
module Version
end
VERSION = "0.1.0"
end
20 changes: 10 additions & 10 deletions sidekiq-poison-pill-remedy.gemspec
Original file line number Diff line number Diff line change
@@ -1,24 +1,22 @@
# frozen_string_literal: true

require_relative "lib/sidekiq/poison/pill/remedy/version"
require_relative "lib/version"

Gem::Specification.new do |spec|
spec.name = "sidekiq-poison-pill-remedy"
spec.version = Sidekiq::Poison::Pill::Remedy::VERSION
spec.version = SidekiqPoisonPillRemedy::VERSION
spec.authors = ["Karol Galanciak"]
spec.email = ["[email protected]"]

spec.summary = "TODO: Write a short summary, because RubyGems requires one."
spec.description = "TODO: Write a longer description or delete this line."
spec.homepage = "TODO: Put your gem's website or public repo URL here."
spec.summary = "Enhances Sidekiq's job processing by automatically handling and rescheduling poison pills"
spec.description = "Enhances Sidekiq's job processing by automatically handling and rescheduling poison pills"
spec.homepage = "https://github.com/BookingSync/sidekiq-poison-pill-remedy"
spec.license = "MIT"
spec.required_ruby_version = ">= 3.0.0"

spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
spec.required_ruby_version = ">= 3.1.0"

spec.metadata["homepage_uri"] = spec.homepage
spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
spec.metadata["source_code_uri"] = "https://github.com/BookingSync/sidekiq-poison-pill-remedy"
spec.metadata["changelog_uri"] = "https://github.com/BookingSync/sidekiq-poison-pill-remedy/blob/master/CHANGELOG.md"

# Specify which files should be added to the gem when it is released.
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
Expand All @@ -35,7 +33,9 @@ Gem::Specification.new do |spec|

# Uncomment to register a new dependency of your gem
# spec.add_dependency "example-gem", "~> 1.0"
spec.add_dependency "sidekiq"

# For more information and examples about making a new gem, check out our
# guide at: https://bundler.io/guides/creating_gem.html
spec.metadata["rubygems_mfa_required"] = "true"
end
11 changes: 0 additions & 11 deletions spec/sidekiq/poison/pill/remedy_spec.rb

This file was deleted.

Loading
Loading