datadog 2.1.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 (183) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +101 -1
  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 +132 -44
  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 +90 -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 +69 -62
  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 -126
  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.c +1 -1
  31. data/ext/datadog_profiling_native_extension/setup_signal_handler.h +1 -0
  32. data/ext/datadog_profiling_native_extension/stack_recorder.c +27 -8
  33. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -0
  34. data/ext/datadog_profiling_native_extension/time_helpers.c +0 -15
  35. data/ext/datadog_profiling_native_extension/time_helpers.h +36 -6
  36. data/ext/{datadog_profiling_native_extension → libdatadog_api}/crashtracker.c +20 -7
  37. data/ext/libdatadog_api/datadog_ruby_common.c +110 -0
  38. data/ext/libdatadog_api/datadog_ruby_common.h +57 -0
  39. data/ext/libdatadog_api/extconf.rb +108 -0
  40. data/ext/libdatadog_api/macos_development.md +26 -0
  41. data/ext/libdatadog_extconf_helpers.rb +130 -0
  42. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +49 -0
  43. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +73 -0
  44. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +68 -0
  45. data/lib/datadog/appsec/contrib/graphql/integration.rb +41 -0
  46. data/lib/datadog/appsec/contrib/graphql/patcher.rb +37 -0
  47. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +59 -0
  48. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +1 -1
  49. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +1 -1
  50. data/lib/datadog/appsec/extensions.rb +1 -0
  51. data/lib/datadog/appsec/processor/actions.rb +1 -1
  52. data/lib/datadog/appsec/response.rb +15 -1
  53. data/lib/datadog/appsec.rb +1 -0
  54. data/lib/datadog/core/configuration/components.rb +17 -12
  55. data/lib/datadog/core/configuration/settings.rb +93 -7
  56. data/lib/datadog/core/configuration.rb +3 -17
  57. data/lib/datadog/core/crashtracking/agent_base_url.rb +21 -0
  58. data/lib/datadog/core/crashtracking/component.rb +111 -0
  59. data/lib/datadog/core/crashtracking/tag_builder.rb +39 -0
  60. data/lib/datadog/core/deprecations.rb +58 -0
  61. data/lib/datadog/core/diagnostics/environment_logger.rb +8 -11
  62. data/lib/datadog/core/environment/yjit.rb +5 -0
  63. data/lib/datadog/core/runtime/ext.rb +1 -0
  64. data/lib/datadog/core/runtime/metrics.rb +6 -0
  65. data/lib/datadog/core/telemetry/component.rb +154 -0
  66. data/lib/datadog/core/telemetry/emitter.rb +9 -11
  67. data/lib/datadog/core/telemetry/event.rb +132 -26
  68. data/lib/datadog/core/telemetry/ext.rb +3 -0
  69. data/lib/datadog/core/telemetry/http/adapters/net.rb +11 -13
  70. data/lib/datadog/core/telemetry/http/ext.rb +3 -0
  71. data/lib/datadog/core/telemetry/http/transport.rb +38 -9
  72. data/lib/datadog/core/telemetry/logging.rb +35 -0
  73. data/lib/datadog/core/telemetry/metric.rb +167 -0
  74. data/lib/datadog/core/telemetry/metrics_collection.rb +81 -0
  75. data/lib/datadog/core/telemetry/metrics_manager.rb +81 -0
  76. data/lib/datadog/core/telemetry/request.rb +1 -1
  77. data/lib/datadog/core/telemetry/worker.rb +173 -0
  78. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +102 -0
  79. data/lib/datadog/core/utils/only_once_successful.rb +76 -0
  80. data/lib/datadog/core.rb +2 -19
  81. data/lib/datadog/kit/appsec/events.rb +2 -4
  82. data/lib/datadog/opentelemetry/sdk/propagator.rb +5 -10
  83. data/lib/datadog/opentelemetry/sdk/span_processor.rb +15 -2
  84. data/lib/datadog/opentelemetry/sdk/trace/span.rb +23 -0
  85. data/lib/datadog/profiling/collectors/code_provenance.rb +24 -11
  86. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +17 -17
  87. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +11 -13
  88. data/lib/datadog/profiling/collectors/info.rb +3 -3
  89. data/lib/datadog/profiling/collectors/thread_context.rb +4 -2
  90. data/lib/datadog/profiling/component.rb +85 -90
  91. data/lib/datadog/profiling/exporter.rb +3 -3
  92. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +410 -0
  93. data/lib/datadog/profiling/ext.rb +21 -21
  94. data/lib/datadog/profiling/flush.rb +1 -1
  95. data/lib/datadog/profiling/http_transport.rb +8 -6
  96. data/lib/datadog/profiling/load_native_extension.rb +5 -5
  97. data/lib/datadog/profiling/preload.rb +1 -1
  98. data/lib/datadog/profiling/profiler.rb +5 -8
  99. data/lib/datadog/profiling/scheduler.rb +31 -25
  100. data/lib/datadog/profiling/tag_builder.rb +2 -2
  101. data/lib/datadog/profiling/tasks/exec.rb +5 -5
  102. data/lib/datadog/profiling/tasks/setup.rb +16 -35
  103. data/lib/datadog/profiling.rb +5 -5
  104. data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
  105. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +1 -1
  106. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +1 -1
  107. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +1 -1
  108. data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -6
  109. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +9 -4
  110. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -2
  111. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +1 -5
  112. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  113. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  114. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  115. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  116. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  117. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  118. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  119. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  120. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +1 -1
  121. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  122. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -1
  123. data/lib/datadog/tracing/contrib/active_support/cache/event.rb +32 -0
  124. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +156 -0
  125. data/lib/datadog/tracing/contrib/active_support/cache/events.rb +34 -0
  126. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +45 -41
  127. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +17 -40
  128. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -1
  129. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +29 -6
  130. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +16 -4
  131. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +33 -29
  132. data/lib/datadog/tracing/contrib/analytics.rb +5 -0
  133. data/lib/datadog/tracing/contrib/ext.rb +14 -0
  134. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +5 -0
  135. data/lib/datadog/tracing/contrib/graphql/patcher.rb +8 -2
  136. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +166 -0
  137. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +28 -0
  138. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -1
  139. data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +1 -1
  140. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
  141. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +3 -3
  142. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
  143. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
  144. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +3 -3
  145. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +3 -3
  146. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +3 -3
  147. data/lib/datadog/tracing/contrib/lograge/patcher.rb +16 -0
  148. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +5 -0
  149. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +17 -13
  150. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +5 -0
  151. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +4 -1
  152. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +28 -0
  153. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +5 -1
  154. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +22 -10
  155. data/lib/datadog/tracing/contrib/racecar/event.rb +2 -2
  156. data/lib/datadog/tracing/contrib/rails/ext.rb +9 -0
  157. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -0
  158. data/lib/datadog/tracing/contrib/rails/runner.rb +95 -0
  159. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +5 -0
  160. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -1
  161. data/lib/datadog/tracing/diagnostics/environment_logger.rb +14 -16
  162. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  163. data/lib/datadog/tracing/distributed/b3_single.rb +3 -1
  164. data/lib/datadog/tracing/distributed/datadog.rb +2 -2
  165. data/lib/datadog/tracing/distributed/propagation.rb +9 -2
  166. data/lib/datadog/tracing/distributed/trace_context.rb +3 -2
  167. data/lib/datadog/tracing/metadata/errors.rb +9 -1
  168. data/lib/datadog/tracing/metadata/ext.rb +4 -0
  169. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
  170. data/lib/datadog/tracing/span.rb +9 -2
  171. data/lib/datadog/tracing/span_event.rb +41 -0
  172. data/lib/datadog/tracing/span_operation.rb +9 -4
  173. data/lib/datadog/tracing/trace_operation.rb +7 -3
  174. data/lib/datadog/tracing/trace_segment.rb +4 -1
  175. data/lib/datadog/tracing/tracer.rb +9 -2
  176. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -0
  177. data/lib/datadog/tracing.rb +5 -1
  178. data/lib/datadog/version.rb +2 -2
  179. metadata +43 -12
  180. data/lib/datadog/core/telemetry/client.rb +0 -95
  181. data/lib/datadog/core/telemetry/heartbeat.rb +0 -33
  182. data/lib/datadog/profiling/crashtracker.rb +0 -91
  183. data/lib/datadog/profiling/ext/forking.rb +0 -98
