datadog 2.2.0 → 2.3.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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -2
  3. data/ext/datadog_profiling_loader/extconf.rb +15 -15
  4. data/ext/datadog_profiling_native_extension/clock_id.h +1 -0
  5. data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +1 -2
  6. data/ext/datadog_profiling_native_extension/clock_id_noop.c +1 -2
  7. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +113 -43
  8. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +49 -26
  9. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +34 -4
  10. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +4 -0
  11. data/ext/datadog_profiling_native_extension/collectors_stack.c +49 -37
  12. data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -2
  13. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +81 -19
  14. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  15. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +110 -0
  16. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +57 -0
  17. data/ext/datadog_profiling_native_extension/extconf.rb +65 -60
  18. data/ext/datadog_profiling_native_extension/heap_recorder.c +34 -6
  19. data/ext/datadog_profiling_native_extension/heap_recorder.h +3 -1
  20. data/ext/datadog_profiling_native_extension/helpers.h +6 -17
  21. data/ext/datadog_profiling_native_extension/http_transport.c +3 -3
  22. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +0 -86
  23. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +2 -23
  24. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +61 -172
  25. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +64 -138
  26. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +17 -11
  27. data/ext/datadog_profiling_native_extension/profiling.c +0 -2
  28. data/ext/datadog_profiling_native_extension/ruby_helpers.c +0 -33
  29. data/ext/datadog_profiling_native_extension/ruby_helpers.h +1 -26
  30. data/ext/datadog_profiling_native_extension/setup_signal_handler.h +1 -0
  31. data/ext/datadog_profiling_native_extension/stack_recorder.c +14 -2
  32. data/ext/datadog_profiling_native_extension/stack_recorder.h +1 -0
  33. data/ext/datadog_profiling_native_extension/time_helpers.c +0 -15
  34. data/ext/datadog_profiling_native_extension/time_helpers.h +36 -6
  35. data/ext/{datadog_profiling_native_extension → libdatadog_api}/crashtracker.c +19 -6
  36. data/ext/libdatadog_api/datadog_ruby_common.c +110 -0
  37. data/ext/libdatadog_api/datadog_ruby_common.h +57 -0
  38. data/ext/libdatadog_api/extconf.rb +108 -0
  39. data/ext/libdatadog_api/macos_development.md +26 -0
  40. data/ext/libdatadog_extconf_helpers.rb +130 -0
  41. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +49 -0
  42. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +73 -0
  43. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +68 -0
  44. data/lib/datadog/appsec/contrib/graphql/integration.rb +41 -0
  45. data/lib/datadog/appsec/contrib/graphql/patcher.rb +37 -0
  46. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +59 -0
  47. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +1 -1
  48. data/lib/datadog/appsec/processor/actions.rb +1 -1
  49. data/lib/datadog/appsec/response.rb +15 -1
  50. data/lib/datadog/appsec.rb +1 -0
  51. data/lib/datadog/core/configuration/components.rb +14 -12
  52. data/lib/datadog/core/configuration/settings.rb +54 -7
  53. data/lib/datadog/core/crashtracking/agent_base_url.rb +21 -0
  54. data/lib/datadog/core/crashtracking/component.rb +111 -0
  55. data/lib/datadog/core/crashtracking/tag_builder.rb +39 -0
  56. data/lib/datadog/core/diagnostics/environment_logger.rb +8 -11
  57. data/lib/datadog/core/telemetry/component.rb +49 -2
  58. data/lib/datadog/core/telemetry/emitter.rb +9 -11
  59. data/lib/datadog/core/telemetry/event.rb +32 -1
  60. data/lib/datadog/core/telemetry/ext.rb +1 -0
  61. data/lib/datadog/core/telemetry/http/adapters/net.rb +10 -12
  62. data/lib/datadog/core/telemetry/http/ext.rb +3 -0
  63. data/lib/datadog/core/telemetry/http/transport.rb +38 -9
  64. data/lib/datadog/core/telemetry/logging.rb +35 -0
  65. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +102 -0
  66. data/lib/datadog/kit/appsec/events.rb +2 -4
  67. data/lib/datadog/opentelemetry/sdk/span_processor.rb +10 -0
  68. data/lib/datadog/opentelemetry/sdk/trace/span.rb +23 -0
  69. data/lib/datadog/profiling/collectors/code_provenance.rb +7 -7
  70. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +17 -17
  71. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +11 -13
  72. data/lib/datadog/profiling/collectors/info.rb +3 -3
  73. data/lib/datadog/profiling/collectors/thread_context.rb +4 -2
  74. data/lib/datadog/profiling/component.rb +69 -91
  75. data/lib/datadog/profiling/exporter.rb +3 -3
  76. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +3 -3
  77. data/lib/datadog/profiling/ext.rb +21 -21
  78. data/lib/datadog/profiling/flush.rb +1 -1
  79. data/lib/datadog/profiling/http_transport.rb +8 -6
  80. data/lib/datadog/profiling/load_native_extension.rb +5 -5
  81. data/lib/datadog/profiling/preload.rb +1 -1
  82. data/lib/datadog/profiling/profiler.rb +5 -8
  83. data/lib/datadog/profiling/scheduler.rb +31 -25
  84. data/lib/datadog/profiling/tag_builder.rb +2 -2
  85. data/lib/datadog/profiling/tasks/exec.rb +5 -5
  86. data/lib/datadog/profiling/tasks/setup.rb +16 -35
  87. data/lib/datadog/profiling.rb +4 -5
  88. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -0
  89. data/lib/datadog/tracing/contrib/ext.rb +14 -0
  90. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +1 -1
  91. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +4 -1
  92. data/lib/datadog/tracing/contrib/lograge/patcher.rb +16 -0
  93. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +5 -0
  94. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +17 -13
  95. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +5 -0
  96. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +4 -1
  97. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +28 -0
  98. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +5 -1
  99. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +22 -10
  100. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +5 -0
  101. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -1
  102. data/lib/datadog/tracing/diagnostics/environment_logger.rb +14 -16
  103. data/lib/datadog/tracing/metadata/errors.rb +9 -1
  104. data/lib/datadog/tracing/metadata/ext.rb +4 -0
  105. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
  106. data/lib/datadog/tracing/span.rb +9 -2
  107. data/lib/datadog/tracing/span_event.rb +41 -0
  108. data/lib/datadog/tracing/span_operation.rb +6 -2
  109. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -0
  110. data/lib/datadog/version.rb +1 -1
  111. metadata +28 -10
  112. data/lib/datadog/profiling/crashtracker.rb +0 -91
  113. data/lib/datadog/profiling/ext/forking.rb +0 -98
