Plugins

Dry-system has already built-in plugins that you can enable, and it’s very easy to write your own.

Logging support

You can now enable a default system logger by simply enabling :logging plugin, you can also configure log dir, level and provide your own logger class.

class App < Dry::System::Container
  use :logging
end

# default logger is registered as a standard object, so you can inject it via auto-injection
App[:logger]

# short-cut method is provided too, which is convenient in some cases
App.logger           

Monitoring

Another plugin is called :monitoring which allows you to enable object monitoring, which is built on top of dry-monitor’s instrumentation API. Let’s say you have an object registered under "users.operations.create", and you’d like to add additional logging:

class App < Dry::System::Container
  use :logging
  use :monitoring
end

App.monitor("users.operations.create") do |event|
  App.logger.debug "user created: #{event.payload} in #{event[:time]}ms"
end

You can also provide specific methods that should be monitored, let’s say we’re only interested in #call method:

App.monitor("users.operations.create", methods: %i[call]) do |event|
  App.logger.debug "user created: #{event.payload} in #{event[:time]}ms"
end

Setting environment

Environment can now be set in a non-web systems too. Previously this was only possible in dry-web, now any ruby app based on dry-system can use this configuration setting via :env plugin:

class App < Dry::System::Container
  use :env

  configure do |config|
    config.env = :staging
  end
end

You can provide environment inferrer, which is probably something you want to do, here’s how dry-web sets up its environment:

module Dry
  module Web
    class Container < Dry::System::Container
      use :env, inferrer: -> { ENV.fetch("RACK_ENV", :development).to_sym }
    end
  end
end

Experimental bootsnap support

dry-system is already pretty fast, but in a really big apps, it can take over 2 seconds to boot. You can now speed it up significantly by using :bootsnap plugin, which simply configures bootsnap for you:

class App < Dry::System::Container
  use :bootsnap # that's it
end

We’ve noticed a ~30% speed boost during booting the entire app, unfortunately there are some problems with bootsnap + byebug, so it is now recommended to turn it off if you’re debugging something.