@@ -4,6 +4,7 @@ require_relative '../analytics'
4
4
  require_relative '../patcher'
5
5
  require_relative 'tracing_patcher'
6
6
  require_relative 'trace_patcher'
7
+ require_relative 'unified_trace_patcher'
7
8
 
8
9
  module Datadog
9
10
  module Tracing
@@ -23,10 +24,15 @@ module Datadog
23
24
  if configuration[:with_deprecated_tracer]
24
25
  TracingPatcher.patch!(schemas, trace_options)
25
26
  elsif Integration.trace_supported?
26
- TracePatcher.patch!(schemas, trace_options)
27
+ if configuration[:with_unified_tracer]
28
+ UnifiedTracePatcher.patch!(schemas, trace_options)
29
+ else
30
+ TracePatcher.patch!(schemas, trace_options)
31
+ end
27
32
  else
28
33
  Datadog.logger.warn(
29
- "GraphQL version (#{target_version}) does not support GraphQL::Tracing::DataDogTrace. "\
34
+ "GraphQL version (#{target_version}) does not support GraphQL::Tracing::DataDogTrace"\
35
+ 'or Datadog::Tracing::Contrib::GraphQL::UnifiedTrace.'\
30
36
  'Falling back to GraphQL::Tracing::DataDogTracing.'
31
37
  )