@@ -52,6 +52,11 @@ module Datadog
52
52
  o.default Contrib::Propagation::SqlComment::Ext::DISABLED
53
53
  end
54
54
 
55
+ option :append_comment do |o|
56
+ o.type :bool
57
+ o.default false
58
+ end
59
+
55
60
  option :peer_service do |o|
56
61
  o.type :string, nilable: true
57
62
  o.env Ext::ENV_PEER_SERVICE
@@ -114,7 +114,10 @@ module Datadog
114
114
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
115
115
 
116
116
  if sql
117
- propagation_mode = Contrib::Propagation::SqlComment::Mode.new(comment_propagation)
117
+ propagation_mode = Contrib::Propagation::SqlComment::Mode.new(
118
+ comment_propagation,
119
+ datadog_configuration[:append_comment]
120
+ )
118
121
  Contrib::Propagation::SqlComment.annotate!(span, propagation_mode)
119
122
  propagated_sql_statement = Contrib::Propagation::SqlComment.prepend_comment(
120
123
  sql,
@@ -20,10 +20,38 @@ module Datadog
20
20
  # The value should be `true` when `full` mode
21
21
  TAG_DBM_TRACE_INJECTED = '_dd.dbm_trace_injected'
22
22
 
23
+ # Database service/sql span service (i.e. the service executing the actual query)
24
+ #
25
+ # If fake services are disabled:
26
+ # This value will be the same as the parent service
27
+ #
28
+ # If fake services are enabled:
29
+ # This value is NOT the same as the parent service
30
+ #
31
+ # This should NOT be overridden by peer.service.
23
32
  KEY_DATABASE_SERVICE = 'dddbs'
33
+
34
+ # The global service environment (e.g. DD_ENV)
24
35
  KEY_ENVIRONMENT = 'dde'
36
+
37
+ # The global service name (e.g. DD_SERVICE)
25
38
  KEY_PARENT_SERVICE = 'ddps'
39
+
40
+ # The global service version (e.g. DD_VERSION)
26
41
  KEY_VERSION = 'ddpv'
42
+
43
+ # The hostname of the database server, as provided to the database client upon instantiation.
44
+ # @see Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME
45
+ KEY_HOSTNAME = 'ddh'
46
+
47
+ # @see Datadog::Tracing::Contrib::Ext::DB::TAG_INSTANCE
48
+ KEY_DB_NAME = 'dddb'
49
+
50
+ # Users can use this attribute to specify the identity of the dependency/database they are connecting to.
51
+ # We should grab this attribute only if the user is EXPLICITLY specifying it.
52
+ # @see Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE
53
+ KEY_PEER_SERVICE = 'ddprs'
54
+
27
55
  KEY_TRACEPARENT = 'traceparent'
28
56
  end
29
57
  end
@@ -8,7 +8,7 @@ module Datadog
8
8
  module Propagation
9
9
  # Implements sql comment propagation related contracts.
10
10
  module SqlComment
11
- Mode = Struct.new(:mode) do
11
+ Mode = Struct.new(:mode, :append) do
12
12
  def enabled?
13
13
  service? || full?
14
14
  end
@@ -20,6 +20,10 @@ module Datadog
20
20
  def full?
21
21
  mode == Ext::FULL
22
22
  end
23
+
24
+ def append?
25
+ append
26
+ end
23
27
  end
24
28
  end
25
29
  end
@@ -22,16 +22,28 @@ module Datadog
22
22
  def self.prepend_comment(sql, span_op, trace_op, mode)
23
23
  return sql unless mode.enabled?
24
24
 
25
+ config = Datadog.configuration
26
+
27
+ parent_service = config.service
28
+ peer_service = span_op.get_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE)
29
+
25
30
  tags = {
26
- Ext::KEY_DATABASE_SERVICE => span_op.get_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE) || span_op.service,
27
- Ext::KEY_ENVIRONMENT => datadog_configuration.env,
28
- Ext::KEY_PARENT_SERVICE => datadog_configuration.service,
29
- Ext::KEY_VERSION => datadog_configuration.version
31
+ Ext::KEY_ENVIRONMENT => config.env,
32
+ Ext::KEY_PARENT_SERVICE => parent_service,
33
+ Ext::KEY_VERSION => config.version,
34
+ Ext::KEY_HOSTNAME => span_op.get_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME),
35
+ Ext::KEY_DB_NAME => span_op.get_tag(Contrib::Ext::DB::TAG_INSTANCE),
36
+ Ext::KEY_PEER_SERVICE => peer_service,
30
37
  }
