ddtrace 0.47.0 → 0.48.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.circleci/config.yml +4 -2
- data/.circleci/images/primary/Dockerfile-2.0.0 +11 -1
- data/.circleci/images/primary/Dockerfile-2.1.10 +11 -1
- data/.circleci/images/primary/Dockerfile-2.2.10 +11 -1
- data/.circleci/images/primary/Dockerfile-2.3.8 +10 -0
- data/.circleci/images/primary/Dockerfile-2.4.6 +10 -0
- data/.circleci/images/primary/Dockerfile-2.5.6 +10 -0
- data/.circleci/images/primary/Dockerfile-2.6.4 +10 -0
- data/.circleci/images/primary/Dockerfile-2.7.0 +10 -0
- data/.circleci/images/primary/Dockerfile-jruby-9.2-latest +10 -0
- data/.gitlab-ci.yml +18 -18
- data/.rubocop.yml +19 -0
- data/.rubocop_todo.yml +44 -3
- data/Appraisals +55 -1
- data/CHANGELOG.md +47 -1
- data/Gemfile +10 -0
- data/Rakefile +9 -0
- data/bin/ddtracerb +15 -0
- data/ddtrace.gemspec +4 -2
- data/docs/GettingStarted.md +36 -53
- data/docs/ProfilingDevelopment.md +88 -0
- data/integration/README.md +1 -2
- data/integration/apps/rack/Dockerfile +3 -0
- data/integration/apps/rack/script/build-images +1 -1
- data/integration/apps/rack/script/ci +1 -1
- data/integration/apps/rails-five/script/build-images +1 -1
- data/integration/apps/rails-five/script/ci +1 -1
- data/integration/apps/ruby/script/build-images +1 -1
- data/integration/apps/ruby/script/ci +1 -1
- data/integration/images/include/http-health-check +1 -1
- data/integration/images/wrk/scripts/entrypoint.sh +1 -1
- data/integration/script/build-images +1 -1
- data/lib/ddtrace.rb +1 -0
- data/lib/ddtrace/configuration.rb +39 -13
- data/lib/ddtrace/configuration/components.rb +85 -3
- data/lib/ddtrace/configuration/settings.rb +31 -0
- data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +30 -0
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +9 -3
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +17 -1
- data/lib/ddtrace/contrib/resque/patcher.rb +4 -4
- data/lib/ddtrace/contrib/resque/resque_job.rb +22 -1
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +7 -3
- data/lib/ddtrace/diagnostics/environment_logger.rb +1 -1
- data/lib/ddtrace/error.rb +2 -0
- data/lib/ddtrace/ext/profiling.rb +52 -0
- data/lib/ddtrace/ext/transport.rb +1 -0
- data/lib/ddtrace/metrics.rb +4 -0
- data/lib/ddtrace/profiling.rb +54 -0
- data/lib/ddtrace/profiling/backtrace_location.rb +32 -0
- data/lib/ddtrace/profiling/buffer.rb +41 -0
- data/lib/ddtrace/profiling/collectors/stack.rb +253 -0
- data/lib/ddtrace/profiling/encoding/profile.rb +31 -0
- data/lib/ddtrace/profiling/event.rb +13 -0
- data/lib/ddtrace/profiling/events/stack.rb +102 -0
- data/lib/ddtrace/profiling/exporter.rb +23 -0
- data/lib/ddtrace/profiling/ext/cpu.rb +54 -0
- data/lib/ddtrace/profiling/ext/cthread.rb +134 -0
- data/lib/ddtrace/profiling/ext/forking.rb +97 -0
- data/lib/ddtrace/profiling/flush.rb +41 -0
- data/lib/ddtrace/profiling/pprof/builder.rb +121 -0
- data/lib/ddtrace/profiling/pprof/converter.rb +85 -0
- data/lib/ddtrace/profiling/pprof/message_set.rb +12 -0
- data/lib/ddtrace/profiling/pprof/payload.rb +18 -0
- data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
- data/lib/ddtrace/profiling/pprof/pprof_pb.rb +81 -0
- data/lib/ddtrace/profiling/pprof/stack_sample.rb +90 -0
- data/lib/ddtrace/profiling/pprof/string_table.rb +10 -0
- data/lib/ddtrace/profiling/pprof/template.rb +114 -0
- data/lib/ddtrace/profiling/preload.rb +3 -0
- data/lib/ddtrace/profiling/profiler.rb +28 -0
- data/lib/ddtrace/profiling/recorder.rb +87 -0
- data/lib/ddtrace/profiling/scheduler.rb +84 -0
- data/lib/ddtrace/profiling/tasks/setup.rb +77 -0
- data/lib/ddtrace/profiling/transport/client.rb +12 -0
- data/lib/ddtrace/profiling/transport/http.rb +122 -0
- data/lib/ddtrace/profiling/transport/http/api.rb +43 -0
- data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +90 -0
- data/lib/ddtrace/profiling/transport/http/api/instance.rb +36 -0
- data/lib/ddtrace/profiling/transport/http/api/spec.rb +40 -0
- data/lib/ddtrace/profiling/transport/http/builder.rb +28 -0
- data/lib/ddtrace/profiling/transport/http/client.rb +33 -0
- data/lib/ddtrace/profiling/transport/http/response.rb +21 -0
- data/lib/ddtrace/profiling/transport/io.rb +30 -0
- data/lib/ddtrace/profiling/transport/io/client.rb +27 -0
- data/lib/ddtrace/profiling/transport/io/response.rb +16 -0
- data/lib/ddtrace/profiling/transport/parcel.rb +17 -0
- data/lib/ddtrace/profiling/transport/request.rb +15 -0
- data/lib/ddtrace/profiling/transport/response.rb +8 -0
- data/lib/ddtrace/runtime/container.rb +11 -3
- data/lib/ddtrace/sampling/rule_sampler.rb +3 -9
- data/lib/ddtrace/tasks/exec.rb +48 -0
- data/lib/ddtrace/tasks/help.rb +14 -0
- data/lib/ddtrace/tracer.rb +21 -0
- data/lib/ddtrace/transport/io/client.rb +15 -8
- data/lib/ddtrace/transport/parcel.rb +4 -0
- data/lib/ddtrace/version.rb +3 -1
- data/lib/ddtrace/workers/runtime_metrics.rb +14 -1
- metadata +70 -9
@@ -0,0 +1,88 @@
|
|
1
|
+
# Profiling Development
|
2
|
+
|
3
|
+
This file contains development notes specific to the profiling feature.
|
4
|
+
|
5
|
+
For a more practical view of getting started with development of `ddtrace`, see <DevelopmentGuide.md>.
|
6
|
+
|
7
|
+
## Profiling components high-level view
|
8
|
+
|
9
|
+
Components below live inside <../lib/ddtrace/profiling>:
|
10
|
+
|
11
|
+
* `Collectors::Stack`: Collects stack trace samples from Ruby threads for both CPU-time (if available) and wall-clock.
|
12
|
+
Runs on its own background thread.
|
13
|
+
* `Encoding::Profile`: Encodes gathered data into the pprof format.
|
14
|
+
* `Events::Stack`, `Events::StackSample`, `Events::StackExceptionSample`: Entity classes used to represent stacks.
|
15
|
+
* `Ext::CPU`: Monkey patches Ruby's `Thread` with our `Ext::CThread` to enable CPU-time profiling.
|
16
|
+
* `Ext::CThread`: Extension used to enable CPU-time profiling via use of Pthread's `getcpuclockid`.
|
17
|
+
* `Ext::Forking`: Monkey patches `Kernel#fork`, adding a `Kernel#at_fork` callback mechanism which is used to restore
|
18
|
+
profiling abilities after the VM forks (such as re-instrumenting the main thread, and restarting profiler threads).
|
19
|
+
* `Pprof::*` (in <../lib/ddtrace/profiling/pprof>): Converts samples captured in the `Recorder` into the pprof format.
|
20
|
+
* `Tasks::Setup`: Takes care of loading our extensions/monkey patches to handle fork() and CPU profiling.
|
21
|
+
* `Transport::*` (in <../lib/ddtrace/profiling/transport>): Implements transmission of profiling payloads to the Datadog agent
|
22
|
+
or backend.
|
23
|
+
* `BacktraceLocation`: Entity class used to represent an entry in a stack trace.
|
24
|
+
* `Buffer`: Bounded buffer used to store profiling events.
|
25
|
+
* `Exporter`: Writes profiling data to a given transport.
|
26
|
+
* `Flush`: Entity class used to represent metadata for a given profile.
|
27
|
+
* `Profiler`: Profiling entry point, which coordinates collectors and a scheduler.
|
28
|
+
* `Recorder`: Stores profiling events gathered by `Collector`s.
|
29
|
+
* `Scheduler`: Periodically (every 1 minute) takes data from the `Recorder` and pushes them to all configured
|
30
|
+
`Exporter`s. Runs on its own background thread.
|
31
|
+
|
32
|
+
## Initialization
|
33
|
+
|
34
|
+
When started via `ddtracerb exec` (together with `DD_PROFILING_ENABLED=true`), initialization goes through the following
|
35
|
+
flow:
|
36
|
+
|
37
|
+
1. <../lib/ddtrace/profiling/preload.rb> triggers the creation of the `Datadog.profiler` instance by calling the method
|
38
|
+
2. `Datadog.profiler` is handled by `Datadog::Configuration`, which triggers the configuration of `ddtrace` components
|
39
|
+
in `#build_components`
|
40
|
+
3. Inside `Datadog::Components`, the `build_profiler` method triggers the execution of the `Tasks::Setup`
|
41
|
+
4. The `Setup` task activates our extensions
|
42
|
+
* `Datadog::Profiling::Ext::Forking`
|
43
|
+
* `Datadog::Profiling::Ext::CPU`
|
44
|
+
5. Still inside `Datadog::Components`, the `build_profiler` method then creates and wires up the Profiler:
|
45
|
+
```ruby
|
46
|
+
recorder = build_profiler_recorder(settings)
|
47
|
+
collectors = build_profiler_collectors(settings, recorder)
|
48
|
+
exporters = build_profiler_exporters(settings)
|
49
|
+
scheduler = build_profiler_scheduler(settings, recorder, exporters)
|
50
|
+
|
51
|
+
Datadog::Profiler.new(collectors, scheduler)
|
52
|
+
```
|
53
|
+
```asciiflow
|
54
|
+
+------------+
|
55
|
+
| Profiler |
|
56
|
+
+-+--------+-+
|
57
|
+
| |
|
58
|
+
v v
|
59
|
+
+---------+--+ +--+--------+
|
60
|
+
| Collectors | | Scheduler |
|
61
|
+
+---------+--+ +-+-------+-+
|
62
|
+
| | |
|
63
|
+
v | v
|
64
|
+
+-----+-+ | +----+------+
|
65
|
+
| Stack | | | Exporters |
|
66
|
+
+-----+-+ | +-----------+
|
67
|
+
| |
|
68
|
+
v v
|
69
|
+
+-+-------+-+
|
70
|
+
| Recorder |
|
71
|
+
+-----------+
|
72
|
+
```
|
73
|
+
6. The profiler gets started when `startup!` is called by `Datadog::Configuration` after component creation.
|
74
|
+
|
75
|
+
## Run-time execution
|
76
|
+
|
77
|
+
During run-time, the `Scheduler` and the `Collectors::Stack` each execute on their own background thread.
|
78
|
+
|
79
|
+
The `Collectors::Stack` samples stack traces of threads, capturing both CPU-time (if available) and wall-clock, storing
|
80
|
+
them in the `Recorder`.
|
81
|
+
|
82
|
+
The `Scheduler` wakes up every 1 minute to flush the results of the `Recorder` into one or more `exporter`s.
|
83
|
+
Usually only one exporter is in use. By default, the `Exporter` delegates to the default `Transport::HTTP` transport, which
|
84
|
+
takes care of encoding the data and reporting it to the datadog agent (or to the API, when running without an agent).
|
85
|
+
|
86
|
+
## How CPU-time profiling works
|
87
|
+
|
88
|
+
**TODO**: Document our pthread-based approach to getting CPU-time for threads.
|
data/integration/README.md
CHANGED
@@ -15,6 +15,9 @@ ENV DD_DEMO_ENV_GEM_REF_DDTRACE ${ddtrace_ref}
|
|
15
15
|
|
16
16
|
# Install dependencies
|
17
17
|
COPY Gemfile /app/Gemfile
|
18
|
+
# This forces gems with native extensions to be compiled, rather than using pre-compiled binaries; it's needed because
|
19
|
+
# some google-protobuf versions ship with missing binaries for older rubies.
|
20
|
+
ENV BUNDLE_FORCE_RUBY_PLATFORM true
|
18
21
|
RUN bundle install
|
19
22
|
|
20
23
|
# Add files
|
data/lib/ddtrace.rb
CHANGED
@@ -15,6 +15,7 @@ require 'ddtrace/configuration'
|
|
15
15
|
require 'ddtrace/patcher'
|
16
16
|
require 'ddtrace/metrics'
|
17
17
|
require 'ddtrace/auto_instrument_base'
|
18
|
+
require 'ddtrace/profiling'
|
18
19
|
|
19
20
|
# \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
|
20
21
|
module Datadog
|
@@ -2,10 +2,11 @@ require 'forwardable'
|
|
2
2
|
require 'ddtrace/configuration/pin_setup'
|
3
3
|
require 'ddtrace/configuration/settings'
|
4
4
|
require 'ddtrace/configuration/components'
|
5
|
+
require 'ddtrace/utils/only_once'
|
5
6
|
|
6
7
|
module Datadog
|
7
8
|
# Configuration provides a unique access point for configurations
|
8
|
-
module Configuration
|
9
|
+
module Configuration # rubocop:disable Metrics/ModuleLength
|
9
10
|
extend Forwardable
|
10
11
|
|
11
12
|
# Used to ensure that @components initialization/reconfiguration is performed one-at-a-time, by a single thread.
|
@@ -42,6 +43,8 @@ module Datadog
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def configure(target = configuration, opts = {})
|
46
|
+
ruby_version_deprecation_warning
|
47
|
+
|
45
48
|
if target.is_a?(Settings)
|
46
49
|
yield(target) if block_given?
|
47
50
|
|
@@ -64,6 +67,7 @@ module Datadog
|
|
64
67
|
def_delegators \
|
65
68
|
:components,
|
66
69
|
:health_metrics,
|
70
|
+
:profiler,
|
67
71
|
:runtime_metrics,
|
68
72
|
:tracer
|
69
73
|
|
@@ -94,18 +98,6 @@ module Datadog
|
|
94
98
|
end
|
95
99
|
end
|
96
100
|
|
97
|
-
# Gracefully shuts down the tracer and disposes of component references,
|
98
|
-
# allowing execution to start anew.
|
99
|
-
#
|
100
|
-
# In contrast with +#shutdown!+, components will be automatically
|
101
|
-
# reinitialized after a reset.
|
102
|
-
def reset!
|
103
|
-
safely_synchronize do |write_components|
|
104
|
-
@components.shutdown! if components?
|
105
|
-
write_components.call(nil)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
101
|
protected
|
110
102
|
|
111
103
|
def components(allow_initialization: true)
|
@@ -119,6 +111,21 @@ module Datadog
|
|
119
111
|
|
120
112
|
private
|
121
113
|
|
114
|
+
# Gracefully shuts down the tracer and disposes of component references,
|
115
|
+
# allowing execution to start anew.
|
116
|
+
#
|
117
|
+
# In contrast with +#shutdown!+, components will be automatically
|
118
|
+
# reinitialized after a reset.
|
119
|
+
#
|
120
|
+
# Used internally to ensure a clean environment between test runs.
|
121
|
+
def reset!
|
122
|
+
safely_synchronize do |write_components|
|
123
|
+
@components.shutdown! if components?
|
124
|
+
write_components.call(nil)
|
125
|
+
configuration.reset!
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
122
129
|
def safely_synchronize
|
123
130
|
# Writes to @components should only happen through this proc. Because this proc is only accessible to callers of
|
124
131
|
# safely_synchronize, this forces all writers to go through this method.
|
@@ -168,5 +175,24 @@ module Datadog
|
|
168
175
|
logger
|
169
176
|
end
|
170
177
|
end
|
178
|
+
|
179
|
+
# Perform version check only once
|
180
|
+
DEPRECATED_RUBY_VERSION = Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.1')
|
181
|
+
private_constant :DEPRECATED_RUBY_VERSION
|
182
|
+
|
183
|
+
RUBY_VERSION_DEPRECATION_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
|
184
|
+
private_constant :RUBY_VERSION_DEPRECATION_ONLY_ONCE
|
185
|
+
|
186
|
+
def ruby_version_deprecation_warning
|
187
|
+
return unless DEPRECATED_RUBY_VERSION
|
188
|
+
|
189
|
+
RUBY_VERSION_DEPRECATION_ONLY_ONCE.run do
|
190
|
+
Datadog.logger.warn(
|
191
|
+
"Support for Ruby versions < 2.1 in dd-trace-rb is DEPRECATED.\n" \
|
192
|
+
"Last version to support Ruby < 2.1 will be 0.49.x, which will only receive critical bugfixes.\n" \
|
193
|
+
'Support for Ruby versions < 2.1 will be REMOVED in version 0.50.0.'
|
194
|
+
)
|
195
|
+
end
|
196
|
+
end
|
171
197
|
end
|
172
198
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'ddtrace/diagnostics/health'
|
2
2
|
require 'ddtrace/logger'
|
3
|
+
require 'ddtrace/profiling'
|
3
4
|
require 'ddtrace/runtime/metrics'
|
4
5
|
require 'ddtrace/tracer'
|
5
6
|
require 'ddtrace/workers/runtime_metrics'
|
@@ -8,6 +9,7 @@ module Datadog
|
|
8
9
|
module Configuration
|
9
10
|
# Global components for the trace library.
|
10
11
|
# rubocop:disable Layout/LineLength
|
12
|
+
# rubocop:disable Metrics/ClassLength
|
11
13
|
class Components
|
12
14
|
class << self
|
13
15
|
def build_health_metrics(settings)
|
@@ -66,6 +68,22 @@ module Datadog
|
|
66
68
|
tracer
|
67
69
|
end
|
68
70
|
|
71
|
+
def build_profiler(settings)
|
72
|
+
return unless Datadog::Profiling.supported? && settings.profiling.enabled
|
73
|
+
|
74
|
+
# Load extensions needed to support some of the Profiling features
|
75
|
+
Datadog::Profiling::Tasks::Setup.new.run
|
76
|
+
|
77
|
+
# NOTE: Please update the Initialization section of ProfilingDevelopment.md with any changes to this method
|
78
|
+
|
79
|
+
recorder = build_profiler_recorder(settings)
|
80
|
+
collectors = build_profiler_collectors(settings, recorder)
|
81
|
+
exporters = build_profiler_exporters(settings)
|
82
|
+
scheduler = build_profiler_scheduler(settings, recorder, exporters)
|
83
|
+
|
84
|
+
Datadog::Profiler.new(collectors, scheduler)
|
85
|
+
end
|
86
|
+
|
69
87
|
private
|
70
88
|
|
71
89
|
def build_tracer_tags(settings)
|
@@ -90,11 +108,51 @@ module Datadog
|
|
90
108
|
opts[:writer_options] = settings.writer_options if settings.writer.nil?
|
91
109
|
end
|
92
110
|
end
|
111
|
+
|
112
|
+
def build_profiler_recorder(settings)
|
113
|
+
event_classes = [Datadog::Profiling::Events::StackSample]
|
114
|
+
|
115
|
+
Datadog::Profiling::Recorder.new(event_classes, settings.profiling.max_events)
|
116
|
+
end
|
117
|
+
|
118
|
+
def build_profiler_collectors(settings, recorder)
|
119
|
+
[
|
120
|
+
Datadog::Profiling::Collectors::Stack.new(
|
121
|
+
recorder,
|
122
|
+
max_frames: settings.profiling.max_frames
|
123
|
+
# TODO: Provide proc that identifies Datadog worker threads?
|
124
|
+
# ignore_thread: settings.profiling.ignore_profiler
|
125
|
+
)
|
126
|
+
]
|
127
|
+
end
|
128
|
+
|
129
|
+
def build_profiler_exporters(settings)
|
130
|
+
if settings.profiling.exporter.instances.is_a?(Array)
|
131
|
+
settings.profiling.exporter.instances
|
132
|
+
else
|
133
|
+
transport = if settings.profiling.exporter.transport
|
134
|
+
settings.profiling.exporter.transport
|
135
|
+
else
|
136
|
+
transport_options = settings.profiling.exporter.transport_options.dup
|
137
|
+
transport_options[:site] ||= settings.site if settings.site
|
138
|
+
transport_options[:api_key] ||= settings.api_key if settings.api_key
|
139
|
+
transport_options[:timeout] ||= settings.profiling.upload.timeout
|
140
|
+
Datadog::Profiling::Transport::HTTP.default(transport_options)
|
141
|
+
end
|
142
|
+
|
143
|
+
[Datadog::Profiling::Exporter.new(transport)]
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def build_profiler_scheduler(settings, recorder, exporters)
|
148
|
+
Datadog::Profiling::Scheduler.new(recorder, exporters)
|
149
|
+
end
|
93
150
|
end
|
94
151
|
|
95
152
|
attr_reader \
|
96
153
|
:health_metrics,
|
97
154
|
:logger,
|
155
|
+
:profiler,
|
98
156
|
:runtime_metrics,
|
99
157
|
:tracer
|
100
158
|
|
@@ -105,6 +163,9 @@ module Datadog
|
|
105
163
|
# Tracer
|
106
164
|
@tracer = self.class.build_tracer(settings)
|
107
165
|
|
166
|
+
# Profiler
|
167
|
+
@profiler = self.class.build_profiler(settings)
|
168
|
+
|
108
169
|
# Runtime metrics
|
109
170
|
@runtime_metrics = self.class.build_runtime_metrics_worker(settings)
|
110
171
|
|
@@ -113,7 +174,20 @@ module Datadog
|
|
113
174
|
end
|
114
175
|
|
115
176
|
# Starts up components
|
116
|
-
def startup!(settings)
|
177
|
+
def startup!(settings)
|
178
|
+
if settings.profiling.enabled
|
179
|
+
if profiler
|
180
|
+
@logger.debug('Profiling started')
|
181
|
+
profiler.start
|
182
|
+
else
|
183
|
+
# Display a warning for users who expected profiling to autostart
|
184
|
+
protobuf = Datadog::Profiling.google_protobuf_supported?
|
185
|
+
logger.warn("Profiling was enabled but is not supported; profiling disabled. (google-protobuf?: #{protobuf})")
|
186
|
+
end
|
187
|
+
else
|
188
|
+
@logger.debug('Profiling is disabled')
|
189
|
+
end
|
190
|
+
end
|
117
191
|
|
118
192
|
# Shuts down all the components in use.
|
119
193
|
# If it has another instance to compare to, it will compare
|
@@ -123,12 +197,20 @@ module Datadog
|
|
123
197
|
# (e.g. a custom tracer instance passed in.)
|
124
198
|
tracer.shutdown! unless replacement && tracer == replacement.tracer
|
125
199
|
|
200
|
+
# Shutdown old profiler
|
201
|
+
profiler.shutdown! unless profiler.nil?
|
202
|
+
|
126
203
|
# Shutdown workers
|
127
|
-
runtime_metrics.
|
128
|
-
runtime_metrics.stop(true)
|
204
|
+
runtime_metrics.stop(true, close_metrics: false)
|
129
205
|
|
130
206
|
# Shutdown the old metrics, unless they are still being used.
|
131
207
|
# (e.g. custom Statsd instances.)
|
208
|
+
#
|
209
|
+
# TODO: This violates the encapsulation created by Runtime::Metrics and
|
210
|
+
# Health::Metrics, by directly manipulating `statsd` and changing
|
211
|
+
# it's lifecycle management.
|
212
|
+
# If we need to directly have ownership of `statsd` lifecycle, we should
|
213
|
+
# have direct ownership of it.
|
132
214
|
old_statsd = [
|
133
215
|
runtime_metrics.metrics.statsd,
|
134
216
|
health_metrics.statsd
|
@@ -3,6 +3,7 @@ require 'ddtrace/configuration/base'
|
|
3
3
|
|
4
4
|
require 'ddtrace/ext/analytics'
|
5
5
|
require 'ddtrace/ext/distributed'
|
6
|
+
require 'ddtrace/ext/profiling'
|
6
7
|
require 'ddtrace/ext/runtime'
|
7
8
|
require 'ddtrace/ext/sampling'
|
8
9
|
|
@@ -108,6 +109,36 @@ module Datadog
|
|
108
109
|
get_option(:logger).instance = logger
|
109
110
|
end
|
110
111
|
|
112
|
+
settings :profiling do
|
113
|
+
option :enabled do |o|
|
114
|
+
o.default { env_to_bool(Ext::Profiling::ENV_ENABLED, false) }
|
115
|
+
o.lazy
|
116
|
+
end
|
117
|
+
|
118
|
+
settings :exporter do
|
119
|
+
option :instances
|
120
|
+
option :transport
|
121
|
+
option :transport_options, default: ->(_o) { {} }, lazy: true
|
122
|
+
end
|
123
|
+
|
124
|
+
option :max_events, default: 32768
|
125
|
+
|
126
|
+
# Controls the maximum number of frames for each thread sampled. Can be tuned to avoid omitted frames in the
|
127
|
+
# produced profiles. Increasing this may increase the overhead of profiling.
|
128
|
+
option :max_frames do |o|
|
129
|
+
o.default { env_to_int(Ext::Profiling::ENV_MAX_FRAMES, 400) }
|
130
|
+
o.lazy
|
131
|
+
end
|
132
|
+
|
133
|
+
settings :upload do
|
134
|
+
option :timeout do |o|
|
135
|
+
o.setter { |value| value.nil? ? 30.0 : value.to_f }
|
136
|
+
o.default { env_to_float(Ext::Profiling::ENV_UPLOAD_TIMEOUT, 30.0) }
|
137
|
+
o.lazy
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
111
142
|
option :report_hostname do |o|
|
112
143
|
o.default { env_to_bool(Ext::NET::ENV_REPORT_HOSTNAME, false) }
|
113
144
|
o.lazy
|