Commit fd429bdd authored by Bob Van Landuyt's avatar Bob Van Landuyt 💬
Browse files

Merge branch 'bvl-sidekiq-middleware-chain' into 'master'

Wrap sidekiq middleware in a chain

See merge request gitlab-org/labkit-ruby!29
parents c05aed9e c6a8f371
Loading
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@ module Labkit
    module Sidekiq
      autoload :Client, "labkit/middleware/sidekiq/client"
      autoload :Server, "labkit/middleware/sidekiq/server"
      autoload :Context, "labkit/middleware/sidekiq/context"
      autoload :Tracing, "labkit/middleware/sidekiq/tracing"
    end
  end
end
+13 −6
Original line number Diff line number Diff line
@@ -3,14 +3,21 @@
module Labkit
  module Middleware
    module Sidekiq
      # This middleware for Sidekiq-client wraps scheduling jobs in a context
      # The context will also be added to the sidekiq job in redis so it can
      # be reinstantiated by Sidekiq-server when running the job.
      # This is a wrapper around all the sidekiq client-middleware in labkit
      # The only middleware that needs to be added to the chain in GitLab-rails
      #
      # It uses a new `Sidekiq::Middleware::Chain` to string multiple middlewares
      # together.
      class Client
        def call(_worker_class, job, _queue, _redis_pool)
          Labkit::Context.with_context do |context|
            job.merge!(context.to_h)
        def self.chain
          @chain ||= ::Sidekiq::Middleware::Chain.new do |chain|
            chain.add Labkit::Middleware::Sidekiq::Context::Client
            chain.add Labkit::Middleware::Sidekiq::Tracing::Client if Labkit::Tracing.enabled?
          end
        end

        def call(*args)
          self.class.chain.invoke(*args) do
            yield
          end
        end
+14 −0
Original line number Diff line number Diff line
# frozen_string_literal: true

module Labkit
  module Middleware
    module Sidekiq
      # This module contains all the sidekiq middleware regarding application
      # context
      module Context
        autoload :Client, "labkit/middleware/sidekiq/context/client"
        autoload :Server, "labkit/middleware/sidekiq/context/server"
      end
    end
  end
end
+22 −0
Original line number Diff line number Diff line
# frozen_string_literal: true

module Labkit
  module Middleware
    module Sidekiq
      module Context
        # This middleware for Sidekiq-client wraps scheduling jobs in a context
        # The context will also be added to the sidekiq job in redis so it can
        # be reinstantiated by Sidekiq-server when running the job.
        class Client
          def call(_worker_class, job, _queue, _redis_pool)
            Labkit::Context.with_context do |context|
              job.merge!(context.to_h)

              yield
            end
          end
        end
      end
    end
  end
end
+21 −0
Original line number Diff line number Diff line
# frozen_string_literal: true

module Labkit
  module Middleware
    module Sidekiq
      module Context
        # This middleware for Sidekiq-client uses the values stored on a job to
        # reinstantiate a context in which the job will run.
        class Server
          def call(_worker_class, job, _queue)
            data = job.merge(Labkit::Context.log_key(:caller_id) => job["class"])

            Labkit::Context.with_context(data) do |_context|
              yield
            end
          end
        end
      end
    end
  end
end
Loading