datadog 2.34.0 → 2.35.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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +75 -6
  3. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +2 -15
  4. data/ext/datadog_profiling_native_extension/stack_recorder.c +6 -11
  5. data/lib/datadog/ai_guard/configuration.rb +1 -0
  6. data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +53 -39
  7. data/lib/datadog/ai_guard/evaluation.rb +6 -1
  8. data/lib/datadog/ai_guard/ext.rb +12 -1
  9. data/lib/datadog/appsec/api_security/route_extractor.rb +3 -0
  10. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +9 -40
  11. data/lib/datadog/appsec/default_header_tags.rb +48 -0
  12. data/lib/datadog/core/configuration/settings.rb +10 -6
  13. data/lib/datadog/core/environment/process.rb +4 -2
  14. data/lib/datadog/core/utils/{array.rb → enumerable_compat.rb} +2 -2
  15. data/lib/datadog/profiling/collectors/thread_context.rb +0 -4
  16. data/lib/datadog/profiling/component.rb +3 -11
  17. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +3 -2
  18. data/lib/datadog/profiling/stack_recorder.rb +0 -4
  19. data/lib/datadog/symbol_database/extractor.rb +3 -3
  20. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -1
  21. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -1
  22. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -1
  23. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -1
  24. data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
  25. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +1 -0
  26. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +4 -1
  27. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +4 -1
  28. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -1
  29. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -1
  30. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -1
  31. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -1
  32. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -1
  33. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -1
  34. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -0
  35. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -0
  36. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -0
  37. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -0
  38. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -0
  39. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
  40. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
  41. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -0
  42. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
  43. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +1 -0
  44. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -0
  45. data/lib/datadog/tracing/contrib/excon/middleware.rb +1 -0
  46. data/lib/datadog/tracing/contrib/ext.rb +3 -0
  47. data/lib/datadog/tracing/contrib/faraday/middleware.rb +1 -0
  48. data/lib/datadog/tracing/contrib/grape/endpoint.rb +3 -0
  49. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +1 -0
  50. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -0
  51. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -0
  52. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
  53. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -0
  54. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -0
  55. data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -0
  56. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +1 -0
  57. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -0
  58. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -0
  59. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
  60. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -0
  61. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +1 -0
  62. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -0
  63. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +2 -2
  64. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +1 -0
  65. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -0
  66. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +3 -0
  67. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +2 -2
  68. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
  69. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -0
  70. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +23 -0
  71. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -0
  72. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +2 -0
  73. data/lib/datadog/tracing/contrib/rails/runner.rb +2 -0
  74. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -2
  75. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +2 -0
  76. data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -0
  77. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +1 -0
  78. data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
  79. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -1
  80. data/lib/datadog/tracing/contrib/sequel/database.rb +1 -0
  81. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -0
  82. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -0
  83. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +1 -0
  84. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
  85. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
  86. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
  87. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
  88. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
  89. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +3 -2
  90. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
  91. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +1 -0
  92. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -0
  93. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
  94. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +1 -0
  95. data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +1 -1
  96. data/lib/datadog/tracing/metadata/ext.rb +7 -0
  97. data/lib/datadog/tracing/tracer.rb +3 -0
  98. data/lib/datadog/tracing/transport/traces.rb +2 -2
  99. data/lib/datadog/version.rb +1 -1
  100. metadata +8 -9
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../utils/quantization/hash'
3
+ require_relative '../utils/quantization/hash_formatter'
4
4
 
5
5
  module Datadog
6
6
  module Tracing
@@ -20,11 +20,11 @@ module Datadog
20
20
  # returns a formatted and normalized query
21
21
  def query_builder(command_name, database_name, command)
22
22
  # always exclude the command name
23
- options = Contrib::Utils::Quantization::Hash.merge_options(quantization_options, exclude: [command_name.to_s])
23
+ options = Contrib::Utils::Quantization::HashFormatter.merge_options(quantization_options, exclude: [command_name.to_s])
24
24
 