31
38
 
39
+ db_service = peer_service || span_op.service
40
+ if parent_service != db_service # Only set if it's different from parent_service; otherwise it's redundant
41
+ tags[Ext::KEY_DATABASE_SERVICE] = db_service
42
+ end
43
+
32
44
  if mode.full?
33
45
  # When tracing is disabled, trace_operation is a dummy object that does not contain data to build traceparent
34
- if datadog_configuration.tracing.enabled
46
+ if config.tracing.enabled
35
47
  tags[Ext::KEY_TRACEPARENT] =
36
48
  Tracing::Distributed::TraceContext.new(fetcher: nil).send(:build_traceparent, trace_op.to_digest)
37
49
  else
@@ -42,11 +54,11 @@ module Datadog
42
54
  end
43
55
  end
44
56
 
45
- "#{Comment.new(tags)} #{sql}"
46
- end
47
-
48
- def self.datadog_configuration
49
- Datadog.configuration
57
+ if mode.append?
58
+ "#{sql} #{Comment.new(tags)}"
59
+ else
60
+ "#{Comment.new(tags)} #{sql}"
61
+ end
50
62
  end
51
63
  end
52
64
  end
@@ -46,6 +46,11 @@ module Datadog
46
46
  o.default Contrib::Propagation::SqlComment::Ext::DISABLED
