epsagon 0.0.8 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a7b3206724c319044ec03107de40ed46798b935d85e6aba2a5cadadfe777e86c
4
- data.tar.gz: cd515cf0bcd75faba2d3153f456c44441fa9df5e511f7a8b4aea5dc95178a3c1
3
+ metadata.gz: 61ba7bcc54462d42f93ab3ef042ad54eae55b0447849ed2cb04407980d95ac5c
4
+ data.tar.gz: cbe32e9ece025429fba57e0468b9016e81ab0d291a20755b3fe4c7eb13bcfb13
5
5
  SHA512:
6
- metadata.gz: fa0bc9dcc5710f2498a9c39f3d86ebc43ed825b4fa23a8532457a6770ed9834de2ca2fab3e37c7324902ac38f0f426ea0de0ca2f1272a73c56ad35ff7afe1458
7
- data.tar.gz: 00b78e433d7cfea98710f6f641123727a3b44edcfab51da0039363c1db135401166ea4d35f2d4e935f54d78de1434130ea33b092e83cd85d1ba56d3bead9e847
6
+ metadata.gz: d722c6363b5a2184034a8e05e43b7fc5ad20f1f4689b62f44f0287b6bfef62253765d1d71f312f49bf4d5d9698b82ba3e6507b45260b53cff3fe637f736b501f
7
+ data.tar.gz: a6d24b5d4d8de7e42e8780d936e22256c0d23618c19c7c232ea0d96c3ecbf95eed7f7e43d6bba044ded25fda965903262328f77893155718e4df8a23ddd146d8
data/lib/epsagon.rb CHANGED
@@ -9,19 +9,23 @@ require 'opentelemetry/exporter/otlp'
9
9
  require_relative 'instrumentation/sinatra'
10
10
  require_relative 'instrumentation/net_http'
11
11
  require_relative 'instrumentation/faraday'
12
+ require_relative 'instrumentation/aws_sdk'
13
+ require_relative 'instrumentation/rails'
12
14
  require_relative 'util'
13
15
 
14
16
  Bundler.require
15
17
 
16
18
  # Epsagon tracing main entry point
17
19
  module Epsagon
20
+ DEFAULT_BACKEND = 'opentelemetry.tc.epsagon.com:443/traces'
21
+
18
22
  @@epsagon_config = {
19
- metadata_only: ENV['EPSAGON_METADATA']&.to_s&.downcase != 'false',
20
- debug: ENV['EPSAGON_DEBUG']&.to_s&.downcase == 'true',
21
- token: ENV['EPSAGON_TOKEN'],
22
- app_name: ENV['EPSAGON_APP_NAME'],
23
- backend: ENV['EPSAGON_BACKEND'] || 'localhost:55681/v1/trace'
24
- }
23
+ metadata_only: ENV['EPSAGON_METADATA']&.to_s&.downcase != 'false',
24
+ debug: ENV['EPSAGON_DEBUG']&.to_s&.downcase == 'true',
25
+ token: ENV['EPSAGON_TOKEN'],
26
+ app_name: ENV['EPSAGON_APP_NAME'],
27
+ backend: ENV['EPSAGON_BACKEND'] || DEFAULT_BACKEND
28
+ }
25
29
 
26
30
  module_function
27
31
 
@@ -39,14 +43,16 @@ module Epsagon
39
43
  configurator.use 'EpsagonSinatraInstrumentation', { epsagon: @@epsagon_config }
40
44
  configurator.use 'EpsagonNetHTTPInstrumentation', { epsagon: @@epsagon_config }
41
45
  configurator.use 'EpsagonFaradayInstrumentation', { epsagon: @@epsagon_config }
46
+ configurator.use 'EpsagonAwsSdkInstrumentation', { epsagon: @@epsagon_config }
47
+ configurator.use 'EpsagonRailsInstrumentation', { epsagon: @@epsagon_config }
42
48
 
43
49
  if @@epsagon_config[:debug]
44
50
  configurator.add_span_processor OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(
45
51
  OpenTelemetry::Exporter::OTLP::Exporter.new(headers: {
46
- 'x-epsagon-token' => @@epsagon_config[:token]
47
- },
48
- endpoint: @@epsagon_config[:backend],
49
- insecure: @@epsagon_config[:insecure] || false)
52
+ 'x-epsagon-token' => @@epsagon_config[:token]
53
+ },
54
+ endpoint: @@epsagon_config[:backend],
55
+ insecure: @@epsagon_config[:insecure] || false)
50
56
  )