32
38
  TracingPatcher.patch!(schemas, trace_options)
@@ -0,0 +1,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql'
4
+
5
+ module Datadog
6
+ module Tracing
7
+ module Contrib
8
+ module GraphQL
9
+ # These methods will be called by the GraphQL runtime to trace the execution of queries.
10
+ # This tracer differs from the upstream one as it follows the unified naming convention specification,
11
+ # which is required to use features such as API Catalog.
12
+ # DEV-3.0: This tracer should be the default one in the next major version.
13
+ module UnifiedTrace
14
+ # @param analytics_enabled [Boolean] Deprecated
15
+ # @param analytics_sample_rate [Float] Deprecated
16
+ # @param service [String|nil] The service name to be set on the spans
17
+ def initialize(*args, analytics_enabled: false, analytics_sample_rate: 1.0, service: nil, **kwargs)
18
+ @analytics_enabled = analytics_enabled
19
+ @analytics_sample_rate = analytics_sample_rate
20
+
21
+ @service_name = service
22
+ @has_prepare_span = respond_to?(:prepare_span)
23
+ super
24
+ end
25
+
26
+ def lex(*args, query_string:, **kwargs)
27
+ trace(proc { super }, 'lex', query_string, query_string: query_string)
28
+ end
29
+
30
+ def parse(*args, query_string:, **kwargs)
31
+ trace(proc { super }, 'parse', query_string, query_string: query_string) do |span|
32
+ span.set_tag('graphql.source', query_string)
33
+ end
34
+ end
35
+
36
+ def validate(*args, query:, validate:, **kwargs)
37
+ trace(proc { super }, 'validate', query.selected_operation_name, query: query, validate: validate) do |span|
38
+ span.set_tag('graphql.source', query.query_string)
39
+ end
40
+ end
41
+
42
+ def analyze_multiplex(*args, multiplex:, **kwargs)
43
+ trace(proc { super }, 'analyze_multiplex', multiplex_resource(multiplex), multiplex: multiplex)
44
+ end
45
+
46
+ def analyze_query(*args, query:, **kwargs)
47
+ trace(proc { super }, 'analyze', query.query_string, query: query)
48
+ end
49
+
50
+ def execute_multiplex(*args, multiplex:, **kwargs)
51
+ trace(proc { super }, 'execute_multiplex', multiplex_resource(multiplex), multiplex: multiplex) do |span|
52
+ span.set_tag('graphql.source', "Multiplex[#{multiplex.queries.map(&:query_string).join(', ')}]")
53
+ end
54
+ end
55
+
56
+ def execute_query(*args, query:, **kwargs)
57
+ trace(proc { super }, 'execute', query.selected_operation_name, query: query) do |span|
58
+ span.set_tag('graphql.source', query.query_string)
59
+ span.set_tag('graphql.operation.type', query.selected_operation.operation_type)
60
+ span.set_tag('graphql.operation.name', query.selected_operation_name) if query.selected_operation_name
61
+ query.variables.instance_variable_get(:@storage).each do |key, value|
62
+ span.set_tag("graphql.variables.#{key}", value)
63
+ end
64
+ end
65
+ end
66
+
67
+ def execute_query_lazy(*args, query:, multiplex:, **kwargs)
68
+ resource = if query
69
+ query.selected_operation_name || fallback_transaction_name(query.context)
70
+ else
71
+ multiplex_resource(multiplex)
72
+ end
73
+ trace(proc { super }, 'execute_lazy', resource, query: query, multiplex: multiplex)
74
+ end
75
+
76
+ def execute_field_span(callable, span_key, **kwargs)
77
+ # @platform_key_cache is initialized upstream, in ::GraphQL::Tracing::PlatformTrace
78
+ platform_key = @platform_key_cache[UnifiedTrace].platform_field_key_cache[kwargs[:field]]
79
+
80
+ if platform_key
81
+ trace(callable, span_key, platform_key, **kwargs) do |span|
82
+ kwargs[:arguments].each do |key, value|
83
+ span.set_tag("graphql.variables.#{key}", value)
84
+ end
85
+ end
86
+ else
87
+ callable.call
88
+ end
89
+ end
90
+
91
+ def execute_field(*args, **kwargs)
92
+ execute_field_span(proc { super }, 'resolve', **kwargs)
93
+ end
94
+
95
+ def execute_field_lazy(*args, **kwargs)
96
+ execute_field_span(proc { super }, 'resolve_lazy', **kwargs)
97
+ end
98
+
99
+ def authorized_span(callable, span_key, **kwargs)
100
+ platform_key = @platform_key_cache[UnifiedTrace].platform_authorized_key_cache[kwargs[:type]]
101
+ trace(callable, span_key, platform_key, **kwargs)
102
+ end
103
+
104
+ def authorized(*args, **kwargs)
105
+ authorized_span(proc { super }, 'authorized', **kwargs)
106
+ end
107
+
108
+ def authorized_lazy(*args, **kwargs)
109
+ authorized_span(proc { super }, 'authorized_lazy', **kwargs)
110
+ end
111
+
112
+ def resolve_type_span(callable, span_key, **kwargs)
113
+ platform_key = @platform_key_cache[UnifiedTrace].platform_resolve_type_key_cache[kwargs[:type]]
114
+ trace(callable, span_key, platform_key, **kwargs)
115
+ end
116
+
117
+ def resolve_type(*args, **kwargs)
118
+ resolve_type_span(proc { super }, 'resolve_type', **kwargs)
119
+ end
120
+
121
+ def resolve_type_lazy(*args, **kwargs)
122
+ resolve_type_span(proc { super }, 'resolve_type_lazy', **kwargs)
123
+ end
124
+
125
+ include ::GraphQL::Tracing::PlatformTrace
126
+
127
+ def platform_field_key(field, *args, **kwargs)
128
+ field.path
129
+ end
130
+
131
+ def platform_authorized_key(type, *args, **kwargs)
132
+ "#{type.graphql_name}.authorized"
133
+ end
134
+
135
+ def platform_resolve_type_key(type, *args, **kwargs)
136
+ "#{type.graphql_name}.resolve_type"
137
+ end
138
+
139
+ private
140
+
141
+ def trace(callable, trace_key, resource, **kwargs)
142
+ Tracing.trace("graphql.#{trace_key}", resource: resource, service: @service_name, type: 'graphql') do |span|
143
+ yield(span) if block_given?
144
+
145
+ prepare_span(trace_key, kwargs, span) if @has_prepare_span
146
+
147
+ callable.call
148
+ end
149
+ end
150
+
151
+ def multiplex_resource(multiplex)
152
+ return nil unless multiplex
153
+
154
+ operations = multiplex.queries.map(&:selected_operation_name).compact.join(', ')
155
+ if operations.empty?
156
+ first_query = multiplex.queries.first
157
+ fallback_transaction_name(first_query && first_query.context)
158
+ else
159
+ operations
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ if Gem.loaded_specs['graphql'] && Gem.loaded_specs['graphql'].version >= Gem::Version.new('2.0.19')
4
+ require_relative 'unified_trace'
5
+ end
6
+
7
+ module Datadog
8
+ module Tracing
9
+ module Contrib
10
+ module GraphQL
11
+ # Provides instrumentation for `graphql` through the GraphQL's tracing with methods defined in UnifiedTrace
12
+ module UnifiedTracePatcher
13
+ module_function
14
+
15
+ def patch!(schemas, options)
16
+ if schemas.empty?
17
+ ::GraphQL::Schema.trace_with(UnifiedTrace, **options)
18
+ else
19
+ schemas.each do |schema|
20
+ schema.trace_with(UnifiedTrace, **options)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -6,7 +6,7 @@ module Datadog
6
6
  module Kafka
