ddtrace 1.14.0 → 1.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +178 -2
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +3 -5
- data/ext/ddtrace_profiling_native_extension/clock_id.h +0 -3
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +0 -22
- data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +0 -1
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +41 -6
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +76 -24
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +1 -1
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +207 -32
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +1 -1
- data/ext/ddtrace_profiling_native_extension/extconf.rb +8 -2
- data/ext/ddtrace_profiling_native_extension/http_transport.c +26 -10
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +42 -0
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +6 -0
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +1 -16
- data/ext/ddtrace_profiling_native_extension/pid_controller.c +57 -0
- data/ext/ddtrace_profiling_native_extension/pid_controller.h +45 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +17 -12
- data/ext/ddtrace_profiling_native_extension/profiling.c +0 -2
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +74 -37
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +13 -3
- data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
- data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
- data/lib/datadog/appsec/assets.rb +8 -0
- data/lib/datadog/appsec/component.rb +9 -2
- data/lib/datadog/appsec/configuration/settings.rb +61 -2
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +2 -7
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +2 -5
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +2 -5
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +23 -9
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
- data/lib/datadog/appsec/contrib/rails/patcher.rb +9 -3
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +2 -5
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +2 -5
- data/lib/datadog/appsec/event.rb +106 -50
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +2 -5
- data/lib/datadog/appsec/processor/actions.rb +49 -0
- data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
- data/lib/datadog/appsec/processor.rb +34 -6
- data/lib/datadog/appsec/remote.rb +4 -1
- data/lib/datadog/appsec/response.rb +82 -4
- data/lib/datadog/appsec/sample_rate.rb +21 -0
- data/lib/datadog/appsec.rb +2 -2
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +29 -24
- data/lib/datadog/core/configuration/base.rb +1 -11
- data/lib/datadog/core/configuration/components.rb +7 -2
- data/lib/datadog/core/configuration/ext.rb +21 -0
- data/lib/datadog/core/configuration/option.rb +2 -4
- data/lib/datadog/core/configuration/option_definition.rb +17 -41
- data/lib/datadog/core/configuration/options.rb +5 -5
- data/lib/datadog/core/configuration/settings.rb +47 -45
- data/lib/datadog/core/environment/execution.rb +47 -9
- data/lib/datadog/core/environment/variable_helpers.rb +0 -69
- data/lib/datadog/core/error.rb +1 -0
- data/lib/datadog/core/git/ext.rb +2 -0
- data/lib/datadog/core/remote/client/capabilities.rb +1 -1
- data/lib/datadog/core/remote/component.rb +2 -2
- data/lib/datadog/core/remote/negotiation.rb +2 -2
- data/lib/datadog/core/remote/transport/config.rb +60 -0
- data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
- data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
- data/lib/datadog/core/remote/transport/http/api.rb +58 -0
- data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
- data/lib/datadog/core/remote/transport/http/client.rb +48 -0
- data/lib/datadog/core/remote/transport/http/config.rb +280 -0
- data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
- data/lib/datadog/core/remote/transport/http.rb +179 -0
- data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
- data/lib/datadog/core/telemetry/collector.rb +3 -2
- data/lib/datadog/core/telemetry/http/transport.rb +2 -1
- data/lib/datadog/core/transport/ext.rb +47 -0
- data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
- data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
- data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
- data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
- data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
- data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
- data/lib/datadog/core/transport/http/api/map.rb +18 -0
- data/lib/datadog/core/transport/http/env.rb +62 -0
- data/lib/datadog/core/transport/http/response.rb +60 -0
- data/lib/datadog/core/transport/parcel.rb +22 -0
- data/lib/datadog/core/transport/request.rb +17 -0
- data/lib/datadog/core/transport/response.rb +64 -0
- data/lib/datadog/core/workers/polling.rb +2 -2
- data/lib/datadog/opentelemetry/api/context.rb +10 -3
- data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +14 -2
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +68 -0
- data/lib/datadog/opentelemetry/trace.rb +58 -0
- data/lib/datadog/opentelemetry.rb +1 -0
- data/lib/datadog/opentracer.rb +9 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +12 -18
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
- data/lib/datadog/profiling/collectors/thread_context.rb +9 -1
- data/lib/datadog/profiling/component.rb +24 -99
- data/lib/datadog/profiling/ext.rb +0 -12
- data/lib/datadog/profiling/flush.rb +0 -3
- data/lib/datadog/profiling/http_transport.rb +6 -3
- data/lib/datadog/profiling/native_extension.rb +0 -21
- data/lib/datadog/profiling/profiler.rb +11 -12
- data/lib/datadog/profiling.rb +8 -81
- data/lib/datadog/tracing/component.rb +10 -4
- data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
- data/lib/datadog/tracing/configuration/ext.rb +4 -2
- data/lib/datadog/tracing/configuration/settings.rb +14 -7
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +4 -0
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +104 -197
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +7 -0
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/dalli/ext.rb +7 -0
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +9 -2
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +5 -0
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -0
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +8 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -0
- data/lib/datadog/tracing/contrib/ext.rb +3 -0
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -0
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +21 -1
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -1
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +18 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +3 -3
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +5 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +7 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +13 -3
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +7 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +5 -0
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +5 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/event.rb +5 -0
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +14 -4
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -4
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/tags.rb +5 -0
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -0
- data/lib/datadog/tracing/contrib/sequel/utils.rb +5 -0
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +2 -2
- data/lib/datadog/tracing/distributed/propagation.rb +13 -33
- data/lib/datadog/tracing/metadata/tagging.rb +3 -3
- data/lib/datadog/tracing/sync_writer.rb +3 -3
- data/lib/datadog/tracing/tracer.rb +2 -0
- data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
- data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
- data/lib/datadog/tracing/transport/http/api.rb +43 -0
- data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
- data/lib/datadog/tracing/transport/http/client.rb +57 -0
- data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
- data/lib/datadog/tracing/transport/http/traces.rb +152 -0
- data/lib/datadog/tracing/transport/http.rb +124 -0
- data/lib/datadog/tracing/transport/io/client.rb +89 -0
- data/lib/datadog/tracing/transport/io/response.rb +27 -0
- data/lib/datadog/tracing/transport/io/traces.rb +101 -0
- data/lib/datadog/tracing/transport/io.rb +30 -0
- data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
- data/lib/datadog/tracing/transport/statistics.rb +77 -0
- data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
- data/lib/datadog/tracing/transport/traces.rb +224 -0
- data/lib/datadog/tracing/workers/trace_writer.rb +5 -3
- data/lib/datadog/tracing/workers.rb +3 -2
- data/lib/datadog/tracing/writer.rb +5 -2
- data/lib/ddtrace/transport/ext.rb +17 -15
- data/lib/ddtrace/version.rb +1 -1
- data/lib/ddtrace.rb +1 -1
- metadata +72 -96
- data/lib/datadog/ci/configuration/components.rb +0 -32
- data/lib/datadog/ci/configuration/settings.rb +0 -51
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -35
- data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -22
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
- data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
- data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +0 -35
- data/lib/datadog/ci/contrib/minitest/ext.rb +0 -21
- data/lib/datadog/ci/contrib/minitest/integration.rb +0 -49
- data/lib/datadog/ci/contrib/minitest/patcher.rb +0 -27
- data/lib/datadog/ci/contrib/minitest/test_helper.rb +0 -68
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -35
- data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
- data/lib/datadog/ci/contrib/rspec/ext.rb +0 -21
- data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
- data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
- data/lib/datadog/ci/ext/app_types.rb +0 -9
- data/lib/datadog/ci/ext/environment.rb +0 -575
- data/lib/datadog/ci/ext/settings.rb +0 -10
- data/lib/datadog/ci/ext/test.rb +0 -35
- data/lib/datadog/ci/extensions.rb +0 -19
- data/lib/datadog/ci/flush.rb +0 -38
- data/lib/datadog/ci/test.rb +0 -81
- data/lib/datadog/ci.rb +0 -21
- data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
- data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
- data/lib/datadog/core/configuration/option_set.rb +0 -10
- data/lib/datadog/core/transport/config.rb +0 -58
- data/lib/datadog/core/transport/http/api.rb +0 -57
- data/lib/datadog/core/transport/http/client.rb +0 -45
- data/lib/datadog/core/transport/http/config.rb +0 -278
- data/lib/datadog/core/transport/http/negotiation.rb +0 -144
- data/lib/datadog/core/transport/http.rb +0 -169
- data/lib/datadog/core/utils/object_set.rb +0 -43
- data/lib/datadog/core/utils/string_table.rb +0 -47
- data/lib/datadog/profiling/backtrace_location.rb +0 -34
- data/lib/datadog/profiling/buffer.rb +0 -43
- data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
- data/lib/datadog/profiling/encoding/profile.rb +0 -41
- data/lib/datadog/profiling/event.rb +0 -15
- data/lib/datadog/profiling/events/stack.rb +0 -82
- data/lib/datadog/profiling/old_recorder.rb +0 -107
- data/lib/datadog/profiling/pprof/builder.rb +0 -125
- data/lib/datadog/profiling/pprof/converter.rb +0 -102
- data/lib/datadog/profiling/pprof/message_set.rb +0 -16
- data/lib/datadog/profiling/pprof/payload.rb +0 -20
- data/lib/datadog/profiling/pprof/pprof.proto +0 -212
- data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
- data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
- data/lib/datadog/profiling/pprof/string_table.rb +0 -12
- data/lib/datadog/profiling/pprof/template.rb +0 -118
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
- data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
- data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
- data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
- data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
- data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
- data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
- data/lib/ddtrace/transport/http/api/instance.rb +0 -35
- data/lib/ddtrace/transport/http/api/map.rb +0 -16
- data/lib/ddtrace/transport/http/api/spec.rb +0 -17
- data/lib/ddtrace/transport/http/api.rb +0 -39
- data/lib/ddtrace/transport/http/builder.rb +0 -176
- data/lib/ddtrace/transport/http/client.rb +0 -52
- data/lib/ddtrace/transport/http/env.rb +0 -58
- data/lib/ddtrace/transport/http/response.rb +0 -58
- data/lib/ddtrace/transport/http/statistics.rb +0 -43
- data/lib/ddtrace/transport/http/traces.rb +0 -144
- data/lib/ddtrace/transport/http.rb +0 -117
- data/lib/ddtrace/transport/io/client.rb +0 -85
- data/lib/ddtrace/transport/io/response.rb +0 -25
- data/lib/ddtrace/transport/io/traces.rb +0 -99
- data/lib/ddtrace/transport/io.rb +0 -28
- data/lib/ddtrace/transport/parcel.rb +0 -20
- data/lib/ddtrace/transport/request.rb +0 -15
- data/lib/ddtrace/transport/response.rb +0 -60
- data/lib/ddtrace/transport/serializable_trace.rb +0 -122
- data/lib/ddtrace/transport/statistics.rb +0 -75
- data/lib/ddtrace/transport/trace_formatter.rb +0 -207
- data/lib/ddtrace/transport/traces.rb +0 -216
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18896f24a83a74a5ea6f4adfb3baad9fec922f0d3c3e8d087d28805744584d40
|
4
|
+
data.tar.gz: 173d93233e49670ed94a9d3cd7501f50c596ceb7624293e4c1992513e6121fa6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 174e727aad6f68b2873e88ac71b5a563075c501f4fbd75cad563735c765962d5753f6025a0a75c257f12a7a89fc83713e3ff249f2e2815803786ed709e35daff
|
7
|
+
data.tar.gz: bc2bbcc9d601473e871dee51e53745045b37204bb902dd2f29deac2ea4c94bdc7aa6c016eecfd2648ccac13393b612400c9167bdbd115271893e561fcb12a8ce
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,135 @@
|
|
2
2
|
|
3
3
|
## [Unreleased]
|
4
4
|
|
5
|
+
## [1.15.0] - 2023-10-09
|
6
|
+
|
7
|
+
### Highlights
|
8
|
+
|
9
|
+
#### Timeline view for Profiler beta
|
10
|
+
|
11
|
+
As of ddtrace 1.15.0, the Profiler now supports gathering data for the new
|
12
|
+
[Timeline view](https://docs.datadoghq.com/profiler/profile_visualizations/#timeline-view).
|
13
|
+
|
14
|
+
The Timeline view allows you to look at time-based patterns and work distribution over the period of a single profile: you can look at what individual threads were doing, and when 🎉
|
15
|
+
|
16
|
+
You can use the timeline view both when looking at individual profiles, as well as when scoped to a given trace.
|
17
|
+
|
18
|
+
You can enable it:
|
19
|
+
|
20
|
+
* Using an environment variable by setting `DD_PROFILING_EXPERIMENTAL_TIMELINE_ENABLED=true`
|
21
|
+
* Or via code by adding to your `Datadog.configure` block:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
Datadog.configure do |c|
|
25
|
+
# … existing configuration …
|
26
|
+
c.profiling.advanced.experimental_timeline_enabled = true
|
27
|
+
end
|
28
|
+
```
|
29
|
+
|
30
|
+
Give it a try, let us know what you think!
|
31
|
+
|
32
|
+
(Note: We do not recommend enabling this feature prior to 1.15.0!)
|
33
|
+
|
34
|
+
#### google-protobuf dependency is no longer needed by the Profiler
|
35
|
+
|
36
|
+
As of ddtrace version 1.15.0, the `google-protobuf` gem is no longer needed to enable the Profiler.
|
37
|
+
|
38
|
+
If you've added this gem to your `Gemfile`/`gems.rb` file as part of enabling the Profiler, you can
|
39
|
+
remove it now. (If you're curious, we've internally replaced this dependency with the `libdatadog` gem.)
|
40
|
+
|
41
|
+
#### Configure blocking responses for AppSec via configuration or Remote Configuration
|
42
|
+
|
43
|
+
As of dd-trace-rb 1.15.0, AppSec supports configuring the blocking response.
|
44
|
+
|
45
|
+
You can configure the blocking response via:
|
46
|
+
- Using the ENV variables: `DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML=#{file_name}`, and `DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON=#{file_name}`
|
47
|
+
- Via code by adding to your `Datadog.configure` block:
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
Datadog.configure do |c|
|
51
|
+
# … existing configuration …
|
52
|
+
c.appsec.block.templates.html = "#{file_name}"
|
53
|
+
c.appsec.block.templates.json = "#{file_name}"
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
- Using the Remote configuration UI. This option allow you to configure the status code and the blocking behaviour. You can redirect malicious attacker to custome pages.
|
58
|
+
You can find more information on the [official documentation](https://docs.datadoghq.com/security/application_security/threats/protection/#customize-protection-behavior)
|
59
|
+
|
60
|
+
#### Configure agentless mode for CI visibility
|
61
|
+
|
62
|
+
If you are using CI visibility with a cloud CI provider without access to the underlying worker nodes, such as GitHub Actions or CircleCI, configure the library to use the Agentless mode.
|
63
|
+
|
64
|
+
For this, set the following environment variables:
|
65
|
+
- DD_CIVISIBILITY_AGENTLESS_ENABLED=true
|
66
|
+
- DD_API_KEY=<your_api_key>
|
67
|
+
|
68
|
+
Additionally, configure which Datadog site you want to send your data to:
|
69
|
+
- DD_SITE (default: datadoghq.com)
|
70
|
+
|
71
|
+
You can also enable agentless mode with `Datadog.configure` block:
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
Datadog.configure do |c|
|
75
|
+
# … existing configuration …
|
76
|
+
c.ci.agentless_mode_enabled = true
|
77
|
+
# don't forget to set DD_API_KEY env variable!
|
78
|
+
end
|
79
|
+
```
|
80
|
+
|
81
|
+
### Added
|
82
|
+
* Profiling: Import java-profiler PID controller and port it to C ([#3190][])
|
83
|
+
* Tracing: Support Opensearch 3 ([#3189][])
|
84
|
+
* bump datadog-ci dependency to 0.2 ([#3186][])
|
85
|
+
* Enable allocation counting feature by default for some Ruby 3 versions ([#3176][])
|
86
|
+
* Tracing: Introduce async configuration for test mode to use standard writer when needed ([#3158][])
|
87
|
+
* Appsec: Update AppSec rules to 1.8.0 ([#3140][])
|
88
|
+
* Appsec: Update AppSec rules to 1.7.2 ([#3139][])
|
89
|
+
* Appsec: ASM API security. Schema extraction ([#3131][], [#3166][], [#3177][])
|
90
|
+
* Tracing: peer.service adjustment for sql propagation with DBM ([#3127][])
|
91
|
+
* Ci-app: CI visibility: validate git tags ([#3100][])
|
92
|
+
* Appsec: Enable configuring blocking response via Remote Configuration ([#3099][])
|
93
|
+
* Profiling: Record allocation type when sampling objects ([#3096][])
|
94
|
+
* Appsec: Uppgrade libddwaf-rb version to 1.11.0 ([#3087][])
|
95
|
+
* Profiling: Mergequeue-status: removed: Include 'ruby vm type' in profiler allocation samples ([#3074][])
|
96
|
+
* Detect WebMock to disable telemetry and remote configuration ([#3065][])
|
97
|
+
* Ensure Rails testing is considered a development environment ([#3062][])
|
98
|
+
* Tracing: Implements `_dd.base_service` tag ([#3018][])
|
99
|
+
* Appsec: Allow blocking response template configuration via ENV variables ([#2975][])
|
100
|
+
* Ci-app: agentless mode ([#3186][])
|
101
|
+
|
102
|
+
### Changed
|
103
|
+
* Appsec: skip passing waf addresses when the value is empty ([#3188][])
|
104
|
+
* Tracing: Disable memcached command tag by default ([#3171][])
|
105
|
+
* Profiling: Upgrade to libdatadog 5 ([#3169][])
|
106
|
+
* Profiling: Restore support for Ruby 3.3 ([#3167][])
|
107
|
+
* Bump debase-ruby_core_source dependency to 3.2.2 ([#3163][])
|
108
|
+
* Profiling: Add approximate thread state categorization for timeline ([#3162][])
|
109
|
+
* Tracing: remove variable helpers module from our configuration DSL ([#3152][])
|
110
|
+
* Profiling: Tracing: ekump/decouple core transport ([#3150][])
|
111
|
+
* Test:Remove explicit dependency on `addressable` ([#3148][])
|
112
|
+
* Detect Cucumber as a development environment ([#3145][])
|
113
|
+
* Tracing: rename core configuration option on_set to after_set ([#3107][])
|
114
|
+
* Profiling: Upgrade to libdatadog 4 ([#3104][])
|
115
|
+
* Profiling: Wire up allocation sampling into `CpuAndWallTimeWorker` ([#3103][])
|
116
|
+
* Tracing: rename experimental_default_proc to default_proc ([#3091][])
|
117
|
+
* remove `delegate_to` configuration option from our DSL ([#3086][])
|
118
|
+
* Ci-app: Fix Datadog::CI::Environment to support the new CI specs ([#3080][])
|
119
|
+
* Tracing: Use first valid extracted style for distributed tracing ([#2879][])
|
120
|
+
|
121
|
+
### Fixed
|
122
|
+
* Profiling: Add workaround for incorrect invoke location when logging gem is in use ([#3183][])
|
123
|
+
* Profiling: Fix missing endpoint profiling when request_queuing is enabled in rack instrumentation ([#3109][])
|
124
|
+
* Appsec: Fix a bug with ASM span tags reporting the number of WAF failed loaded rules ([#3106][])
|
125
|
+
* Tracing: Fix tagging with empty data ([#3102][])
|
126
|
+
* Tracing: fix(grpc): allow custom error_handler for client interceptor ([#3095][])
|
127
|
+
* Tracing: Correctly set `rails.cache.backend` span tag for multiple stores ([#3060][])
|
128
|
+
|
129
|
+
### Removed
|
130
|
+
* Profiling: Remove legacy profiler codepath ([#3172][])
|
131
|
+
* Ci-app: remove CI module and add a dependency on datadog-ci gem ([#3128][])
|
132
|
+
* Tracing: Remove `depends_on` from Core Configuration option ([#3085][])
|
133
|
+
|
5
134
|
## [1.14.0] - 2023-08-24
|
6
135
|
|
7
136
|
### Added
|
@@ -2534,7 +2663,8 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
|
|
2534
2663
|
|
2535
2664
|
Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
2536
2665
|
|
2537
|
-
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.
|
2666
|
+
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.15.0...master
|
2667
|
+
[1.15.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.14.0...v1.15.0
|
2538
2668
|
[1.14.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.13.1...1.14.0
|
2539
2669
|
[1.13.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.13.0...1.13.1
|
2540
2670
|
[1.13.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.12.1...v1.13.0
|
@@ -3624,6 +3754,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
3624
3754
|
[#2874]: https://github.com/DataDog/dd-trace-rb/issues/2874
|
3625
3755
|
[#2875]: https://github.com/DataDog/dd-trace-rb/issues/2875
|
3626
3756
|
[#2877]: https://github.com/DataDog/dd-trace-rb/issues/2877
|
3757
|
+
[#2879]: https://github.com/DataDog/dd-trace-rb/issues/2879
|
3627
3758
|
[#2882]: https://github.com/DataDog/dd-trace-rb/issues/2882
|
3628
3759
|
[#2883]: https://github.com/DataDog/dd-trace-rb/issues/2883
|
3629
3760
|
[#2890]: https://github.com/DataDog/dd-trace-rb/issues/2890
|
@@ -3659,6 +3790,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
3659
3790
|
[#2972]: https://github.com/DataDog/dd-trace-rb/issues/2972
|
3660
3791
|
[#2973]: https://github.com/DataDog/dd-trace-rb/issues/2973
|
3661
3792
|
[#2974]: https://github.com/DataDog/dd-trace-rb/issues/2974
|
3793
|
+
[#2975]: https://github.com/DataDog/dd-trace-rb/issues/2975
|
3662
3794
|
[#2977]: https://github.com/DataDog/dd-trace-rb/issues/2977
|
3663
3795
|
[#2978]: https://github.com/DataDog/dd-trace-rb/issues/2978
|
3664
3796
|
[#2982]: https://github.com/DataDog/dd-trace-rb/issues/2982
|
@@ -3671,6 +3803,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
3671
3803
|
[#3005]: https://github.com/DataDog/dd-trace-rb/issues/3005
|
3672
3804
|
[#3007]: https://github.com/DataDog/dd-trace-rb/issues/3007
|
3673
3805
|
[#3011]: https://github.com/DataDog/dd-trace-rb/issues/3011
|
3806
|
+
[#3018]: https://github.com/DataDog/dd-trace-rb/issues/3018
|
3674
3807
|
[#3019]: https://github.com/DataDog/dd-trace-rb/issues/3019
|
3675
3808
|
[#3020]: https://github.com/DataDog/dd-trace-rb/issues/3020
|
3676
3809
|
[#3022]: https://github.com/DataDog/dd-trace-rb/issues/3022
|
@@ -3685,8 +3818,51 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
3685
3818
|
[#3054]: https://github.com/DataDog/dd-trace-rb/issues/3054
|
3686
3819
|
[#3056]: https://github.com/DataDog/dd-trace-rb/issues/3056
|
3687
3820
|
[#3057]: https://github.com/DataDog/dd-trace-rb/issues/3057
|
3821
|
+
[#3060]: https://github.com/DataDog/dd-trace-rb/issues/3060
|
3688
3822
|
[#3061]: https://github.com/DataDog/dd-trace-rb/issues/3061
|
3823
|
+
[#3062]: https://github.com/DataDog/dd-trace-rb/issues/3062
|
3824
|
+
[#3065]: https://github.com/DataDog/dd-trace-rb/issues/3065
|
3689
3825
|
[#3070]: https://github.com/DataDog/dd-trace-rb/issues/3070
|
3826
|
+
[#3074]: https://github.com/DataDog/dd-trace-rb/issues/3074
|
3827
|
+
[#3080]: https://github.com/DataDog/dd-trace-rb/issues/3080
|
3828
|
+
[#3085]: https://github.com/DataDog/dd-trace-rb/issues/3085
|
3829
|
+
[#3086]: https://github.com/DataDog/dd-trace-rb/issues/3086
|
3830
|
+
[#3087]: https://github.com/DataDog/dd-trace-rb/issues/3087
|
3831
|
+
[#3091]: https://github.com/DataDog/dd-trace-rb/issues/3091
|
3832
|
+
[#3095]: https://github.com/DataDog/dd-trace-rb/issues/3095
|
3833
|
+
[#3096]: https://github.com/DataDog/dd-trace-rb/issues/3096
|
3834
|
+
[#3099]: https://github.com/DataDog/dd-trace-rb/issues/3099
|
3835
|
+
[#3100]: https://github.com/DataDog/dd-trace-rb/issues/3100
|
3836
|
+
[#3102]: https://github.com/DataDog/dd-trace-rb/issues/3102
|
3837
|
+
[#3103]: https://github.com/DataDog/dd-trace-rb/issues/3103
|
3838
|
+
[#3104]: https://github.com/DataDog/dd-trace-rb/issues/3104
|
3839
|
+
[#3106]: https://github.com/DataDog/dd-trace-rb/issues/3106
|
3840
|
+
[#3107]: https://github.com/DataDog/dd-trace-rb/issues/3107
|
3841
|
+
[#3109]: https://github.com/DataDog/dd-trace-rb/issues/3109
|
3842
|
+
[#3127]: https://github.com/DataDog/dd-trace-rb/issues/3127
|
3843
|
+
[#3128]: https://github.com/DataDog/dd-trace-rb/issues/3128
|
3844
|
+
[#3131]: https://github.com/DataDog/dd-trace-rb/issues/3131
|
3845
|
+
[#3139]: https://github.com/DataDog/dd-trace-rb/issues/3139
|
3846
|
+
[#3140]: https://github.com/DataDog/dd-trace-rb/issues/3140
|
3847
|
+
[#3145]: https://github.com/DataDog/dd-trace-rb/issues/3145
|
3848
|
+
[#3148]: https://github.com/DataDog/dd-trace-rb/issues/3148
|
3849
|
+
[#3150]: https://github.com/DataDog/dd-trace-rb/issues/3150
|
3850
|
+
[#3152]: https://github.com/DataDog/dd-trace-rb/issues/3152
|
3851
|
+
[#3158]: https://github.com/DataDog/dd-trace-rb/issues/3158
|
3852
|
+
[#3162]: https://github.com/DataDog/dd-trace-rb/issues/3162
|
3853
|
+
[#3163]: https://github.com/DataDog/dd-trace-rb/issues/3163
|
3854
|
+
[#3166]: https://github.com/DataDog/dd-trace-rb/issues/3166
|
3855
|
+
[#3167]: https://github.com/DataDog/dd-trace-rb/issues/3167
|
3856
|
+
[#3169]: https://github.com/DataDog/dd-trace-rb/issues/3169
|
3857
|
+
[#3171]: https://github.com/DataDog/dd-trace-rb/issues/3171
|
3858
|
+
[#3172]: https://github.com/DataDog/dd-trace-rb/issues/3172
|
3859
|
+
[#3176]: https://github.com/DataDog/dd-trace-rb/issues/3176
|
3860
|
+
[#3177]: https://github.com/DataDog/dd-trace-rb/issues/3177
|
3861
|
+
[#3183]: https://github.com/DataDog/dd-trace-rb/issues/3183
|
3862
|
+
[#3186]: https://github.com/DataDog/dd-trace-rb/issues/3186
|
3863
|
+
[#3188]: https://github.com/DataDog/dd-trace-rb/issues/3188
|
3864
|
+
[#3189]: https://github.com/DataDog/dd-trace-rb/issues/3189
|
3865
|
+
[#3190]: https://github.com/DataDog/dd-trace-rb/issues/3190
|
3690
3866
|
[@AdrianLC]: https://github.com/AdrianLC
|
3691
3867
|
[@Azure7111]: https://github.com/Azure7111
|
3692
3868
|
[@BabyGroot]: https://github.com/BabyGroot
|
@@ -3838,4 +4014,4 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
3838
4014
|
[@y-yagi]: https://github.com/y-yagi
|
3839
4015
|
[@yujideveloper]: https://github.com/yujideveloper
|
3840
4016
|
[@yukimurasawa]: https://github.com/yukimurasawa
|
3841
|
-
[@zachmccormick]: https://github.com/zachmccormick
|
4017
|
+
[@zachmccormick]: https://github.com/zachmccormick
|
@@ -16,8 +16,7 @@ the gem. Setting `DD_PROFILING_NO_EXTENSION` at installation time skips compilat
|
|
16
16
|
|
17
17
|
(If you're a customer and needed to use this, please tell us why on <https://github.com/DataDog/dd-trace-rb/issues/new>.)
|
18
18
|
|
19
|
-
|
20
|
-
and disabling the extension will disable profiling.
|
19
|
+
Disabling the profiler extension will disable profiling.
|
21
20
|
|
22
21
|
## Who is this page for?
|
23
22
|
|
@@ -83,7 +82,7 @@ contribute upstream changes so that they become official public VM APIs.
|
|
83
82
|
Ruby versions 2.6 to 3.2 shipped a JIT compiler called MJIT. This compiler does not directly generate machine code;
|
84
83
|
instead it generates C code and uses the system C compiler to turn it into machine code.
|
85
84
|
|
86
|
-
The generated C code `#include`s a private header -- which we
|
85
|
+
The generated C code `#include`s a private header -- which we call "the MJIT header".
|
87
86
|
The MJIT header gets shipped with all MJIT-enabled Rubies and includes the layout of many internal VM structures;
|
88
87
|
and of course the intention is that it is only used by the Ruby MJIT compiler.
|
89
88
|
|
@@ -104,8 +103,7 @@ Thus, even though a regular Ruby installation does not include these files, we c
|
|
104
103
|
* **OS support**: Linux
|
105
104
|
|
106
105
|
To enable CPU-time profiling, we use the `pthread_getcpuclockid(pthread_t thread, clockid_t *clockid)` C function to
|
107
|
-
obtain a `clockid_t` that can then be used with the `
|
108
|
-
`clock_gettime()` C function).
|
106
|
+
obtain a `clockid_t` that can then be used with the `clock_gettime` function.
|
109
107
|
|
110
108
|
The challenge with using `pthread_getcpuclockid()` is that we need to get the `pthread_t` for a given Ruby `Thread`
|
111
109
|
object. We previously did this with a weird combination of monkey patching and `pthread_self()` (effectively patching
|
@@ -17,9 +17,6 @@ typedef struct thread_cpu_time {
|
|
17
17
|
|
18
18
|
void self_test_clock_id(void);
|
19
19
|
|
20
|
-
// TODO: Remove this after the OldStack profiler gets removed
|
21
|
-
VALUE clock_id_for(VALUE self, VALUE thread);
|
22
|
-
|
23
20
|
// Safety: This function is assumed never to raise exceptions by callers
|
24
21
|
thread_cpu_time_id thread_cpu_time_id_for(VALUE thread);
|
25
22
|
thread_cpu_time thread_cpu_time_for(thread_cpu_time_id time_id);
|
@@ -22,28 +22,6 @@ void self_test_clock_id(void) {
|
|
22
22
|
if (expected_pthread_id != actual_pthread_id) rb_raise(rb_eRuntimeError, "pthread_id_for() self-test failed");
|
23
23
|
}
|
24
24
|
|
25
|
-
// TODO: Remove this after the OldStack profiler gets removed
|
26
|
-
VALUE clock_id_for(DDTRACE_UNUSED VALUE _self, VALUE thread) {
|
27
|
-
rb_nativethread_id_t thread_id = pthread_id_for(thread);
|
28
|
-
|
29
|
-
clockid_t clock_id;
|
30
|
-
int error = pthread_getcpuclockid(thread_id, &clock_id);
|
31
|
-
|
32
|
-
if (error == 0) {
|
33
|
-
return CLOCKID2NUM(clock_id);
|
34
|
-
} else {
|
35
|
-
switch(error) {
|
36
|
-
// The more specific error messages are based on the pthread_getcpuclockid(3) man page
|
37
|
-
case ENOENT:
|
38
|
-
rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread: Per-thread CPU time clocks are not supported by the system."));
|
39
|
-
case ESRCH:
|
40
|
-
rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread: No thread could be found."));
|
41
|
-
default:
|
42
|
-
rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread"));
|
43
|
-
}
|
44
|
-
}
|
45
|
-
}
|
46
|
-
|
47
25
|
// Safety: This function is assumed never to raise exceptions by callers
|
48
26
|
thread_cpu_time_id thread_cpu_time_id_for(VALUE thread) {
|
49
27
|
rb_nativethread_id_t thread_id = pthread_id_for(thread);
|
@@ -10,7 +10,6 @@
|
|
10
10
|
#include "helpers.h"
|
11
11
|
|
12
12
|
void self_test_clock_id(void) { } // Nothing to check
|
13
|
-
VALUE clock_id_for(DDTRACE_UNUSED VALUE _self, DDTRACE_UNUSED VALUE _thread) { return Qnil; } // Nothing to return
|
14
13
|
|
15
14
|
thread_cpu_time_id thread_cpu_time_id_for(DDTRACE_UNUSED VALUE _thread) {
|
16
15
|
return (thread_cpu_time_id) {.valid = false};
|
@@ -83,6 +83,7 @@ struct cpu_and_wall_time_worker_state {
|
|
83
83
|
bool allocation_counting_enabled;
|
84
84
|
bool no_signals_workaround_enabled;
|
85
85
|
bool dynamic_sampling_rate_enabled;
|
86
|
+
int allocation_sample_every; // Temporarily used for development/testing of allocation profiling
|
86
87
|
VALUE self_instance;
|
87
88
|
VALUE thread_context_collector_instance;
|
88
89
|
VALUE idle_sampling_helper_instance;
|
@@ -150,7 +151,8 @@ static VALUE _native_initialize(
|
|
150
151
|
VALUE idle_sampling_helper_instance,
|
151
152
|
VALUE allocation_counting_enabled,
|
152
153
|
VALUE no_signals_workaround_enabled,
|
153
|
-
VALUE dynamic_sampling_rate_enabled
|
154
|
+
VALUE dynamic_sampling_rate_enabled,
|
155
|
+
VALUE allocation_sample_every
|
154
156
|
);
|
155
157
|
static void cpu_and_wall_time_worker_typed_data_mark(void *state_ptr);
|
156
158
|
static VALUE _native_sampling_loop(VALUE self, VALUE instance);
|
@@ -183,9 +185,10 @@ static void grab_gvl_and_sample(void);
|
|
183
185
|
static void reset_stats(struct cpu_and_wall_time_worker_state *state);
|
184
186
|
static void sleep_for(uint64_t time_ns);
|
185
187
|
static VALUE _native_allocation_count(DDTRACE_UNUSED VALUE self);
|
186
|
-
static void on_newobj_event(
|
188
|
+
static void on_newobj_event(VALUE tracepoint_data, DDTRACE_UNUSED void *unused);
|
187
189
|
static void disable_tracepoints(struct cpu_and_wall_time_worker_state *state);
|
188
190
|
static VALUE _native_with_blocked_sigprof(DDTRACE_UNUSED VALUE self);
|
191
|
+
static VALUE rescued_sample_allocation(VALUE tracepoint_data);
|
189
192
|
|
190
193
|
// Note on sampler global state safety:
|
191
194
|
//
|
@@ -223,7 +226,7 @@ void collectors_cpu_and_wall_time_worker_init(VALUE profiling_module) {
|
|
223
226
|
// https://bugs.ruby-lang.org/issues/18007 for a discussion around this.
|
224
227
|
rb_define_alloc_func(collectors_cpu_and_wall_time_worker_class, _native_new);
|
225
228
|
|
226
|
-
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_initialize", _native_initialize,
|
229
|
+
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_initialize", _native_initialize, 8);
|
227
230
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_sampling_loop", _native_sampling_loop, 1);
|
228
231
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_stop", _native_stop, 2);
|
229
232
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_reset_after_fork", _native_reset_after_fork, 1);
|
@@ -257,10 +260,14 @@ static const rb_data_type_t cpu_and_wall_time_worker_typed_data = {
|
|
257
260
|
static VALUE _native_new(VALUE klass) {
|
258
261
|
struct cpu_and_wall_time_worker_state *state = ruby_xcalloc(1, sizeof(struct cpu_and_wall_time_worker_state));
|
259
262
|
|
263
|
+
// Note: Any exceptions raised from this note until the TypedData_Wrap_Struct call will lead to the state memory
|
264
|
+
// being leaked.
|
265
|
+
|
260
266
|
state->gc_profiling_enabled = false;
|
261
267
|
state->allocation_counting_enabled = false;
|
262
268
|
state->no_signals_workaround_enabled = false;
|
263
269
|
state->dynamic_sampling_rate_enabled = true;
|
270
|
+
state->allocation_sample_every = 0;
|
264
271
|
state->thread_context_collector_instance = Qnil;
|
265
272
|
state->idle_sampling_helper_instance = Qnil;
|
266
273
|
state->owner_thread = Qnil;
|
@@ -287,12 +294,14 @@ static VALUE _native_initialize(
|
|
287
294
|
VALUE idle_sampling_helper_instance,
|
288
295
|
VALUE allocation_counting_enabled,
|
289
296
|
VALUE no_signals_workaround_enabled,
|
290
|
-
VALUE dynamic_sampling_rate_enabled
|
297
|
+
VALUE dynamic_sampling_rate_enabled,
|
298
|
+
VALUE allocation_sample_every
|
291
299
|
) {
|
292
300
|
ENFORCE_BOOLEAN(gc_profiling_enabled);
|
293
301
|
ENFORCE_BOOLEAN(allocation_counting_enabled);
|
294
302
|
ENFORCE_BOOLEAN(no_signals_workaround_enabled);
|
295
303
|
ENFORCE_BOOLEAN(dynamic_sampling_rate_enabled);
|
304
|
+
ENFORCE_TYPE(allocation_sample_every, T_FIXNUM);
|
296
305
|
|
297
306
|
struct cpu_and_wall_time_worker_state *state;
|
298
307
|
TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_worker_state, &cpu_and_wall_time_worker_typed_data, state);
|
@@ -301,6 +310,12 @@ static VALUE _native_initialize(
|
|
301
310
|
state->allocation_counting_enabled = (allocation_counting_enabled == Qtrue);
|
302
311
|
state->no_signals_workaround_enabled = (no_signals_workaround_enabled == Qtrue);
|
303
312
|
state->dynamic_sampling_rate_enabled = (dynamic_sampling_rate_enabled == Qtrue);
|
313
|
+
state->allocation_sample_every = NUM2INT(allocation_sample_every);
|
314
|
+
|
315
|
+
if (state->allocation_sample_every < 0) {
|
316
|
+
rb_raise(rb_eArgError, "Unexpected value for allocation_sample_every: %d. This value must be >= 0.", state->allocation_sample_every);
|
317
|
+
}
|
318
|
+
|
304
319
|
state->thread_context_collector_instance = enforce_thread_context_collector_instance(thread_context_collector_instance);
|
305
320
|
state->idle_sampling_helper_instance = idle_sampling_helper_instance;
|
306
321
|
state->gc_tracepoint = rb_tracepoint_new(Qnil, RUBY_INTERNAL_EVENT_GC_ENTER | RUBY_INTERNAL_EVENT_GC_EXIT, on_gc_event, NULL /* unused */);
|
@@ -880,7 +895,7 @@ static VALUE _native_allocation_count(DDTRACE_UNUSED VALUE self) {
|
|
880
895
|
|
881
896
|
// Implements memory-related profiling events. This function is called by Ruby via the `object_allocation_tracepoint`
|
882
897
|
// when the RUBY_INTERNAL_EVENT_NEWOBJ event is triggered.
|
883
|
-
static void on_newobj_event(
|
898
|
+
static void on_newobj_event(VALUE tracepoint_data, DDTRACE_UNUSED void *unused) {
|
884
899
|
// Update thread-local allocation count
|
885
900
|
if (RB_UNLIKELY(allocation_count == UINT64_MAX)) {
|
886
901
|
allocation_count = 0;
|
@@ -907,7 +922,12 @@ static void on_newobj_event(DDTRACE_UNUSED VALUE tracepoint_data, DDTRACE_UNUSED
|
|
907
922
|
// defined as not being able to allocate) sets this.
|
908
923
|
state->during_sample = true;
|
909
924
|
|
910
|
-
// TODO:
|
925
|
+
// TODO: This is a placeholder sampling decision strategy. We plan to replace it with a better one soon (e.g. before
|
926
|
+
// beta), and having something here allows us to test the rest of feature, sampling decision aside.
|
927
|
+
if (state->allocation_sample_every > 0 && ((allocation_count % state->allocation_sample_every) == 0)) {
|
928
|
+
// Rescue against any exceptions that happen during sampling
|
929
|
+
safely_call(rescued_sample_allocation, tracepoint_data, state->self_instance);
|
930
|
+
}
|
911
931
|
|
912
932
|
state->during_sample = false;
|
913
933
|
}
|
@@ -929,3 +949,18 @@ static VALUE _native_with_blocked_sigprof(DDTRACE_UNUSED VALUE self) {
|
|
929
949
|
return result;
|
930
950
|
}
|
931
951
|
}
|
952
|
+
|
953
|
+
static VALUE rescued_sample_allocation(VALUE tracepoint_data) {
|
954
|
+
struct cpu_and_wall_time_worker_state *state = active_sampler_instance_state; // Read from global variable, see "sampler global state safety" note above
|
955
|
+
|
956
|
+
// This should not happen in a normal situation because on_newobj_event already checked for this, but just in case...
|
957
|
+
if (state == NULL) return Qnil;
|
958
|
+
|
959
|
+
rb_trace_arg_t *data = rb_tracearg_from_tracepoint(tracepoint_data);
|
960
|
+
VALUE new_object = rb_tracearg_object(data);
|
961
|
+
|
962
|
+
thread_context_collector_sample_allocation(state->thread_context_collector_instance, state->allocation_sample_every, new_object);
|
963
|
+
|
964
|
+
// Return a dummy VALUE because we're called from rb_rescue2 which requires it
|
965
|
+
return Qnil;
|
966
|
+
}
|
@@ -78,6 +78,9 @@ static const rb_data_type_t idle_sampling_helper_typed_data = {
|
|
78
78
|
static VALUE _native_new(VALUE klass) {
|
79
79
|
struct idle_sampling_loop_state *state = ruby_xcalloc(1, sizeof(struct idle_sampling_loop_state));
|
80
80
|
|
81
|
+
// Note: Any exceptions raised from this note until the TypedData_Wrap_Struct call will lead to the state memory
|
82
|
+
// being leaked.
|
83
|
+
|
81
84
|
reset_state(state);
|
82
85
|
|
83
86
|
return TypedData_Wrap_Struct(klass, &idle_sampling_helper_typed_data, state);
|