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

Wrap the `Labkit::Context` middlewares in a chain

This allows us to add more middlewares to labkit while only having to
add a single middleware in GitLab-rails
parent c05aed9e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ module Labkit
    module Sidekiq
      autoload :Client, "labkit/middleware/sidekiq/client"
      autoload :Server, "labkit/middleware/sidekiq/server"
      autoload :Context, "labkit/middleware/sidekiq/context"
    end
  end
end
+10 −6
Original line number Diff line number Diff line
@@ -3,14 +3,18 @@
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)
        LABKIT_CLIENT_CHAIN = ::Sidekiq::Middleware::Chain.new do |chain|
          chain.add Labkit::Middleware::Sidekiq::Context::Client
        end

        def call(*args)
          LABKIT_CLIENT_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