fiveruns-dash-datamapper 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,90 @@
1
+ = FiveRuns Dash recipe for DataMapper
2
+
3
+ Provides a Ruby API to push metrics from applications using DataMapper to the FiveRuns Dash service, http://dash.fiveruns.com, currently in beta.
4
+
5
+ You'll need a Dash account before using this library.
6
+
7
+ == Installation
8
+
9
+ This library is released as a gem from the official repository at http://github.com/fiveruns/dash-datamapper
10
+
11
+ sudo gem install fiveruns-dash-datamapper --source http://gems.github.com
12
+
13
+ == Compatibility
14
+
15
+ Currently only DataObject adapters are supported.
16
+
17
+ == Configuration
18
+
19
+ Metrics in this recipe require a 'total_time' option be provided when the recipe is added; this option should indicate the metric to use when calculating % of utilization:
20
+
21
+ * For web applications, this is probably the total time of a request (ie, request_time)
22
+ * For daemons, this is likely a processing cycle (eg, proc_time)
23
+
24
+ Known issues: The metric name is not currently namespaced by recipe URL; although collision is unlikely, if your 'total_time' setting is for a metric that's present in more than one recipe, you may encounter problems.
25
+
26
+ Note: The metric selected must be `marked', ie:
27
+
28
+ recipe.time :response_time, :method => 'Request#dispatch_action',
29
+ :mark => true
30
+ Example:
31
+
32
+ other_recipe.add_recipe :datamapper,
33
+ :url => 'http://dash.fiveruns.com',
34
+ :total_time => 'response_time'
35
+
36
+ == Usage
37
+
38
+ See the Dash Ruby support pages http://support.fiveruns.com/faqs/dash/ruby for more information on how to use this library.
39
+
40
+ == Authors
41
+
42
+ The FiveRuns Development Team & Dash community
43
+
44
+ == Dependencies
45
+
46
+ * The fiveruns-dash-ruby gem (see http://github.com/fiveruns/dash-ruby)
47
+ * The json gem (as a dependency for fiveruns-dash-ruby)
48
+
49
+ == Platforms
50
+
51
+ This library has only been tested on OSX and Linux. See the notes for fiveruns-dash-ruby for more information: http://github.com/fiveruns/dash-ruby
52
+
53
+ == Contributing
54
+
55
+ As an open source project, we welcome community contributions!
56
+
57
+ The best way to contribute is by sending pull requests via GitHub. The official repository for this project is:
58
+
59
+ http://github.com/fiveruns/dash-datamapper
60
+
61
+ == Support
62
+
63
+ Please join the dash-users Google group, http://groups.google.com/group/dash-users
64
+
65
+ You can also contact us via Twitter, Campfire, or email; see the main help page, http://support.fiveruns.com, for details.
66
+
67
+ == License
68
+
69
+ # (The FiveRuns License)
70
+ #
71
+ # Copyright (c) 2006-2008 FiveRuns Corporation
72
+ #
73
+ # Permission is hereby granted, free of charge, to any person obtaining
74
+ # a copy of this software and associated documentation files (the
75
+ # 'Software'), to deal in the Software without restriction, including
76
+ # without limitation the rights to use, copy, modify, merge, publish,
77
+ # distribute, sublicense, and/or sell copies of the Software, and to
78
+ # permit persons to whom the Software is furnished to do so, subject to
79
+ # the following conditions:
80
+ #
81
+ # The above copyright notice and this permission notice shall be
82
+ # included in all copies or substantial portions of the Software.
83
+ #
84
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
85
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
86
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
87
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
88
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
89
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
90
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 6
3
+ :patch: 0
4
+ :major: 0
@@ -0,0 +1,2 @@
1
+ # Stub for gem dependency schemes
2
+ require 'fiveruns/dash/datamapper'
@@ -0,0 +1,11 @@
1
+ gem 'fiveruns-dash-ruby'
2
+ require 'fiveruns/dash'
3
+
4
+ require 'fiveruns/dash/recipes/datamapper'
5
+
6
+ module Fiveruns::Dash::DataMapper
7
+ DB_TARGETS = %w(DataMapper::Adapters::DataObjectsAdapter#execute)
8
+ ORM_TARGETS = %w(read_many read_one update delete).map do |meth|
9
+ "DataMapper::Repository##{meth}"
10
+ end
11
+ end
@@ -0,0 +1,41 @@
1
+ Fiveruns::Dash.register_recipe :datamapper, :url => 'http://dash.fiveruns.com' do |recipe|
2
+
3
+ recipe.time :db_time, 'Database Time', :methods => Fiveruns::Dash::DataMapper::DB_TARGETS
4
+ recipe.time :orm_time, 'DataMapper Time', :methods => Fiveruns::Dash::DataMapper::ORM_TARGETS,
5
+ :reentrant => true
6
+ recipe.added do |settings|
7
+
8
+ # We need a way to get the total time for a request/operation so that we can
9
+ # calculate the relative percentage used by AR/DB.
10
+ if settings[:total_time]
11
+
12
+ total_time = settings[:total_time].to_s
13
+
14
+ Fiveruns::Dash.logger.debug "Limiting FiveRuns Dash DataMapper metrics to within #{total_time}"
15
+ # Limit timing
16
+ recipe.metrics.each do |metric|
17
+ if %w(db_time orm_time).include?(metric.name) && metric.recipe.url == 'http://dash.fiveruns.com'
18
+ metric.options[:only_within] = total_time
19
+ end
20
+ end
21
+
22
+ recipe.percentage :orm_util, 'DataMapper Utilization', :sources => ["orm_time", total_time] do |orm_time, all_time|
23
+ all_time == 0 ? 0 : (orm_time / all_time) * 100.0
24
+ end
25
+ recipe.percentage :db_util, 'Database Utilization', :sources => ["db_time", total_time] do |db_time, all_time|
26
+ all_time == 0 ? 0 : (db_time / all_time) * 100.0
27
+ end
28
+
29
+ else
30
+
31
+ Fiveruns::Dash.logger.error [
32
+ "Could not add some metrics from the FiveRuns Dash `datamapper' recipe to the configuration;",
33
+ "Please provide a :total_time metric name setting when adding the recipe.",
34
+ "For more information, see the fiveruns-dash-datamapper README"
35
+ ].join("\n")
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,111 @@
1
+ require File.dirname(__FILE__) << "/test_helper"
2
+
3
+ Fiveruns::Dash.logger.level = Logger::FATAL
4
+
5
+ class DataMapperTest < Test::Unit::TestCase
6
+
7
+ class TestModel
8
+ include DataMapper::Resource
9
+ property :id, Serial
10
+ property :name, String
11
+ end
12
+
13
+ class TestEngine
14
+ def doit
15
+ sleep 1
16
+ 2.times do
17
+ t = TestModel.create(:name => 'foo')
18
+ t.destroy
19
+ end
20
+ end
21
+
22
+ def conn
23
+ # FIXME: We need a way to suspend execution temporarily
24
+ # for a specific w/in the DB; sqlite doesn't support sleep()
25
+ # ... otherwise we need to mock `execute'
26
+ TestModel.repository.adapter.execute("select sleep(1)")
27
+ end
28
+
29
+ def entry(meth)
30
+ send(meth)
31
+ end
32
+ end
33
+
34
+
35
+ context "Metric" do
36
+
37
+ setup do
38
+ DataMapper.setup(:default, 'sqlite3::memory:')
39
+ DataMapper.auto_migrate!
40
+ end
41
+
42
+ should "collect basic ORM metrics" do
43
+ scenario do
44
+ TestEngine.new.entry(:doit)
45
+
46
+ data = Fiveruns::Dash.session.data
47
+ assert metric('test_time', data) > 1.0
48
+ assert metric('orm_util', data) > metric('db_util', data)
49
+ assert metric('db_util', data) < 5
50
+ end
51
+ end
52
+
53
+ should "collect DB metrics" do
54
+ scenario do
55
+ TestEngine.new.entry(:conn)
56
+
57
+ data = Fiveruns::Dash.session.data
58
+ assert metric('test_time', data) > 1.0
59
+ assert metric('test_time', data) < 1.1
60
+ assert metric('db_time', data) > 1.0
61
+ assert metric('db_time', data) < 1.1
62
+ assert metric('db_util', data) > 90.0
63
+ assert metric('db_util', data) < 100.0
64
+ end
65
+ end
66
+ end
67
+
68
+ def scenario(&block)
69
+ child = fork do
70
+ mock_datamapper!
71
+ yield
72
+ end
73
+ Process.wait
74
+ assert_equal 0, $?.exitstatus
75
+ end
76
+
77
+ def metric(metric, data, context=[])
78
+ hash = data.detect { |hash| hash[:name] == metric }
79
+ assert hash, "No metric named #{metric} was found in metrics payload"
80
+ vals = hash[:values]
81
+ assert vals, "No values found for #{metric} in metrics payload"
82
+ val = vals.detect { |val| val[:context] == context }
83
+ assert val, "No value for #{metric} found for context #{context.inspect}"
84
+ val[:value]
85
+ end
86
+
87
+ def mock_datamapper!
88
+
89
+ eval <<-MOCK
90
+ module Fiveruns::Dash
91
+ class Reporter
92
+ private
93
+ def run
94
+ end
95
+ end
96
+ end
97
+ MOCK
98
+
99
+ Fiveruns::Dash.register_recipe :tester, :url => 'http://dash.fiveruns.com' do |recipe|
100
+ recipe.time :test_time, 'Test Time', :method => 'DataMapperTest::TestEngine#entry',
101
+ :mark => true
102
+ end
103
+
104
+ Fiveruns::Dash.start :app => '666' do |config|
105
+ config.add_recipe :ruby
106
+ config.add_recipe :tester
107
+ config.add_recipe :datamapper, :total_time => 'test_time'
108
+ end
109
+
110
+ end
111
+ end
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'datamapper'
3
+
4
+ $LOAD_PATH.unshift(File.dirname(__FILE__) << "/../lib")
5
+ require 'fiveruns/dash/datamapper'
6
+
7
+ require 'test/unit'
8
+
9
+ begin
10
+ require 'redgreen'
11
+ rescue LoadError
12
+ end
13
+
14
+ require 'activerecord'
15
+ require 'shoulda'
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fiveruns-dash-datamapper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.0
5
+ platform: ruby
6
+ authors:
7
+ - FiveRuns Development Team
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-02-22 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Provides an API to send metrics from applications using DataMapper to the FiveRuns Dash service
17
+ email: dev@fiveruns.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - README.rdoc
26
+ - VERSION.yml
27
+ - lib/fiveruns
28
+ - lib/fiveruns/dash
29
+ - lib/fiveruns/dash/datamapper.rb
30
+ - lib/fiveruns/dash/recipes
31
+ - lib/fiveruns/dash/recipes/datamapper.rb
32
+ - lib/fiveruns-dash-datamapper.rb
33
+ - test/datamapper_test.rb
34
+ - test/test_helper.rb
35
+ has_rdoc: true
36
+ homepage: http://github.com/fiveruns/dash-datamapper
37
+ post_install_message:
38
+ rdoc_options:
39
+ - --inline-source
40
+ - --charset=UTF-8
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ requirements: []
56
+
57
+ rubyforge_project:
58
+ rubygems_version: 1.2.0
59
+ signing_key:
60
+ specification_version: 2
61
+ summary: FiveRuns Dash recipe for DataMapper
62
+ test_files: []
63
+