47
47
  end
48
48
 
49
+ option :append_comment do |o|
50
+ o.type :bool
51
+ o.default false
52
+ end
53
+
49
54
  option :peer_service do |o|
50
55
  o.type :string, nilable: true
51
56
  o.env Ext::ENV_PEER_SERVICE
@@ -49,13 +49,16 @@ module Datadog
49
49
  # Set analytics sample rate
50
50
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
51
51
 
52
+ span.set_tag(Contrib::Ext::DB::TAG_INSTANCE, connection_options[:database])
52
53
  span.set_tag(Ext::TAG_DB_NAME, connection_options[:database])
53
54
  span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_HOST, connection_options[:host])
54
55
  span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_PORT, connection_options[:port])
55
56
 
56
57
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
57
58
 
58
- propagation_mode = Contrib::Propagation::SqlComment::Mode.new(comment_propagation)
59
+ propagation_mode = Contrib::Propagation::SqlComment::Mode.new(
60
+ comment_propagation, datadog_configuration[:append_comment]
61
+ )
59
62
 
60
63
  Contrib::Propagation::SqlComment.annotate!(span, propagation_mode)
61
64
  sql = Contrib::Propagation::SqlComment.prepend_comment(
@@ -14,8 +14,8 @@ module Datadog
14
14
 
15
15
  def self.collect_and_log!(responses: nil)
16
16
  if log?
17
- env_data = EnvironmentCollector.collect_config!
18
- log_configuration!('TRACING', env_data.to_json)
17
+ log_configuration!('TRACING', EnvironmentCollector.collect_config!.to_json)
18
+ log_debug!('TRACING INTEGRATIONS', EnvironmentCollector.collect_integrations_settings!.to_json)
19
19
 
20
20
  if responses
21
21
  err_data = EnvironmentCollector.collect_errors!(responses)
@@ -40,7 +40,6 @@ module Datadog
40
40
  sampling_rules: sampling_rules,
41
41
  integrations_loaded: integrations_loaded,
42
42
  partial_flushing_enabled: partial_flushing_enabled,
43
- **instrumented_integrations_settings
44
43
  }
45
44
  end
46
45
 
@@ -128,6 +127,18 @@ module Datadog
128
127
  !!Datadog.configuration.tracing.partial_flush.enabled
129
128
  end
130
129
 
130
+ def collect_integrations_settings!
131
+ instrumented_integrations.each_with_object({}) do |(name, integration), result|
132
+ integration.configuration.to_h.each do |setting, value|
133
+ next if setting == :tracer # Skip internal objects
134
+
135
+ # Convert value to a string to avoid custom #to_json
136
+ # handlers possibly causing errors.
137
+ result[:"#{name}_#{setting}"] = value.to_s
138
+ end
139
+ end
140
+ end
141
+
131
142
  private
132
143
 
133
144
  def instrumented_integrations
@@ -139,19 +150,6 @@ module Datadog
139
150
 
140
151
  Datadog.configuration.tracing.instrumented_integrations
141
152
  end
142
-
143
- # Capture all active integration settings into "integrationName_settingName: value" entries.
144
- def instrumented_integrations_settings
145
- instrumented_integrations.flat_map do |name, integration|
146
- integration.configuration.to_h.flat_map do |setting, value|
147
- next [] if setting == :tracer # Skip internal Ruby objects
148
-
149
- # Convert value to a string to avoid custom #to_json
150
- # handlers possibly causing errors.
151
- [[:"integration_#{name}_#{setting}", value.to_s]]
152
- end
153
- end.to_h
154
- end
155
153
  end
156
154
  end
157
155
  end
@@ -10,8 +10,16 @@ module Datadog
10
10
  # Adds error tagging behavior
11
11
  # @public_api
12
12
  module Errors
13
- # Mark the span with the given error.
14
13
  def set_error(e)
14
+ Datadog::Core.log_deprecation do
15
+ 'Errors.set_error(..) is deprecated. ' \
16
+ 'Use Errors.set_error_tags(..) instead.'
17
+ end
18
+ set_error_tags(e)
19
+ end
20
+
21
+ # Mark the span with the given error.
22
+ def set_error_tags(e)
15
23
  e = Core::Error.build_from(e)
