newrelic_ia 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ == 0.2.0 2010-04-14
2
+
3
+ * Pull in memcached instrumentation from rubyorchard/memcached_newrelic_ia
4
+
1
5
  == 0.1.0 2009-06-15
2
6
 
3
7
  * 1 major enhancement:
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2009-2010 New Relic, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ 'Software'), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,23 +1,17 @@
1
1
  = New Relic Infrastructure Agent
2
2
 
3
- Bare bones Gem for collecting disk, cpu and IO statistics and
4
- sending them to the New Relic RPM application.
5
-
6
- This is a work in progress. We hope to add more statistics
7
- to the agent as well as more useful views on the RPM site
8
- for viewing these metrics.
9
-
10
- == DESCRIPTION:
3
+ Gem for collecting memcached, disk, cpu and IO statistics. Collected
4
+ stats are sent to the New Relic RPM application.
11
5
 
12
6
  Use this gem to collect statistics from a given host by running
13
7
  newrelic_ia -a as a daemon. This will contribute System/* metrics
14
8
  to your RPM console which can be viewed with custom dashboards.
15
9
 
16
- == SYNOPSIS:
10
+ == Synopsis
17
11
 
18
12
  newrelic_ia [ options ] aspect, aspect..
19
13
 
20
- aspect: one or more of 'iostat' or 'disk' (more to come)
14
+ aspect: one or more of 'iostat' or 'disk' or 'memcached' (more to come)
21
15
 
22
16
  -a, --all use all available aspects
23
17
  -v, --verbose debug output
@@ -26,15 +20,14 @@ to your RPM console which can be viewed with custom dashboards.
26
20
  --install create a default newrelic.yml
27
21
  -h, --help Show this help message.
28
22
 
29
- == REQUIREMENTS:
23
+ == Requirements
30
24
 
31
- * New Relic Agent version 2.9.2 or later
25
+ * New Relic Agent version 2.10.6 or later
32
26
  * Gold Subscription for creating and viewing custom dashboards
33
27
 
34
- == INSTALL:
28
+ == Install
35
29
 
36
- sudo gem sources -a http://gems.github.com
37
- sudo gem install newrelic-ia
30
+ sudo gem install newrelic_ia
38
31
 
39
32
  Once installed, run from the home directory of your Rails
40
33
  application, or create a separate working directory and run
@@ -44,27 +37,97 @@ application, or create a separate working directory and run
44
37
  to create a template newrelic.yml file you can use. Edit this file
45
38
  and substitute your license key and app_name value.
46
39
 
47
- == LICENSE:
48
-
49
- (The MIT License)
50
-
51
- Copyright (c) 2009 FIXME full name
52
-
53
- Permission is hereby granted, free of charge, to any person obtaining
54
- a copy of this software and associated documentation files (the
55
- 'Software'), to deal in the Software without restriction, including
56
- without limitation the rights to use, copy, modify, merge, publish,
57
- distribute, sublicense, and/or sell copies of the Software, and to
58
- permit persons to whom the Software is furnished to do so, subject to
59
- the following conditions:
60
-
61
- The above copyright notice and this permission notice shall be
62
- included in all copies or substantial portions of the Software.
40
+ specify memcached nodes in memcached-nodes.txt.
41
+
42
+ == Credits
43
+
44
+ Special thanks to Chandra Patni and Tony Ford of IGN for the Memcached
45
+ sampler.
46
+
47
+ == Memcached Details
48
+
49
+ Memcached statistics sampler collects subset of stats provided by
50
+ memcached daemon, once a minute. In addition it computes other stats
51
+ dervied from memcached stats. Also support stats derivatives over time
52
+ to compute rate etc. Specify Memcached nodes configuration in the
53
+ newrelic.yml file.
54
+
55
+ Memcached stats are reported for each node and also sample reports aggregated stats
56
+
57
+ === Stats Detail
58
+
59
+ uptime Number of seconds this server has been running
60
+ curr_items Current number of items stored by the server
61
+ total_items Total number of items stored by this server
62
+ ever since it started
63
+ bytes Current number of bytes used by this server to store items
64
+ curr_connections Number of open connections
65
+ total_connections Total number of connections opened since
66
+ the server started running
67
+ connection_structures Number of connection structures allocated by the server
68
+ cmd_get Cumulative number of retrieval requests
69
+ cmd_set Cumulative number of storage requests
70
+ get_hits Number of keys that have been requested and found present
71
+ get_misses Number of items that have been requested and not found
72
+ evictions Number of valid items removed from cache to free
73
+ memory for new items
74
+ bytes_read Total number of bytes read by this server from network
75
+ bytes_written Total number of bytes sent by this server to network
76
+ limit_maxbytes Number of bytes this server is allowed to use for storage
77
+ threads Number of worker threads requested
78
+
79
+ Derived Stats (computed stats):
80
+
81
+ free_maxbytes Number of free bytes this server has available for storage
82
+
83
+ Stats Derivatives (time derivatives of stats):
84
+
85
+ hit_ratio Percent of keys that have been requested and found present
86
+ miss_ratio Percent of keys that have been requested and found missing
87
+ rpm Requests per minutes
88
+ gpm Gets per minutes
89
+ hpm Hits per minutes
90
+ mpm Misses per minutes
91
+ spm Sets per minutes
92
+ fpm Flushes per minutes
93
+ epm Evictions per minutes
94
+
95
+
96
+ === Sample Custom View
97
+
98
+ Liquid template for NewRelic custom dashboard:
99
+
100
+ <div>
101
+ <div style="float: left; width: 50%;">
102
+ {% line_chart value:average_value title:'Cache Miss Ratio' metric:'System/Memcached/Miss Ratio' simple_tooltip:true label:segment_3 value_suffix:'%' %}
103
+ </div>
104
+ <div style="float: left; width: 50%;">
105
+ {% line_chart value:average_value title:'Cache Memory' regexp:'System/Memcached/(Bytes|Free Bytes|Limit Maxbytes)' simple_tooltip:true label:segment_3 %}
106
+ </div>
107
+ <br style="clear: both" />
108
+ </div>
109
+
110
+ <div style="padding-top: 20px">&nbsp;</div>
111
+
112
+ <div>
113
+ <div style="float: left; width: 50%;">
114
+ {% line_chart value:average_value title:'Cache Gets & Sets' regexp:'System/Memcached/(Gpm|Spm)' simple_tooltip:true label:segment_3 %}
115
+ </div>
116
+ <div style="float: left; width: 50%;">
117
+ {% line_chart value:average_value title:'Cache Misses, Flushes, & Evictions' regexp:'System/Memcached/(Mpm|Epm|Fpm)' simple_tooltip:true label:segment_3 %}
118
+ </div>
119
+ <br style="clear: both" />
120
+ </div>
121
+
122
+ <div style="padding-top: 20px">&nbsp;</div>
123
+
124
+ <div>
125
+ <div style="float: left; width: 50%;">
126
+ {% line_chart value:average_value title:'Active Connections' metric:'System/Memcached/Curr Connections' simple_tooltip:true hide_legend:true %}
127
+ </div>
128
+ <div style="float: left; width: 50%;">
129
+ {% line_chart value:average_value title:'Cache Objects' metric:'System/Memcached/Curr Items' simple_tooltip:true hide_legend:true %}
130
+ </div>
131
+ <br style="clear: both" />
132
+ </div>
63
133
 
64
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
65
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
66
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
67
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
68
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
69
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
70
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,43 +1,87 @@
1
- require 'rubygems'
2
- require 'echoe'
3
- %w[rake rake/clean fileutils rubigen].each { |f| require f }
4
- require File.dirname(__FILE__) + '/lib/newrelic_ia'
5
-
6
- GEM_NAME = "newrelic_ia"
7
- GEM_VERSION = NewRelic::IA::VERSION
8
- AUTHOR = "Bill Kayser"
9
- EMAIL = "bkayser@newrelic.com"
10
- HOMEPAGE = "http://www.newrelic.com"
11
- SUMMARY = "New Relic Gem for gathering system metrics"
12
- DESCRIPTION = <<EOF
13
- The New Relic Infrastructure Agent (IA) collects system metrics and transmits
14
- them to the RPM server where they can be viewed with custom dashboards.
15
- EOF
16
-
17
- # Generate all the Rake tasks
18
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
19
- Echoe.new('newrelic_ia', NewRelic::IA::VERSION) do |p|
20
- p.author = AUTHOR
21
- p.email = EMAIL
22
- p.summary = SUMMARY
23
- p.description = DESCRIPTION
24
- p.url = HOMEPAGE
25
- p.project = 'newrelic'
26
- p.need_tar_gz = false
27
- p.need_gem = true
28
- p.runtime_dependencies = [
29
- ['newrelic_rpm','>= 2.9.2'],
30
- ]
31
- p.development_dependencies = [
32
- #['newgem', ">= #{::Newgem::VERSION}"]
33
- ]
34
- p.bin_files = 'bin/newrelic_ia'
35
- p.test_pattern = "spec/*.rb"
36
- p.install_message = File.read('PostInstall.txt')
37
- p.ignore_pattern = %w[PostInstall.txt newrelic.yml]
38
- p.clean_pattern |= %w[**/.DS_Store tmp *.log]
39
- path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
40
- end
41
-
42
- Dir['tasks/**/*.rake'].each { |t| load t }
43
-
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require File.dirname(__FILE__) + '/lib/new_relic/ia/version.rb'
4
+ require 'rake/testtask'
5
+
6
+ GEM_NAME = "newrelic_ia"
7
+ GEM_VERSION = NewRelic::IA::VERSION
8
+ AUTHOR = "Bill Kayser"
9
+ EMAIL = "bkayser@newrelic.com"
10
+ HOMEPAGE = "http://www.newrelic.com"
11
+ SUMMARY = "New Relic Gem for gathering system metrics"
12
+ DESCRIPTION = <<EOF
13
+ The New Relic Infrastructure Agent (IA) collects system metrics and transmits
14
+ them to the RPM server where they can be viewed with custom dashboards.
15
+ EOF
16
+
17
+ # See http://www.rubygems.org/read/chapter/20
18
+ begin
19
+ require 'jeweler'
20
+ Jeweler::Tasks.new do |gem|
21
+ gem.name = GEM_NAME
22
+ gem.summary = SUMMARY
23
+ gem.description = DESCRIPTION
24
+ gem.email = EMAIL
25
+ gem.homepage = HOMEPAGE
26
+ gem.author = AUTHOR
27
+ gem.version = GEM_VERSION
28
+ gem.files = FileList['Rakefile', 'README*', 'CHANGELOG', 'spec/**/*','tasks/*', 'lib/**/*'].to_a
29
+ gem.test_files = FileList['spec/**/*.rb']
30
+ gem.rdoc_options <<
31
+ "--line-numbers" <<
32
+ "--inline-source" <<
33
+ "--title" << SUMMARY <<
34
+ "-m" << "README.rdoc"
35
+
36
+ gem.files.reject! { |fn| fn =~ /PostInstall.txt|pkg\/|rdoc\// }
37
+ gem.extra_rdoc_files = %w[CHANGELOG LICENSE README.rdoc bin/newrelic_ia]
38
+ gem.add_dependency 'newrelic_rpm', '>=2.10.6'
39
+ gem.post_install_message = File.read 'PostInstall.txt'
40
+ end
41
+ Jeweler::GemcutterTasks.new
42
+ rescue LoadError
43
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
44
+ end
45
+
46
+ load "#{File.dirname(__FILE__)}/tasks/rspec.rake"
47
+
48
+ task :manifest do
49
+ puts "Manifest task is no longer used since switching to jeweler."
50
+ end
51
+
52
+ begin
53
+ require 'rcov/rcovtask'
54
+ Rcov::RcovTask.new do |test|
55
+ test.libs << 'test'
56
+ test.pattern = 'spec/**/*.rb'
57
+ test.verbose = true
58
+ end
59
+ rescue LoadError
60
+ task :rcov do
61
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
62
+ end
63
+ end
64
+
65
+ require 'spec/rake/spectask'
66
+ Spec::Rake::SpecTask.new(:spec) do |spec|
67
+ spec.libs << 'lib' << 'spec'
68
+ spec.spec_files = FileList['spec/**/*_spec.rb']
69
+ end
70
+
71
+ task :spec => :check_dependencies
72
+
73
+ task :default => :spec
74
+
75
+ require 'rake/rdoctask'
76
+ Rake::RDocTask.new do |rdoc|
77
+ rdoc.title = SUMMARY
78
+ rdoc.main = "README.rdoc"
79
+ rdoc.rdoc_files << 'LICENSE' << 'README*' << 'CHANGELOG' << 'lib/**/*.rb' << 'bin/**/*'
80
+ rdoc.inline_source = true
81
+ end
82
+
83
+ begin
84
+ require 'sdoc_helpers'
85
+ rescue LoadError
86
+ puts "sdoc support not enabled. Please gem install sdoc-helpers."
87
+ end
@@ -3,10 +3,18 @@
3
3
  # Created on 2009-6-15.
4
4
  # Copyright (c) 2009. All rights reserved.
5
5
 
6
- require File.expand_path(File.dirname(__FILE__) + "/../lib/newrelic_ia")
7
-
6
+ begin
7
+ require 'newrelic_ia'
8
+ rescue LoadError
9
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
10
+ begin
11
+ require 'newrelic_ia'
12
+ rescue Exception => e
13
+ # No gem. Must be in development
14
+ require "#{File.dirname(__FILE__)}/../lib/newrelic_ia"
15
+ end
16
+ end
8
17
  require "new_relic/ia/cli"
9
-
10
18
  status = NewRelic::IA::CLI.execute(STDOUT, ARGV)
11
19
  exit status if status
12
20
  # if execute returned nil, we are running forever:
@@ -1,104 +1,157 @@
1
1
  require 'optparse'
2
2
  require 'logger'
3
3
 
4
- class NewRelic::IA::CLI
5
-
6
- LOGFILE = "newrelic_ia.log"
7
- @log = Logger.new(STDOUT)
4
+ module NewRelic::IA
5
+
6
+ class InitError < StandardError; end
8
7
 
9
- class << self
10
- attr_accessor :log
11
- def level= l
12
- @log.level = l
13
- end
8
+ class CLI
14
9
 
15
- # Run the command line args. Return nil if running
16
- # or an exit status if not.
17
- def execute(stdout, arguments=[])
18
- @aspects = []
19
- @log = Logger.new LOGFILE
20
- @log_level = Logger::INFO
21
- parser = OptionParser.new do |opts|
22
- opts.banner = <<-BANNER.gsub(/^ */,'')
23
-
10
+ LOGFILE = "newrelic_ia.log"
11
+
12
+ class << self
13
+
14
+ def log
15
+ @log ||= Logger.new LOGFILE
16
+ end
17
+
18
+ def level= l
19
+ log.level = l
20
+ end
21
+
22
+ # Run the command line args. Return nil if running
23
+ # or an exit status if not.
24
+ def execute(stdout, arguments=[])
25
+ @aspects = []
26
+ parser = OptionParser.new do |opts|
27
+ opts.banner = <<-BANNER.gsub(/^ */,'')
28
+ New Relic Infrastructure Agent (IA) version #{NewRelic::IA::VERSION}
24
29
  Monitor different aspects of your environment with New Relic RPM.
25
30
 
26
31
  Usage: #{File.basename($0)} [ options ] aspect, aspect..
27
32
 
28
- aspect: one or more of 'iostat' or 'disk' (more to come)
33
+ aspect: one or more of 'memcached', 'iostat' or 'disk' (more to come)
29
34
  BANNER
30
- opts.separator ""
31
- opts.on("-a", "--all",
32
- "use all available aspects") { @aspects = %w[iostat disk] }
33
- opts.on("-v", "--verbose",
34
- "debug output") { @log_level = Logger::DEBUG }
35
- opts.on("-q", "--quiet",
36
- "quiet output") { @log_level = Logger::ERROR }
37
- opts.on("-e", "--environment=ENV",
38
- "use ENV section in newrelic.yml") { |e| @env = e }
39
- opts.on("--install",
40
- "create a default newrelic.yml") { |e| return self.install(stdout) }
41
-
42
- opts.on("-h", "--help",
43
- "Show this help message.") { stdout.puts "#{opts}\n"; return 0 }
44
- begin
45
- args = opts.parse! arguments
46
- unless args.empty?
47
- @aspects = args
35
+ opts.separator ""
36
+ opts.on("-a", "--all",
37
+ "use all available aspects") { @aspects = %w[iostat disk memcached] }
38
+ opts.on("-v", "--verbose",
39
+ "debug output") { NewRelic::IA::CLI.log.level = Logger::DEBUG }
40
+ opts.on("-q", "--quiet",
41
+ "quiet output") { NewRelic::IA::CLI.log.level = Logger::ERROR }
42
+ opts.on("-e", "--environment=ENV",
43
+ "use ENV section in newrelic.yml") { |e| @env = e }
44
+ opts.on("--install",
45
+ "create a default newrelic.yml") { |e| return self.install(stdout) }
46
+
47
+ opts.on("-h", "--help",
48
+ "Show this help message.") { stdout.puts "#{opts}\n"; return 0 }
49
+ begin
50
+ args = opts.parse! arguments
51
+ unless args.empty?
52
+ @aspects = args
53
+ end
54
+ rescue => e
55
+ stdout.puts e
56
+ stdout.puts opts
57
+ return 1
58
+ end
59
+ end
60
+ @aspects.delete_if do |aspect|
61
+ unless self.instance_methods(false).include? aspect
62
+ stdout.puts "Unknown aspect: #{aspect}"
63
+ true
48
64
  end
49
- rescue => e
50
- stdout.puts e
51
- stdout.puts opts
65
+ end
66
+ if @aspects.empty?
67
+ stdout.puts "No aspects specified."
68
+ stdout.puts parser
52
69
  return 1
53
70
  end
54
- end
55
- @aspects.delete_if do |aspect|
56
- unless self.instance_methods(false).include? aspect
57
- stdout.puts "Unknown aspect: #{aspect}"
58
- true
71
+ require_newrelic_rpm
72
+ NewRelic::Agent.manual_start :env => @env, :monitor_mode => true, :log => self.log
73
+ # connected? due in a future version
74
+ if not (NewRelic::Agent.instance.connected? rescue true)
75
+ raise InitError, "Unable to connect to RPM server. Agent not started."
59
76
  end
60
- end
61
- if @aspects.empty?
62
- stdout.puts "No aspects specified."
63
- stdout.puts parser
77
+ cli = new
78
+ @aspects.each do | aspect |
79
+ cli.send aspect
80
+ end
81
+ return nil
82
+ rescue InitError => e
83
+ stdout.puts e.message
64
84
  return 1
65
85
  end
66
86
 
67
- @log.level = @log_level
68
- gem 'newrelic_rpm'
69
- require 'newrelic_rpm'
70
- NewRelic::Agent.manual_start :log => @log, :env => @env, :enabled => true
71
- cli = new
72
- @aspects.each do | aspect |
73
- cli.send aspect
87
+ end
88
+ # Aspect definitions
89
+ def iostat # :nodoc:
90
+ self.class.log.info "Starting iostat monitor..."
91
+ require 'new_relic/ia/iostat_reader'
92
+ reader = NewRelic::IA::IostatReader.new
93
+ Thread.new { reader.run }
94
+ end
95
+
96
+ def disk
97
+ self.class.log.info "Starting disk sampler..."
98
+ require 'new_relic/ia/disk_sampler'
99
+ NewRelic::Agent.instance.stats_engine.add_harvest_sampler NewRelic::IA::DiskSampler.new
100
+ end
101
+
102
+ def memcached
103
+ require 'new_relic/ia/memcached_sampler'
104
+ s = NewRelic::IA::MemcachedSampler.new
105
+ s.check
106
+ NewRelic::Agent.instance.stats_engine.add_harvest_sampler s
107
+ end
108
+
109
+ private
110
+
111
+ def log
112
+ self.class.log
113
+ end
114
+
115
+ def self.require_newrelic_rpm
116
+ begin
117
+ require 'newrelic_rpm'
118
+ rescue Exception => e
119
+ begin
120
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
121
+ require 'newrelic_rpm'
122
+ rescue LoadError
123
+ $stderr.puts "Unable to load required gem newrelic_rpm"
124
+ $stderr.puts "Try `gem install newrelic_rpm`"
125
+ Kernel.exit 1
126
+ end
74
127
  end
75
- return nil
76
128
  end
77
- end
78
- # Aspect definitions
79
- def iostat # :nodoc:
80
- self.class.log.info "Starting iostat monitor..."
81
- require 'new_relic/ia/iostat_reader'
82
- reader = NewRelic::IA::IostatReader.new
83
- Thread.new { reader.run }
84
- end
85
-
86
- def disk
87
- self.class.log.info "Starting disk sampler..."
88
- require 'new_relic/ia/disk_sampler'
89
- NewRelic::Agent.instance.stats_engine.add_harvest_sampler NewRelic::IA::DiskSampler.new
90
- end
91
-
92
- private
93
- def self.install(stdio)
94
- if File.exists? "newrelic.yml"
95
- stdio.puts "A newrelic.yml file already exists. Please remove it before installing another."
96
- 1 # error
97
- else
98
- FileUtils.copy File.join(File.dirname(__FILE__), "newrelic.yml"), "."
99
- stdio.puts "A newrelic.yml template was copied to #{File.expand_path('.')}."
100
- stdio.puts "Please add a license key to the file before starting."
101
- 0 # normal
129
+
130
+ def self.install stdout
131
+ require_newrelic_rpm
132
+ if NewRelic::VersionNumber.new(NewRelic::VERSION::STRING) < '2.12'
133
+ if File.exists? "newrelic.yml"
134
+ stdout.puts "A newrelic.yml file already exists. Please remove it before installing another."
135
+ return 1 # error
136
+ else
137
+ FileUtils.copy File.join(File.dirname(__FILE__), "newrelic.yml"), "."
138
+ stdout.puts "A newrelic.yml template was copied to #{File.expand_path('.')}."
139
+ stdout.puts "Please add a license key to the file before starting."
140
+ return 0 # normal
141
+ end
142
+ else
143
+ begin
144
+ require 'new_relic/command'
145
+ cmd = NewRelic::Command::Install.new \
146
+ :src_file => File.join(File.dirname(__FILE__), "newrelic.yml"),
147
+ :generated_for_user => "Generated on #{Time.now.strftime('%b %d, %Y')}, from version #{NewRelic::IA::VERSION}"
148
+ cmd.run
149
+ 0 # normal
150
+ rescue NewRelic::Command::CommandFailure => e
151
+ stdout.puts e.message
152
+ 1 # error
153
+ end
154
+ end
102
155
  end
103
156
  end
104
- end
157
+ end