Class: ScoutApm::Environment

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/scout_apm/environment.rb

Constant Summary collapse

STDOUT_LOGGER =
begin
  l = Logger.new(STDOUT)
  l.level = Logger::INFO
  l
end
SERVER_INTEGRATIONS =

I’ve put Thin and Webrick last as they are often used in development and included in Gemfiles but less likely used in production.

[
  ScoutApm::ServerIntegrations::Passenger.new(STDOUT_LOGGER),
  ScoutApm::ServerIntegrations::Unicorn.new(STDOUT_LOGGER),
  ScoutApm::ServerIntegrations::Rainbows.new(STDOUT_LOGGER),
  ScoutApm::ServerIntegrations::Puma.new(STDOUT_LOGGER),
  ScoutApm::ServerIntegrations::Thin.new(STDOUT_LOGGER),
  ScoutApm::ServerIntegrations::Webrick.new(STDOUT_LOGGER),
  ScoutApm::ServerIntegrations::Null.new(STDOUT_LOGGER), # must be last
]
BACKGROUND_JOB_INTEGRATIONS =
[
  ScoutApm::BackgroundJobIntegrations::Resque.new,
  ScoutApm::BackgroundJobIntegrations::Sidekiq.new,
  ScoutApm::BackgroundJobIntegrations::DelayedJob.new,
]
FRAMEWORK_INTEGRATIONS =
[
  ScoutApm::FrameworkIntegrations::Rails2.new,
  ScoutApm::FrameworkIntegrations::Rails3Or4.new,
  ScoutApm::FrameworkIntegrations::Sinatra.new,
  ScoutApm::FrameworkIntegrations::Ruby.new, # Fallback if none match
]
PLATFORM_INTEGRATIONS =
[
  ScoutApm::PlatformIntegrations::Heroku.new,
  ScoutApm::PlatformIntegrations::CloudFoundry.new,
  ScoutApm::PlatformIntegrations::Server.new,
]

Instance Method Summary collapse

Instance Method Details

#app_serverObject

App server’s name (symbol)



134
135
136
# File 'lib/scout_apm/environment.rb', line 134

def app_server
  app_server_integration.name
end

#app_server_integration(force = false) ⇒ Object

Returns the whole integration object This needs to be improved. Frequently, multiple app servers gem are present and which ever is checked first becomes the designated app server.

Next step: (1) list out all detected app servers (2) install hooks for those that need it (passenger, rainbows, unicorn).



128
129
130
131
# File 'lib/scout_apm/environment.rb', line 128

def app_server_integration(force=false)
  @app_server = nil if force
  @app_server ||= SERVER_INTEGRATIONS.detect{ |integration| integration.present? }
end

#application_nameObject



61
62
63
64
65
# File 'lib/scout_apm/environment.rb', line 61

def application_name
  Agent.instance.context.config.value("name") ||
    framework_integration.application_name ||
    "App"
end

#background_job_integrationsObject



144
145
146
147
148
149
150
# File 'lib/scout_apm/environment.rb', line 144

def background_job_integrations
  if Agent.instance.context.config.value("enable_background_jobs")
    @background_job_integrations ||= BACKGROUND_JOB_INTEGRATIONS.select {|integration| integration.present?}
  else
    []
  end
end

#database_engineObject



67
68
69
# File 'lib/scout_apm/environment.rb', line 67

def database_engine
  framework_integration.database_engine
end

#envObject



45
46
47
# File 'lib/scout_apm/environment.rb', line 45

def env
  @env ||= framework_integration.env
end

#forking?Boolean

If forking, don’t start worker thread in the master process. Since it’s started as a Thread, it won’t survive the fork.

Returns:

  • (Boolean)


140
141
142
# File 'lib/scout_apm/environment.rb', line 140

def forking?
  app_server_integration.forking? || (background_job_integration && background_job_integration.forking?)
end

#frameworkObject



49
50
51
# File 'lib/scout_apm/environment.rb', line 49

def framework
  framework_integration.name
end

#framework_integrationObject



53
54
55
# File 'lib/scout_apm/environment.rb', line 53

def framework_integration
  @framework ||= FRAMEWORK_INTEGRATIONS.detect{ |integration| integration.present? }
end

#framework_rootObject