16
24
 
17
25
  set_tag(Ext::Errors::TAG_TYPE, e.type) unless e.type.empty?
@@ -14,6 +14,10 @@ module Datadog
14
14
  # Type of operation being performed (e.g. )
15
15
  TAG_OPERATION = 'operation'
16
16
  # Hostname of external service interacted with
17
+ #
18
+ # This tag also doesn't strictly need to be a “hostname”. It can be a raw IP address and in some cases it
19
+ # can even be a unix domain socket (i.e. postgres client setting host=/var/run/postgres).
20
+ # It should be whatever the client uses to point at the server it’s trying to talk to.
17
21
  TAG_PEER_HOSTNAME = 'peer.hostname'
18
22
  # Name of external service that performed the work
19
23
  TAG_PEER_SERVICE = 'peer.service'
@@ -10,8 +10,8 @@ module Datadog
10
10
  # This processor executes the configured `operation` for each {Datadog::Tracing::Span}
11
11
  # in a {Datadog::Tracing::TraceSegment}.
12
12
  #
13
- # If `operation` returns a truthy value for a span, that span is kept,
14
- # otherwise the span is removed from the trace.
13
+ # If `operation` returns a truthy value for a span, that span is dropped,
14
+ # otherwise the span is kept.
15
15
  #
16
16
  # @public_api
17
17
  class SpanFilter < SpanProcessor
@@ -27,6 +27,7 @@ module Datadog
27
27
  :resource,
28
28
  :service,
29
29
  :links,
30
+ :events,
30
31
  :type,
31
32
  :start_time,
32
33
  :status,
@@ -45,6 +46,7 @@ module Datadog
45
46
  # * +parent_id+: the identifier of the parent span
46
47
  # * +trace_id+: the identifier of the root span for this trace
47
48
  # * +service_entry+: whether it is a service entry span.
49
+ # * +events+: the list of events that occurred while a span was active.
48
50
  def initialize(
49
51
  name,
50
52
  duration: nil,
@@ -60,7 +62,8 @@ module Datadog
60
62
  type: nil,
61
63
  trace_id: nil,
62
64
  service_entry: nil,
63
- links: nil
65
+ links: nil,
66
+ events: nil
64
67
  )
65
68
  @name = Core::Utils::SafeDup.frozen_or_dup(name)
66
69
  @service = Core::Utils::SafeDup.frozen_or_dup(service)
@@ -90,6 +93,8 @@ module Datadog
90
93
 
91
94
  @links = links || []
92
95
 
96
+ @events = events || []
97
+
93
98
  # Mark with the service entry span metric, if applicable
94
99
  set_metric(Metadata::Ext::TAG_TOP_LEVEL, 1.0) if service_entry
95
100
  end
@@ -112,7 +117,7 @@ module Datadog
112
117
 
113
118
  def set_error(e)
114
119
  @status = Metadata::Ext::Errors::STATUS
115
- super
120
+ set_error_tags(e)
116
121
  end
117
122
 
118
123
  # Spans with the same ID are considered the same span
@@ -149,6 +154,8 @@ module Datadog
149
154
  h[:duration] = duration_nano
150
155
  end
151
156
 
157
+ h[:meta]['events'] = @events.map(&:to_hash).to_json unless @events.empty?
158
+
152
159
  h
153
160
  end
154
161
 
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+
5
+ module Datadog
6
+ module Tracing
7
+ # Represents a timestamped annotation on a span. It is analogous to structured log message.
8
+ # @public_api
9
+ class SpanEvent
10
+ # @!attribute [r] name
11
+ # @return [Integer]
12
+ attr_reader :name
13
+
14
+ # @!attribute [r] attributes
15
+ # @return [Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}]
16
+ attr_reader :attributes
17
+
18
+ # @!attribute [r] time_unix_nano
19
+ # @return [Integer]
20
+ attr_reader :time_unix_nano
21
+
22
+ def initialize(
23
+ name,
24
+ attributes: nil,
25
+ time_unix_nano: nil
26
+ )
27
+ @name = name
28
+ @attributes = attributes || {}
29
+ # OpenTelemetry SDK stores span event timestamps in nanoseconds (not seconds).
30
+ # We will do the same here to avoid unnecessary conversions and inconsistencies.
31
+ @time_unix_nano = time_unix_nano || (Time.now.to_r * 1_000_000_000).to_i
32
+ end
33
+
34
+ def to_hash
35
+ h = { name: @name, time_unix_nano: @time_unix_nano }
36
+ h[:attributes] = attributes unless @attributes.empty?
37
+ h
38
+ end
39
+ end
40
+ end
41
+ end
@@ -35,7 +35,7 @@ module Datadog
35
35
  :start_time,
