newrelic-manticore 0.1.1-java

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.
@@ -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: []