datadog 2.40.0 → 2.42.0
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 +4 -4
- data/CHANGELOG.md +120 -59
- data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +12 -24
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +110 -61
- data/ext/datadog_profiling_native_extension/collectors_stack.c +13 -5
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +141 -103
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +7 -3
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +0 -10
- data/ext/datadog_profiling_native_extension/extconf.rb +52 -93
- data/ext/datadog_profiling_native_extension/heap_recorder.c +338 -255
- data/ext/datadog_profiling_native_extension/heap_recorder.h +46 -31
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -27
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +526 -443
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +15 -3
- data/ext/datadog_profiling_native_extension/profiling.c +2 -0
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -79
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +0 -7
- data/ext/datadog_profiling_native_extension/stack_recorder.c +93 -61
- data/ext/datadog_profiling_native_extension/stack_recorder.h +12 -4
- data/ext/libdatadog_api/datadog_ruby_common.h +0 -10
- data/ext/libdatadog_api/di.c +10 -0
- data/ext/libdatadog_api/extconf.rb +3 -0
- data/ext/libdatadog_api/init.c +2 -0
- data/ext/libdatadog_api/otel_thread_context.c +232 -0
- data/ext/libdatadog_api/otel_thread_context.h +5 -0
- data/ext/libdatadog_api/trace_exporter.c +409 -71
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- data/lib/datadog/ai_guard/api_client.rb +1 -1
- data/lib/datadog/ai_guard/evaluation/request.rb +8 -8
- data/lib/datadog/ai_guard/evaluation.rb +10 -3
- data/lib/datadog/ai_guard/ext.rb +1 -1
- data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +21 -42
- data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
- data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
- data/lib/datadog/appsec/assets/blocked.html +1 -108
- data/lib/datadog/appsec/configuration.rb +2 -2
- data/lib/datadog/appsec/context.rb +1 -1
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +1 -1
- data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +2 -2
- data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +2 -2
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +2 -2
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +2 -2
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +2 -2
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +2 -2
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +2 -2
- data/lib/datadog/appsec/processor/rule_loader.rb +12 -12
- data/lib/datadog/appsec/response.rb +1 -1
- data/lib/datadog/appsec/route_normalizer/route_pattern.rb +3 -3
- data/lib/datadog/appsec/security_engine/engine.rb +3 -3
- data/lib/datadog/core/configuration/components.rb +3 -2
- data/lib/datadog/core/configuration/option_definition.rb +1 -1
- data/lib/datadog/core/configuration/options.rb +1 -1
- data/lib/datadog/core/crashtracking/component.rb +5 -1
- data/lib/datadog/core/diagnostics/environment_logger.rb +36 -1
- data/lib/datadog/core/metrics/helpers.rb +1 -1
- data/lib/datadog/core/metrics/options.rb +2 -2
- data/lib/datadog/core/process_discovery.rb +1 -1
- data/lib/datadog/core/remote/client.rb +1 -1
- data/lib/datadog/core/remote/configuration/repository.rb +2 -2
- data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -1
- data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +1 -1
- data/lib/datadog/core/telemetry/event/app_started.rb +5 -24
- data/lib/datadog/core/telemetry/event/generate_metrics.rb +1 -1
- data/lib/datadog/core/telemetry/event/log.rb +2 -2
- data/lib/datadog/core/telemetry/metric.rb +2 -2
- data/lib/datadog/core/telemetry/request.rb +2 -2
- data/lib/datadog/core/transport/http.rb +1 -1
- data/lib/datadog/core/transport/transport.rb +1 -1
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +127 -43
- data/lib/datadog/data_streams/pathway_context.rb +20 -22
- data/lib/datadog/data_streams/processor.rb +45 -14
- data/lib/datadog/di/el/compiler.rb +23 -0
- data/lib/datadog/di/el/expression.rb +8 -5
- data/lib/datadog/di/instrumenter.rb +46 -5
- data/lib/datadog/di/logger.rb +2 -2
- data/lib/datadog/di/probe.rb +9 -1
- data/lib/datadog/di/probe_builder.rb +5 -4
- data/lib/datadog/di/probe_notification_builder.rb +3 -2
- data/lib/datadog/di/remote.rb +3 -3
- data/lib/datadog/di/serializer.rb +29 -4
- data/lib/datadog/error_tracking/component.rb +1 -1
- data/lib/datadog/kit/appsec/events/v2.rb +2 -2
- data/lib/datadog/open_feature/evaluation_engine.rb +29 -3
- data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
- data/lib/datadog/open_feature/exposures/event.rb +15 -8
- data/lib/datadog/open_feature/ext.rb +19 -0
- data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +236 -80
- data/lib/datadog/open_feature/flag_evaluation/writer.rb +179 -68
- data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +24 -21
- data/lib/datadog/open_feature/native_evaluator.rb +33 -6
- data/lib/datadog/open_feature/noop_evaluator.rb +5 -0
- data/lib/datadog/open_feature/provider.rb +11 -2
- data/lib/datadog/opentelemetry/sdk/propagator.rb +1 -1
- data/lib/datadog/opentelemetry/trace.rb +3 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +3 -0
- data/lib/datadog/profiling/collectors/info.rb +1 -1
- data/lib/datadog/profiling/collectors/thread_context.rb +0 -4
- data/lib/datadog/profiling/component.rb +8 -16
- data/lib/datadog/profiling/tasks/exec.rb +1 -1
- data/lib/datadog/symbol_database/extractor.rb +6 -6
- data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
- data/lib/datadog/tracing/configuration/dynamic.rb +5 -3
- data/lib/datadog/tracing/contrib/action_cable/events.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/events.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -0
- data/lib/datadog/tracing/contrib/active_record/events.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/services.rb +1 -1
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/ext.rb +3 -3
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events.rb +1 -1
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/patchable.rb +1 -1
- data/lib/datadog/tracing/contrib/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/quantize.rb +36 -2
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +9 -3
- data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
- data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +1 -1
- data/lib/datadog/tracing/correlation.rb +2 -2
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +2 -2
- data/lib/datadog/tracing/distributed/baggage.rb +1 -3
- data/lib/datadog/tracing/distributed/datadog.rb +3 -3
- data/lib/datadog/tracing/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +14 -271
- data/lib/datadog/tracing/distributed/trace_state/datadog.rb +233 -0
- data/lib/datadog/tracing/distributed/trace_state/ext.rb +44 -0
- data/lib/datadog/tracing/distributed/trace_state/open_telemetry.rb +156 -0
- data/lib/datadog/tracing/distributed/trace_state.rb +121 -0
- data/lib/datadog/tracing/metadata/tagging.rb +1 -1
- data/lib/datadog/tracing/otel_thread_context.rb +30 -0
- data/lib/datadog/tracing/remote.rb +197 -29
- data/lib/datadog/tracing/sampling/rule_sampler.rb +2 -0
- data/lib/datadog/tracing/span.rb +1 -1
- data/lib/datadog/tracing/span_operation.rb +1 -1
- data/lib/datadog/tracing/trace_digest.rb +22 -4
- data/lib/datadog/tracing/trace_operation.rb +22 -10
- data/lib/datadog/tracing/tracer.rb +5 -5
- data/lib/datadog/tracing/transport/io/traces.rb +1 -1
- data/lib/datadog/tracing/transport/native.rb +78 -54
- data/lib/datadog/tracing/writer.rb +1 -1
- data/lib/datadog/version.rb +1 -1
- metadata +15 -8
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -69
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
#include <ruby.h>
|
|
2
|
+
#include <ruby/thread.h>
|
|
3
|
+
|
|
4
|
+
#include "datadog_ruby_common.h"
|
|
5
|
+
#include "otel_thread_context.h"
|
|
6
|
+
|
|
7
|
+
#ifdef __linux__
|
|
8
|
+
#include <datadog/otel-thread-ctx.h>
|
|
9
|
+
extern __thread const uint8_t *otel_thread_ctx_v1;
|
|
10
|
+
|
|
11
|
+
static void otel_ctx_handle_free(void *handle) {
|
|
12
|
+
ddog_otel_thread_ctx_free((ddog_ThreadContextHandle *) handle);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
static const rb_data_type_t otel_ctx_handle_t = {
|
|
16
|
+
.wrap_struct_name = "Datadog::Tracing::OTelThreadContext handle",
|
|
17
|
+
.function = {.dfree = otel_ctx_handle_free},
|
|
18
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
|
19
|
+
};
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
static ID fiber_context_slot;
|
|
23
|
+
|
|
24
|
+
DDTRACE_UNUSED static bool otel_context_enabled = false;
|
|
25
|
+
|
|
26
|
+
static VALUE native_set(VALUE _self, VALUE trace_id, VALUE span_id, VALUE local_root_span_id);
|
|
27
|
+
static VALUE native_supported_p(VALUE _self);
|
|
28
|
+
static VALUE native_enable(VALUE _self);
|
|
29
|
+
static VALUE native_read(VALUE _self);
|
|
30
|
+
|
|
31
|
+
void otel_thread_context_init(VALUE tracing_module) {
|
|
32
|
+
fiber_context_slot = rb_intern("__dd_otel_fiber_context");
|
|
33
|
+
|
|
34
|
+
VALUE otel_thread_context_module = rb_define_module_under(tracing_module, "OTelThreadContext");
|
|
35
|
+
|
|
36
|
+
rb_define_singleton_method(otel_thread_context_module, "_native_enable", native_enable, 0);
|
|
37
|
+
rb_define_singleton_method(otel_thread_context_module, "_native_set", native_set, 3);
|
|
38
|
+
rb_define_singleton_method(otel_thread_context_module, "_native_supported?", native_supported_p, 0);
|
|
39
|
+
|
|
40
|
+
VALUE testing_module = rb_define_module_under(otel_thread_context_module, "Testing");
|
|
41
|
+
rb_define_singleton_method(testing_module, "_native_read", native_read, 0);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
#ifdef __linux__
|
|
45
|
+
static ddog_ThreadContextHandle *get_fiber_handle_for(VALUE thread) {
|
|
46
|
+
VALUE obj = rb_thread_local_aref(thread, fiber_context_slot);
|
|
47
|
+
|
|
48
|
+
if (!rb_typeddata_is_kind_of(obj, &otel_ctx_handle_t)) return NULL;
|
|
49
|
+
|
|
50
|
+
return RTYPEDDATA_DATA(obj);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static ddog_ThreadContextHandle *get_current_fiber_handle(void) {
|
|
54
|
+
return get_fiber_handle_for(rb_thread_current());
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
static void store_current_fiber_handle(ddog_ThreadContextHandle *handle) {
|
|
58
|
+
VALUE obj = TypedData_Wrap_Struct(rb_cObject, &otel_ctx_handle_t, handle);
|
|
59
|
+
rb_thread_local_aset(rb_thread_current(), fiber_context_slot, obj);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
#ifdef RUBY_INTERNAL_THREAD_EVENT_EXITED
|
|
63
|
+
static void on_thread_exited(
|
|
64
|
+
DDTRACE_UNUSED rb_event_flag_t event,
|
|
65
|
+
DDTRACE_UNUSED const rb_internal_thread_event_data_t *event_data,
|
|
66
|
+
DDTRACE_UNUSED void *user_data
|
|
67
|
+
) {
|
|
68
|
+
ddog_otel_thread_ctx_detach();
|
|
69
|
+
}
|
|
70
|
+
#else
|
|
71
|
+
static void on_thread_end(
|
|
72
|
+
DDTRACE_UNUSED rb_event_flag_t evflag,
|
|
73
|
+
DDTRACE_UNUSED VALUE data,
|
|
74
|
+
DDTRACE_UNUSED VALUE self,
|
|
75
|
+
DDTRACE_UNUSED ID mid,
|
|
76
|
+
DDTRACE_UNUSED VALUE klass
|
|
77
|
+
) {
|
|
78
|
+
ddog_otel_thread_ctx_detach();
|
|
79
|
+
}
|
|
80
|
+
#endif
|
|
81
|
+
|
|
82
|
+
#ifdef HAVE_RUBY_THREAD_STORAGE_API
|
|
83
|
+
// This function is declared in internal/thread.h.
|
|
84
|
+
// It returns 0 when the current thread sits in a blocking region.
|
|
85
|
+
int ruby_thread_has_gvl_p(void);
|
|
86
|
+
|
|
87
|
+
static bool in_blocking_region(void) {
|
|
88
|
+
#ifdef HAVE_RUBY_THREAD_HAS_GVL_P
|
|
89
|
+
return ruby_thread_has_gvl_p() == 0;
|
|
90
|
+
#else
|
|
91
|
+
return false;
|
|
92
|
+
#endif
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Under M:N a Ruby thread can migrate between native threads,
|
|
96
|
+
// so we need to detach the context when the Ruby thread gets suspended.
|
|
97
|
+
static void on_thread_suspended(
|
|
98
|
+
DDTRACE_UNUSED rb_event_flag_t event,
|
|
99
|
+
DDTRACE_UNUSED const rb_internal_thread_event_data_t *event_data,
|
|
100
|
+
DDTRACE_UNUSED void *user_data
|
|
101
|
+
) {
|
|
102
|
+
// Ruby pins threads that release GVL to call into a native extension,
|
|
103
|
+
// so we know the thread will not migrate.
|
|
104
|
+
if (in_blocking_region()) return;
|
|
105
|
+
|
|
106
|
+
ddog_otel_thread_ctx_detach();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
static void on_thread_resumed(
|
|
110
|
+
DDTRACE_UNUSED rb_event_flag_t event,
|
|
111
|
+
const rb_internal_thread_event_data_t *event_data,
|
|
112
|
+
DDTRACE_UNUSED void *user_data
|
|
113
|
+
) {
|
|
114
|
+
ddog_ThreadContextHandle *handle = get_fiber_handle_for(event_data->thread);
|
|
115
|
+
|
|
116
|
+
if (handle != NULL) ddog_otel_thread_ctx_attach(handle);
|
|
117
|
+
}
|
|
118
|
+
#endif
|
|
119
|
+
|
|
120
|
+
static void on_fiber_switch(
|
|
121
|
+
DDTRACE_UNUSED rb_event_flag_t evflag,
|
|
122
|
+
DDTRACE_UNUSED VALUE data,
|
|
123
|
+
DDTRACE_UNUSED VALUE self,
|
|
124
|
+
DDTRACE_UNUSED ID mid,
|
|
125
|
+
DDTRACE_UNUSED VALUE klass
|
|
126
|
+
) {
|
|
127
|
+
ddog_ThreadContextHandle *handle = get_current_fiber_handle();
|
|
128
|
+
|
|
129
|
+
if (handle != NULL) {
|
|
130
|
+
ddog_otel_thread_ctx_attach(handle);
|
|
131
|
+
} else {
|
|
132
|
+
ddog_otel_thread_ctx_detach();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
#endif
|
|
136
|
+
|
|
137
|
+
static VALUE native_enable(DDTRACE_UNUSED VALUE _self) {
|
|
138
|
+
#ifdef __linux__
|
|
139
|
+
if (otel_context_enabled) return Qtrue;
|
|
140
|
+
otel_context_enabled = true;
|
|
141
|
+
|
|
142
|
+
#ifdef RUBY_INTERNAL_THREAD_EVENT_EXITED
|
|
143
|
+
rb_internal_thread_add_event_hook(on_thread_exited, RUBY_INTERNAL_THREAD_EVENT_EXITED, NULL);
|
|
144
|
+
#else
|
|
145
|
+
rb_add_event_hook(on_thread_end, RUBY_EVENT_THREAD_END, Qnil);
|
|
146
|
+
#endif
|
|
147
|
+
|
|
148
|
+
// These hooks only matter under the M:N thread scheduler (Ruby 3.3+),
|
|
149
|
+
// where a Ruby thread can migrate between native threads.
|
|
150
|
+
#ifdef HAVE_RUBY_THREAD_STORAGE_API
|
|
151
|
+
rb_internal_thread_add_event_hook(on_thread_suspended, RUBY_INTERNAL_THREAD_EVENT_SUSPENDED, NULL);
|
|
152
|
+
rb_internal_thread_add_event_hook(on_thread_resumed, RUBY_INTERNAL_THREAD_EVENT_RESUMED, NULL);
|
|
153
|
+
#endif
|
|
154
|
+
|
|
155
|
+
rb_add_event_hook(on_fiber_switch, RUBY_EVENT_FIBER_SWITCH, Qnil);
|
|
156
|
+
|
|
157
|
+
return Qtrue;
|
|
158
|
+
#else
|
|
159
|
+
return Qfalse;
|
|
160
|
+
#endif
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
static VALUE native_supported_p(DDTRACE_UNUSED VALUE _self) {
|
|
164
|
+
#ifdef __linux__
|
|
165
|
+
return Qtrue;
|
|
166
|
+
#else
|
|
167
|
+
return Qfalse;
|
|
168
|
+
#endif
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
static VALUE native_set(
|
|
172
|
+
DDTRACE_UNUSED VALUE _self,
|
|
173
|
+
DDTRACE_UNUSED VALUE trace_id,
|
|
174
|
+
DDTRACE_UNUSED VALUE span_id,
|
|
175
|
+
DDTRACE_UNUSED VALUE local_root_span_id
|
|
176
|
+
) {
|
|
177
|
+
#ifdef __linux__
|
|
178
|
+
if (!otel_context_enabled) return Qfalse;
|
|
179
|
+
|
|
180
|
+
uint8_t trace_id_bytes[16];
|
|
181
|
+
uint8_t span_id_bytes[8];
|
|
182
|
+
uint8_t local_root_span_id_bytes[8];
|
|
183
|
+
|
|
184
|
+
const int BIG_ENDIAN_PACK_FLAGS = INTEGER_PACK_MSWORD_FIRST | INTEGER_PACK_BIG_ENDIAN;
|
|
185
|
+
rb_integer_pack(trace_id, trace_id_bytes, sizeof(trace_id_bytes), 1, 0, BIG_ENDIAN_PACK_FLAGS);
|
|
186
|
+
rb_integer_pack(span_id, span_id_bytes, sizeof(span_id_bytes), 1, 0, BIG_ENDIAN_PACK_FLAGS);
|
|
187
|
+
rb_integer_pack(local_root_span_id, local_root_span_id_bytes, sizeof(local_root_span_id_bytes), 1, 0, BIG_ENDIAN_PACK_FLAGS);
|
|
188
|
+
|
|
189
|
+
ddog_ThreadContextHandle *handle = get_current_fiber_handle();
|
|
190
|
+
|
|
191
|
+
if (handle == NULL) {
|
|
192
|
+
handle = ddog_otel_thread_ctx_new(&trace_id_bytes, &span_id_bytes, 0, &local_root_span_id_bytes);
|
|
193
|
+
store_current_fiber_handle(handle);
|
|
194
|
+
ddog_otel_thread_ctx_attach(handle);
|
|
195
|
+
} else {
|
|
196
|
+
// FIXME: add a method to libdatadog to update the context record before attaching it
|
|
197
|
+
ddog_otel_thread_ctx_attach(handle);
|
|
198
|
+
ddog_otel_thread_ctx_update(&trace_id_bytes, &span_id_bytes, 0, &local_root_span_id_bytes);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return Qtrue;
|
|
202
|
+
#else
|
|
203
|
+
return Qfalse;
|
|
204
|
+
#endif
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
static VALUE native_read(DDTRACE_UNUSED VALUE _self) {
|
|
208
|
+
#ifdef __linux__
|
|
209
|
+
const uint8_t *raw = otel_thread_ctx_v1;
|
|
210
|
+
if (!raw) return Qnil;
|
|
211
|
+
|
|
212
|
+
uint16_t attrs_data_size = (uint16_t) raw[26] | ((uint16_t) raw[27] << 8);
|
|
213
|
+
|
|
214
|
+
if (attrs_data_size > ddog_MAX_ATTRS_DATA_SIZE) {
|
|
215
|
+
raise_error(
|
|
216
|
+
rb_eRuntimeError,
|
|
217
|
+
"Invalid OTel thread context record: attrs_data_size (%d) exceeds maximum (%d)",
|
|
218
|
+
attrs_data_size, ddog_MAX_ATTRS_DATA_SIZE
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
VALUE result = rb_hash_new();
|
|
223
|
+
rb_hash_aset(result, ID2SYM(rb_intern("trace_id")), rb_str_new((const char *) raw, 16));
|
|
224
|
+
rb_hash_aset(result, ID2SYM(rb_intern("span_id")), rb_str_new((const char *) (raw + 16), 8));
|
|
225
|
+
rb_hash_aset(result, ID2SYM(rb_intern("valid")), rb_str_new((const char *) (raw + 24), 1));
|
|
226
|
+
rb_hash_aset(result, ID2SYM(rb_intern("attrs")), rb_str_new((const char *) (raw + 28), attrs_data_size));
|
|
227
|
+
|
|
228
|
+
return result;
|
|
229
|
+
#else
|
|
230
|
+
return Qnil;
|
|
231
|
+
#endif
|
|
232
|
+
}
|