25
25
  # quantized statements keys are strings to avoid leaking Symbols in older Rubies
26
26
  # as Symbols are not GC'ed in Rubies prior to 2.2
27
- base_info = Contrib::Utils::Quantization::Hash.format(
27
+ base_info = Contrib::Utils::Quantization::HashFormatter.format(
28
28
  {
29
29
  'operation' => command_name,
30
30
  'database' => database_name,
@@ -33,11 +33,11 @@ module Datadog
33
33
  options
34
34
  )
35
35
 
36
- base_info.merge(Contrib::Utils::Quantization::Hash.format(command, options))
36
+ base_info.merge(Contrib::Utils::Quantization::HashFormatter.format(command, options))
37
37
  end
38
38
 
39
39
  def quantization_options
40
- Contrib::Utils::Quantization::Hash.merge_options(DEFAULT_OPTIONS, configuration[:quantize])
40
+ Contrib::Utils::Quantization::HashFormatter.merge_options(DEFAULT_OPTIONS, configuration[:quantize])
41
41
  end
42
42
 
43
43
  def configuration
@@ -30,6 +30,8 @@ module Datadog
30
30
  span = Tracing.trace(Ext::SPAN_COMMAND, service: service, type: Ext::SPAN_TYPE_COMMAND)
31
31
  set_span(event, span)
32
32
 
33
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
34
+
33
35
  # build a quantized Query using the Parser module
34
36
  query = MongoDB.query_builder(event.command_name, event.database_name, event.command)
35
37
  serialized_query = serialize_query(query)
@@ -24,6 +24,7 @@ module Datadog
24
24
  on_error = Datadog.configuration_for(self, :on_error) || datadog_configuration[:on_error]
25
25
 
26
26
  Tracing.trace(Ext::SPAN_QUERY, service: service, on_error: on_error) do |span, trace_op|
27
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
27
28
  span.resource = sql
28
29
  span.type = Tracing::Metadata::Ext::SQL::TYPE
29
30
 
@@ -34,6 +34,7 @@ module Datadog
34
34
  response = nil
35
35
  # rubocop:disable Metrics/BlockLength
36
36
  Tracing.trace('opensearch.query', service: datadog_configuration[:service_name]) do |span|
37
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
37
38
  # Set generic tags
38
39
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
39
40
  span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../utils/quantization/hash'
3
+ require_relative '../utils/quantization/hash_formatter'
4
4
 
5
5
  module Datadog
6
6
  module Tracing
@@ -41,7 +41,7 @@ module Datadog
41
41
  # Parse each statement and quantize them.
42
42
  statements.collect do |string|
43
43
  reserialize_json(string, options[:placeholder]) do |obj|
44
- Contrib::Utils::Quantization::Hash.format(obj, options)
44
+ Contrib::Utils::Quantization::HashFormatter.format(obj, options)
45
45
  end
46
46
  end.join("\n")
47
47
  end
@@ -109,6 +109,7 @@ module Datadog
109
109
  resource: resource,
110
110
  type: Tracing::Metadata::Ext::SQL::TYPE
111
111
  ) do |span, trace_op|
112
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
112
113
  annotate_span_with_query!(span, service)
113
114
  # Set analytics sample rate
114
115
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
@@ -23,6 +23,7 @@ module Datadog
23
23
  service: datadog_configuration[:service_name]
24
24
  ) do |span|
25
25
  begin
26
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
26
27
  decorate!(span, Ext::TAG_OPERATION_QUERY)
27
28
  span.resource = query
28
29
  span.type = Tracing::Metadata::Ext::SQL::TYPE
@@ -41,6 +42,7 @@ module Datadog
41
42
  service: datadog_configuration[:service_name]
42
43
  ) do |span|
43
44
  begin
45
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
44
46
  decorate!(span, Ext::TAG_OPERATION_QUERY)
