lib/elastic_apm/railtie.rb



# frozen_string_literal: true

module ElasticAPM
  # @api private
  class Railtie < Rails::Railtie
    config.elastic_apm = ActiveSupport::OrderedOptions.new
    Config::DEFAULTS.each { |option, value| config.elastic_apm[option] = value }

    initializer 'elastic_apm.initialize' do |app|
      config = Config.new app.config.elastic_apm do |c|
        c.app = app
      end

      file_config = load_config(app)
      file_config.each do |option, value|
        config.send(:"#{option}=", value)
      end

      begin
        ElasticAPM.start config

        app.middleware.insert 0, Middleware
      rescue StandardError => e
        Rails.logger.error "#{Log::PREFIX}Failed to start: #{e.message}"
        Rails.logger.debug e.backtrace.join("\n")
      end
    end

    config.after_initialize do
      require 'elastic_apm/injectors/action_dispatch'
    end

    private

    def load_config(app)
      config_path = app.root.join('config', 'elastic_apm.yml')
      return {} unless File.exist?(config_path)

      YAML.load_file(config_path) || {}
    end
  end
end