36
36
  :trace_id,
37
37
  :type
38
- attr_accessor :links, :status
38
+ attr_accessor :links, :status, :span_events
39
39
 
40
40
  def initialize(
41
41
  name,
@@ -49,6 +49,7 @@ module Datadog
49
49
  trace_id: nil,
50
50
  type: nil,
51
51
  links: nil,
52
+ span_events: nil,
52
53
  id: nil
53
54
  )
54
55
  # Ensure dynamically created strings are UTF-8 encoded.
@@ -68,6 +69,8 @@ module Datadog
68
69
  @status = 0
69
70
  # stores array of span links
70
71
  @links = links || []
72
+ # stores array of span events
73
+ @span_events = span_events || []
71
74
 
72
75
  # start_time and end_time track wall clock. In Ruby, wall clock
73
76
  # has less accuracy than monotonic clock, so if possible we look to only use wall clock
@@ -265,7 +268,7 @@ module Datadog
265
268
 
266
269
  def set_error(e)
267
270
  @status = Metadata::Ext::Errors::STATUS
268
- super
271
+ set_error_tags(e)
269
272
  end
270
273
 
271
274
  # Return a string representation of the span.
@@ -455,6 +458,7 @@ module Datadog
455
458
  type: @type,
456
459
  trace_id: @trace_id,
457
460
  links: @links,
461
+ events: @span_events,
458
462
  service_entry: parent.nil? || (service && parent.service != service)
459
463
  )
460
464
  end
@@ -72,6 +72,9 @@ module Datadog
72
72
  packer.write_map_header(number_of_elements_to_write) # Set header with how many elements in the map
73
73
  end
74
74
 
75
+ # serialize span events as meta tags
76
+ span.set_tag('events', span.events.map(&:to_hash).to_json) if span.events.any?
77
+
75
78
  # DEV: We use strings as keys here, instead of symbols, as
76
79
  # DEV: MessagePack will ultimately convert them to strings.
77
80
  # DEV: By providing strings directly, we skip this indirection operation.
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 2
6
+ MINOR = 3
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-11 00:00:00.000000000 Z
11
+ date: 2024-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 10.0.0.1.0
61
+ version: 11.0.0.1.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 10.0.0.1.0
68
+ version: 11.0.0.1.0
69
69
  description: |
70
70
  datadog is Datadog's client library for Ruby. It includes a suite of tools
71
71
  which provide visibility into the performance and security of Ruby applications,
@@ -77,6 +77,7 @@ executables:
77
77
  extensions:
78
78
  - ext/datadog_profiling_native_extension/extconf.rb
79
79
  - ext/datadog_profiling_loader/extconf.rb
80
+ - ext/libdatadog_api/extconf.rb
80
81
  extra_rdoc_files: []
81
82
  files:
82
83
  - CHANGELOG.md
@@ -106,7 +107,8 @@ files:
106
107
  - ext/datadog_profiling_native_extension/collectors_stack.h
107
108
  - ext/datadog_profiling_native_extension/collectors_thread_context.c
108
109
  - ext/datadog_profiling_native_extension/collectors_thread_context.h
109
- - ext/datadog_profiling_native_extension/crashtracker.c
110
+ - ext/datadog_profiling_native_extension/datadog_ruby_common.c
111
+ - ext/datadog_profiling_native_extension/datadog_ruby_common.h
110
112
  - ext/datadog_profiling_native_extension/extconf.rb
111
113
  - ext/datadog_profiling_native_extension/heap_recorder.c
112
114
  - ext/datadog_profiling_native_extension/heap_recorder.h
@@ -126,6 +128,12 @@ files:
126
128
  - ext/datadog_profiling_native_extension/stack_recorder.h