51
57
 
52
58
  configurator.add_span_processor OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(
@@ -62,7 +68,6 @@ module Epsagon
62
68
  )
63
69
  end
64
70
  end
65
-
66
71
  end
67
72
 
68
73
  # monkey patch to include epsagon confs
@@ -2,32 +2,6 @@
2
2
 
3
3
  require_relative '../util'
4
4
 
5
- # AWS SDK plugin for epsagon instrumentation
6
- class EpsagonAwsPlugin < Seahorse::Client::Plugin
7
- def add_handlers(handlers, _)
8
- handlers.add(EpsagonAwsHandler, step: :validate)
9
- end
10
- end
11
-
12
- # Generates Spans for all uses of AWS SDK
13
- class EpsagonAwsHandler < Seahorse::Client::Handler
14
- def call(context)
15
- tracer.in_span('') do |span|
16
- @handler.call(context).tap do
17
- span.set_attribute('aws.operation', context[:command])
18
- span.set_attribute('aws.status_code', context[:status_code])
19
- span.set_attribute('aws.service', context[:service_name])
20
- span.set_attribute('aws.account_id', context[:account_id])
21
- span.set_attribute('aws.status_code', context[:status_code])
22
- end
23
- end
24
- end
25
-
26
- def tracer
27
- EpsagonAwsSdkInstrumentation.instance.tracer
28
- end
29
- end
30
-
31
5
  # AWS SDK epsagon instrumentation
32
6
  class EpsagonAwsSdkInstrumentation < OpenTelemetry::Instrumentation::Base
33
7
  VERSION = '0.0.0'
@@ -143,6 +117,7 @@ class EpsagonAwsSdkInstrumentation < OpenTelemetry::Instrumentation::Base
143
117
  ].freeze
144
118
 
145
119
  install do |_|
120
+ require_relative 'aws_sdk_plugin'
146
121
  ::Seahorse::Client::Base.add_plugin(EpsagonAwsPlugin)
147
122
  loaded_constants.each { |klass| klass.add_plugin(EpsagonAwsPlugin) }
148
123
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aws-sdk-core'
4
+ require 'opentelemetry/common'
5
+ require 'opentelemetry/sdk'
6
+
7
+ def untraced(&block)
8
+ OpenTelemetry::Trace.with_span(OpenTelemetry::Trace::Span.new, &block)
9
+ end
10
+
11
+ # AWS SDK plugin for epsagon instrumentation
12
+ class EpsagonAwsPlugin < Seahorse::Client::Plugin
13
+ def add_handlers(handlers, _)
14
+ handlers.add(EpsagonAwsHandler, step: :validate)
15
+ end
16
+ end
17
+
18
+ # Generates Spans for all uses of AWS SDK
19
+ class EpsagonAwsHandler < Seahorse::Client::Handler
20
+ def call(context)
21
+ tracer.in_span('', kind: :client) do |span|
22
+ untraced do
23
+ @handler.call(context).tap do
24
+ span.set_attribute('aws.service', context.client.class.to_s.split('::')[1].downcase)
25
+ span.set_attribute('aws.operation', context.operation.name)
26
+ span.set_attribute('aws.region', context.client.config.region)
27
+ span.set_attribute('http.status_code', context.http_response.status_code)
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ def tracer
34
+ EpsagonAwsSdkInstrumentation.instance.tracer
35
+ end
36
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require_relative '../util'
3
4
  require 'faraday'
