newrelic_ia 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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