fair-ddtrace 0.8.2.a

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.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/.env +11 -0
  3. data/.gitignore +59 -0
  4. data/.rubocop.yml +61 -0
  5. data/.yardopts +5 -0
  6. data/Appraisals +136 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +24 -0
  9. data/README.md +156 -0
  10. data/Rakefile +176 -0
  11. data/circle.yml +61 -0
  12. data/ddtrace.gemspec +44 -0
  13. data/docker-compose.yml +42 -0
  14. data/docs/GettingStarted.md +735 -0
  15. data/gemfiles/contrib.gemfile +16 -0
  16. data/gemfiles/contrib_old.gemfile +15 -0
  17. data/gemfiles/rails30_postgres.gemfile +10 -0
  18. data/gemfiles/rails30_postgres_sidekiq.gemfile +11 -0
  19. data/gemfiles/rails32_mysql2.gemfile +11 -0
  20. data/gemfiles/rails32_postgres.gemfile +10 -0
  21. data/gemfiles/rails32_postgres_redis.gemfile +11 -0
  22. data/gemfiles/rails32_postgres_sidekiq.gemfile +11 -0
  23. data/gemfiles/rails4_mysql2.gemfile +9 -0
  24. data/gemfiles/rails4_postgres.gemfile +9 -0
  25. data/gemfiles/rails4_postgres_redis.gemfile +10 -0
  26. data/gemfiles/rails4_postgres_sidekiq.gemfile +11 -0
  27. data/gemfiles/rails5_mysql2.gemfile +8 -0
  28. data/gemfiles/rails5_postgres.gemfile +8 -0
  29. data/gemfiles/rails5_postgres_redis.gemfile +9 -0
  30. data/gemfiles/rails5_postgres_sidekiq.gemfile +10 -0
  31. data/lib/ddtrace.rb +73 -0
  32. data/lib/ddtrace/buffer.rb +52 -0
  33. data/lib/ddtrace/context.rb +145 -0
  34. data/lib/ddtrace/contrib/active_record/patcher.rb +94 -0
  35. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +108 -0
  36. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +22 -0
  37. data/lib/ddtrace/contrib/grape/endpoint.rb +164 -0
  38. data/lib/ddtrace/contrib/grape/patcher.rb +73 -0
  39. data/lib/ddtrace/contrib/http/patcher.rb +156 -0
  40. data/lib/ddtrace/contrib/rack/middlewares.rb +150 -0
  41. data/lib/ddtrace/contrib/rails/action_controller.rb +81 -0
  42. data/lib/ddtrace/contrib/rails/action_view.rb +110 -0
  43. data/lib/ddtrace/contrib/rails/active_record.rb +56 -0
  44. data/lib/ddtrace/contrib/rails/active_support.rb +113 -0
  45. data/lib/ddtrace/contrib/rails/core_extensions.rb +137 -0
  46. data/lib/ddtrace/contrib/rails/framework.rb +171 -0
  47. data/lib/ddtrace/contrib/rails/middlewares.rb +32 -0
  48. data/lib/ddtrace/contrib/rails/utils.rb +43 -0
  49. data/lib/ddtrace/contrib/redis/patcher.rb +118 -0
  50. data/lib/ddtrace/contrib/redis/quantize.rb +30 -0
  51. data/lib/ddtrace/contrib/redis/tags.rb +19 -0
  52. data/lib/ddtrace/contrib/sidekiq/tracer.rb +103 -0
  53. data/lib/ddtrace/contrib/sinatra/tracer.rb +169 -0
  54. data/lib/ddtrace/distributed.rb +38 -0
  55. data/lib/ddtrace/encoding.rb +65 -0
  56. data/lib/ddtrace/error.rb +37 -0
  57. data/lib/ddtrace/ext/app_types.rb +10 -0
  58. data/lib/ddtrace/ext/cache.rb +7 -0
  59. data/lib/ddtrace/ext/distributed.rb +10 -0
  60. data/lib/ddtrace/ext/errors.rb +10 -0
  61. data/lib/ddtrace/ext/http.rb +11 -0
  62. data/lib/ddtrace/ext/net.rb +8 -0
  63. data/lib/ddtrace/ext/redis.rb +11 -0
  64. data/lib/ddtrace/ext/sql.rb +8 -0
  65. data/lib/ddtrace/logger.rb +39 -0
  66. data/lib/ddtrace/monkey.rb +84 -0
  67. data/lib/ddtrace/pin.rb +63 -0
  68. data/lib/ddtrace/provider.rb +21 -0
  69. data/lib/ddtrace/sampler.rb +49 -0
  70. data/lib/ddtrace/span.rb +222 -0
  71. data/lib/ddtrace/tracer.rb +310 -0
  72. data/lib/ddtrace/transport.rb +162 -0
  73. data/lib/ddtrace/utils.rb +16 -0
  74. data/lib/ddtrace/version.rb +9 -0
  75. data/lib/ddtrace/workers.rb +108 -0
  76. data/lib/ddtrace/writer.rb +118 -0
  77. metadata +208 -0
