ddtrace 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/.env +11 -0
  3. data/.gitignore +56 -0
  4. data/.rubocop.yml +43 -0
  5. data/Appraisals +65 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE +24 -0
  8. data/README.md +119 -0
  9. data/Rakefile +103 -0
  10. data/circle.yml +68 -0
  11. data/ddtrace.gemspec +41 -0
  12. data/docker-compose.yml +33 -0
  13. data/docs/GettingStarted +352 -0
  14. data/gemfiles/contrib.gemfile +9 -0
  15. data/gemfiles/rails3_mysql2.gemfile +11 -0
  16. data/gemfiles/rails3_postgres.gemfile +10 -0
  17. data/gemfiles/rails3_postgres_redis.gemfile +11 -0
  18. data/gemfiles/rails4_mysql2.gemfile +9 -0
  19. data/gemfiles/rails4_postgres.gemfile +9 -0
  20. data/gemfiles/rails4_postgres_redis.gemfile +10 -0
  21. data/gemfiles/rails5_mysql2.gemfile +8 -0
  22. data/gemfiles/rails5_postgres.gemfile +8 -0
  23. data/gemfiles/rails5_postgres_redis.gemfile +9 -0
  24. data/lib/ddtrace.rb +63 -0
  25. data/lib/ddtrace/buffer.rb +77 -0
  26. data/lib/ddtrace/contrib/elasticsearch/core.rb +56 -0
  27. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +35 -0
  28. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +22 -0
  29. data/lib/ddtrace/contrib/rails/action_controller.rb +75 -0
  30. data/lib/ddtrace/contrib/rails/action_view.rb +121 -0
  31. data/lib/ddtrace/contrib/rails/active_record.rb +44 -0
  32. data/lib/ddtrace/contrib/rails/active_support.rb +115 -0
  33. data/lib/ddtrace/contrib/rails/core_extensions.rb +89 -0
  34. data/lib/ddtrace/contrib/rails/framework.rb +107 -0
  35. data/lib/ddtrace/contrib/rails/utils.rb +42 -0
  36. data/lib/ddtrace/contrib/redis/core.rb +72 -0
  37. data/lib/ddtrace/contrib/redis/patcher.rb +36 -0
  38. data/lib/ddtrace/contrib/redis/quantize.rb +30 -0
  39. data/lib/ddtrace/contrib/redis/tags.rb +19 -0
  40. data/lib/ddtrace/encoding.rb +65 -0
  41. data/lib/ddtrace/ext/app_types.rb +9 -0
  42. data/lib/ddtrace/ext/cache.rb +7 -0
  43. data/lib/ddtrace/ext/errors.rb +9 -0
  44. data/lib/ddtrace/ext/http.rb +11 -0
  45. data/lib/ddtrace/ext/net.rb +8 -0
  46. data/lib/ddtrace/ext/redis.rb +16 -0
  47. data/lib/ddtrace/ext/sql.rb +8 -0
  48. data/lib/ddtrace/monkey.rb +60 -0
  49. data/lib/ddtrace/pin.rb +62 -0
  50. data/lib/ddtrace/span.rb +163 -0
  51. data/lib/ddtrace/tracer.rb +180 -0
  52. data/lib/ddtrace/transport.rb +149 -0
  53. data/lib/ddtrace/utils.rb +9 -0
  54. data/lib/ddtrace/version.rb +9 -0
  55. data/lib/ddtrace/workers.rb +109 -0
  56. data/lib/ddtrace/writer.rb +119 -0
  57. metadata +187 -0