100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/scout_apm/environment.rb', line 100

def framework_root
  if override_root = Agent.instance.context.config.value("application_root")
    return override_root
  end
  if framework == :rails
    RAILS_ROOT.to_s
  elsif framework == :rails3_or_4
    Rails.root
  elsif framework == :sinatra
    Sinatra::Application.root || "."
  else
    '.'
  end
end

#git_revisionObject



119
120
121
# File 'lib/scout_apm/environment.rb', line 119

def git_revision
  @git_revision ||= ScoutApm::GitRevision.new(Agent.instance.context)
end

#hostnameObject



115
116
117
# File 'lib/scout_apm/environment.rb', line 115

def hostname
  @hostname ||= Agent.instance.context.config.value("hostname") || platform_integration.hostname
end

#interactive?Boolean

If both stdin & stdout are interactive and the Rails::Console constant is defined

Returns:

  • (Boolean)


153
154
155
# File 'lib/scout_apm/environment.rb', line 153

def interactive?
  defined?(::Rails::Console) && $stdout.isatty && $stdin.isatty
end

#jruby?Boolean

Returns:

  • (Boolean)


163
164
165
# File 'lib/scout_apm/environment.rb', line 163

def jruby?
  defined?(JRuby)
end

#osObject

Returns a string representation of the OS (ex: darwin, linux)



180
181
182
183
184
185
186
187
188
189
# File 'lib/scout_apm/environment.rb', line 180

def os
  return @os if @os
  raw_os = RbConfig::CONFIG['target_os']
  match = raw_os.match(/([a-z]+)/)
  if match
    @os = match[1]
  else
    @os = raw_os
  end
end

#platform_integrationObject



57
58
59
# File 'lib/scout_apm/environment.rb', line 57

def platform_integration
  @platform ||= PLATFORM_INTEGRATIONS.detect{ |integration| integration.present? }
end

#processorsObject



75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/scout_apm/environment.rb', line 75

def processors
  @processors ||= begin
                    proc_file = '/proc/cpuinfo'
                    processors = if !File.exist?(proc_file)
                                   1
                                 else
                                   lines = File.read("/proc/cpuinfo").lines.to_a
                                   lines.grep(/^processor\s*:/i).size
                                 end
                    [processors, 1].compact.max
                  end
end

#raw_database_adapterObject



71
72
73
# File 'lib/scout_apm/environment.rb', line 71

def raw_database_adapter
  framework_integration.raw_database_adapter
end

#rootObject



96
97
98
# File 'lib/scout_apm/environment.rb', line 96

def root
  @root ||= framework_root
end

#rubinius?Boolean

ruby checks

Returns:

  • (Boolean)


159
160
161
# File 'lib/scout_apm/environment.rb', line 159

def rubinius?
  RUBY_VERSION =~ /rubinius/i
end

#ruby_187?Boolean

Returns:

  • (Boolean)


171
172
173
# File 'lib/scout_apm/environment.rb', line 171

def ruby_187?
  @ruby_187 ||= defined?(RUBY_VERSION) && RUBY_VERSION.match(/^1\.8\.7/)
end

#ruby_19?Boolean

Returns:

  • (Boolean)


167
168
169
# File 'lib/scout_apm/environment.rb', line 167

def ruby_19?
  @ruby_19 ||= defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby" && RUBY_VERSION.match(/^1\.9/)
end

#ruby_2?Boolean

Returns:

  • (Boolean)


175
176
177
# File 'lib/scout_apm/environment.rb', line 175

def ruby_2?
  @ruby_2 ||= defined?(RUBY_VERSION) && RUBY_VERSION.match(/^2/)
end

#scm_subdirectoryObject



88
89
90
91
92
93
94
# File 'lib/scout_apm/environment.rb', line 88

def scm_subdirectory
  @scm_subdirectory ||= if Agent.instance.context.config.value('scm_subdirectory').empty?
    ''
  else
    Agent.instance.context.config.value('scm_subdirectory').sub(/^\//, '') # Trim any leading slash
  end
end

#sinatra?Boolean

framework checks

Returns:

  • (Boolean)


193
194
195
# File 'lib/scout_apm/environment.rb', line 193

def sinatra?
  framework_integration.name == :sinatra
end