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.
- checksums.yaml +7 -0
- data/.env +11 -0
- data/.gitignore +56 -0
- data/.rubocop.yml +43 -0
- data/Appraisals +65 -0
- data/Gemfile +3 -0
- data/LICENSE +24 -0
- data/README.md +119 -0
- data/Rakefile +103 -0
- data/circle.yml +68 -0
- data/ddtrace.gemspec +41 -0
- data/docker-compose.yml +33 -0
- data/docs/GettingStarted +352 -0
- data/gemfiles/contrib.gemfile +9 -0
- data/gemfiles/rails3_mysql2.gemfile +11 -0
- data/gemfiles/rails3_postgres.gemfile +10 -0
- data/gemfiles/rails3_postgres_redis.gemfile +11 -0
- data/gemfiles/rails4_mysql2.gemfile +9 -0
- data/gemfiles/rails4_postgres.gemfile +9 -0
- data/gemfiles/rails4_postgres_redis.gemfile +10 -0
- data/gemfiles/rails5_mysql2.gemfile +8 -0
- data/gemfiles/rails5_postgres.gemfile +8 -0
- data/gemfiles/rails5_postgres_redis.gemfile +9 -0
- data/lib/ddtrace.rb +63 -0
- data/lib/ddtrace/buffer.rb +77 -0
- data/lib/ddtrace/contrib/elasticsearch/core.rb +56 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +35 -0
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +22 -0
- data/lib/ddtrace/contrib/rails/action_controller.rb +75 -0
- data/lib/ddtrace/contrib/rails/action_view.rb +121 -0
- data/lib/ddtrace/contrib/rails/active_record.rb +44 -0
- data/lib/ddtrace/contrib/rails/active_support.rb +115 -0
- data/lib/ddtrace/contrib/rails/core_extensions.rb +89 -0
- data/lib/ddtrace/contrib/rails/framework.rb +107 -0
- data/lib/ddtrace/contrib/rails/utils.rb +42 -0
- data/lib/ddtrace/contrib/redis/core.rb +72 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +36 -0
- data/lib/ddtrace/contrib/redis/quantize.rb +30 -0
- data/lib/ddtrace/contrib/redis/tags.rb +19 -0
- data/lib/ddtrace/encoding.rb +65 -0
- data/lib/ddtrace/ext/app_types.rb +9 -0
- data/lib/ddtrace/ext/cache.rb +7 -0
- data/lib/ddtrace/ext/errors.rb +9 -0
- data/lib/ddtrace/ext/http.rb +11 -0
- data/lib/ddtrace/ext/net.rb +8 -0
- data/lib/ddtrace/ext/redis.rb +16 -0
- data/lib/ddtrace/ext/sql.rb +8 -0
- data/lib/ddtrace/monkey.rb +60 -0
- data/lib/ddtrace/pin.rb +62 -0
- data/lib/ddtrace/span.rb +163 -0
- data/lib/ddtrace/tracer.rb +180 -0
- data/lib/ddtrace/transport.rb +149 -0
- data/lib/ddtrace/utils.rb +9 -0
- data/lib/ddtrace/version.rb +9 -0
- data/lib/ddtrace/workers.rb +109 -0
- data/lib/ddtrace/writer.rb +119 -0
- 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: []
|