7
7
  # Defines basic behaviors for an event for a consumer.
8
8
  module ConsumerEvent
9
- def process(span, _event, _id, payload)
9
+ def on_start(span, _event, _id, payload)
10
10
  super
11
11
 
12
12
  span.set_tag(Ext::TAG_GROUP, payload[:group_id])
@@ -6,7 +6,7 @@ module Datadog
6
6
  module Kafka
7
7
  # Defines basic behaviors for an event for a consumer group.
8
8
  module ConsumerGroupEvent
9
- def process(span, _event, _id, payload)
9
+ def on_start(span, _event, _id, payload)
10
10
  super
11
11
 
12
12
  span.resource = payload[:group_id]
@@ -29,7 +29,7 @@ module Datadog
29
29
  Datadog.configuration.tracing[:kafka]
30
30
  end
31
31
 
32
- def process(span, _event, _id, payload)
32
+ def on_start(span, _event, _id, payload)
33
33
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
34
34
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_MESSAGING_SYSTEM)
35
35
 
@@ -15,7 +15,9 @@ module Datadog
15
15
 
16
16
  EVENT_NAME = 'request.connection.kafka'
17
17
 
18
- def self.process(span, _event, _id, payload)
18
+ module_function
19
+
20
+ def on_start(span, _event, _id, payload)
19
21
  super