@@ -0,0 +1,282 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'opentelemetry/trace/status'
4
+
5
+ module QueueTime
6
+ REQUEST_START = 'HTTP_X_REQUEST_START'
7
+ QUEUE_START = 'HTTP_X_QUEUE_START'
8
+ MINIMUM_ACCEPTABLE_TIME_VALUE = 1_000_000_000
9
+
10
+ module_function
11
+
12
+ def get_request_start(env, now = nil) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
13
+ header = env[REQUEST_START] || env[QUEUE_START]
14
+ return unless header
15
+
16
+ # nginx header is seconds in the format "t=1512379167.574"
17
+ # apache header is microseconds in the format "t=1570633834463123"
18
+ # heroku header is milliseconds in the format "1570634024294"
19
+ time_string = header.to_s.delete('^0-9')
20
+ return if time_string.nil?
21
+
22
+ # Return nil if the time is clearly invalid
23
+ time_value = "#{time_string[0, 10]}.#{time_string[10, 6]}".to_f
24
+ return if time_value.zero? || time_value < MINIMUM_ACCEPTABLE_TIME_VALUE
25
+
26
+ # return the request_start only if it's lesser than
27
+ # current time, to avoid significant clock skew
28
+ request_start = Time.at(time_value)
29
+ now ||= Time.now.utc
30
+ request_start.utc > now ? nil : request_start
31
+ rescue StandardError => e
32
+ # in case of an Exception we don't create a
33
+ # `request.queuing` span
34
+ OpenTelemetry.logger.debug("[rack] unable to parse request queue headers: #{e}")
35
+ nil
36
+ end
37
+ end
38
+
39
+ class EpsagonRackMiddleware
40
+ class << self
41
+ def allowed_rack_request_headers
42
+ @allowed_rack_request_headers ||= Array(config[:allowed_request_headers]).each_with_object({}) do |header, memo|
43
+ memo["HTTP_#{header.to_s.upcase.gsub(/[-\s]/, '_')}"] = build_attribute_name('http.request.headers.', header)
44
+ end
45
+ end
46
+
47
+ def allowed_response_headers
48
+ @allowed_response_headers ||= Array(config[:allowed_response_headers]).each_with_object({}) do |header, memo|
49
+ memo[header] = build_attribute_name('http.response.headers.', header)
50
+ memo[header.to_s.upcase] = build_attribute_name('http.response.headers.', header)
51
+ end
52
+ end
53
+
54
+ def build_attribute_name(prefix, suffix)
55
+ prefix + suffix.to_s.downcase.gsub(/[-\s]/, '_')
56
+ end
57
+
58
+ def config
59
+ EpsagonRailsInstrumentation.instance.config
60
+ end
61
+
62
+ private
63
+
64
+ def clear_cached_config
65
+ @allowed_rack_request_headers = nil
66
+ @allowed_response_headers = nil
67
+ end
68
+ end
69
+
70
+ EMPTY_HASH = {}.freeze
71
+
72
+ def initialize(app)
73
+ @app = app
74
+ end
75
+
76
+ def call(env)
77
+ original_env = env.dup
78
+ extracted_context = OpenTelemetry.propagation.http.extract(env)
79
+ frontend_context = create_frontend_span(env, extracted_context)
80
+
81
+ # restore extracted context in this process:
82
+ OpenTelemetry::Context.with_current(frontend_context || extracted_context) do
83
+ request_span_name = create_request_span_name(env['REQUEST_URI'] || original_env['PATH_INFO'])
84
+ tracer.in_span(env['HTTP_HOST'] || 'unknown',
85
+ attributes: request_span_attributes(env: env),
86
+ kind: :server) do |http_span|
87
+ RackExtension.with_span(http_span) do
88
+ tracer.in_span('rails') do |framework_span|
89
+ @app.call(env).tap do |status, headers, response|
90
+ set_attributes_after_request(http_span, framework_span, status, headers, response)
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ ensure
97
+ finish_span(frontend_context)
98
+ end
99
+
100
+ private
101
+
102
+ # return Context with the frontend span as the current span
103
+ def create_frontend_span(env, extracted_context)
104
+ request_start_time = QueueTime.get_request_start(env)
105
+
106
+ return unless config[:record_frontend_span] && !request_start_time.nil?
107
+
108
+ span = tracer.start_span('http_server.proxy',
109
+ with_parent: extracted_context,
110
+ attributes: {
111
+ 'start_time' => request_start_time.to_f
112
+ },
113
+ kind: :server)
114
+
115
+ OpenTelemetry::Trace.context_with_span(span, parent_context: extracted_context)
116
+ end
117
+
118
+ def finish_span(context)
119
+ OpenTelemetry::Trace.current_span(context).finish if context
120
+ end
121
+
122
+ def tracer
123
+ EpsagonRailsInstrumentation.instance.tracer
124
+ end
125
+
126
+ def request_span_attributes(env:)
127
+ request = Rack::Request.new(env)
128
+ path, path_params = request.path.split(';')
129
+ request_headers = JSON.generate(Hash[*env.select { |k, _v| k.start_with? 'HTTP_' }
130
+ .collect { |k, v| [k.sub(/^HTTP_/, ''), v] }
131
+ .collect { |k, v| [k.split('_').collect(&:capitalize).join('-'), v] }
132
+ .sort
133
+ .flatten])
134
+
135
+ attributes = {
136
+ 'operation' => env['REQUEST_METHOD'],
137
+ 'type' => 'http',
138
+ 'http.scheme' => env['PATH_INFO'],
139
+ 'http.request.path' => path,
140
+ 'http.request.headers' => request_headers
141
+ }
142
+
143
+ unless config[:epsagon][:metadata_only]
144
+ request.body.rewind
145
+ request_body = request.body.read
146
+ request.body.rewind
147
+
148
+ attributes.merge!(Util.epsagon_query_attributes(request.query_string))
149
+
150
+ attributes.merge!({
151
+ 'http.request.body' => request_body,
152
+ 'http.request.path_params' => path_params,
153
+ 'http.request.headers.User-Agent' => env['HTTP_USER_AGENT']
154
+ })
155
+ end
156
+
157
+ attributes
158
+ end
159
+
160
+ # e.g., "/webshop/articles/4?s=1":
161
+ def fullpath(env)
162
+ query_string = env['QUERY_STRING']
163
+ path = env['SCRIPT_NAME'] + env['PATH_INFO']
164
+
165
+ query_string.empty? ? path : "#{path}?#{query_string}"
166
+ end
167
+
168
+ # https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-http.md#name
169
+ #
170
+ # recommendation: span.name(s) should be low-cardinality (e.g.,
171
+ # strip off query param value, keep param name)
172
+ #
173
+ # see http://github.com/open-telemetry/opentelemetry-specification/pull/416/files
174
+ def create_request_span_name(request_uri_or_path_info)
175
+ # NOTE: dd-trace-rb has implemented 'quantization' (which lowers url cardinality)
176
+ # see Datadog::Quantization::HTTP.url
177
+
178
+ if (implementation = config[:url_quantization])
179
+ implementation.call(request_uri_or_path_info)
180
+ else
181
+ request_uri_or_path_info
182
+ end
183
+ end
184
+
185
+ def set_attributes_after_request(http_span, _framework_span, status, headers, response)
186
+ unless config[:epsagon][:metadata_only]
187
+ http_span.set_attribute('http.response.headers', JSON.generate(headers))
188
+ http_span.set_attribute('http.response.body', response.join)
189
+ end
190
+
191
+ http_span.set_attribute('http.status_code', status)
192
+ http_span.status = OpenTelemetry::Trace::Status.http_to_status(status)
193
+ end
194
+
195
+ def allowed_request_headers(env)
196
+ return EMPTY_HASH if self.class.allowed_rack_request_headers.empty?
197
+
198
+ {}.tap do |result|
199
+ self.class.allowed_rack_request_headers.each do |key, value|
200
+ result[value] = env[key] if env.key?(key)
201
+ end
202
+ end
203
+ end
204
+
205
+ def allowed_response_headers(headers)
206
+ return EMPTY_HASH if headers.nil?
207
+ return EMPTY_HASH if self.class.allowed_response_headers.empty?
208
+
209
+ {}.tap do |result|
210
+ self.class.allowed_response_headers.each do |key, value|
211
+ if headers.key?(key)
212
+ result[value] = headers[key]
213
+ else
214
+ # do case-insensitive match:
215
+ headers.each do |k, v|
216
+ if k.upcase == key
217
+ result[value] = v
218
+ break
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
225
+
226
+ def config
227
+ EpsagonRailsInstrumentation.instance.config
228
+ end
229
+ end
230
+
231
+ # class EpsagonRackInstrumentation < OpenTelemetry::Instrumentation::Base
232
+ # install do |config|
233
+ # require_dependencies
234
+
235
+ # retain_middleware_names if config[:retain_middleware_names]
236
+ # end
237
+
238
+ # present do
239
+ # defined?(::Rack)
240
+ # end
241
+
242
+ # private
243
+
244
+ # def require_dependencies
245
+ # require_relative 'middlewares/tracer_middleware'
246
+ # end
247
+
248
+ # MissingApplicationError = Class.new(StandardError)
249
+
250
+ # # intercept all middleware-compatible calls, retain class name
251
+ # def retain_middleware_names
252
+ # next_middleware = config[:application]
253
+ # raise MissingApplicationError unless next_middleware
254
+
255
+ # while next_middleware
256
+ # if next_middleware.respond_to?(:call)
257
+ # next_middleware.singleton_class.class_eval do
258
+ # alias_method :__call, :call
259
+
260
+ # def call(env)
261
+ # env['RESPONSE_MIDDLEWARE'] = self.class.to_s
262
+ # __call(env)
263
+ # end
264
+ # end
265
+ # end
266
+
267
+ # next_middleware = next_middleware.instance_variable_defined?('@app') &&
268
+ # next_middleware.instance_variable_get('@app')
269
+ # end
270
+ # end
271
+ # end
272
+
273
+ class EpsagonRailtie < ::Rails::Railtie
274
+ config.before_initialize do |app|
275
+ # EpsagonRackInstrumentation.instance.install({})
276
+
277
+ app.middleware.insert_after(
278
+ ActionDispatch::RequestId,
279
+ EpsagonRackMiddleware
280
+ )
281
+ end
282
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # Patch faraday to include middleware
3
4
  module EpsagonFaradayPatch
