newrelic_riak 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ *.swp
2
+ coverage
3
+ log
4
+ config/newrelic.yml
5
+
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development, :test do
6
+ gem 'ruby-prof'
7
+ gem 'simplecov'
8
+ gem 'debugger'
9
+ gem 'riak-client', '~> 1.1.1'
10
+ gem 'ripple', :git => 'git://github.com/basho/ripple.git'
11
+ gem 'ripple-encryption', '~> 0.0.4'
12
+ end
@@ -0,0 +1,72 @@
1
+ GIT
2
+ remote: git://github.com/basho/ripple.git
3
+ revision: 20c7dba18448437930136f3a6da57d8d091a63a5
4
+ specs:
5
+ ripple (1.0.0.beta2)
6
+ activemodel (>= 3.0.0, < 3.3.0)
7
+ activesupport (>= 3.0.0, < 3.3.0)
8
+ riak-client (~> 1.1.0)
9
+ tzinfo
10
+
11
+ PATH
12
+ remote: .
13
+ specs:
14
+ newrelic_riak (0.0.3)
15
+ newrelic_rpm (~> 3.0)
16
+ rake
17
+
18
+ GEM
19
+ remote: https://rubygems.org/
20
+ specs:
21
+ activemodel (3.2.12)
22
+ activesupport (= 3.2.12)
23
+ builder (~> 3.0.0)
24
+ activesupport (3.2.12)
25
+ i18n (~> 0.6)
26
+ multi_json (~> 1.0)
27
+ beefcake (0.3.7)
28
+ builder (3.0.4)
29
+ columnize (0.3.6)
30
+ debugger (1.6.0)
31
+ columnize (>= 0.3.1)
32
+ debugger-linecache (~> 1.2.0)
33
+ debugger-ruby_core_source (~> 1.2.1)
34
+ debugger-linecache (1.2.0)
35
+ debugger-ruby_core_source (1.2.3)
36
+ i18n (0.6.4)
37
+ innertube (1.0.2)
38
+ mini_shoulda (0.5.0)
39
+ minitest (> 2.1.0)
40
+ minitest (3.3.0)
41
+ multi_json (1.7.7)
42
+ newrelic_rpm (3.6.5.130)
43
+ rake (10.0.3)
44
+ riak-client (1.1.1)
45
+ beefcake (~> 0.3.7)
46
+ builder (>= 2.1.2)
47
+ i18n (>= 0.4.0)
48
+ innertube (~> 1.0.2)
49
+ multi_json (~> 1.0)
50
+ ripple-encryption (0.0.4)
51
+ rake
52
+ riak-client
53
+ ripple
54
+ ruby-prof (0.13.0)
55
+ simplecov (0.7.1)
56
+ multi_json (~> 1.0)
57
+ simplecov-html (~> 0.7.1)
58
+ simplecov-html (0.7.1)
59
+ tzinfo (1.0.1)
60
+
61
+ PLATFORMS
62
+ ruby
63
+
64
+ DEPENDENCIES
65
+ debugger
66
+ mini_shoulda
67
+ newrelic_riak!
68
+ riak-client (~> 1.1.1)
69
+ ripple!
70
+ ripple-encryption (~> 0.0.4)
71
+ ruby-prof
72
+ simplecov
@@ -0,0 +1,31 @@
1
+ ## The NewRelic Riak gem
2
+ NewRelic instrumentation for [riak-ruby-client](https://github.com/basho/riak-ruby-client), [ripple](https://github.com/basho/ripple), and [ripple-encryption](https://github.com/basho/ripple-encryption).
3
+
4
+ ## Dependencies
5
+ `newrelic-riak` requires:
6
+ - Ruby 1.9.3 or later
7
+ - [newrelic](https://github.com/newrelic/rpm)
8
+ - [riak-ruby-client](https://github.com/basho/riak-ruby-client)
9
+
10
+ While the following are optional:
11
+ - [ripple](https://github.com/basho/ripple)
12
+ - [ripple-encryption](https://github.com/basho/ripple-encryption)
13
+
14
+ ## Installation
15
+ Add the gem file reference to the Gemfile:
16
+
17
+ ``` ruby
18
+ gem 'newrelic_riak', '~> 0.0.3'
19
+ ```
20
+
21
+ ## Usage
22
+ Just require the gem where you need it:
23
+
24
+ ``` ruby
25
+ require 'newrelic_riak'
26
+ ```
27
+
28
+ ## Running the Tests
29
+ The tests currently assume you have riak running locally on port 8098.
30
+
31
+ bundle exec rake
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rake'
5
+ require 'rake/testtask'
6
+
7
+ Rake::TestTask.new(:test) do |t|
8
+ t.libs << "test"
9
+ t.test_files = FileList['test/**/test_*.rb']
10
+ t.verbose = true
11
+ end
12
+
13
+ namespace :test do
14
+ desc "Test everything"
15
+ task :all => [:test]
16
+ end
17
+
18
+ task :default => :test
@@ -0,0 +1,21 @@
1
+ test:
2
+ app_name: NewRelic Riak - local (test)
3
+ monitor_mode: true
4
+ developer_mode: true
5
+ log_level: debug
6
+ ssl: true
7
+ apdex_t: 0.5
8
+ capture_params: false
9
+ transaction_tracer:
10
+ enabled: true
11
+ transaction_threshold: apdex_f
12
+ record_sql: obfuscated
13
+ stack_trace_threshold: 0.500
14
+ error_collector:
15
+ enabled: true
16
+ capture_source: true
17
+ ignore_errors: ActionController::RoutingError
18
+ #disable_riak: true
19
+ #disable_ripple: true
20
+ #disable_ripple_encryption: true
21
+ #riak_impersonate_activerecord: true
@@ -0,0 +1,5 @@
1
+ require 'newrelic_riak/instrumentation'
2
+ require 'newrelic_riak/riak_client'
3
+ require 'newrelic_riak/ripple'
4
+ require 'newrelic_riak/ripple_encryption'
5
+
@@ -0,0 +1,35 @@
1
+ def add_riak_tracer(metric_prefix, operation)
2
+ op = operation
3
+ define_method("#{op}_with_newrelic_trace") do |*args, &blk|
4
+ if NewRelic::Agent::Instrumentation::MetricFrame.recording_web_transaction?
5
+ total_metric = "#{metric_prefix}/allWeb"
6
+ else
7
+ total_metric = "#{metric_prefix}/allOther"
8
+ end
9
+
10
+ bucket = case args[0]
11
+ when Riak::Bucket
12
+ args[0].name
13
+ when Riak::RObject
14
+ args[0].bucket.name
15
+ when String
16
+ args[0]
17
+ end unless self.class.to_s.match /^Ripple::Encryption/ # don't load ripple here
18
+
19
+ metrics = bucket ? ["#{metric_prefix}/#{bucket}##{op}", total_metric] : ["#{metric_prefix}/#{op}", total_metric]
20
+
21
+ self.class.trace_execution_scoped(metrics) do
22
+ start = Time.now
23
+
24
+ begin
25
+ method_name = "#{op}_without_newrelic_trace"
26
+ send(method_name, *args, &blk)
27
+ ensure
28
+ s = NewRelic::Agent.instance.transaction_sampler
29
+ s.notice_nosql(args.inspect, (Time.now - start).to_f) rescue nil
30
+ end
31
+ end
32
+ end
33
+ alias_method "#{op}_without_newrelic_trace".to_sym, op.to_sym
34
+ alias_method op.to_sym, "#{op}_with_newrelic_trace".to_sym
35
+ end
@@ -0,0 +1,48 @@
1
+ require 'new_relic/agent/method_tracer'
2
+
3
+ DependencyDetection.defer do
4
+ @name = :riak
5
+
6
+ depends_on do
7
+ defined?(::Riak) &&
8
+ !NewRelic::Control.instance['disable_riak'] &&
9
+ ENV['NEWRELIC_ENABLE'].to_s !~ /false|off|no/i
10
+ end
11
+
12
+ executes do
13
+ NewRelic::Agent.logger.debug 'Installing Riak Instrumentation'
14
+ end
15
+
16
+ riak_metric_prefix = NewRelic::Control.instance['riak_impersonate_activerecord'] ? 'ActiveRecord' : 'Database/Riak'
17
+
18
+ executes do
19
+ ::Riak::Client.class_eval do
20
+ operations = [:bucket, :ping, :list_buckets, :get_bucket_props, :set_bucket_props,
21
+ :mapred, :list_keys, :get_object, :reload_object, :store_object, :delete_object]
22
+
23
+ operations.each do |key|
24
+ add_riak_tracer(riak_metric_prefix, key.to_s)
25
+ end
26
+ end
27
+
28
+ ::Riak::Client::BeefcakeProtobuffsBackend.class_eval do
29
+ operations = [:server_info, :get_client_id, :set_client_id]
30
+
31
+ operations.each do |key|
32
+ add_riak_tracer(riak_metric_prefix, key.to_s)
33
+ end
34
+ end
35
+
36
+ ::Riak::Client::HTTPBackend.class_eval do
37
+ operations = [:stats, :link_walk, :get_index, :search, :update_search_index]
38
+
39
+ operations.each do |key|
40
+ add_riak_tracer(riak_metric_prefix, key.to_s)
41
+ end
42
+ end
43
+
44
+ ::Riak::RObject.class_eval do
45
+ add_riak_tracer riak_metric_prefix, :serialize.to_s
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,49 @@
1
+ require 'new_relic/agent/method_tracer'
2
+
3
+ DependencyDetection.defer do
4
+ @name = :ripple
5
+
6
+ depends_on do
7
+ defined?(::Ripple) and not
8
+ NewRelic::Control.instance['disable_ripple']
9
+ end
10
+
11
+ executes do
12
+ NewRelic::Agent.logger.debug 'Installing Ripple Instrumentation'
13
+ end
14
+
15
+ riak_metric_prefix = NewRelic::Control.instance['riak_impersonate_activerecord'] ? 'ActiveRecord' : 'Database/Ripple'
16
+
17
+ executes do
18
+ ::Ripple::Callbacks.class_eval do
19
+ add_riak_tracer riak_metric_prefix, :valid?.to_s
20
+ end
21
+
22
+ ::Ripple::Document::Persistence::ClassMethods.class_eval do
23
+ # operations = [:create, :destroy, :destroy_all]
24
+ operations = [:create, :destroy_all]
25
+
26
+ operations.each do |key|
27
+ add_riak_tracer(riak_metric_prefix, key.to_s)
28
+ end
29
+ end
30
+
31
+
32
+ (defined?(::Ripple::Document::Persistence::InstanceMethods) ?
33
+ ::Ripple::Document::Persistence::InstanceMethods : ::Ripple::Document::Persistence).class_eval do
34
+ operations = [:really_save, :reload, :destroy!, :update_attribute, :update_attributes]
35
+
36
+ operations.each do |key|
37
+ add_riak_tracer(riak_metric_prefix, key.to_s)
38
+ end
39
+ end
40
+
41
+ ::Ripple::Document::Finders::ClassMethods.class_eval do
42
+ operations = [:find, :list]
43
+
44
+ operations.each do |key|
45
+ add_riak_tracer(riak_metric_prefix, key.to_s)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,33 @@
1
+ require 'new_relic/agent/method_tracer'
2
+
3
+ DependencyDetection.defer do
4
+ @name = :ripple_encryption
5
+
6
+ depends_on do
7
+ defined?(::Ripple::Encryption) and not NewRelic::Control.instance['disable_ripple_encryption']
8
+ end
9
+
10
+ executes do
11
+ NewRelic::Agent.logger.debug 'Installing Ripple Encryption Instrumentation'
12
+ end
13
+
14
+ riak_metric_prefix = NewRelic::Control.instance['riak_impersonate_activerecord'] ? 'ActiveRecord' : 'Database/RippleEncryption'
15
+
16
+ executes do
17
+ ::Ripple::Encryption::JsonSerializer.class_eval do
18
+ operations = [:dump, :load]
19
+
20
+ operations.each do |key|
21
+ add_riak_tracer(riak_metric_prefix, key.to_s)
22
+ end
23
+ end
24
+
25
+ ::Ripple::Encryption::Encryptor.class_eval do
26
+ operations = [:encrypt, :decrypt]
27
+
28
+ operations.each do |key|
29
+ add_riak_tracer(riak_metric_prefix, key.to_s)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,5 @@
1
+ module Basho
2
+ module NewRelic
3
+ VERSION = "0.0.3"
4
+ end
5
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/newrelic_riak/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Randy Secrist"]
6
+ gem.email = ["rsecrist@basho.com"]
7
+ gem.description = %q{NewRelic instrumentation for Riak.}
8
+ gem.summary = %q{Sends performance metrics related to Riak to NewRelic}
9
+ gem.homepage = "http://github.com/basho/newrelic-riak"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "newrelic_riak"
15
+ gem.require_paths = ['lib']
16
+ gem.version = Basho::NewRelic::VERSION
17
+
18
+ gem.add_dependency 'rake'
19
+
20
+ gem.add_runtime_dependency(%q<newrelic_rpm>, ["~> 3.0"])
21
+
22
+ # Test Dependencies
23
+ gem.add_development_dependency 'simplecov'
24
+ gem.add_development_dependency 'mini_shoulda'
25
+ gem.add_development_dependency 'ruby-prof'
26
+ gem.add_development_dependency 'debugger'
27
+ gem.add_development_dependency 'riak-client'
28
+ end
29
+
@@ -0,0 +1,5 @@
1
+ test:
2
+ cipher: AES-256-CBC
3
+ key: fantasticobscurekeygoesherenowty
4
+ iv: !binary |
5
+ ABYLnUHWE/fIwE2gKYC6hg==
@@ -0,0 +1,4 @@
1
+ test:
2
+ host: 127.0.0.1
3
+ http_port: 8098
4
+ namespace: test_ns~
@@ -0,0 +1,35 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+
4
+ require 'rake'
5
+
6
+ require 'simplecov'
7
+ SimpleCov.start do
8
+ project_name "Basho - NewRelic Instrumentation"
9
+ add_filter "/test/"
10
+ end
11
+
12
+ require 'minitest/autorun'
13
+ require 'mini_shoulda'
14
+
15
+ require 'riak'
16
+ require 'ripple'
17
+ require 'ripple-encryption'
18
+ require 'newrelic_riak'
19
+
20
+ ENV['RACK_ENV'] = 'test'
21
+ ENV['RIPPLE'] = File.expand_path(File.join('..','fixtures','ripple.yml'),__FILE__)
22
+ ENV['ENCRYPTION'] = File.expand_path(File.join('..','fixtures','encryption.yml'),__FILE__)
23
+
24
+ Ripple::Encryption.activate ENV['ENCRYPTION']
25
+ class TestDocument
26
+ include Ripple::Document
27
+ include Ripple::Encryption
28
+ property :message, String
29
+
30
+ def self.bucket_name
31
+ "#{Ripple.config[:namespace]}#{super}"
32
+ end
33
+ end
34
+
35
+ TestDocument.bucket.get_index('$bucket', '_').each {|k| TestDocument.bucket.delete(k)}
@@ -0,0 +1,63 @@
1
+ require 'helper'
2
+
3
+ class TestNewRelicRiak < MiniTest::Spec
4
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
5
+
6
+ PORT = 8098
7
+ OPTIONS = {}
8
+
9
+ def assert_metrics(*m)
10
+ m.each do |x|
11
+ assert @engine.metrics.include?(x), "#{x} not in metrics: #{@engine.metrics}"
12
+ end
13
+ end
14
+
15
+ context 'test metrics' do
16
+ setup do
17
+ NewRelic::Agent.manual_start
18
+ @engine = NewRelic::Agent.instance.stats_engine
19
+ @engine.clear_stats
20
+
21
+ @sampler = NewRelic::Agent.instance.transaction_sampler
22
+ @sampler.reset!
23
+ @sampler.start_builder
24
+
25
+ @client = ::Riak::Client.new OPTIONS
26
+ end
27
+
28
+ teardown do
29
+ @sampler.clear_builder
30
+ end
31
+
32
+ should 'record riak metrics' do
33
+ bucket = @client.bucket "random_bucket"
34
+ object = bucket.get_or_new("index.html")
35
+ object.raw_data = "<html><body>Hello, world!</body></html>"
36
+ object.content_type = "text/html"
37
+ object.store
38
+ assert_metrics(
39
+ "Database/Riak/#{bucket.name}#bucket",
40
+ "Database/Riak/#{bucket.name}#get_object",
41
+ "Database/Riak/#{bucket.name}#store_object",
42
+ "Database/Riak/allOther")
43
+ end
44
+
45
+ should 'record ripple metrics' do
46
+ doc = TestDocument.create({:message => 'this is a test message'})
47
+ doc.save!
48
+ assert_metrics(
49
+ "Database/Ripple/allOther",
50
+ "Database/Ripple/valid?",
51
+ "Database/Riak/allOther",
52
+ "Database/Riak/test_documents#bucket",
53
+ "Database/RippleEncryption/allOther",
54
+ "Database/RippleEncryption/encrypt",
55
+ "Database/RippleEncryption/dump",
56
+ "Database/RippleEncryption/decrypt",
57
+ "Database/RippleEncryption/load",
58
+ "Database/Riak/test_documents#store_object",
59
+ "Database/Ripple/really_save",
60
+ "Database/Ripple/create")
61
+ end
62
+ end
63
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: newrelic_riak
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Randy Secrist
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: newrelic_rpm
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '3.0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '3.0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: simplecov
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: mini_shoulda
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: ruby-prof
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: debugger
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: riak-client
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: NewRelic instrumentation for Riak.
127
+ email:
128
+ - rsecrist@basho.com
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - .gitignore
134
+ - Gemfile
135
+ - Gemfile.lock
136
+ - README.md
137
+ - Rakefile
138
+ - config/newrelic.yml.example
139
+ - lib/newrelic_riak.rb
140
+ - lib/newrelic_riak/instrumentation.rb
141
+ - lib/newrelic_riak/riak_client.rb
142
+ - lib/newrelic_riak/ripple.rb
143
+ - lib/newrelic_riak/ripple_encryption.rb
144
+ - lib/newrelic_riak/version.rb
145
+ - newrelic_riak.gemspec
146
+ - test/fixtures/encryption.yml
147
+ - test/fixtures/ripple.yml
148
+ - test/helper.rb
149
+ - test/test_newrelic_riak.rb
150
+ homepage: http://github.com/basho/newrelic-riak
151
+ licenses: []
152
+ post_install_message:
153
+ rdoc_options: []
154
+ require_paths:
155
+ - lib
156
+ required_ruby_version: !ruby/object:Gem::Requirement
157
+ none: false
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ requirements: []
169
+ rubyforge_project:
170
+ rubygems_version: 1.8.23
171
+ signing_key:
172
+ specification_version: 3
173
+ summary: Sends performance metrics related to Riak to NewRelic
174
+ test_files:
175
+ - test/fixtures/encryption.yml
176
+ - test/fixtures/ripple.yml
177
+ - test/helper.rb
178
+ - test/test_newrelic_riak.rb