20
22
 
21
23
  span.resource = payload[:api]
@@ -24,8 +26,6 @@ module Datadog
24
26
  span.set_tag(Ext::TAG_RESPONSE_SIZE, payload[:response_size]) if payload.key?(:response_size)
25
27
  end
26
28
 
27
- module_function
28
-
29
29
  def span_name
30
30
  Ext::SPAN_CONNECTION_REQUEST
31
31
  end
@@ -17,7 +17,9 @@ module Datadog
17
17
 
18
18
  EVENT_NAME = 'process_batch.consumer.kafka'
19
19
 
20
- def self.process(span, _event, _id, payload)
20
+ module_function
21
+
22
+ def on_start(span, _event, _id, payload)
21
23
  super
22
24
 
23
25
  span.resource = payload[:topic]
@@ -31,8 +33,6 @@ module Datadog
31
33
  span.set_tag(Ext::TAG_OFFSET_LAG, payload[:offset_lag]) if payload.key?(:offset_lag)
32
34
  end
33
35
 
34
- module_function
35
-
36
36
  def span_name
37
37
  Ext::SPAN_PROCESS_BATCH
38
38
  end
@@ -17,7 +17,9 @@ module Datadog
17
17
 
18
18
  EVENT_NAME = 'process_message.consumer.kafka'
19
19
 
20
- def self.process(span, _event, _id, payload)
20
+ module_function
21
+
22
+ def on_start(span, _event, _id, payload)
21
23
  super
22
24
 
23
25
  span.resource = payload[:topic]
@@ -29,8 +31,6 @@ module Datadog
29
31
  span.set_tag(Ext::TAG_OFFSET_LAG, payload[:offset_lag]) if payload.key?(:offset_lag)
30
32
  end
31
33
 
32
- module_function
33
-
34
34
  def span_name
35
35
  Ext::SPAN_PROCESS_MESSAGE
36
36
  end
@@ -19,7 +19,9 @@ module Datadog
19
19
 
20
20
  EVENT_NAME = 'heartbeat.consumer.kafka'
21
21
 