4
5
  def adapter(*args)
@@ -40,7 +40,7 @@ module EpsagonNetHTTPExtension
40
40
  tracer.in_span(
41
41
  @address,
42
42
  attributes: attributes,
43
- kind: :Client
43
+ kind: :client
44
44
  ) do |span|
45
45
  OpenTelemetry.propagation.http.inject(req)
46
46
 
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'opentelemetry'
4
+ require 'rails'
5
+ require 'action_controller/railtie'
6
+
7
+ require_relative '../util'
8
+
9
+ module RackExtension
10
+ module_function
11
+
12
+ CURRENT_SPAN_KEY = OpenTelemetry::Context.create_key('current-span')
13
+
14
+ private_constant :CURRENT_SPAN_KEY
15
+
16
+ # Returns the current span from the current or provided context
17
+ #
18
+ # @param [optional Context] context The context to lookup the current
19
+ # {Span} from. Defaults to Context.current
20
+ def current_span(context = nil)
21
+ context ||= OpenTelemetry::Context.current
22
+ context.value(CURRENT_SPAN_KEY) || OpenTelemetry::Trace::Span::INVALID
23
+ end
24
+
25
+ # Returns a context containing the span, derived from the optional parent
26
+ # context, or the current context if one was not provided.
27
+ #
28
+ # @param [optional Context] context The context to use as the parent for
29
+ # the returned context
30
+ def context_with_span(span, parent_context: OpenTelemetry::Context.current)
31
+ parent_context.set_value(CURRENT_SPAN_KEY, span)
32
+ end
33
+
34
+ # Activates/deactivates the Span within the current Context, which makes the "current span"
35
+ # available implicitly.
36
+ #
37
+ # On exit, the Span that was active before calling this method will be reactivated.
38
+ #
39
+ # @param [Span] span the span to activate
40
+ # @yield [span, context] yields span and a context containing the span to the block.
41
+ def with_span(span)
42
+ OpenTelemetry::Context.with_value(CURRENT_SPAN_KEY, span) { |c, s| yield s, c }
43
+ end
44
+ end
45
+
46
+ module MetalPatch
47
+ def dispatch(name, request, response)
48
+ rack_span = RackExtension.current_span
49
+ # rack_span.name = "#{self.class.name}##{name}" if rack_span.context.valid? && !request.env['action_dispatch.exception']
50
+ super(name, request, response)
51
+ end
52
+ end
53
+
54
+ class EpsagonRailsInstrumentation < OpenTelemetry::Instrumentation::Base
55
+ install do |_config|
56
+ require_relative 'epsagon_rails_middleware'
57
+ ::ActionController::Metal.prepend(MetalPatch)
58
+ end
59
+
60
+ present do
61
+ defined?(::Rails)
62
+ end
63
+ end
@@ -26,7 +26,7 @@ class EpsagonTracerMiddleware
26
26
  attributes = {
27
27
  'operation' => env['REQUEST_METHOD'],
28
28
  'type' => 'http',
29
- 'http.scheme' => env['PATH_INFO'],
29
+ 'http.scheme' => env['rack.url_scheme'],
30
30
  'http.request.path' => path,
31
31
  'http.request.headers' => request_headers
32
32
  }