45
47
  span.resource = query
46
48
  span.type = Tracing::Metadata::Ext::SQL::TYPE
@@ -59,6 +61,7 @@ module Datadog
59
61
  service: datadog_configuration[:service_name]
60
62
  ) do |span|
61
63
  begin
64
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
62
65
  decorate!(span, Ext::TAG_OPERATION_KILL)
63
66
  span.resource = Ext::SPAN_KILL
64
67
  span.type = Tracing::Metadata::Ext::AppTypes::TYPE_DB
@@ -18,6 +18,9 @@ module Datadog
18
18
  # The `service` mode propagates service configuration
19
19
  SERVICE = 'service'
20
20
 
21
+ # The `dynamic_service` mode propagates service configuration + DBM service hash
22
+ DYNAMIC_SERVICE = 'dynamic_service'
23
+
21
24
  # The `full` mode propagates service configuration + trace context
22
25
  FULL = 'full'
23
26
 
@@ -14,7 +14,7 @@ module Datadog
14
14
  end
15
15
 
16
16
  def service?
17
- mode == Ext::SERVICE
17
+ mode == Ext::SERVICE || mode == Ext::DYNAMIC_SERVICE
18
18
  end
19
19
 
20
20
  def full?
@@ -26,7 +26,7 @@ module Datadog
26
26
  end
27
27
 
28
28
  def inject_sql_basehash?
29
- inject_sql_basehash
29
+ inject_sql_basehash || mode == Ext::DYNAMIC_SERVICE
30
30
  end
31
31
  end
32
32
  end
@@ -16,6 +16,7 @@ module Datadog
16
16
  }
17
17
 
18
18
  Tracing.trace(Ext::SPAN_JOB, **trace_options) do |request_span|
19
+ request_span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
19
20
  request_span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
20
21
 
21
22
  request_span.resource = job.class.name.to_s
@@ -35,6 +35,7 @@ module Datadog
35
35
 
36
36
  def on_start(span, event, _id, payload)
37
37
  span.service = configuration[:service_name]
38
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
38
39
  span.resource = payload[:consumer_class]
39
40
 
40
41
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_MESSAGING_SYSTEM)
@@ -1,11 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'header_collection'
4
+
3
5
  module Datadog
4
6
  module Tracing
5
7
  module Contrib
6
8
  module Rack
7
9
  # Matches Rack-style headers with a matcher and sets matching headers into a span.
8
10
  module HeaderTagging
11
+ DATADOG_REQUEST_ATTRIBUTION_HEADERS = [
12
+ 'x-datadog-endpoint-scan',
13
+ 'x-datadog-security-test'
14
+ ].freeze
15
+
9
16
  def self.tag_request_headers(span, env, configuration)
10
17
  # Wrap env in a case-insensitive Rack-style accessor.
11
18
  headers = env.is_a?(Header::RequestHeaderCollection) ? env : Header::RequestHeaderCollection.new(env)
@@ -25,6 +32,7 @@ module Datadog
25
32
  end
26
33
 
27
34
  span.set_tags(tags)
35
+ tag_datadog_request_attribution_headers(span, headers)
28
36
  end
29
37
 
30
38
  def self.tag_response_headers(span, headers, configuration)
@@ -56,6 +64,21 @@ module Datadog
56
64
 
57
65
  span.set_tags(tags)
58
66
  end
67
+
68
+ # Datadog-originated requests use these headers for request attribution.
69
+ # They are tagged independently of user-configured header tagging so
70
+ # downstream systems can distinguish them from regular application traffic.
71
+ #
72
+ # @api private
73
+ private_class_method def self.tag_datadog_request_attribution_headers(span, headers)
74
+ DATADOG_REQUEST_ATTRIBUTION_HEADERS.each do |header|
75
+ header_value = headers.get(header)
76
+ next unless header_value
77
+
78
+ header_tag = Tracing::Metadata::Ext::HTTP::RequestHeaders.to_tag(header)
79
+ span.set_tag(header_tag, header_value)
80
+ end
81
+ end
59
82
  end