22
- def self.process(span, _event, _id, payload)
22
+ module_function
23
+
24
+ def on_start(span, _event, _id, payload)
23
25
  super
24
26
 
25
27
  if payload.key?(:topic_partitions)
@@ -29,8 +31,6 @@ module Datadog
29
31
  end
30
32
  end
31
33
 
32
- module_function
33
-
34
34
  def span_name
35
35
  Ext::SPAN_CONSUMER_HEARTBEAT
36
36
  end
@@ -15,7 +15,9 @@ module Datadog
15
15
 
16
16
  EVENT_NAME = 'send_messages.producer.kafka'
17
17
 
18
- def self.process(span, _event, _id, payload)
18
+ module_function
19
+
20
+ def on_start(span, _event, _id, payload)
19
21
  super
20
22
 
21
23
  span.set_tag(Ext::TAG_MESSAGE_COUNT, payload[:message_count]) if payload.key?(:message_count)
@@ -23,8 +25,6 @@ module Datadog
23
25
  span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_PRODUCER)
24
26
  end
25
27
 
26
- module_function
27
-
28
28
  def span_name
29
29
  Ext::SPAN_SEND_MESSAGES
30
30
  end
@@ -15,7 +15,9 @@ module Datadog
15
15
 
16
16
  EVENT_NAME = 'deliver_messages.producer.kafka'
17
17
 
18
- def self.process(span, _event, _id, payload)
18
+ module_function
19
+
20
+ def on_start(span, _event, _id, payload)
19
21
  super
20
22
 
21
23
  span.set_tag(Ext::TAG_ATTEMPTS, payload[:attempts]) if payload.key?(:attempts)
@@ -26,8 +28,6 @@ module Datadog
26
28
  span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_PRODUCER)
27
29
  end
28
30
 
29
- module_function
30
-
31
31
  def span_name
32
32
  Ext::SPAN_DELIVER_MESSAGES
33
33
  end
@@ -20,6 +20,22 @@ module Datadog
20
20
 
21
21
  # patch applies our patch
22
22
  def patch
23
+ # ActiveSupport::TaggedLogging is the default Rails logger since Rails 5
24
+ if defined?(::ActiveSupport::TaggedLogging::Formatter) &&
25
+ ::Lograge::LogSubscribers::ActionController
26
+ .logger&.formatter.is_a?(::ActiveSupport::TaggedLogging::Formatter)
27
+
28
+ Datadog.logger.error(
29
+ 'Lograge and ActiveSupport::TaggedLogging (the default Rails log formatter) are not compatible: ' \
30
+ 'Lograge does not account for Rails log tags, creating polluted logs and breaking log formatting. ' \
31
+ 'Traces and Logs correlation may not work. ' \
32
+ 'Either: 1. Disable tagged logging in your Rails configuration ' \
33
+ '`config.logger = ActiveSupport::Logger.new(STDOUT); ' \
34
+ 'config.active_job.logger = ActiveSupport::Logger.new(STDOUT)` ' \
35
+ 'or 2. Use the `semantic_logger` gem instead of `lograge`.'
36
+ )
37
+ end
38
+
23
39
  ::Lograge::LogSubscribers::Base.include(Instrumentation)
24
40
  end
25
41
  end
@@ -48,6 +48,11 @@ module Datadog
48
48
  o.default Contrib::Propagation::SqlComment::Ext::DISABLED
49
49
  end
50
50
 
51
+ option :append_comment do |o|
52
+ o.type :bool
53
+ o.default false
54
+ end
55
+
51
56
  option :peer_service do |o|
52
57
  o.type :string, nilable: true
53
58
  o.env Ext::ENV_PEER_SERVICE
@@ -50,21 +50,14 @@ module Datadog
50
50
  # Set analytics sample rate
51
51
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
52
52
 
53
+ span.set_tag(Contrib::Ext::DB::TAG_INSTANCE, query_options[:database])
53
54
  span.set_tag(Ext::TAG_DB_NAME, query_options[:database])
54
55
  span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_HOST, query_options[:host])
55
56
  span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_PORT, query_options[:port])
56
57
 
57
58
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
58
59
 