@@ -0,0 +1,119 @@
1
+ require 'ddtrace/buffer'
2
+ require 'ddtrace/transport'
3
+ require 'ddtrace/encoding'
4
+ require 'ddtrace/workers'
5
+
6
+ module Datadog
7
+ # Traces and services writer that periodically sends data to the trace-agent
8
+ class Writer
9
+ attr_reader :transport
10
+
11
+ HOSTNAME = 'localhost'.freeze
12
+ PORT = '7777'.freeze
13
+
14
+ def initialize(options = {})
15
+ # writer and transport parameters
16
+ @buff_size = options.fetch(:buffer_size, 100)
17
+ @span_interval = options.fetch(:spans_interval, 1)
18
+ @service_interval = options.fetch(:services_interval, 120)
19
+
20
+ # transport and buffers
21
+ @transport = options.fetch(:transport, Datadog::HTTPTransport.new(HOSTNAME, PORT))
22
+ @services = {}
23
+
24
+ # handles the thread creation after an eventual fork
25
+ @mutex_after_fork = Mutex.new
26
+ @pid = nil
27
+
28
+ @traces_flushed = 0
29
+ @services_flushed = 0
30
+
31
+ # one worker for both services and traces, each have their own queues
32
+ @worker = nil
33
+ end
34
+
35
+ # spawns two different workers for spans and services;
36
+ # they share the same transport which is thread-safe
37
+ def start
38
+ @trace_handler = ->(items, transport) { send_spans(items, transport) }
39
+ @service_handler = ->(items, transport) { send_services(items, transport) }
40
+ @worker = Datadog::Workers::AsyncTransport.new(@span_interval,
41
+ @service_interval,
42
+ @transport,
43
+ @buff_size,
44
+ @trace_handler,
45
+ @service_handler)
46
+
47
+ @worker.start()
48
+ end
49
+
50
+ # stops both workers for spans and services.
51
+ def stop
52
+ @worker.stop()
53
+ @worker = nil
54
+ end
55
+
56
+ # flush spans to the trace-agent, handles spans only
57
+ def send_spans(traces, transport)
58
+ return true if traces.empty?
59
+
60
+ code = transport.send(:traces, traces)
61
+
62
+ if transport.server_error? code # requeue on server error, skip on success or client error
63
+ traces[0..@buff_size].each do |trace|
64
+ @worker.enqueue_trace trace
65
+ end
66
+ return false
67
+ end
68
+
69
+ @traces_flushed += traces.length()
70
+ true
71
+ end
72
+
73
+ # flush services to the trace-agent, handles services only
74
+ def send_services(services, transport)
75
+ return true if services.empty?
76
+
77
+ code = transport.send(:services, services)
78
+ if transport.server_error? code # requeue on server error, skip on success or client error
79
+ @worker.enqueue_service services
80
+ return false
81
+ end
82
+
83
+ @services_flushed += 1
84
+ true
85
+ end
86
+
87
+ # enqueue the trace for submission to the API
88
+ def write(trace, services)
89
+ # In multiprocess environments, the main process initializes the +Writer+ instance and if
90
+ # the process forks (i.e. a web server like Unicorn or Puma with multiple workers) the new
91
+ # processes will share the same +Writer+ until the first write (COW). Because of that,
92
+ # each process owns a different copy of the +@buffer+ after each write and so the
93
+ # +AsyncTransport+ will not send data to the trace agent.
94
+ #
95
+ # This check ensures that if a process doesn't own the current +Writer+, async workers
96
+ # will be initialized again (but only once for each process).
97
+ pid = Process.pid
98
+ @mutex_after_fork.synchronize do
99
+ if pid != @pid
100
+ @pid = pid
101
+ # we should start threads because the worker doesn't own this
102
+ start()
103
+ end
104
+ end
105
+
106
+ @worker.enqueue_trace(trace)
107
+ @worker.enqueue_service(services)
108
+ end
109
+
110
+ # stats returns a dictionary of stats about the writer.
111
+ def stats
112
+ {
113
+ traces_flushed: @traces_flushed,
114
+ services_flushed: @services_flushed,
115
+ transport: @transport.stats
116
+ }
117
+ end
118
+ end
119
+ end
metadata ADDED
@@ -0,0 +1,187 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ddtrace
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1
5
+ platform: ruby
6
+ authors:
7
+ - Datadog, Inc.
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-01-23 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: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.12'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.12'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.43'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.43'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '5.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: appraisal
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.1'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.1'
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
+ email:
102
+ - dev@datadoghq.com
103
+ executables: []
104
+ extensions: []
105
+ extra_rdoc_files: []
106
+ files:
107
+ - ".env"
108
+ - ".gitignore"
109
+ - ".rubocop.yml"
110
+ - Appraisals
111
+ - Gemfile
112
+ - LICENSE
113
+ - README.md
114
+ - Rakefile
115
+ - circle.yml
116
+ - ddtrace.gemspec
117
+ - docker-compose.yml
118
+ - docs/GettingStarted
119
+ - gemfiles/contrib.gemfile
120
+ - gemfiles/rails3_mysql2.gemfile
121
+ - gemfiles/rails3_postgres.gemfile
122
+ - gemfiles/rails3_postgres_redis.gemfile
123
+ - gemfiles/rails4_mysql2.gemfile
124
+ - gemfiles/rails4_postgres.gemfile
125
+ - gemfiles/rails4_postgres_redis.gemfile
126
+ - gemfiles/rails5_mysql2.gemfile
127
+ - gemfiles/rails5_postgres.gemfile
128
+ - gemfiles/rails5_postgres_redis.gemfile
129
+ - lib/ddtrace.rb
130
+ - lib/ddtrace/buffer.rb
131
+ - lib/ddtrace/contrib/elasticsearch/core.rb
132
+ - lib/ddtrace/contrib/elasticsearch/patcher.rb
133
+ - lib/ddtrace/contrib/elasticsearch/quantize.rb
134
+ - lib/ddtrace/contrib/rails/action_controller.rb
135
+ - lib/ddtrace/contrib/rails/action_view.rb
136
+ - lib/ddtrace/contrib/rails/active_record.rb
137
+ - lib/ddtrace/contrib/rails/active_support.rb
138
+ - lib/ddtrace/contrib/rails/core_extensions.rb
139
+ - lib/ddtrace/contrib/rails/framework.rb
140
+ - lib/ddtrace/contrib/rails/utils.rb
141
+ - lib/ddtrace/contrib/redis/core.rb
142
+ - lib/ddtrace/contrib/redis/patcher.rb
143
+ - lib/ddtrace/contrib/redis/quantize.rb
144
+ - lib/ddtrace/contrib/redis/tags.rb
145
+ - lib/ddtrace/encoding.rb
146
+ - lib/ddtrace/ext/app_types.rb
147
+ - lib/ddtrace/ext/cache.rb
148
+ - lib/ddtrace/ext/errors.rb
149
+ - lib/ddtrace/ext/http.rb
150
+ - lib/ddtrace/ext/net.rb
151
+ - lib/ddtrace/ext/redis.rb
152
+ - lib/ddtrace/ext/sql.rb
153
+ - lib/ddtrace/monkey.rb
154
+ - lib/ddtrace/pin.rb
155
+ - lib/ddtrace/span.rb
156
+ - lib/ddtrace/tracer.rb
157
+ - lib/ddtrace/transport.rb
158
+ - lib/ddtrace/utils.rb
159
+ - lib/ddtrace/version.rb
160
+ - lib/ddtrace/workers.rb
161
+ - lib/ddtrace/writer.rb
162
+ homepage: https://github.com/DataDog/dd-trace-rb
163
+ licenses:
164
+ - BSD-3-Clause
165
+ metadata:
166
+ allowed_push_host: https://rubygems.org
167
+ post_install_message:
168
+ rdoc_options: []
169
+ require_paths:
170
+ - lib
171
+ required_ruby_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: 2.1.0
176
+ required_rubygems_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ requirements: []
182
+ rubyforge_project:
183
+ rubygems_version: 2.5.2
184
+ signing_key:
185
+ specification_version: 4
186
+ summary: Datadog tracing code for your Ruby applications
187
+ test_files: []