@@ -48,10 +48,14 @@ class EpsagonTracerMiddleware
48
48
  tracer.in_span(
49
49
  env['HTTP_HOST'],
50
50
  attributes: attributes,
51
- kind: :Server,
51
+ kind: :server,
52
52
  with_parent: parent_context(env)
53
53
  ) do |http_span|
54
- tracer.in_span('sinatra') do |framework_span|
54
+ tracer.in_span(
55
+ env['HTTP_HOST'],
56
+ kind: :server,
57
+ attributes: { type: 'sinatra' }
58
+ ) do |framework_span|
55
59
  app.call(env).tap { |resp| trace_response(http_span, framework_span, env, resp) }
56
60
  end
57
61
  end
@@ -78,7 +82,7 @@ class EpsagonTracerMiddleware
78
82
  end
79
83
 
80
84
  http_span.set_attribute('http.status_code', status)
81
- framework_span.set_attribute('http.route', env['sinatra.route'].split.last) if env['sinatra.route']
85
+ http_span.set_attribute('http.route', env['sinatra.route'].split.last) if env['sinatra.route']
82
86
  http_span.status = OpenTelemetry::Trace::Status.http_to_status(status)
83
87
  end
84
88
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: epsagon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Epsagon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-10 00:00:00.000000000 Z
11
+ date: 2021-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -25,35 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.11.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: opentelemetry-sdk
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: 0.11.1
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: 0.11.1
41
- - !ruby/object:Gem::Dependency
42
- name: sinatra
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '2.1'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '2.1'
55
- - !ruby/object:Gem::Dependency
56
- name: opentelemetry-instrumentation-sinatra
28
+ name: opentelemetry-exporter-otlp
57
29
  requirement: !ruby/object:Gem::Requirement