59
- propagation_mode = Contrib::Propagation::SqlComment::Mode.new(comment_propagation)
60
-
61
- Contrib::Propagation::SqlComment.annotate!(span, propagation_mode)
62
- sql = Contrib::Propagation::SqlComment.prepend_comment(
63
- sql,
64
- span,
65
- trace_op,
66
- propagation_mode
67
- )
60
+ sql = inject_propagation(span, sql, trace_op)
68
61
 
69
62
  super(sql, options)
70
63
  end
@@ -72,6 +65,21 @@ module Datadog
72
65
 
73
66
  private
74
67
 
68
+ def inject_propagation(span, sql, trace_op)
69
+ propagation_mode = Contrib::Propagation::SqlComment::Mode.new(
70
+ datadog_configuration[:comment_propagation],
71
+ datadog_configuration[:append_comment]
72
+ )
73
+
74
+ Contrib::Propagation::SqlComment.annotate!(span, propagation_mode)
75
+ Contrib::Propagation::SqlComment.prepend_comment(
76
+ sql,
77
+ span,
78
+ trace_op,
79
+ propagation_mode
80
+ )
81
+ end
82
+
75
83
  def datadog_configuration
76
84
  Datadog.configuration.tracing[:mysql2]
77
85
  end
@@ -83,10 +91,6 @@ module Datadog
83
91
  def analytics_sample_rate
84
92
  datadog_configuration[:analytics_sample_rate]
85
93
  end
86
-
87
- def comment_propagation
88
- datadog_configuration[:comment_propagation]
89
- end
90
94
  end
91
95
  end
92
96
  end
@@ -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
@@ -19,7 +19,7 @@ module Datadog
19
19
  # Class methods for Racecar events.
20
20
  # Note, they share the same process method and before_trace method.
21
21
  module ClassMethods
22
- def subscription(*args)
22
+ def subscription(*args, **kwargs)
23
23
  super.tap do |subscription|
24
24
  subscription.before_trace { ensure_clean_context! }
25
25
  end
@@ -33,7 +33,7 @@ module Datadog
33
33
  Datadog.configuration.tracing[:racecar]
34
34
  end
35
35
 
36
- def process(span, event, _id, payload)
36
+ def on_start(span, event, _id, payload)
37
37
  span.service = configuration[:service_name]
38
38
  span.resource = payload[:consumer_class]
39
39
 
@@ -14,6 +14,15 @@ module Datadog
14
14
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RAILS_ANALYTICS_SAMPLE_RATE'
15
15
  ENV_DISABLE = 'DISABLE_DATADOG_RAILS'
16
16
 
17
+ SPAN_RUNNER_FILE = 'rails.runner.file'
18
+ SPAN_RUNNER_INLINE = 'rails.runner.inline'
19
+ SPAN_RUNNER_STDIN = 'rails.runner.stdin'
20
+ TAG_COMPONENT = 'rails'
21
+ TAG_OPERATION_FILE = 'runner.file'
22
+ TAG_OPERATION_INLINE = 'runner.inline'
23
+ TAG_OPERATION_STDIN = 'runner.stdin'
24
+ TAG_RUNNER_SOURCE = 'source'
25
+
17
26
  # @!visibility private
18
27
  MINIMUM_VERSION = Gem::Version.new('4')
19
28
  end
@@ -5,6 +5,7 @@ require_relative '../rack/middlewares'
5
5
  require_relative 'framework'
6
6
  require_relative 'log_injection'
7
7
  require_relative 'middlewares'
8
+ require_relative 'runner'
8
9
  require_relative 'utils'
9
10
  require_relative '../semantic_logger/patcher'
10
11
 
@@ -28,6 +29,7 @@ module Datadog
28
29
  def patch
29
30
  patch_before_initialize
30
31
  patch_after_initialize
32
+ patch_rails_runner
31
33
  end
32
34
 
33
35
  def patch_before_initialize
@@ -81,6 +83,11 @@ module Datadog
81
83
  def setup_tracer
82
84
  Contrib::Rails::Framework.setup
83
85
  end
86
+
87
+ # Instruments the `bin/rails runner` command.
88
+ def patch_rails_runner
89
+ ::Rails::Command.singleton_class.prepend(Command) if defined?(::Rails::Command)
90
+ end
84
91
  end
85
92
  end
86
93
  end