60
83
  end
61
84
  end
@@ -135,6 +135,7 @@ module Datadog
135
135
  # Otherwise, the getter method would delegate to its root span
136
136
  trace.resource = request_span.resource unless trace.resource_override?
137
137
 
138
+ request_span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
138
139
  request_span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
139
140
  request_span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_REQUEST)
140
141
  request_span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_SERVER)
@@ -32,12 +32,14 @@ module Datadog
32
32
 
33
33
  request_span = Tracing.trace(Ext::SPAN_HTTP_PROXY_REQUEST, **options)
34
34
 
35
+ request_span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT_HTTP_PROXY)
35
36
  request_span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT_HTTP_PROXY)
36
37
  request_span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_HTTP_PROXY_REQUEST)
37
38
  request_span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_PROXY)
38
39
 
39
40
  queue_span = Tracing.trace(Ext::SPAN_HTTP_PROXY_QUEUE, **options)
40
41
 
42
+ queue_span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT_HTTP_PROXY)
41
43
  queue_span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT_HTTP_PROXY)
42
44
  queue_span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_HTTP_PROXY_QUEUE)
43
45
  queue_span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_PROXY)
@@ -53,6 +53,7 @@ module Datadog
53
53
  name,
54
54
  service: Datadog.configuration.tracing[:rails][:service_name],
55
55
  tags: {
56
+ Tracing::Metadata::Ext::TAG_SVC_SRC => Ext::TAG_COMPONENT,
56
57
  Tracing::Metadata::Ext::TAG_COMPONENT => Ext::TAG_COMPONENT,
57
58
  Tracing::Metadata::Ext::TAG_OPERATION => operation,
58
59
  }
@@ -94,6 +95,7 @@ module Datadog
94
95
  service: Datadog.configuration.tracing[:rails][:service_name],
95
96
  resource: resource,
96
97
  tags: {
98
+ Tracing::Metadata::Ext::TAG_SVC_SRC => Ext::TAG_COMPONENT,
97
99
  Tracing::Metadata::Ext::TAG_COMPONENT => Ext::TAG_COMPONENT,
98
100
  Tracing::Metadata::Ext::TAG_OPERATION => operation,
99
101
  }
@@ -3,7 +3,7 @@
3
3
  require_relative '../../metadata/ext'
4
4
  require_relative '../analytics'
5
5
  require_relative 'ext'
6
- require_relative '../utils/quantization/hash'
6
+ require_relative '../utils/quantization/hash_formatter'
7
7
 
8
8
  module Datadog
9
9
  module Tracing
@@ -53,6 +53,7 @@ module Datadog
53
53
 
54
54
  def annotate_invoke!(span, args)
55
55
  span.resource = name
56
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
56
57
  # Set analytics sample rate
57
58
  if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
58
59
  Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
@@ -71,6 +72,7 @@ module Datadog
71
72
 
72
73
  def annotate_execute!(span, args)
73
74
  span.resource = name
75
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
74
76
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
75
77
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_EXECUTE)
76
78
  span.set_tag(Ext::TAG_EXECUTE_ARGS, quantize_args(args.to_hash)) unless args.nil?
@@ -80,7 +82,7 @@ module Datadog
80
82
 
81
83
  def quantize_args(args)
82
84
  quantize_options = configuration[:quantize][:args]
83
- Contrib::Utils::Quantization::Hash.format(args, quantize_options)
85
+ Contrib::Utils::Quantization::HashFormatter.format(args, quantize_options)
84
86
  end
85
87
 
86
88
  def enabled?
@@ -26,6 +26,7 @@ module Datadog
26
26
  class << self
27
27
  def call(client, command, service_name, command_args)
28
28
  Tracing.trace(Redis::Ext::SPAN_COMMAND, type: Redis::Ext::TYPE, service: service_name) do |span|
