hypertrace-agent 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,61 @@
1
+ module OpenTelemetry::Instrumentation::RestClient::Patches::Request
2
+ private
3
+
4
+ def trace_request
5
+ http_method = method.upcase
6
+ instrumentation_attrs = {
7
+ 'http.scheme' => self.use_ssl? ? "https" : "http",
8
+ 'http.method' => http_method.to_s,
9
+ 'http.url' => OpenTelemetry::Common::Utilities.cleanse_url(url)
10
+ }
11
+ config = OpenTelemetry::Instrumentation::RestClient::Instrumentation.instance.config
12
+ header_map = self.processed_headers
13
+ ht_attributes = Hypertrace::Instrumentation::DataCapture.headers_to_attribute_keys(header_map,
14
+ Hypertrace::Instrumentation::DataCapture::TYPE_REQUEST)
15
+ content_type = header_map.find{|k,v|k.downcase == 'content-type'}&.last
16
+ if Hypertrace::Instrumentation::DataCapture.can_capture?(content_type,
17
+ Hypertrace::Instrumentation::DataCapture::TYPE_REQUEST)
18
+ body_cap = Hypertrace::Instrumentation::DataCapture.capturable_body(self.payload.to_s)
19
+ ht_attributes['http.request.body'] = body_cap if body_cap
20
+ end
21
+
22
+ instrumentation_attrs['peer.service'] = config[:peer_service] if config[:peer_service]
23
+ span = tracer.start_span(
24
+ "HTTP #{http_method}",
25
+ attributes: instrumentation_attrs.merge(
26
+ OpenTelemetry::Common::HTTP::ClientContext.attributes,
27
+ ht_attributes
28
+ ),
29
+ kind: :client
30
+ )
31
+
32
+ OpenTelemetry::Trace.with_span(span) do
33
+ OpenTelemetry.propagation.inject(processed_headers)
34
+ end
35
+
36
+ yield(span).tap do |response|
37
+ # Verify return value is a response.
38
+ # If so, add additional attributes.
39
+ if response.is_a?(::RestClient::Response)
40
+ headers = response.headers
41
+ Hypertrace::Instrumentation::DataCapture.headers_to_attribute_keys(headers, Hypertrace::Instrumentation::DataCapture::TYPE_RESPONSE) do |attr_key, attr_value|
42
+ span.set_attribute(attr_key, attr_value)
43
+ end
44
+ content_type = headers[:content_type]
45
+ if Hypertrace::Instrumentation::DataCapture.can_capture?(content_type, Hypertrace::Instrumentation::DataCapture::TYPE_RESPONSE)
46
+ body_cap = Hypertrace::Instrumentation::DataCapture.capturable_body(response.body)
47
+ span.set_attribute('http.response.body', body_cap) if body_cap
48
+ end
49
+ span.set_attribute('http.status_code', response.code)
50
+ span.status = OpenTelemetry::Trace::Status.error unless (100..399).include?(response.code.to_i)
51
+ end
52
+ end
53
+ rescue ::RestClient::ExceptionWithResponse => e
54
+ span.set_attribute('http.status_code', e.http_code)
55
+ span.status = OpenTelemetry::Trace::Status.error unless (100..399).include?(e.http_code.to_i)
56
+
57
+ raise e
58
+ ensure
59
+ span.finish
60
+ end
61
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Re-open sinatra middleware to customize middleware to call our Hypertrace specific capture
4
+ class OpenTelemetry::Instrumentation::Sinatra::Middlewares::TracerMiddleware
5
+ def call env
6
+ extracted_context = OpenTelemetry.propagation.extract(
7
+ env,
8
+ getter: OpenTelemetry::Common::Propagation.rack_env_getter
9
+ )
10
+ OpenTelemetry::Context.with_current(extracted_context) do
11
+ attrs = Hypertrace::Instrumentation::RackCompatible.extract_req_headers_as_attributes(env, 'http.request.header')
12
+ if Hypertrace::Instrumentation::RackCompatible.should_record_env?(env)
13
+ body_cap = Hypertrace::Instrumentation::DataCapture.capturable_body(env['rack.input'])
14
+ attrs['http.request.body'] = body_cap if body_cap
15
+ end
16
+
17
+ tracer.in_span(
18
+ env['PATH_INFO'],
19
+ attributes: request_span_attributes(env: env).merge!(attrs),
20
+ kind: :server
21
+ ) do |span|
22
+ @app.call(env).tap do |resp|
23
+ response_attributes = Hypertrace::Instrumentation::RackCompatible.extract_response_headers_as_attributes(resp, 'http.response.header')
24
+ if Hypertrace::Instrumentation::RackCompatible.should_record_rack_array?(resp)
25
+ cap_body = Hypertrace::Instrumentation::RackCompatible.extract_response_body(resp)
26
+ response_attributes['http.response.body'] = cap_body if cap_body
27
+ end
28
+ span.add_attributes(response_attributes)
29
+ trace_response(span, env, resp)
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ def request_span_attributes(env:)
36
+ attributes = {
37
+ 'http.method' => env['REQUEST_METHOD'],
38
+ 'http.host' => env['HTTP_HOST'] || 'unknown',
39
+ 'http.scheme' => env['rack.url_scheme'],
40
+ 'http.target' => env['QUERY_STRING'].empty? ? env['PATH_INFO'] : "#{env['PATH_INFO']}?#{env['QUERY_STRING']}"
41
+ }
42
+
43
+ attributes['http.user_agent'] = env['HTTP_USER_AGENT'] if env['HTTP_USER_AGENT']
44
+ attributes
45
+ end
46
+ end
@@ -0,0 +1,4 @@
1
+ module Hypertrace
2
+ module Instrumentation
3
+ end
4
+ end
@@ -0,0 +1,28 @@
1
+ require 'logger'
2
+
3
+ module Hypertrace
4
+ module Logging
5
+ def log
6
+ @_logger ||= begin
7
+ l = Logger.new(STDOUT)
8
+ l.level = get_level
9
+ l.progname = 'Hypertrace'
10
+ l
11
+ end
12
+ end
13
+
14
+ private
15
+ def get_level
16
+ level_map = {
17
+ "debug" => Logger::DEBUG,
18
+ 'info' => Logger::INFO,
19
+ 'warn' => Logger::WARN,
20
+ 'error' => Logger::ERROR
21
+ }
22
+
23
+ level = Hypertrace::EnvVarSettings.env_value('LOG_LEVEL') || ''
24
+
25
+ level_map.fetch(level.downcase, Logger::INFO)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'opentelemetry-sdk'
4
+ require 'opentelemetry/exporter/zipkin'
5
+ require 'opentelemetry/exporter/otlp'
6
+ require 'opentelemetry/propagator/b3'
7
+ require 'opentelemetry/trace/propagation/trace_context'
8
+ require 'opentelemetry/instrumentation/faraday'
9
+ require 'opentelemetry/instrumentation/net/http'
10
+ require 'opentelemetry/instrumentation/http'
11
+ require 'opentelemetry/instrumentation/mongo'
12
+ require 'opentelemetry/instrumentation/mysql2'
13
+ require 'opentelemetry/instrumentation/pg'
14
+ require 'opentelemetry/instrumentation/rack'
15
+ require 'opentelemetry/instrumentation/rails'
16
+ require 'opentelemetry/instrumentation/restclient'
17
+ require 'opentelemetry/instrumentation/sinatra'
18
+ require_relative './instrumentation'
19
+ require_relative './instrumentation/data_capture'
20
+
21
+ require_relative './instrumentation/rack_compatible'
22
+ require_relative './config'
23
+ require_relative './instrumentation/sinatra'
24
+ require_relative './version'
25
+
26
+ require 'singleton'
27
+
28
+ # We can't name the class 'Hypertrace::Agent' because the built proto definitions
29
+ # create a module Hypertrace::Agent :(
30
+ # RubyAgent is repetitve, but want to remain somewhat consistent compared to python/node
31
+ class Hypertrace::RubyAgent
32
+ include Hypertrace::Logging
33
+ include Singleton
34
+
35
+ def self.instrument!
36
+ self.instance.instrument!
37
+ end
38
+
39
+ def self.config
40
+ self.instance.config
41
+ end
42
+
43
+ def initialize(version = Hypertrace::VERSION)
44
+ log.info {"Initializing Hypertrace"}
45
+ configure_otel_logger!
46
+ @config = Hypertrace::Config::Config.new
47
+ @version = version
48
+ log.info {"Hypertrace version: #{Hypertrace::VERSION}"}
49
+ log.info {"Ruby version: #{RUBY_VERSION}"}
50
+ end
51
+
52
+ def config
53
+ @config.config
54
+ end
55
+
56
+ def instrument!
57
+ initalize_tracer
58
+ end
59
+
60
+ def initalize_tracer
61
+ resource = OpenTelemetry::SDK::Resources::Resource.create(create_resource_attributes)
62
+
63
+ # TODO: Extra resource Attributes From Config
64
+ exporter = create_exporter
65
+ OpenTelemetry::SDK.configure do |c|
66
+ if ENV['HT_CI_TEST'] != nil
67
+ span_processor = OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(EXPORTER)
68
+ c.add_span_processor span_processor
69
+ else
70
+ c.add_span_processor OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(exporter)
71
+ end
72
+ c.resource = resource
73
+
74
+ c.use 'OpenTelemetry::Instrumentation::ActionPack'
75
+ c.use 'OpenTelemetry::Instrumentation::ActionView'
76
+ c.use 'OpenTelemetry::Instrumentation::ActiveRecord'
77
+ c.use 'OpenTelemetry::Instrumentation::ActiveSupport'
78
+ c.use 'OpenTelemetry::Instrumentation::Faraday'
79
+ c.use 'OpenTelemetry::Instrumentation::Mongo'
80
+ c.use 'OpenTelemetry::Instrumentation::Mysql2'
81
+ c.use 'OpenTelemetry::Instrumentation::PG'
82
+ c.use 'OpenTelemetry::Instrumentation::Rack'
83
+ c.use 'OpenTelemetry::Instrumentation::Sinatra'
84
+ c.use 'OpenTelemetry::Instrumentation::Net::HTTP'
85
+ c.use 'OpenTelemetry::Instrumentation::HTTP'
86
+ c.use 'OpenTelemetry::Instrumentation::RestClient'
87
+ end
88
+
89
+ apply_custom_patch './instrumentation/rack'
90
+ apply_custom_patch './instrumentation/net_http_patch'
91
+ apply_custom_patch './instrumentation/http_patch'
92
+ apply_custom_patch './instrumentation/faraday_patch'
93
+ apply_custom_patch './instrumentation/rest_client_patch'
94
+
95
+ configure_propagators
96
+ end
97
+
98
+ private
99
+
100
+ def create_exporter
101
+ exporter = nil
102
+ if config.reporting.trace_reporter_type == :OTLP
103
+ verify_mode = config.reporting.secure.value ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
104
+ exporter = OpenTelemetry::Exporter::OTLP::Exporter.new(endpoint: config.reporting.endpoint.value,
105
+ ssl_verify_mode: verify_mode)
106
+ return exporter
107
+ end
108
+ if config.reporting.trace_reporter_type == :ZIPKIN
109
+ exporter = OpenTelemetry::Exporter::Zipkin::Exporter.new(endpoint: config.reporting.endpoint.value)
110
+ return exporter
111
+ end
112
+ end
113
+
114
+ def configure_propagators
115
+ propagator_list = []
116
+
117
+ [config.propagation_formats.to_a].each do |format|
118
+ if format[0] == :TRACECONTEXT
119
+ propagator_list << OpenTelemetry::Trace::Propagation::TraceContext.text_map_propagator
120
+ elsif format[0] == :B3
121
+ propagator_list << OpenTelemetry::Propagator::B3::Single.text_map_propagator
122
+ end
123
+ end
124
+ if propagator_list.empty?
125
+ log.warn{"No propagators were added!"}
126
+ end
127
+ OpenTelemetry.propagation = OpenTelemetry::Context::Propagation::CompositeTextMapPropagator.compose_propagators(propagator_list.compact)
128
+ end
129
+
130
+ private
131
+
132
+ def apply_custom_patch file
133
+ begin
134
+ require_relative file
135
+ log.debug{"Applied patch for #{file}"}
136
+ rescue => _e
137
+ log.debug{"Unable to apply patch for #{file} this is most likely because the library is unavailable or an unsupported version"}
138
+ end
139
+ end
140
+
141
+ def create_resource_attributes
142
+ {
143
+ 'service.name': config.service_name.value,
144
+ 'service.instance.id': Process.pid,
145
+ 'telemetry.sdk.version': @version,
146
+ 'telemetry.sdk.name': 'hypertrace',
147
+ 'telemetry.sdk.language': 'ruby'
148
+ }.transform_keys(&:to_s)
149
+ end
150
+
151
+ NULL_LOGGER = Logger.new(File::NULL)
152
+
153
+ def configure_otel_logger!
154
+ OpenTelemetry.logger = NULL_LOGGER
155
+ end
156
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hypertrace
4
+ VERSION = "0.1.0"
5
+ end
data/lib/hypertrace.rb ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hypertrace
4
+ class Error < StandardError; end
5
+ end
6
+
7
+ require_relative './hypertrace/version'
8
+ require_relative './hypertrace/env_var_settings'
9
+ require_relative './hypertrace/logging'
10
+ require_relative './hypertrace/config'
11
+ require_relative './hypertrace/ruby_agent'
12
+
13
+
data/rubyagent.gemspec ADDED
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/hypertrace/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "hypertrace-agent"
7
+ spec.version = Hypertrace::VERSION
8
+ spec.authors = ["prodion23"]
9
+ spec.email = ["Write your email address"]
10
+
11
+ spec.summary = "Write a short summary, because RubyGems requires one."
12
+ spec.description = "Hypertrace ..."
13
+ spec.homepage = "https://hypertrace.com"
14
+ spec.required_ruby_version = ">= 2.6.0"
15
+
16
+ # spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
17
+
18
+ spec.metadata["homepage_uri"] = spec.homepage
19
+ spec.metadata["source_code_uri"] = "https://github.com/hypertrace/rubyagent"
20
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
25
+ `git ls-files -z`.split("\x0").reject do |f|
26
+ (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
27
+ end
28
+ end
29
+ spec.bindir = "exe"
30
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ["lib"]
32
+
33
+ # Uncomment to register a new dependency of your gem
34
+ # spec.add_dependency "example-gem", "~> 1.0"
35
+ spec.add_dependency 'google-protobuf', '3.21.5'
36
+ spec.add_dependency 'opentelemetry-api', '1.0.2'
37
+ spec.add_dependency 'opentelemetry-sdk', '1.1.0'
38
+ spec.add_dependency 'opentelemetry-propagator-b3', '0.20.0'
39
+ spec.add_dependency 'opentelemetry-exporter-otlp', '0.21.1'
40
+ spec.add_dependency 'opentelemetry-exporter-zipkin', '0.20.0'
41
+ spec.add_dependency 'opentelemetry-instrumentation-faraday', '0.21.0'
42
+ spec.add_dependency 'opentelemetry-instrumentation-mysql2', '0.21.0'
43
+ spec.add_dependency 'opentelemetry-instrumentation-pg', '0.21.0'
44
+ spec.add_dependency 'opentelemetry-instrumentation-mongo', '0.20.0'
45
+ spec.add_dependency 'opentelemetry-instrumentation-net_http', '0.20.0'
46
+ spec.add_dependency 'opentelemetry-instrumentation-http', '0.20.0'
47
+ spec.add_dependency 'opentelemetry-instrumentation-rails', '0.22.0'
48
+ spec.add_dependency 'opentelemetry-instrumentation-restclient', '0.20.0'
49
+ spec.add_dependency 'opentelemetry-instrumentation-sinatra', '0.20.0'
50
+
51
+ # For more information and examples about making a new gem, check out our
52
+ # guide at: https://bundler.io/guides/creating_gem.html
53
+ end
data/sig/rubyagent.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Rubyagent
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,288 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hypertrace-agent
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - prodion23
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-09-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: google-protobuf
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.21.5
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 3.21.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: opentelemetry-api
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.0.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: opentelemetry-sdk
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.1.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: opentelemetry-propagator-b3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.20.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.20.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: opentelemetry-exporter-otlp
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 0.21.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 0.21.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: opentelemetry-exporter-zipkin
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.20.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.20.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: opentelemetry-instrumentation-faraday
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.21.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.21.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: opentelemetry-instrumentation-mysql2
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.21.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 0.21.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: opentelemetry-instrumentation-pg
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '='
130
+ - !ruby/object:Gem::Version
131
+ version: 0.21.0
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '='
137
+ - !ruby/object:Gem::Version
138
+ version: 0.21.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: opentelemetry-instrumentation-mongo
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '='
144
+ - !ruby/object:Gem::Version
145
+ version: 0.20.0
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '='
151
+ - !ruby/object:Gem::Version
152
+ version: 0.20.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: opentelemetry-instrumentation-net_http
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '='
158
+ - !ruby/object:Gem::Version
159
+ version: 0.20.0
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '='
165
+ - !ruby/object:Gem::Version
166
+ version: 0.20.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: opentelemetry-instrumentation-http
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 0.20.0
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '='
179
+ - !ruby/object:Gem::Version
180
+ version: 0.20.0
181
+ - !ruby/object:Gem::Dependency
182
+ name: opentelemetry-instrumentation-rails
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '='
186
+ - !ruby/object:Gem::Version
187
+ version: 0.22.0
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '='
193
+ - !ruby/object:Gem::Version
194
+ version: 0.22.0
195
+ - !ruby/object:Gem::Dependency
196
+ name: opentelemetry-instrumentation-restclient
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - '='
200
+ - !ruby/object:Gem::Version
201
+ version: 0.20.0
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - '='
207
+ - !ruby/object:Gem::Version
208
+ version: 0.20.0
209
+ - !ruby/object:Gem::Dependency
210
+ name: opentelemetry-instrumentation-sinatra
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - '='
214
+ - !ruby/object:Gem::Version
215
+ version: 0.20.0
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '='
221
+ - !ruby/object:Gem::Version
222
+ version: 0.20.0
223
+ description: Hypertrace ...
224
+ email:
225
+ - Write your email address
226
+ executables: []
227
+ extensions: []
228
+ extra_rdoc_files: []
229
+ files:
230
+ - ".rspec"
231
+ - ".rubocop.yml"
232
+ - ".ruby-gemset"
233
+ - ".ruby-version"
234
+ - Gemfile
235
+ - Gemfile.lock
236
+ - LICENSE
237
+ - README.md
238
+ - Rakefile
239
+ - bin/console
240
+ - bin/setup
241
+ - build_proto.sh
242
+ - examples/sinatra/app.rb
243
+ - lib/hypertrace.rb
244
+ - lib/hypertrace/config.rb
245
+ - lib/hypertrace/config/config.rb
246
+ - lib/hypertrace/config/config_pb.rb
247
+ - lib/hypertrace/config/default.rb
248
+ - lib/hypertrace/config/environment.rb
249
+ - lib/hypertrace/env_var_settings.rb
250
+ - lib/hypertrace/instrumentation.rb
251
+ - lib/hypertrace/instrumentation/data_capture.rb
252
+ - lib/hypertrace/instrumentation/faraday_patch.rb
253
+ - lib/hypertrace/instrumentation/http_patch.rb
254
+ - lib/hypertrace/instrumentation/net_http_patch.rb
255
+ - lib/hypertrace/instrumentation/rack.rb
256
+ - lib/hypertrace/instrumentation/rack_compatible.rb
257
+ - lib/hypertrace/instrumentation/rest_client_patch.rb
258
+ - lib/hypertrace/instrumentation/sinatra.rb
259
+ - lib/hypertrace/logging.rb
260
+ - lib/hypertrace/ruby_agent.rb
261
+ - lib/hypertrace/version.rb
262
+ - rubyagent.gemspec
263
+ - sig/rubyagent.rbs
264
+ homepage: https://hypertrace.com
265
+ licenses: []
266
+ metadata:
267
+ homepage_uri: https://hypertrace.com
268
+ source_code_uri: https://github.com/hypertrace/rubyagent
269
+ post_install_message:
270
+ rdoc_options: []
271
+ require_paths:
272
+ - lib
273
+ required_ruby_version: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - ">="
276
+ - !ruby/object:Gem::Version
277
+ version: 2.6.0
278
+ required_rubygems_version: !ruby/object:Gem::Requirement
279
+ requirements:
280
+ - - ">="
281
+ - !ruby/object:Gem::Version
282
+ version: '0'
283
+ requirements: []
284
+ rubygems_version: 3.3.7
285
+ signing_key:
286
+ specification_version: 4
287
+ summary: Write a short summary, because RubyGems requires one.
288
+ test_files: []