ddtrace 0.3.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.
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: []