29
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Redis::Ext::TAG_COMPONENT)
29
30
  raw_command = get_command(command, true)
30
31
  span.resource = command_args ? raw_command : get_command(command, false)
31
32
 
@@ -37,6 +38,7 @@ module Datadog
37
38
 
38
39
  def call_pipelined(client, commands, service_name, command_args)
39
40
  Tracing.trace(Redis::Ext::SPAN_COMMAND, type: Redis::Ext::TYPE, service: service_name) do |span|
41
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Redis::Ext::TAG_COMPONENT)
40
42
  raw_command = get_pipeline_commands(commands, true)
41
43
  span.resource = command_args ? raw_command : get_pipeline_commands(commands, false)
42
44
 
@@ -35,6 +35,7 @@ module Datadog
35
35
  return yield unless datadog_configuration && Tracing.enabled?
36
36
 
37
37
  Tracing.trace(Ext::SPAN_JOB, **span_options) do |span|
38
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
38
39
  span.resource = args.first.is_a?(Hash) && args.first['job_class'] || name
39
40
  span.type = Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
40
41
 
@@ -37,6 +37,7 @@ module Datadog
37
37
  end
38
38
 
39
39
  def datadog_tag_request(uri, span)
40
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
40
41
  span.resource = method.to_s.upcase
41
42
 
42
43
  if datadog_configuration[:peer_service]
@@ -7,6 +7,7 @@ module Datadog
7
7
  # Roda integration constants
8
8
  module Ext
9
9
  APP = 'roda'
10
+ TAG_COMPONENT = 'roda'
10
11
  ENV_ENABLED = 'DD_TRACE_RODA_ENABLED'
11
12
  # @!visibility private
12
13
  ENV_ANALYTICS_ENABLED = 'DD_RODA_ANALYTICS_ENABLED'
@@ -25,7 +25,10 @@ module Datadog
25
25
  begin
26
26
  request_method = request.request_method.to_s.upcase
27
27
 
28
- span.service = configuration[:service_name] if configuration[:service_name]
28
+ if configuration[:service_name]
29
+ span.service = configuration[:service_name]
30
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
31
+ end
29
32
 
30
33
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_INBOUND
31
34
 
@@ -29,6 +29,7 @@ module Datadog
29
29
  '',
30
30
  adapter_name
31
31
  )
32
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
32
33
  span.resource = opts[:query]
33
34
  span.type = Tracing::Metadata::Ext::SQL::TYPE
34
35
  Utils.set_common_tags(span, self)
@@ -46,6 +46,7 @@ module Datadog
46
46
  '',
47
47
  adapter_name
48
48
  )
49
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
49
50
  span.resource = opts[:query]
50
51
  span.type = Tracing::Metadata::Ext::SQL::TYPE
51
52
  Utils.set_common_tags(span, db)
@@ -20,6 +20,7 @@ module Datadog
20
20
  type: Tracing::Metadata::Ext::AppTypes::TYPE_WORKER,
21
21
  on_error: @on_error
22
22
  ) do |span|
23
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
23
24
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_MESSAGING_SYSTEM)
24
25
 
25
26
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -24,6 +24,7 @@ module Datadog
24
24
  resource = job_resource(job)
25
25
 
26
26
  Datadog::Tracing.trace(Ext::SPAN_PUSH, service: @sidekiq_service) do |span, trace_op|