58
30
  requirements:
59
31
  - - "~>"
@@ -67,7 +39,7 @@ dependencies:
67
39
  - !ruby/object:Gem::Version
68
40
  version: 0.11.0
69
41
  - !ruby/object:Gem::Dependency
70
- name: opentelemetry-exporter-otlp
42
+ name: opentelemetry-instrumentation-sinatra
71
43
  requirement: !ruby/object:Gem::Requirement
72
44
  requirements:
73
45
  - - "~>"
@@ -81,19 +53,19 @@ dependencies:
81
53
  - !ruby/object:Gem::Version
82
54
  version: 0.11.0
83
55
  - !ruby/object:Gem::Dependency
84
- name: faraday
56
+ name: opentelemetry-sdk
85
57
  requirement: !ruby/object:Gem::Requirement
86
58
  requirements:
87
59
  - - "~>"
88
60
  - !ruby/object:Gem::Version
89
- version: '1.3'
61
+ version: 0.11.1
90
62
  type: :runtime
91
63
  prerelease: false
92
64
  version_requirements: !ruby/object:Gem::Requirement
93
65
  requirements:
94
66
  - - "~>"
95
67
  - !ruby/object:Gem::Version
96
- version: '1.3'
68
+ version: 0.11.1
97
69
  description: 'Epsagon provides tracing to Ruby applications for the collection of
98
70
  distributed tracing and performance metrics to simplify complex architectures, eliminate
99
71
  manual work, visualize and correlate data to identify and fix problems fast.
@@ -106,9 +78,12 @@ extra_rdoc_files: []
106
78
  files:
107
79
  - lib/epsagon.rb
108
80
  - lib/instrumentation/aws_sdk.rb
81
+ - lib/instrumentation/aws_sdk_plugin.rb
109
82
  - lib/instrumentation/epsagon_faraday_middleware.rb
83
+ - lib/instrumentation/epsagon_rails_middleware.rb
110
84
  - lib/instrumentation/faraday.rb
111
85
  - lib/instrumentation/net_http.rb
86
+ - lib/instrumentation/rails.rb
112
87
  - lib/instrumentation/sinatra.rb
113
88
  - lib/util.rb
114
89
  homepage: https://github.com/epsagon/epsagon-ruby