datadog 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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