127
129
  - ext/datadog_profiling_native_extension/time_helpers.c
128
130
  - ext/datadog_profiling_native_extension/time_helpers.h
131
+ - ext/libdatadog_api/crashtracker.c
132
+ - ext/libdatadog_api/datadog_ruby_common.c
133
+ - ext/libdatadog_api/datadog_ruby_common.h
134
+ - ext/libdatadog_api/extconf.rb
135
+ - ext/libdatadog_api/macos_development.md
136
+ - ext/libdatadog_extconf_helpers.rb
129
137
  - lib/datadog.rb
130
138
  - lib/datadog/appsec.rb
131
139
  - lib/datadog/appsec/assets.rb
@@ -150,6 +158,12 @@ files:
150
158
  - lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb
151
159
  - lib/datadog/appsec/contrib/devise/resource.rb
152
160
  - lib/datadog/appsec/contrib/devise/tracking.rb
161
+ - lib/datadog/appsec/contrib/graphql/appsec_trace.rb
162
+ - lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb
163
+ - lib/datadog/appsec/contrib/graphql/gateway/watcher.rb
164
+ - lib/datadog/appsec/contrib/graphql/integration.rb
165
+ - lib/datadog/appsec/contrib/graphql/patcher.rb
166
+ - lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb
153
167
  - lib/datadog/appsec/contrib/integration.rb
154
168
  - lib/datadog/appsec/contrib/patcher.rb
155
169
  - lib/datadog/appsec/contrib/rack/ext.rb
@@ -223,6 +237,9 @@ files:
223
237
  - lib/datadog/core/configuration/option_definition.rb
224
238
  - lib/datadog/core/configuration/options.rb
225
239
  - lib/datadog/core/configuration/settings.rb
240
+ - lib/datadog/core/crashtracking/agent_base_url.rb
241
+ - lib/datadog/core/crashtracking/component.rb
242
+ - lib/datadog/core/crashtracking/tag_builder.rb
226
243
  - lib/datadog/core/deprecations.rb
227
244
  - lib/datadog/core/diagnostics/environment_logger.rb
228
245
  - lib/datadog/core/diagnostics/health.rb
@@ -291,6 +308,7 @@ files:
291
308
  - lib/datadog/core/telemetry/http/ext.rb
292
309
  - lib/datadog/core/telemetry/http/response.rb
293
310
  - lib/datadog/core/telemetry/http/transport.rb
311
+ - lib/datadog/core/telemetry/logging.rb
294
312
  - lib/datadog/core/telemetry/metric.rb
295
313
  - lib/datadog/core/telemetry/metrics_collection.rb
296
314
  - lib/datadog/core/telemetry/metrics_manager.rb
@@ -310,6 +328,7 @@ files:
310
328
  - lib/datadog/core/transport/request.rb
311
329
  - lib/datadog/core/transport/response.rb
312
330
  - lib/datadog/core/utils.rb
331
+ - lib/datadog/core/utils/at_fork_monkey_patch.rb
313
332
  - lib/datadog/core/utils/base64.rb
314
333
  - lib/datadog/core/utils/duration.rb
315
334
  - lib/datadog/core/utils/forking.rb
@@ -357,11 +376,9 @@ files:
357
376
  - lib/datadog/profiling/collectors/stack.rb
358
377
  - lib/datadog/profiling/collectors/thread_context.rb
359
378
  - lib/datadog/profiling/component.rb
360
- - lib/datadog/profiling/crashtracker.rb
361
379
  - lib/datadog/profiling/exporter.rb
362
380
  - lib/datadog/profiling/ext.rb
363
381
  - lib/datadog/profiling/ext/dir_monkey_patches.rb
364
- - lib/datadog/profiling/ext/forking.rb
365
382
  - lib/datadog/profiling/flush.rb
366
383
  - lib/datadog/profiling/http_transport.rb
367
384
  - lib/datadog/profiling/load_native_extension.rb
@@ -818,6 +835,7 @@ files:
818
835
  - lib/datadog/tracing/sampling/span/rule_parser.rb
819
836
  - lib/datadog/tracing/sampling/span/sampler.rb
