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.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +120 -59
  3. data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +12 -24
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +110 -61
  5. data/ext/datadog_profiling_native_extension/collectors_stack.c +13 -5
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +141 -103
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +7 -3
  8. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +0 -10
  9. data/ext/datadog_profiling_native_extension/extconf.rb +52 -93
  10. data/ext/datadog_profiling_native_extension/heap_recorder.c +338 -255
  11. data/ext/datadog_profiling_native_extension/heap_recorder.h +46 -31
  12. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -27
  13. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +526 -443
  14. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +15 -3
  15. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  16. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -79
  17. data/ext/datadog_profiling_native_extension/ruby_helpers.h +0 -7
  18. data/ext/datadog_profiling_native_extension/stack_recorder.c +93 -61
  19. data/ext/datadog_profiling_native_extension/stack_recorder.h +12 -4
  20. data/ext/libdatadog_api/datadog_ruby_common.h +0 -10
  21. data/ext/libdatadog_api/di.c +10 -0
  22. data/ext/libdatadog_api/extconf.rb +3 -0
  23. data/ext/libdatadog_api/init.c +2 -0
  24. data/ext/libdatadog_api/otel_thread_context.c +232 -0
  25. data/ext/libdatadog_api/otel_thread_context.h +5 -0
  26. data/ext/libdatadog_api/trace_exporter.c +409 -71
  27. data/ext/libdatadog_extconf_helpers.rb +1 -1
  28. data/lib/datadog/ai_guard/api_client.rb +1 -1
  29. data/lib/datadog/ai_guard/evaluation/request.rb +8 -8
  30. data/lib/datadog/ai_guard/evaluation.rb +10 -3
  31. data/lib/datadog/ai_guard/ext.rb +1 -1
  32. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +21 -42
  33. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
  34. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
  35. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
  36. data/lib/datadog/appsec/assets/blocked.html +1 -108
  37. data/lib/datadog/appsec/configuration.rb +2 -2
  38. data/lib/datadog/appsec/context.rb +1 -1
  39. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +1 -1
  40. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +2 -2
  41. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  42. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +2 -2
  43. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +2 -2
  44. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  45. data/lib/datadog/appsec/contrib/rack/ext.rb +2 -2
  46. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +2 -2
  47. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +2 -2
  48. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
  49. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +2 -2
  50. data/lib/datadog/appsec/processor/rule_loader.rb +12 -12
  51. data/lib/datadog/appsec/response.rb +1 -1
  52. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +3 -3
  53. data/lib/datadog/appsec/security_engine/engine.rb +3 -3
  54. data/lib/datadog/core/configuration/components.rb +3 -2
  55. data/lib/datadog/core/configuration/option_definition.rb +1 -1
  56. data/lib/datadog/core/configuration/options.rb +1 -1
  57. data/lib/datadog/core/crashtracking/component.rb +5 -1
  58. data/lib/datadog/core/diagnostics/environment_logger.rb +36 -1
  59. data/lib/datadog/core/metrics/helpers.rb +1 -1
  60. data/lib/datadog/core/metrics/options.rb +2 -2
  61. data/lib/datadog/core/process_discovery.rb +1 -1
  62. data/lib/datadog/core/remote/client.rb +1 -1
  63. data/lib/datadog/core/remote/configuration/repository.rb +2 -2
  64. data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
  65. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -1
  66. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +1 -1
  67. data/lib/datadog/core/telemetry/event/app_started.rb +5 -24
  68. data/lib/datadog/core/telemetry/event/generate_metrics.rb +1 -1
  69. data/lib/datadog/core/telemetry/event/log.rb +2 -2
  70. data/lib/datadog/core/telemetry/metric.rb +2 -2
  71. data/lib/datadog/core/telemetry/request.rb +2 -2
  72. data/lib/datadog/core/transport/http.rb +1 -1
  73. data/lib/datadog/core/transport/transport.rb +1 -1
  74. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +127 -43
  75. data/lib/datadog/data_streams/pathway_context.rb +20 -22
  76. data/lib/datadog/data_streams/processor.rb +45 -14
  77. data/lib/datadog/di/el/compiler.rb +23 -0
  78. data/lib/datadog/di/el/expression.rb +8 -5
  79. data/lib/datadog/di/instrumenter.rb +46 -5
  80. data/lib/datadog/di/logger.rb +2 -2
  81. data/lib/datadog/di/probe.rb +9 -1
  82. data/lib/datadog/di/probe_builder.rb +5 -4
  83. data/lib/datadog/di/probe_notification_builder.rb +3 -2
  84. data/lib/datadog/di/remote.rb +3 -3
  85. data/lib/datadog/di/serializer.rb +29 -4
  86. data/lib/datadog/error_tracking/component.rb +1 -1
  87. data/lib/datadog/kit/appsec/events/v2.rb +2 -2
  88. data/lib/datadog/open_feature/evaluation_engine.rb +29 -3
  89. data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
  90. data/lib/datadog/open_feature/exposures/event.rb +15 -8
  91. data/lib/datadog/open_feature/ext.rb +19 -0
  92. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +236 -80
  93. data/lib/datadog/open_feature/flag_evaluation/writer.rb +179 -68
  94. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +24 -21
  95. data/lib/datadog/open_feature/native_evaluator.rb +33 -6
  96. data/lib/datadog/open_feature/noop_evaluator.rb +5 -0
  97. data/lib/datadog/open_feature/provider.rb +11 -2
  98. data/lib/datadog/opentelemetry/sdk/propagator.rb +1 -1
  99. data/lib/datadog/opentelemetry/trace.rb +3 -0
  100. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +3 -0
  101. data/lib/datadog/profiling/collectors/info.rb +1 -1
  102. data/lib/datadog/profiling/collectors/thread_context.rb +0 -4
  103. data/lib/datadog/profiling/component.rb +8 -16
  104. data/lib/datadog/profiling/tasks/exec.rb +1 -1
  105. data/lib/datadog/symbol_database/extractor.rb +6 -6
  106. data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
  107. data/lib/datadog/tracing/configuration/dynamic.rb +5 -3
  108. data/lib/datadog/tracing/contrib/action_cable/events.rb +1 -1
  109. data/lib/datadog/tracing/contrib/action_mailer/events.rb +1 -1
  110. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
  111. data/lib/datadog/tracing/contrib/action_view/events.rb +1 -1
  112. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +1 -1
  113. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  114. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -0
  115. data/lib/datadog/tracing/contrib/active_record/events.rb +1 -1
  116. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -2
  117. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  118. data/lib/datadog/tracing/contrib/aws/services.rb +1 -1
  119. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  120. data/lib/datadog/tracing/contrib/ext.rb +3 -3
  121. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -1
  122. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -1
  123. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +1 -1
  124. data/lib/datadog/tracing/contrib/kafka/events.rb +1 -1
  125. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +1 -1
  126. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  127. data/lib/datadog/tracing/contrib/opensearch/ext.rb +1 -1
  128. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +1 -1
  129. data/lib/datadog/tracing/contrib/patchable.rb +1 -1
  130. data/lib/datadog/tracing/contrib/patcher.rb +1 -1
  131. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  132. data/lib/datadog/tracing/contrib/racecar/events.rb +1 -1
  133. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +1 -1
  134. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +1 -1
  135. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  136. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +1 -1
  137. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  138. data/lib/datadog/tracing/contrib/redis/quantize.rb +36 -2
  139. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +9 -3
  140. data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
  141. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +1 -1
  142. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +1 -1
  143. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
  144. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
  145. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +1 -1
  146. data/lib/datadog/tracing/correlation.rb +2 -2
  147. data/lib/datadog/tracing/diagnostics/environment_logger.rb +2 -2
  148. data/lib/datadog/tracing/distributed/baggage.rb +1 -3
  149. data/lib/datadog/tracing/distributed/datadog.rb +3 -3
  150. data/lib/datadog/tracing/distributed/propagation.rb +3 -0
  151. data/lib/datadog/tracing/distributed/trace_context.rb +14 -271
  152. data/lib/datadog/tracing/distributed/trace_state/datadog.rb +233 -0
  153. data/lib/datadog/tracing/distributed/trace_state/ext.rb +44 -0
  154. data/lib/datadog/tracing/distributed/trace_state/open_telemetry.rb +156 -0
  155. data/lib/datadog/tracing/distributed/trace_state.rb +121 -0
  156. data/lib/datadog/tracing/metadata/tagging.rb +1 -1
  157. data/lib/datadog/tracing/otel_thread_context.rb +30 -0
  158. data/lib/datadog/tracing/remote.rb +197 -29
  159. data/lib/datadog/tracing/sampling/rule_sampler.rb +2 -0
  160. data/lib/datadog/tracing/span.rb +1 -1
  161. data/lib/datadog/tracing/span_operation.rb +1 -1
  162. data/lib/datadog/tracing/trace_digest.rb +22 -4
  163. data/lib/datadog/tracing/trace_operation.rb +22 -10
  164. data/lib/datadog/tracing/tracer.rb +5 -5
  165. data/lib/datadog/tracing/transport/io/traces.rb +1 -1
  166. data/lib/datadog/tracing/transport/native.rb +78 -54
  167. data/lib/datadog/tracing/writer.rb +1 -1
  168. data/lib/datadog/version.rb +1 -1
  169. metadata +15 -8
  170. 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
+ }
@@ -0,0 +1,5 @@
1
+ #pragma once
2
+
3
+ #include <ruby.h>
4
+
5
+ void otel_thread_context_init(VALUE tracing_module);