27
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
27
28
  if Tracing::Distributed::PropagationPolicy.enabled?(
28
29
  global_config: configuration,
29
30
  trace: trace_op
@@ -13,6 +13,7 @@ module Datadog
13
13
  configuration = Datadog.configuration.tracing[:sidekiq]
14
14
 
15
15
  Datadog::Tracing.trace(Ext::SPAN_HEARTBEAT, service: configuration[:service_name]) do |span|
16
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
16
17
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
17
18
 
18
19
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -38,6 +39,7 @@ module Datadog
38
39
  configuration = Datadog.configuration.tracing[:sidekiq]
39
40
 
40
41
  Datadog::Tracing.trace(Ext::SPAN_HEARTBEAT, service: configuration[:service_name]) do |span|
42
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
41
43
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
42
44
 
43
45
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -13,6 +13,7 @@ module Datadog
13
13
  configuration = Datadog.configuration.tracing[:sidekiq]
14
14
 
15
15
  Datadog::Tracing.trace(Ext::SPAN_JOB_FETCH, service: configuration[:service_name]) do |span|
16
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
16
17
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
17
18
 
18
19
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -11,6 +11,7 @@ module Datadog
11
11
  configuration = Datadog.configuration.tracing[:sidekiq]
12
12
 
13
13
  Datadog::Tracing.trace(Ext::SPAN_REDIS_INFO, service: configuration[:service_name]) do |span|
14
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
14
15
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
15
16
 
16
17
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -12,6 +12,7 @@ module Datadog
12
12
  configuration = Datadog.configuration.tracing[:sidekiq]
13
13
 
14
14
  Datadog::Tracing.trace(Ext::SPAN_SCHEDULED_PUSH, service: configuration[:service_name]) do |span|
15
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
15
16
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
16
17
 
17
18
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -34,6 +35,7 @@ module Datadog
34
35
  configuration = Datadog.configuration.tracing[:sidekiq]
35
36
 
36
37
  Datadog::Tracing.trace(Ext::SPAN_SCHEDULED_WAIT, service: configuration[:service_name]) do |span|
38
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
37
39
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
38
40
 
39
41
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -11,6 +11,7 @@ module Datadog
11
11
  configuration = Datadog.configuration.tracing[:sidekiq]
12
12
 
13
13
  Datadog::Tracing.trace(Ext::SPAN_STOP, service: configuration[:service_name]) do |span|
14
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
14
15
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
15
16
 
16
17
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -4,7 +4,7 @@ require_relative '../../metadata/ext'
4
4
  require_relative '../analytics'
5
5
  require_relative 'ext'
6
6
  require_relative 'utils'
7
- require_relative '../utils/quantization/hash'
7
+ require_relative '../utils/quantization/hash_formatter'
8
8
  require_relative 'distributed/propagation'
9
9
 
10
10
  module Datadog
@@ -36,6 +36,7 @@ module Datadog
36
36
  type: Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER,
37
37
  on_error: @on_error
38
38
  ) do |span|
39
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
39
40
  span.resource = resource
40
41
 
41
42
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -68,7 +69,7 @@ module Datadog
68
69
 
69
70
  args = job['args']
70
71
  if args && !args.empty?
71
- span.set_tag(Ext::TAG_JOB_ARGS, Contrib::Utils::Quantization::Hash.format(args, (@quantize[:args] || {})))
72
+ span.set_tag(Ext::TAG_JOB_ARGS, Contrib::Utils::Quantization::HashFormatter.format(args, (@quantize[:args] || {})))
72
73
  end
73
74
 
74
75
  yield
@@ -57,6 +57,7 @@ module Datadog
57
57
  type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND,
58
58
  resource: "#{request.request_method} #{datadog_route}",
59
59
  ) do |span, trace|
60
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
60
61
  span.set_tag(Ext::TAG_APP_NAME, settings.name || settings.superclass.name)
61
62
  span.set_tag(Ext::TAG_ROUTE_PATH, datadog_route)
62
63
 
@@ -28,6 +28,7 @@ module Datadog
28
28
  service: configuration[:service_name],
29
29
  type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND
30
30
  ) do |span|
31
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
31
32
  # this is kept nil until we set a correct one (either in the route or with a fallback in the ensure below)
32
33
  # the nil signals that there's no good one yet and is also seen by profiler, when sampling the resource
33
34
  span.resource = nil