820
837
  - lib/datadog/tracing/span.rb
838
+ - lib/datadog/tracing/span_event.rb
821
839
  - lib/datadog/tracing/span_link.rb
822
840
  - lib/datadog/tracing/span_operation.rb
823
841
  - lib/datadog/tracing/sync_writer.rb
@@ -852,8 +870,8 @@ licenses:
852
870
  - Apache-2.0
853
871
  metadata:
854
872
  allowed_push_host: https://rubygems.org
855
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.2.0/CHANGELOG.md
856
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.2.0
873
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.3.0/CHANGELOG.md
874
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.3.0
857
875
  post_install_message:
858
876
  rdoc_options: []
859
877
  require_paths:
@@ -872,7 +890,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
872
890
  - !ruby/object:Gem::Version
873
891
  version: 2.0.0
874
892
  requirements: []
875
- rubygems_version: 3.4.21
893
+ rubygems_version: 3.5.16
876
894
  signing_key:
877
895
  specification_version: 4
878
896
  summary: Datadog tracing code for your Ruby applications
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'libdatadog'
4
-
5
- module Datadog
6
- module Profiling
7
- # Used to report Ruby VM crashes.
8
- # The interesting bits are implemented as native code and using libdatadog.
9
- #
10
- # NOTE: The crashtracker native state is a singleton; so even if you create multiple instances of `Crashtracker`
11
- # and start them, it only works as "last writer wins". Same for stop -- there's only one state, so calling stop
12
- # on it will stop the crash tracker, regardless of which instance started it.
13
- #
14
- # Methods prefixed with _native_ are implemented in `crashtracker.c`
15
- class Crashtracker
16
- private
17
-
18
- attr_reader \
19
- :exporter_configuration,
20
- :tags_as_array,
21
- :path_to_crashtracking_receiver_binary,
22
- :ld_library_path,
23
- :upload_timeout_seconds
24
-
25
- public
26
-
27
- def initialize(
28
- exporter_configuration:,
29
- tags:,
30
- upload_timeout_seconds:,
31
- path_to_crashtracking_receiver_binary: Libdatadog.path_to_crashtracking_receiver_binary,
32
- ld_library_path: Libdatadog.ld_library_path
33
- )
34
- @exporter_configuration = exporter_configuration
35
- @tags_as_array = tags.to_a
36
- @upload_timeout_seconds = upload_timeout_seconds
37
- @path_to_crashtracking_receiver_binary = path_to_crashtracking_receiver_binary
38
- @ld_library_path = ld_library_path
39
- end
40
-
41
- def start
42
- start_or_update_on_fork(action: :start)
43
- end
44
-
45
- def reset_after_fork
46
- start_or_update_on_fork(action: :update_on_fork)
47
- end
48
-
49
- def stop
50
- begin
51
- self.class._native_stop
52
- Datadog.logger.debug('Crash tracking stopped successfully')
53
- rescue => e
54
- Datadog.logger.error("Failed to stop crash tracking: #{e.message}")
55
- end
56
- end
57
-
58
- private
59
-
60
- def start_or_update_on_fork(action:)
61
- unless path_to_crashtracking_receiver_binary
62
- Datadog.logger.warn(
63
- "Cannot #{action} profiling crash tracking as no path_to_crashtracking_receiver_binary was found"
64
- )
65
- return
66
- end
67
-
68
- unless ld_library_path
69
- Datadog.logger.warn(
70
- "Cannot #{action} profiling crash tracking as no ld_library_path was found"
71
- )
72
- return
73
- end
74
-
75
- begin
76
- self.class._native_start_or_update_on_fork(
77
- action: action,
78
- exporter_configuration: exporter_configuration,
79
- path_to_crashtracking_receiver_binary: path_to_crashtracking_receiver_binary,
80
- ld_library_path: ld_library_path,
81
- tags_as_array: tags_as_array,
82
- upload_timeout_seconds: Integer(upload_timeout_seconds),
83
- )
84
- Datadog.logger.debug("Crash tracking #{action} successful")
85
- rescue => e
86
- Datadog.logger.error("Failed to #{action} crash tracking: #{e.message}")
87
- end
88
- end
89
- end
90
- end
91
- end