newrelic-manticore 0.1.1-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b65407b94c439f088f0439f2abbbc59cf4744718
4
+ data.tar.gz: aa8d3f6e39791945dc9e450336e0f0ad758f87ce
5
+ SHA512:
6
+ metadata.gz: 7ced02ea954f04bef5420e3b802a422d2ae3f37bfd8fc58690f5cf3a83c9182fd154dadd82925d644465096094bbab1f37f0e0be90624b1b7afcaa3f77e3a827
7
+ data.tar.gz: 0c2a79e73faa7a9c066744b8af4adae56571f791b7963b28b8a78c0a1b70c40f9cbf694b50ee3224d352d74e0df6910785c2999118c9ac5c806c15fd4f64793d
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ *.swp
10
+ /log/*
11
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,12 @@
1
+ require: rt_rubocop_defaults
2
+
3
+ AllCops:
4
+ TargetRubyVersion: 2.2
5
+
6
+ Metrics/BlockLength:
7
+ Exclude:
8
+ - test/**/*
9
+
10
+ Metrics/ClassLength:
11
+ Exclude:
12
+ - test/**/*
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - jruby-9.1.17.0 # ruby 2.3
4
+ - jruby-9.2.0.0 # ruby 2.5
5
+ jobs:
6
+ include:
7
+ - stage: linting
8
+ rvm: jruby-9.2.0.0
9
+ script: bundle exec rake rubocop
@@ -0,0 +1,14 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [0.1.1] - 2018-10-09
8
+ ### Fixed
9
+ - Time spent inside Manticore requests inside database calls where not included in the exclusive time stats of the database request.
10
+ - Fixed instrumentation when using manticore with faraday adapter.
11
+
12
+ ## [0.1.0] - 2018-10-09
13
+ ### Added
14
+ - Basic manticore instrumentation.
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in new_relic_wrapper.gemspec
6
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018 Runtastic
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,33 @@
1
+ [travis]: https://travis-ci.org/runtastic/newrelic-manticore
2
+ [rubygems]: https://rubygems.org/gems/newrelic-manticore
3
+ [manticore]: https://gitlab.com/cheald/manticore
4
+ [mit]: http://opensource.org/licenses/MIT
5
+ [cc]: http://contributor-covenant.org
6
+
7
+ # NewrelicManticore
8
+
9
+ [![Build Status](https://travis-ci.org/runtastic/newrelic-manticore.svg?branch=master)][travis] [![Gem Version](https://badge.fury.io/rb/newrelic-manticore.svg)][rubygems]
10
+
11
+ Adds NewRelic instrumentation for the [Manticore JRuby HTTP client][manticore].
12
+
13
+ ## Installation
14
+ Add this line to your application's Gemfile:
15
+
16
+ `$ gem 'newrelic-manticore'`
17
+
18
+ And then execute:
19
+
20
+ `$ bundle`
21
+
22
+ ## How it works
23
+ When `newrelic/manticore` is required (e.g. automatically by Bundler), the gem becomes active.
24
+ It hooks itself into `Manticore::Client#request` and traces your HTTP calls as external requests,
25
+ adding also the necessary headers for cross application tracing.
26
+
27
+ ## Contributing
28
+ Bug reports and pull requests are welcome on GitHub at https://github.com/runtastic/newrelic-manticore.
29
+ This project is intended to be a safe, welcoming space for collaboration, and contributors are expected
30
+ to adhere to the [Contributor Covenant code of conduct][cc].
31
+
32
+ ## License
33
+ The gem is available as open source under [the terms of the MIT License][mit].
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+
6
+ task :init do
7
+ Rake::Task["rubocop:install"].execute
8
+ end
9
+
10
+ require "rubocop/rake_task"
11
+ RuboCop::RakeTask.new
12
+ namespace :rubocop do
13
+ desc "Install Rubocop as pre-commit hook"
14
+ task :install do
15
+ require "rubocop_runner"
16
+ RubocopRunner.install
17
+ end
18
+ end
19
+
20
+ Rake::TestTask.new do |t|
21
+ t.test_files = FileList["test/**/*_test.rb"]
22
+ end
23
+
24
+ task default: :test
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "newrelic-manticore"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "new_relic/manticore/instrumentation"
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ostruct"
4
+
5
+ require "new_relic/agent/method_tracer"
6
+ require "new_relic/agent/http_clients/abstract_request"
7
+
8
+ require "new_relic/manticore/wrapped_request"
9
+ require "new_relic/manticore/wrapped_response"
10
+
11
+ module NewRelic
12
+ module Manticore
13
+ # We do not want to create a segment if there is no newrelic
14
+ # transaction or if we are inside a database segment.
15
+ #
16
+ # An external call segment inside a database segment would
17
+ # deduct the time needed in manticore from the database call,
18
+ # which we want to be the total time needed for the database
19
+ # operation
20
+ def self.create_segment?
21
+ state = NewRelic::Agent::TransactionState.tl_get
22
+ return false unless state && state.current_transaction
23
+
24
+ existing_segments = state.current_transaction.segments
25
+
26
+ existing_segments.empty? ||
27
+ !existing_segments.last.is_a?(
28
+ ::NewRelic::Agent::Transaction::DatastoreSegment
29
+ )
30
+ end
31
+
32
+ # rubocop:disable Metrics/BlockLength
33
+ DependencyDetection.defer do
34
+ @name = :manticore
35
+
36
+ depends_on do
37
+ defined?(::Manticore::Client) &&
38
+ !NewRelic::Control.instance["disable_manticore"] &&
39
+ ENV["NEWRELIC_ENABLE"].to_s !~ /false|off|no/i
40
+ end
41
+
42
+ executes do
43
+ NewRelic::Agent.logger.info "Installing Manticore Instrumentation"
44
+ end
45
+
46
+ executes do
47
+ require "new_relic/agent/external"
48
+ PARALLEL_REQUEST_DUMMY = OpenStruct.new(
49
+ host_from_header: "<MultipleHosts>"
50
+ )
51
+
52
+ ::Manticore::Client.class_eval do
53
+ # This is called for parallel requests that are executed in
54
+ # a batch
55
+ #
56
+ # rubocop:disable Metrics/MethodLength
57
+ def execute_with_newrelic_trace!
58
+ if NewRelic::Manticore.create_segment?
59
+ segment = NewRelic::Agent::External.start_segment(
60
+ library: "Manticore",
61
+ uri: @async_requests.first.request.uri.to_s,
62
+ procedure: "Parallel batch"
63
+ )
64
+ segment.add_request_headers(PARALLEL_REQUEST_DUMMY)
65
+ end
66
+ execute_without_newrelic_trace!
67
+ ensure
68
+ segment.finish if defined?(segment) && segment
69
+ end
70
+ # rubocop:enable Metrics/MethodLength
71
+
72
+ alias_method :execute_without_newrelic_trace!, :execute!
73
+ alias_method :execute!, :execute_with_newrelic_trace!
74
+ end
75
+
76
+ ::Manticore::Response.class_eval do
77
+ # This is called for every request, also parallel and async
78
+ # requests.
79
+ #
80
+ # rubocop:disable Metrics/MethodLength
81
+ def call_with_newrelic_trace
82
+ if NewRelic::Manticore.create_segment?
83
+ segment = create_newrelic_segment
84
+
85
+ segment.add_request_headers(WrappedRequest.new(@request))
86
+ on_complete do |response|
87
+ begin
88
+ segment.read_response_headers(WrappedResponse.new(response))
89
+ ensure
90
+ segment.finish
91
+ end
92
+ end
93
+ end
94
+ call_without_newrelic_trace
95
+ rescue StandardError => e
96
+ segment.finish if defined?(segment) && segment
97
+ raise e
98
+ end
99
+ # rubocop:enable Metrics/MethodLength
100
+
101
+ alias_method :call_without_newrelic_trace, :call
102
+ alias_method :call, :call_with_newrelic_trace
103
+
104
+ def create_newrelic_segment
105
+ NewRelic::Agent::External.start_segment(
106
+ library: "Manticore",
107
+ uri: @request.uri.to_s,
108
+ procedure: @request.method
109
+ ).tap do |segment|
110
+ segment.record_metrics = false if segment.parent.is_a?(::NewRelic::Agent::Transaction::DatastoreSegment)
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ # rubocop:enable Metrics/BlockLength
117
+ end
118
+ end
@@ -0,0 +1,22 @@
1
+ module NewRelic
2
+ module Manticore
3
+ class WrappedRequest < Agent::HTTPClients::AbstractRequest
4
+ def initialize(request)
5
+ @request = request
6
+ end
7
+
8
+ def [](key)
9
+ _, value = @request.headers.find { |k, _| k.casecmp(key).zero? }
10
+ value
11
+ end
12
+
13
+ def []=(key, value)
14
+ @request.set_header(key, value)
15
+ end
16
+
17
+ def host_from_header
18
+ self["Host"]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ module NewRelic
2
+ module Manticore
3
+ class WrappedResponse
4
+ def initialize(response)
5
+ @headers = response.headers
6
+ end
7
+
8
+ def [](key)
9
+ _, value = @headers.find { |k, _| k.casecmp(key).zero? }
10
+ value
11
+ end
12
+
13
+ def to_hash
14
+ @headers
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,2 @@
1
+ # Necessary for bundler auto require (as gem name does not match namespace)
2
+ require "new_relic/manticore"
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Newrelic
4
+ module Manticore
5
+ VERSION = "0.1.1".freeze
6
+ end
7
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("lib", __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require "newrelic/manticore/version"
6
+
7
+ # rubocop:disable Metrics/BlockLength
8
+ Gem::Specification.new do |gem|
9
+ gem.name = "newrelic-manticore"
10
+ gem.version = Newrelic::Manticore::VERSION
11
+ gem.authors = ["Dominik Goltermann",
12
+ "Alexander Junger"]
13
+
14
+ gem.email = ["dominik.goltermann@runtastic.com",
15
+ "alexander.junger@runtastic.com"]
16
+
17
+ gem.summary = "Newrelic support for manticore"
18
+ gem.description = "Adds manticore tracking for HTTP calls to Newrelic"
19
+ gem.homepage = "http://github.com/runtastic/newrelic-manticore"
20
+ gem.license = "MIT"
21
+
22
+ gem.platform = "java"
23
+ gem.files = `git ls-files -z`.split("\x0").reject do |f|
24
+ f.match(%r{^(test|spec|features)/})
25
+ end
26
+ gem.bindir = "exe"
27
+ gem.executables = gem.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ gem.require_paths = ["lib"]
29
+
30
+ gem.add_runtime_dependency "newrelic_rpm", "~> 5"
31
+
32
+ gem.add_development_dependency "bundler", "~> 1.13"
33
+ gem.add_development_dependency "faraday", "~> 0"
34
+ gem.add_development_dependency "manticore", "~> 0"
35
+ gem.add_development_dependency "minitest"
36
+ gem.add_development_dependency "pry"
37
+ gem.add_development_dependency "rake", "~> 10.0"
38
+ gem.add_development_dependency "rspec", "~> 3.0"
39
+ gem.add_development_dependency "rt_rubocop_defaults", "~> 1"
40
+ gem.add_development_dependency "rubocop_runner", "~> 2"
41
+ end
42
+ # rubocop:enable Metrics/BlockLength
metadata ADDED
@@ -0,0 +1,204 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: newrelic-manticore
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: java
6
+ authors:
7
+ - Dominik Goltermann
8
+ - Alexander Junger
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2018-10-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: newrelic_rpm
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '5'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '5'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.13'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.13'
42
+ - !ruby/object:Gem::Dependency
43
+ name: faraday
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: manticore
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: minitest
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: pry
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rake
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '10.0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '10.0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rspec
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '3.0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '3.0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rt_rubocop_defaults
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '1'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '1'
140
+ - !ruby/object:Gem::Dependency
141
+ name: rubocop_runner
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '2'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '2'
154
+ description: Adds manticore tracking for HTTP calls to Newrelic
155
+ email:
156
+ - dominik.goltermann@runtastic.com
157
+ - alexander.junger@runtastic.com
158
+ executables: []
159
+ extensions: []
160
+ extra_rdoc_files: []
161
+ files:
162
+ - ".gitignore"
163
+ - ".rspec"
164
+ - ".rubocop.yml"
165
+ - ".travis.yml"
166
+ - Changelog.md
167
+ - Gemfile
168
+ - LICENSE
169
+ - README.md
170
+ - Rakefile
171
+ - bin/console
172
+ - bin/setup
173
+ - lib/new_relic/manticore.rb
174
+ - lib/new_relic/manticore/instrumentation.rb
175
+ - lib/new_relic/manticore/wrapped_request.rb
176
+ - lib/new_relic/manticore/wrapped_response.rb
177
+ - lib/newrelic/manticore.rb
178
+ - lib/newrelic/manticore/version.rb
179
+ - newrelic-manticore.gemspec
180
+ homepage: http://github.com/runtastic/newrelic-manticore
181
+ licenses:
182
+ - MIT
183
+ metadata: {}
184
+ post_install_message:
185
+ rdoc_options: []
186
+ require_paths:
187
+ - lib
188
+ required_ruby_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ required_rubygems_version: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ requirements: []
199
+ rubyforge_project:
200
+ rubygems_version: 2.5.1
201
+ signing_key:
202
+ specification_version: 4
203
+ summary: Newrelic support for manticore
204
+ test_files: []