Today I was writing a little wrapper around running shell commands, and wanted to wrap an ActiveSupport::Notifications.instrument
call around Process.spawn
. What I had looks something like this:
def spawn(params)
env, command_line = prepare(params)
ActiveSupport::Notifications.instrument('shell_command.spawn', env: env, command_line: command_line) do |payload|
pid = Process.spawn(env, command_line)
Process.wait pid
payload[:exitstatus] = $?.exitstatus
payload[:termsig] = $?.termsig
end
end
I checked and it seems that ActiveSupport::Notifications
and the Instrumenter
class are careful to pass the payload unmodified to the instrumented block, but the Event
class calls payload.dup
on initialization.
I can’t see any reason to forward the payload to the instrumented block if you aren’t allowed to modify it, so I would like to remove the .dup
call and document the (currently undocumented) block parameter.
However, that line has been there for 11 years, and the payload block parameter is not documented, so maybe this is a really bad idea. In that case I’d love it if somebody could tell me how to get the behaviour I want, even if it’s more verbose/complicated for me to write.