@@ -0,0 +1,162 @@
1
+ require 'thread'
2
+ require 'net/http'
3
+
4
+ require 'ddtrace/encoding'
5
+ require 'ddtrace/version'
6
+
7
+ module Datadog
8
+ # Transport class that handles the spans delivery to the
9
+ # local trace-agent. The class wraps a Net:HTTP instance
10
+ # so that the Transport is thread-safe.
11
+ class HTTPTransport
12
+ attr_accessor :hostname, :port
13
+ attr_reader :traces_endpoint, :services_endpoint
14
+
15
+ # seconds before the transport timeout
16
+ TIMEOUT = 1
17
+
18
+ # header containing the number of traces in a payload
19
+ TRACE_COUNT_HEADER = 'X-Datadog-Trace-Count'.freeze
20
+ RUBY_INTERPRETER = RUBY_VERSION > '1.9' ? RUBY_ENGINE + '-' + RUBY_PLATFORM : 'ruby-' + RUBY_PLATFORM
21
+
22
+ def initialize(hostname, port, options = {})
23
+ @hostname = hostname
24
+ @port = port
25
+ @traces_endpoint = '/v0.3/traces'.freeze
26
+ @services_endpoint = '/v0.3/services'.freeze
27
+ @compatibility_mode = false
28
+ @encoder = options.fetch(:encoder, Datadog::Encoding::MsgpackEncoder.new())
29
+
30
+ # overwrite the Content-type with the one chosen in the Encoder
31
+ @headers = options.fetch(:headers, {})
32
+ @headers['Content-Type'] = @encoder.content_type
33
+ @headers['Datadog-Meta-Lang'] = 'ruby'
34
+ @headers['Datadog-Meta-Lang-Version'] = RUBY_VERSION
35
+ @headers['Datadog-Meta-Lang-Interpreter'] = RUBY_INTERPRETER
36
+ @headers['Datadog-Meta-Tracer-Version'] = Datadog::VERSION::STRING
37
+
38
+ # stats
39
+ @mutex = Mutex.new
40
+ @count_success = 0
41
+ @count_client_error = 0
42
+ @count_server_error = 0
43
+ @count_internal_error = 0
44
+ end
45
+
46
+ # route the send to the right endpoint
47
+ def send(endpoint, data)
48
+ case endpoint
49
+ when :services
50
+ payload = @encoder.encode_services(data)
51
+ status_code = post(@services_endpoint, payload)
52
+ when :traces
53
+ count = data.length
54
+ payload = @encoder.encode_traces(data)
55
+ status_code = post(@traces_endpoint, payload, count)
56
+ else
57
+ Datadog::Tracer.log.error("Unsupported endpoint: #{endpoint}")
58
+ return nil
59
+ end
60
+
61
+ return status_code unless downgrade?(status_code) && !@compatibility_mode
62
+
63
+ # the API endpoint is not available so we should downgrade the connection and re-try the call
64
+ downgrade!
65
+ send(endpoint, data)
66
+ end
67
+
68
+ # send data to the trace-agent; the method is thread-safe
69
+ def post(url, data, count = nil)
70
+ Datadog::Tracer.log.debug("Sending data from process: #{Process.pid}")
71
+ headers = count.nil? ? {} : { TRACE_COUNT_HEADER => count.to_s }
72
+ headers = headers.merge(@headers)
73
+ request = Net::HTTP::Post.new(url, headers)
74
+ request.body = data
75
+
76
+ response = Net::HTTP.start(@hostname, @port, read_timeout: TIMEOUT) { |http| http.request(request) }
77
+ handle_response(response)
78
+ rescue StandardError => e
79
+ Datadog::Tracer.log.error(e.message)
80
+ 500
81
+ end
82
+
83
+ # Downgrade the connection to a compatibility version of the HTTPTransport;
84
+ # this method should target a stable API that works whatever is the agent
85
+ # or the tracing client versions.
86
+ def downgrade!
87
+ @compatibility_mode = true
88
+ @traces_endpoint = '/v0.2/traces'.freeze
89
+ @services_endpoint = '/v0.2/services'.freeze
90
+ @encoder = Datadog::Encoding::JSONEncoder.new()
91
+ @headers['Content-Type'] = @encoder.content_type
92
+ end
93
+
94
+ def informational?(code)
95
+ code.between?(100, 199)
96
+ end
97
+
98
+ def success?(code)
99
+ code.between?(200, 299)
100
+ end
101
+
102
+ def redirect?(code)
103
+ code.between?(300, 399)
104
+ end
105
+
106
+ def client_error?(code)
107
+ code.between?(400, 499)
108
+ end
109
+
110
+ def server_error?(code)
111
+ code.between?(500, 599)
112
+ end
113
+
114
+ # receiving a 404 means that we're targeting an endpoint that is not available
115
+ # in the trace agent. Usually this means that we've an up-to-date tracing client,
116
+ # while running an obsolete agent.
117
+ # receiving a 415 means that we're using an unsupported content-type with an existing
118
+ # endpoint. Usually this means that we're using a newer encoder with a previous
119
+ # endpoint. In both cases, we're going to downgrade the transporter encoder so that
120
+ # it will target a stable API.
121
+ def downgrade?(code)
122
+ code == 404 || code == 415
123
+ end
124
+
125
+ # handles the server response; here you can log the trace-agent response
126
+ # or do something more complex to recover from a possible error. This
127
+ # function is handled within the HTTP mutex.synchronize so it's thread-safe.
128
+ def handle_response(response)
129
+ status_code = response.code.to_i
130
+
131
+ if success?(status_code)
132
+ Datadog::Tracer.log.debug('Payload correctly sent to the trace agent.')
133
+ @mutex.synchronize { @count_success += 1 }
134
+ elsif downgrade?(status_code)
135
+ Datadog::Tracer.log.debug("calling the endpoint but received #{status_code}; downgrading the API")
136
+ elsif client_error?(status_code)
137
+ Datadog::Tracer.log.error("Client error: #{response.message}")
138
+ @mutex.synchronize { @count_client_error += 1 }
139
+ elsif server_error?(status_code)
140
+ Datadog::Tracer.log.error("Server error: #{response.message}")
141
+ @mutex.synchronize { @count_server_error += 1 }
142
+ end
143
+
144
+ status_code
145
+ rescue StandardError => e
146
+ Datadog::Tracer.log.error(e.message)
147
+ @mutex.synchronize { @count_internal_error += 1 }
148
+ 500
149
+ end
150
+
151
+ def stats
152
+ @mutex.synchronize do
153
+ {
154
+ success: @count_success,
155
+ client_error: @count_client_error,
156
+ server_error: @count_server_error,
157
+ internal_error: @count_internal_error
158
+ }
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,16 @@
1
+ require 'thread'
2
+
3
+ module Datadog
4
+ # Utils contains low-level utilities, typically to provide pseudo-random trace IDs.
5
+ module Utils
6
+ # We use a custom random number generator because we want no interference
7
+ # with the default one. Using the default prng, we could break code that
8
+ # would rely on srand/rand sequences.
9
+ @rnd = Random.new
10
+
11
+ # Return a span id
12
+ def self.next_id
13
+ @rnd.rand(Datadog::Span::MAX_ID)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ module Datadog
2
+ module VERSION
3
+ MAJOR = 0
4
+ MINOR = 8
5
+ PATCH = '2-a'
6
+
7
+ STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
+ end
9
+ end
@@ -0,0 +1,108 @@
1
+ require 'time'
2
+
3
+ require 'ddtrace/buffer'
4
+
5
+ module Datadog
6
+ module Workers
7
+ # Asynchronous worker that executes a +Send()+ operation after given
8
+ # seconds. Under the hood, it uses +Concurrent::TimerTask+ so that the thread
9
+ # will perform a task at regular intervals. The thread can be stopped
10
+ # with the +stop()+ method and can start with the +start()+ method.
11
+ class AsyncTransport
12
+ def initialize(span_interval, service_interval, transport, buff_size, trace_task, service_task)
13
+ @trace_task = trace_task
14
+ @service_task = service_task
15
+ @span_interval = span_interval
16
+ @service_interval = service_interval
17
+ @trace_buffer = TraceBuffer.new(buff_size)
18
+ @service_buffer = TraceBuffer.new(buff_size)
19
+ @transport = transport
20
+
21
+ @worker = nil
22
+ @run = false
23
+ end
24
+
25
+ # Callback function that process traces and executes the +send_traces()+ method.
26
+ def callback_traces
27
+ return if @trace_buffer.empty?
28
+
29
+ begin
30
+ traces = @trace_buffer.pop()
31
+ @trace_task.call(traces, @transport)
32
+ rescue StandardError => e
33
+ # ensures that the thread will not die because of an exception.
34
+ # TODO[manu]: findout the reason and reschedule the send if it's not
35
+ # a fatal exception
36
+ Datadog::Tracer.log.error("Error during traces flush: dropped #{traces.length} items. Cause: #{e}")
37
+ end
38
+ end
39
+
40
+ # Callback function that process traces and executes the +send_services()+ method.
41
+ def callback_services
42
+ return if @service_buffer.empty?
43
+
44
+ begin
45
+ services = @service_buffer.pop()
46
+ # pick up the latest services hash (this is a FIFO list)
47
+ # that is different from what we sent before.
48
+ different = services.inject(false) { |acc, elem| elem != @last_flushed_services ? elem : acc }
49
+ if different
50
+ if @service_task.call(different, @transport)
51
+ @last_flushed_services = different.clone
52
+ end
53
+ else
54
+ Datadog::Tracer.log.debug('No new different services, skipping flush.')
55
+ end
56
+ rescue StandardError => e
57
+ # ensures that the thread will not die because of an exception.
58
+ # TODO[manu]: findout the reason and reschedule the send if it's not
59
+ # a fatal exception
60
+ Datadog::Tracer.log.error("Error during services flush: dropped #{services.length} items. Cause: #{e}")
61
+ end
62
+ end
63
+
64
+ # Start the timer execution.
65
+ def start
66
+ return if @run
67
+ @run = true
68
+ @worker = Thread.new() do
69
+ Datadog::Tracer.log.debug("Starting thread in the process: #{Process.pid}")
70
+ @last_flushed_services = nil
71
+ next_send_services = Time.now
72
+
73
+ # this loop assumes spans are flushed more often than services
74
+ while @run
75
+ callback_traces
76
+ if Time.now >= next_send_services
77
+ next_send_services = Time.now + @service_interval
78
+ callback_services
79
+ end
80
+ sleep(@span_interval)
81
+ end
82
+ end
83
+ end
84
+
85
+ # Stop the timer execution. Tasks already in the queue will be executed.
86
+ def stop
87
+ @run = false
88
+ end
89
+
90
+ # Block until executor shutdown is complete or until timeout seconds have passed.
91
+ def join
92
+ @worker.join(10)
93
+ end
94
+
95
+ # Enqueue an item in the trace internal buffer. This operation is thread-safe
96
+ # because uses the +TraceBuffer+ data structure.
97
+ def enqueue_trace(trace)
98
+ @trace_buffer.push(trace)
99
+ end
100
+
101
+ # Enqueue an item in the service internal buffer. This operation is thread-safe.
102
+ def enqueue_service(service)
103
+ return if service == {} # no use to send this, not worth it
104
+ @service_buffer.push(service)
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,118 @@
1
+ require 'ddtrace/transport'
2
+ require 'ddtrace/encoding'
3
+ require 'ddtrace/workers'
4
+
5
+ module Datadog
6
+ # Traces and services writer that periodically sends data to the trace-agent
7
+ class Writer
8
+ attr_reader :transport
9
+
10
+ HOSTNAME = 'localhost'.freeze
11
+ PORT = '8126'.freeze
12
+
13
+ def initialize(options = {})
14
+ # writer and transport parameters
15
+ @buff_size = options.fetch(:buffer_size, 100)
16
+ @span_interval = options.fetch(:spans_interval, 1)
17
+ @service_interval = options.fetch(:services_interval, 120)
18
+
19
+ # transport and buffers
20
+ @transport = options.fetch(:transport, Datadog::HTTPTransport.new(HOSTNAME, PORT))
21
+ @services = {}
22
+
23
+ # handles the thread creation after an eventual fork
24
+ @mutex_after_fork = Mutex.new
25
+ @pid = nil
26
+
27
+ @traces_flushed = 0
28
+ @services_flushed = 0
29
+
30
+ # one worker for both services and traces, each have their own queues
31
+ @worker = nil
32
+ end
33
+
34
+ # spawns two different workers for spans and services;
35
+ # they share the same transport which is thread-safe
36
+ def start
37
+ @trace_handler = ->(items, transport) { send_spans(items, transport) }
38
+ @service_handler = ->(items, transport) { send_services(items, transport) }
39
+ @worker = Datadog::Workers::AsyncTransport.new(@span_interval,
40
+ @service_interval,
41
+ @transport,
42
+ @buff_size,
43
+ @trace_handler,
44
+ @service_handler)
45
+
46
+ @worker.start()
47
+ end
48
+
49
+ # stops both workers for spans and services.
50
+ def stop
51
+ @worker.stop()
52
+ @worker = nil
53
+ end
54
+
55
+ # flush spans to the trace-agent, handles spans only
56
+ def send_spans(traces, transport)
57
+ return true if traces.empty?
58
+
59
+ code = transport.send(:traces, traces)
60
+
61
+ if transport.server_error? code # requeue on server error, skip on success or client error
62
+ traces[0..@buff_size].each do |trace|
63
+ @worker.enqueue_trace trace
64
+ end
65
+ return false
66
+ end
67
+
68
+ @traces_flushed += traces.length()
69
+ true
70
+ end
71
+
72
+ # flush services to the trace-agent, handles services only
73
+ def send_services(services, transport)
74
+ return true if services.empty?
75
+
76
+ code = transport.send(:services, services)
77
+ if transport.server_error? code # requeue on server error, skip on success or client error
78
+ @worker.enqueue_service services
79
+ return false
80
+ end
81
+
82
+ @services_flushed += 1
83
+ true
84
+ end
85
+
86
+ # enqueue the trace for submission to the API
87
+ def write(trace, services)
88
+ # In multiprocess environments, the main process initializes the +Writer+ instance and if
89
+ # the process forks (i.e. a web server like Unicorn or Puma with multiple workers) the new
90
+ # processes will share the same +Writer+ until the first write (COW). Because of that,
91
+ # each process owns a different copy of the +@buffer+ after each write and so the
92
+ # +AsyncTransport+ will not send data to the trace agent.
93
+ #
94
+ # This check ensures that if a process doesn't own the current +Writer+, async workers
95
+ # will be initialized again (but only once for each process).
96
+ pid = Process.pid
97
+ @mutex_after_fork.synchronize do
98
+ if pid != @pid
99
+ @pid = pid
100
+ # we should start threads because the worker doesn't own this
101
+ start()
102
+ end
103
+ end
104
+
105
+ @worker.enqueue_trace(trace)
106
+ @worker.enqueue_service(services)
107
+ end
108
+
109
+ # stats returns a dictionary of stats about the writer.
110
+ def stats
111
+ {
112
+ traces_flushed: @traces_flushed,
113
+ services_flushed: @services_flushed,
114
+ transport: @transport.stats
115
+ }
116
+ end
117
+ end
118
+ end
metadata ADDED
@@ -0,0 +1,208 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fair-ddtrace
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.2.a
5
+ platform: ruby
6
+ authors:
7
+ - Fair
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-10-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: msgpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.47'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.47'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 5.10.1
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 5.10.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: appraisal
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.1'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.1'
83
+ - !ruby/object:Gem::Dependency
84
+ name: yard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.9'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.9'
97
+ description: |
98
+ ddtrace is Datadog’s tracing client for Ruby. It is used to trace requests
99
+ as they flow across web servers, databases and microservices so that developers
100
+ have great visiblity into bottlenecks and troublesome requests.
101
+ Find the original version at: https://github.com/DataDog/dd-trace-rb
102
+ email:
103
+ - catherinec@fair.com
104
+ executables: []
105
+ extensions: []
106
+ extra_rdoc_files: []
107
+ files:
108
+ - ".env"
109
+ - ".gitignore"
110
+ - ".rubocop.yml"
111
+ - ".yardopts"
112
+ - Appraisals
113
+ - Gemfile
114
+ - LICENSE
115
+ - README.md
116
+ - Rakefile
117
+ - circle.yml
118
+ - ddtrace.gemspec
119
+ - docker-compose.yml
120
+ - docs/GettingStarted.md
121
+ - gemfiles/contrib.gemfile
122
+ - gemfiles/contrib_old.gemfile
123
+ - gemfiles/rails30_postgres.gemfile
124
+ - gemfiles/rails30_postgres_sidekiq.gemfile
125
+ - gemfiles/rails32_mysql2.gemfile
126
+ - gemfiles/rails32_postgres.gemfile
127
+ - gemfiles/rails32_postgres_redis.gemfile
128
+ - gemfiles/rails32_postgres_sidekiq.gemfile
129
+ - gemfiles/rails4_mysql2.gemfile
130
+ - gemfiles/rails4_postgres.gemfile
131
+ - gemfiles/rails4_postgres_redis.gemfile
132
+ - gemfiles/rails4_postgres_sidekiq.gemfile
133
+ - gemfiles/rails5_mysql2.gemfile
134
+ - gemfiles/rails5_postgres.gemfile
135
+ - gemfiles/rails5_postgres_redis.gemfile
136
+ - gemfiles/rails5_postgres_sidekiq.gemfile
137
+ - lib/ddtrace.rb
138
+ - lib/ddtrace/buffer.rb
139
+ - lib/ddtrace/context.rb
140
+ - lib/ddtrace/contrib/active_record/patcher.rb
141
+ - lib/ddtrace/contrib/elasticsearch/patcher.rb
142
+ - lib/ddtrace/contrib/elasticsearch/quantize.rb
143
+ - lib/ddtrace/contrib/grape/endpoint.rb
144
+ - lib/ddtrace/contrib/grape/patcher.rb
145
+ - lib/ddtrace/contrib/http/patcher.rb
146
+ - lib/ddtrace/contrib/rack/middlewares.rb
147
+ - lib/ddtrace/contrib/rails/action_controller.rb
148
+ - lib/ddtrace/contrib/rails/action_view.rb
149
+ - lib/ddtrace/contrib/rails/active_record.rb
150
+ - lib/ddtrace/contrib/rails/active_support.rb
151
+ - lib/ddtrace/contrib/rails/core_extensions.rb
152
+ - lib/ddtrace/contrib/rails/framework.rb
153
+ - lib/ddtrace/contrib/rails/middlewares.rb
154
+ - lib/ddtrace/contrib/rails/utils.rb
155
+ - lib/ddtrace/contrib/redis/patcher.rb
156
+ - lib/ddtrace/contrib/redis/quantize.rb
157
+ - lib/ddtrace/contrib/redis/tags.rb
158
+ - lib/ddtrace/contrib/sidekiq/tracer.rb
159
+ - lib/ddtrace/contrib/sinatra/tracer.rb
160
+ - lib/ddtrace/distributed.rb
161
+ - lib/ddtrace/encoding.rb
162
+ - lib/ddtrace/error.rb
163
+ - lib/ddtrace/ext/app_types.rb
164
+ - lib/ddtrace/ext/cache.rb
165
+ - lib/ddtrace/ext/distributed.rb
166
+ - lib/ddtrace/ext/errors.rb
167
+ - lib/ddtrace/ext/http.rb
168
+ - lib/ddtrace/ext/net.rb
169
+ - lib/ddtrace/ext/redis.rb
170
+ - lib/ddtrace/ext/sql.rb
171
+ - lib/ddtrace/logger.rb
172
+ - lib/ddtrace/monkey.rb
173
+ - lib/ddtrace/pin.rb
174
+ - lib/ddtrace/provider.rb
175
+ - lib/ddtrace/sampler.rb
176
+ - lib/ddtrace/span.rb
177
+ - lib/ddtrace/tracer.rb
178
+ - lib/ddtrace/transport.rb
179
+ - lib/ddtrace/utils.rb
180
+ - lib/ddtrace/version.rb
181
+ - lib/ddtrace/workers.rb
182
+ - lib/ddtrace/writer.rb
183
+ homepage: https://github.com/wearefair/dd-trace-rb
184
+ licenses:
185
+ - BSD-3-Clause
186
+ metadata:
187
+ allowed_push_host: https://rubygems.org
188
+ post_install_message:
189
+ rdoc_options: []
190
+ require_paths:
191
+ - lib
192
+ required_ruby_version: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: 1.9.1
197
+ required_rubygems_version: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">"
200
+ - !ruby/object:Gem::Version
201
+ version: 1.3.1
202
+ requirements: []
203
+ rubyforge_project:
204
+ rubygems_version: 2.6.14.1
205
+ signing_key:
206
+ specification_version: 4
207
+ summary: Fair fork of Datadog tracing code for your Ruby applications
208
+ test_files: []