module Skylight::Core::Railtie

@api private

Public Class Methods

config_class() click to toggle source
# File lib/skylight/core/railtie.rb, line 12
def self.config_class; Config end
gem_name() click to toggle source
# File lib/skylight/core/railtie.rb, line 14
def self.gem_name; "Skylight" end
log_file_name() click to toggle source
# File lib/skylight/core/railtie.rb, line 15
def self.log_file_name; "skylight" end
middleware_class() click to toggle source
# File lib/skylight/core/railtie.rb, line 13
def self.middleware_class; Middleware end
namespace() click to toggle source
# File lib/skylight/core/railtie.rb, line 16
def self.namespace; Skylight end
root_key() click to toggle source

rubocop:disable Style/SingleLineMethods, Layout/EmptyLineBetweenDefs

# File lib/skylight/core/railtie.rb, line 11
def self.root_key; :skylight end
version() click to toggle source
# File lib/skylight/core/railtie.rb, line 17
def self.version; Skylight::Core::VERSION end

Private Instance Methods

activate?(_sk_config) click to toggle source
# File lib/skylight/core/railtie.rb, line 121
def activate?(_sk_config)
  key = "#{self.class.config_class.env_prefix}ENABLED"
  if ENV.key?(key)
    ENV[key] !~ /^false$/i
  else
    environments.include?(Rails.env.to_s)
  end
end
config_path(app) click to toggle source
# File lib/skylight/core/railtie.rb, line 113
def config_path(app)
  File.expand_path(sk_rails_config.config_path, app.root)
end
configure_logging(config, app) click to toggle source
# File lib/skylight/core/railtie.rb, line 91
def configure_logging(config, app)
  if (logger = sk_rails_config(app).logger)
    config.logger = logger
  else
    # Configure the log file destination
    if (log_file = sk_rails_config(app).log_file)
      config["log_file"] = log_file
    elsif !config.key?("log_file") && !config.on_heroku?
      config["log_file"] = File.join(Rails.root, "log/#{self.class.log_file_name}.log")
    end

    # Configure the log level
    if (level = sk_rails_config(app).log_level)
      config["log_level"] = level
    elsif !config.key?("log_level")
      if (level = app.config.log_level)
        config["log_level"] = level
      end
    end
  end
end
development_warning() click to toggle source
# File lib/skylight/core/railtie.rb, line 27
def development_warning
  "#{log_prefix} Running #{self.class.gem_name} in development mode. No data will be reported until you deploy your app."
end
environments() click to toggle source
# File lib/skylight/core/railtie.rb, line 117
def environments
  Array(sk_rails_config.environments).map { |e| e && e.to_s }.compact
end
existent_paths(paths) click to toggle source
# File lib/skylight/core/railtie.rb, line 68
def existent_paths(paths)
  paths.respond_to?(:existent) ? paths.existent : paths.select { |f| File.exist?(f) }
end
insert_middleware(app, config) click to toggle source
# File lib/skylight/core/railtie.rb, line 139
def insert_middleware(app, config)
  if middleware_position.key?(:after)
    app.middleware.insert_after(middleware_position[:after], self.class.middleware_class, config: config)
  elsif middleware_position.key?(:before)
    app.middleware.insert_before(middleware_position[:before], self.class.middleware_class, config: config)
  else
    raise "The middleware position you have set is invalid. Please be sure `config.#{self.class.root_key}.middleware_position` is set up correctly."
  end
end
load_probes() click to toggle source
# File lib/skylight/core/railtie.rb, line 130
def load_probes
  probes = sk_rails_config.probes || []
  Probes.probe(*probes)
end
load_skylight_config(app) click to toggle source
# File lib/skylight/core/railtie.rb, line 72
def load_skylight_config(app)
  path = config_path(app)
  path = nil unless File.exist?(path)

  unless (tmp = app.config.paths["tmp"].first)
    Rails.logger.error "#{log_prefix} tmp directory missing from rails configuration"
    return nil
  end

  config = self.class.config_class.load(file: path, environment: Rails.env.to_s)
  config[:root] = Rails.root

  configure_logging(config, app)

  config[:'daemon.sockdir_path'] ||= tmp
  config[:'normalizers.render.view_paths'] = existent_paths(app.config.paths["app/views"]) + [Rails.root.to_s]
  config
end
log_prefix() click to toggle source
# File lib/skylight/core/railtie.rb, line 23
def log_prefix
  "[#{self.class.gem_name.upcase}] [#{self.class.version}]"
end
log_warning(config, msg) click to toggle source
# File lib/skylight/core/railtie.rb, line 60
def log_warning(config, msg)
  if config
    config.alert_logger.warn(msg)
  else
    Rails.logger.warn(msg)
  end
end
middleware_position() click to toggle source
# File lib/skylight/core/railtie.rb, line 135
def middleware_position
  sk_rails_config.middleware_position.is_a?(Hash) ? sk_rails_config.middleware_position.symbolize_keys : sk_rails_config.middleware_position
end
run_initializer(app) click to toggle source
# File lib/skylight/core/railtie.rb, line 31
def run_initializer(app)
  # Load probes even when agent is inactive to catch probe related bugs sooner
  load_probes

  config = load_skylight_config(app)

  if activate?(config)
    if config
      if self.class.namespace.start!(config)
        set_middleware_position(app, config)
        Rails.logger.info "#{log_prefix} #{self.class.gem_name} agent enabled"
      else
        Rails.logger.info "#{log_prefix} Unable to start, see the #{self.class.gem_name} logs for more details"
      end
    end
  elsif Rails.env.development?
    # FIXME: The CLI isn't part of core so we should change this message
    unless config.user_config.disable_dev_warning?
      log_warning config, development_warning
    end
  elsif !Rails.env.test?
    unless config.user_config.disable_env_warning?
      log_warning config, "#{log_prefix} You are running in the #{Rails.env} environment but haven't added it to config.#{self.class.root_key}.environments, so no data will be sent to #{config.class.service_name} servers."
    end
  end
rescue ConfigError => e
  Rails.logger.error "#{log_prefix} #{e.message}; disabling #{self.class.gem_name} agent"
end
set_middleware_position(app, config) click to toggle source
# File lib/skylight/core/railtie.rb, line 149
def set_middleware_position(app, config)
  if middleware_position.is_a?(Integer)
    app.middleware.insert middleware_position, self.class.middleware_class, config: config
  elsif middleware_position.is_a?(Hash) && middleware_position.keys.count == 1
    insert_middleware(app, config)
  elsif middleware_position.nil?
    app.middleware.insert 0, self.class.middleware_class, config: config
  else
    raise "The middleware position you have set is invalid. Please be sure `config.#{self.class.root_key}.middleware_position` is set up correctly."
  end
end
sk_rails_config(target = self) click to toggle source
# File lib/skylight/core/railtie.rb, line 161
def sk_rails_config(target = self)
  target.config.send(self.class.root_key)
end