@@ -22,6 +22,7 @@ module Datadog
22
22
  }
23
23
 
24
24
  Tracing.trace(Ext::SPAN_JOB, **trace_options) do |request_span|
25
+ request_span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
25
26
  request_span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_MESSAGING_SYSTEM)
26
27
 
27
28
  request_span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -86,6 +86,7 @@ module Datadog
86
86
 
87
87
  def __with_instrumentation(name)
88
88
  Datadog::Tracing.trace(name, service: datadog_configuration[:service_name]) do |span|
89
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
89
90
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
90
91
  span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
91
92
  span.set_tag(Ext::TAG_QUEUE, to_s)
@@ -23,6 +23,7 @@ module Datadog
23
23
  service = Datadog.configuration_for(self, :service_name) || datadog_configuration[:service_name]
24
24
 
25
25
  Tracing.trace(Ext::SPAN_QUERY, service: service) do |span, trace_op|
26
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
26
27
  span.resource = sql
27
28
  span.type = Tracing::Metadata::Ext::SQL::TYPE
28
29
 
@@ -6,7 +6,7 @@ module Datadog
6
6
  module Utils
7
7
  module Quantization
8
8
  # Quantization for Hash
9
- module Hash
9
+ module HashFormatter
10
10
  PLACEHOLDER = '?'
11
11
  EXCLUDE_KEYS = [].freeze
12
12
  SHOW_KEYS = [].freeze
@@ -36,6 +36,13 @@ module Datadog
36
36
  # Set to the global service name when a span's service is overridden
37
37
  TAG_BASE_SERVICE = '_dd.base_service'
38
38
 
39
+ # Set to the source of a span's service override: the component name for Datadog-instrumented spans
40
+ # (e.g. 'redis', 'pg'), or {SVC_SRC_MANUAL} for manually-instrumented spans
41
+ TAG_SVC_SRC = '_dd.svc_src'
42
+
43
+ # Value for {TAG_SVC_SRC} indicating that a span was manually instrumented via the Tracing API
44
+ SVC_SRC_MANUAL = 'm'
45
+
39
46
  # Defines constants for trace analytics
40
47
  # @public_api
41
48
  module Analytics
@@ -420,6 +420,9 @@ module Datadog
420
420
  events.span_before_finish.subscribe do |event_span_op, _event_trace_op|
421
421
  if event_span_op.service && event_span_op.service != @default_service
422
422
  event_span_op.set_tag(Tracing::Metadata::Ext::TAG_BASE_SERVICE, @default_service)
423
+ event_span_op.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Tracing::Metadata::Ext::SVC_SRC_MANUAL) unless event_span_op.get_tag(Tracing::Metadata::Ext::TAG_SVC_SRC)
424
+ else
425
+ event_span_op.send(:meta).delete(Tracing::Metadata::Ext::TAG_SVC_SRC)
423
426
  end
424
427
  end
425
428
 
@@ -4,7 +4,7 @@ require_relative '../../core/chunker'
4
4
  require_relative '../../core/transport/parcel'
5
5
  require_relative '../../core/transport/request'
6
6
  require_relative '../../core/transport/transport'
7
- require_relative '../../core/utils/array'
7
+ require_relative '../../core/utils/enumerable_compat'
8
8
  require_relative 'http/client'
9
9
  require_relative 'serializable_trace'
10
10
  require_relative 'trace_formatter'
@@ -62,7 +62,7 @@ module Datadog
62
62
  # @return [Enumerable[Array[Bytes,Integer]]] list of encoded chunks: each containing a byte array and
63
63
  # number of traces
64
64
  def encode_in_chunks(traces)
65
- encoded_traces = Core::Utils::Array.filter_map(traces) do |trace|
65
+ encoded_traces = Core::Utils::EnumerableCompat.filter_map(traces) do |trace|
66
66
  encode_one(trace)
67
67
  end
68
68
 
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 34
6
+ MINOR = 35
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil