Instrumental / instrumental_agent-ruby

Ruby Agent for Instrumental Application Monitoring
http://instrumentalapp.com
MIT License
58 stars 5 forks source link

FrozenError exception raised instantiating agent in Rails 6.1.1 #68

Open cbatson opened 3 years ago

cbatson commented 3 years ago

Using Ruby 3.0 and Rails 6.1.1:

root@3353f515ae84:/gwf/app# bundle exec rails c
/usr/local/bundle/bundler/gems/instrumental_agent-ruby-e6b27a2199d2/lib/instrumental/agent.rb:18: warning: Socket.gethostbyname is deprecated; use Addrinfo.getaddrinfo instead.
Loading development environment (Rails 6.1.1)
irb(main):001:0> require 'instrumental_agent'
=> false
irb(main):002:0> agent = Instrumental::Agent.new('foo', enabled: false)
Traceback (most recent call last):
        2: from (irb):2:in `<main>'
        1: from (irb):2:in `new'
FrozenError (can't modify frozen Array: [Metrician::Middleware::RequestTiming, Rack::ContentLength, ActionDispatch::HostAuthorization, Rack::Sendfile, ActionDispatch::Static, ActionDispatch::Executor, ActiveSupport::Cache::Strategy::LocalCache::Middleware, Rack::Runtime, ActionDispatch::RequestId, ActionDispatch::RemoteIp, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::DebugExceptions, ActionDispatch::ActionableExceptions, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, Rack::Head, Rack::ConditionalGet, Rack::ETag, Metrician::Middleware::ApplicationTiming])
cbatson commented 3 years ago

Can work around by disabling metrician:

irb(main):003:0> agent = Instrumental::Agent.new('foo', enabled: false, metrician: false)
=> #<Instrumental::Agent:0x00005646207d61f0 @api_key="foo", @host="collector.instrumentalapp.com", @port=80...
jason-o-matic commented 3 years ago

We'll take a look, but off the top of my head does it work if you load the agent earlier in the rails startup process? It looks like something during initialization is freezing the middleware array, so if the agent is loaded before that happens it might work.