Skip to content

Commit

Permalink
Merge pull request #1 from BookingSync/gem-edit
Browse files Browse the repository at this point in the history
remedy logic, gemfile, gemspec, CI
  • Loading branch information
Azdaroth authored Oct 29, 2024
2 parents 5279830 + e348920 commit c6f27b0
Show file tree
Hide file tree
Showing 16 changed files with 351 additions and 62 deletions.
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
115 changes: 115 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
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

RSpec/AnyInstance:
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.

## 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)`

When a job is considered a poison pill by Sidekiq, SidekiqPoisonPillRemedy prevents it from being moved to DeadSet and moves it to a dedicated queue to make sure the job will be processed after capturing team's attention with Sentry notification

## Development

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__)
5 changes: 5 additions & 0 deletions lib/sidekiq-poison-pill-remedy.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# frozen_string_literal: true

require "sidekiq_poison_pill_remedy"
require "active_support"
require "active_support/inflector"
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
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
21 changes: 11 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,10 @@ Gem::Specification.new do |spec|

# Uncomment to register a new dependency of your gem
# spec.add_dependency "example-gem", "~> 1.0"
spec.add_dependency "activesupport", ">= 6.1"
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

0 comments on commit c6f27b0

Please sign in to comment.