newrelic_em_http 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f656b05621633cca404166dc0245b7a8b6fe21b2
4
+ data.tar.gz: 6ea08d4a59d264e3298eb78376652ebce982defb
5
+ SHA512:
6
+ metadata.gz: 41f111199a2106a0954591a0ce7ff29959746f5c6477d25e9d4f65b3d3631e178873d4b9c7da081d3df6899194b0f1b6304ce0e8348414e3e394ce31f447b673
7
+ data.tar.gz: c9c305015795e0ca04aff7827216f35f6e32588b16c82072ecf3fe7ee1f2634f0f4c891e2f2afda48f03cec9ff60d02b9a0fc883d75af478ffb5b81c49689e5e
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.1
5
+ before_install: gem install bundler -v 1.15.1
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # New Relic EM::HTTP instrumentation
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ ```ruby
8
+ gem 'newrelic_em_http'
9
+ ```
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install newrelic_em_http
18
+
19
+ ## Author
20
+
21
+ [Andriy Yanko](http://ayanko.github.com/)
22
+
23
+ ## License
24
+
25
+ * Copyright (c) 2017 Railsware [www.railsware.com](http://www.railsware.com)
26
+ * [MIT](www.opensource.org/licenses/MIT)
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "newrelic_em_http"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -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,62 @@
1
+ module NewRelic
2
+ module Agent
3
+ module HTTPClients
4
+
5
+ class EmHttpRequest
6
+ EM_HTTP = 'EM::HTTP'.freeze
7
+ HOST = 'host'.freeze
8
+ COLON = ':'.freeze
9
+
10
+ def initialize(client, headers = nil)
11
+ @client = client
12
+ @headers = headers || @client.req.headers
13
+ end
14
+
15
+ def type
16
+ EM_HTTP
17
+ end
18
+
19
+ def host_from_header
20
+ if hostname = self[HOST]
21
+ hostname.split(COLON).first
22
+ end
23
+ end
24
+
25
+ def host
26
+ @client.req.uri.host
27
+ end
28
+
29
+ def method
30
+ @client.req.method
31
+ end
32
+
33
+ def [](key)
34
+ @headers[key]
35
+ end
36
+
37
+ def []=(key, value)
38
+ @headers[key] = value
39
+ end
40
+
41
+ def uri
42
+ URI.parse @client.req.uri.to_s
43
+ end
44
+ end
45
+
46
+ class EmHttpResponse
47
+ def initialize(client)
48
+ @client = client
49
+ end
50
+
51
+ def [](key)
52
+ @client.response_header[key]
53
+ end
54
+
55
+ def to_hash
56
+ @client.response_header.to_hash
57
+ end
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,53 @@
1
+ DependencyDetection.defer do
2
+
3
+ named :em_http
4
+
5
+ depends_on do
6
+ defined?(EM::HTTPMethods)
7
+ end
8
+
9
+ executes do
10
+ ::NewRelic::Agent.logger.info 'Installing EM::HTTP instrumentation'
11
+ require 'new_relic/agent/cross_app_tracing'
12
+ require 'new_relic/agent/http_clients/em_http_wrappers'
13
+ end
14
+
15
+ executes do
16
+ class EventMachine::HttpConnection
17
+ def activate_connection_with_newrelic(client)
18
+ wrapped_request = ::NewRelic::Agent::HTTPClients::EmHttpRequest.new(client)
19
+
20
+ client.newrelic_segment = ::NewRelic::Agent::Transaction.start_external_request_segment(
21
+ wrapped_request.type, wrapped_request.uri, wrapped_request.method
22
+ )
23
+
24
+ client.callback do
25
+ wrapped_response = ::NewRelic::Agent::HTTPClients::EmHttpResponse.new(client)
26
+ client.newrelic_segment.read_response_headers wrapped_response
27
+ client.newrelic_segment.finish
28
+ end
29
+
30
+ activate_connection_without_newrelic(client)
31
+ end
32
+
33
+ alias_method :activate_connection_without_newrelic, :activate_connection
34
+ alias_method :activate_connection, :activate_connection_with_newrelic
35
+ end
36
+ end
37
+
38
+ executes do
39
+ class EventMachine::HttpClient
40
+ attr_accessor :newrelic_segment
41
+
42
+ def send_request_with_newrelic(head, body)
43
+ wrapped_request = ::NewRelic::Agent::HTTPClients::EmHttpRequest.new(self, head)
44
+ newrelic_segment.add_request_headers wrapped_request
45
+ send_request_without_newrelic(head, body)
46
+ end
47
+
48
+ alias_method :send_request_without_newrelic, :send_request
49
+ alias_method :send_request, :send_request_with_newrelic
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,5 @@
1
+ require 'newrelic_rpm'
2
+
3
+ NewRelic::Control.instance.add_instrumentation File.expand_path(
4
+ File.join(__dir__, 'new_relic', 'agent','instrumentation', 'em_http.rb')
5
+ )
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "newrelic_em_http"
7
+ spec.version = "0.0.1"
8
+ spec.authors = ["Andriy Yanko"]
9
+ spec.email = ["andriy.yanko@railsware.com"]
10
+
11
+ spec.summary = %q{EM::HTTP instrumentation for New Relic RPM}
12
+ spec.homepage = "https://github.com/railsware/newrelic_em_http"
13
+
14
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
15
+ f.match(%r{^(test|spec|features)/})
16
+ end
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "newrelic_rpm", "> 4.0.0"
22
+
23
+ spec.add_development_dependency "eventmachine", ">= 1.2.0"
24
+ spec.add_development_dependency "em-http-request", ">= 1.0.0"
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.15"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rspec", "~> 3.0"
29
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: newrelic_em_http
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Andriy Yanko
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-07-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: newrelic_rpm
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: eventmachine
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: em-http-request
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.15'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.15'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ description:
98
+ email:
99
+ - andriy.yanko@railsware.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".travis.yml"
107
+ - Gemfile
108
+ - README.md
109
+ - Rakefile
110
+ - bin/console
111
+ - bin/setup
112
+ - lib/new_relic/agent/http_clients/em_http_wrappers.rb
113
+ - lib/new_relic/agent/instrumentation/em_http.rb
114
+ - lib/newrelic_em_http.rb
115
+ - newrelic_em_http.gemspec
116
+ homepage: https://github.com/railsware/newrelic_em_http
117
+ licenses: []
118
+ metadata: {}
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubyforge_project:
135
+ rubygems_version: 2.6.11
136
+ signing_key:
137
+ specification_version: 4
138
+ summary: EM::HTTP instrumentation for New Relic RPM
139
+ test_files: []
140
+ has_rdoc: