ddtrace 1.6.1 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -2
  3. data/ext/ddtrace_profiling_loader/extconf.rb +1 -1
  4. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +66 -6
  5. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +51 -54
  6. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +11 -13
  7. data/ext/ddtrace_profiling_native_extension/extconf.rb +1 -1
  8. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +3 -2
  9. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +96 -0
  10. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +7 -0
  11. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +70 -18
  12. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +1 -0
  13. data/lib/datadog/appsec/assets/blocked.html +98 -3
  14. data/lib/datadog/appsec/assets/blocked.json +1 -0
  15. data/lib/datadog/appsec/assets/blocked.text +5 -0
  16. data/lib/datadog/appsec/assets/waf_rules/recommended.json +35 -46
  17. data/lib/datadog/appsec/assets/waf_rules/risky.json +1 -1
  18. data/lib/datadog/appsec/assets/waf_rules/strict.json +46 -1
  19. data/lib/datadog/appsec/assets.rb +2 -2
  20. data/lib/datadog/appsec/configuration/settings.rb +6 -0
  21. data/lib/datadog/appsec/configuration.rb +4 -0
  22. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +4 -8
  23. data/lib/datadog/appsec/contrib/rack/request.rb +17 -0
  24. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +2 -2
  25. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +2 -2
  26. data/lib/datadog/appsec/contrib/rails/patcher.rb +3 -6
  27. data/lib/datadog/appsec/contrib/sinatra/ext.rb +1 -0
  28. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +1 -1
  29. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -8
  30. data/lib/datadog/appsec/extensions.rb +10 -0
  31. data/lib/datadog/appsec/processor.rb +18 -0
  32. data/lib/datadog/appsec/response.rb +54 -0
  33. data/lib/datadog/core/runtime/ext.rb +1 -1
  34. data/lib/datadog/opentracer/distributed_headers.rb +5 -7
  35. data/lib/datadog/opentracer/rack_propagator.rb +0 -3
  36. data/lib/datadog/opentracer/text_map_propagator.rb +5 -7
  37. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +10 -4
  38. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +4 -0
  39. data/lib/datadog/profiling/collectors/old_stack.rb +7 -0
  40. data/lib/datadog/profiling/exporter.rb +5 -0
  41. data/lib/datadog/profiling/old_recorder.rb +8 -0
  42. data/lib/datadog/profiling/profiler.rb +7 -0
  43. data/lib/datadog/profiling/scheduler.rb +4 -7
  44. data/lib/datadog/profiling/stack_recorder.rb +22 -0
  45. data/lib/datadog/profiling/tasks/setup.rb +0 -7
  46. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +4 -0
  47. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +2 -1
  48. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -12
  49. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +27 -0
  50. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +38 -0
  51. data/lib/datadog/tracing/contrib/grpc/patcher.rb +0 -2
  52. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +32 -0
  53. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +33 -0
  54. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -0
  55. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
  56. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -0
  57. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -0
  58. data/lib/datadog/tracing/contrib/que/tracer.rb +2 -0
  59. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +4 -1
  60. data/lib/datadog/tracing/contrib/racecar/events/message.rb +4 -1
  61. data/lib/datadog/tracing/contrib/rack/middlewares.rb +2 -0
  62. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +2 -0
  63. data/lib/datadog/tracing/contrib/resque/resque_job.rb +2 -0
  64. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -0
  65. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +5 -0
  66. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -0
  67. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +2 -0
  68. data/lib/datadog/tracing/distributed/b3.rb +66 -0
  69. data/lib/datadog/tracing/distributed/b3_single.rb +66 -0
  70. data/lib/datadog/tracing/distributed/datadog.rb +153 -0
  71. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -0
  72. data/lib/datadog/tracing/distributed/fetcher.rb +30 -0
  73. data/lib/datadog/tracing/distributed/headers/ext.rb +18 -16
  74. data/lib/datadog/tracing/distributed/helpers.rb +7 -6
  75. data/lib/datadog/tracing/distributed/propagation.rb +127 -0
  76. data/lib/datadog/tracing/propagation/http.rb +3 -106
  77. data/lib/datadog/tracing/trace_segment.rb +1 -1
  78. data/lib/ddtrace/transport/trace_formatter.rb +2 -5
  79. data/lib/ddtrace/version.rb +2 -2
  80. metadata +19 -14
  81. data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
  82. data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
  83. data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -144
  84. data/lib/datadog/tracing/distributed/headers/parser.rb +0 -37
  85. data/lib/datadog/tracing/distributed/metadata/b3.rb +0 -55
  86. data/lib/datadog/tracing/distributed/metadata/b3_single.rb +0 -66
  87. data/lib/datadog/tracing/distributed/metadata/datadog.rb +0 -73
  88. data/lib/datadog/tracing/distributed/metadata/parser.rb +0 -34
  89. data/lib/datadog/tracing/propagation/grpc.rb +0 -98
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ddtrace
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.7.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: 2022-11-16 00:00:00.000000000 Z
11
+ date: 2022-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: 0.10.16
34
34
  - - "<="
35
35
  - !ruby/object:Gem::Version
36
- version: 0.10.17
36
+ version: 0.10.18
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: 0.10.16
44
44
  - - "<="
45
45
  - !ruby/object:Gem::Version
46
- version: 0.10.17
46
+ version: 0.10.18
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: libddwaf
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -114,11 +114,15 @@ files:
114
114
  - ext/ddtrace_profiling_native_extension/profiling.c
115
115
  - ext/ddtrace_profiling_native_extension/ruby_helpers.c
116
116
  - ext/ddtrace_profiling_native_extension/ruby_helpers.h
117
+ - ext/ddtrace_profiling_native_extension/setup_signal_handler.c
118
+ - ext/ddtrace_profiling_native_extension/setup_signal_handler.h
117
119
  - ext/ddtrace_profiling_native_extension/stack_recorder.c
118
120
  - ext/ddtrace_profiling_native_extension/stack_recorder.h
119
121
  - lib/datadog/appsec.rb
120
122
  - lib/datadog/appsec/assets.rb
121
123
  - lib/datadog/appsec/assets/blocked.html
124
+ - lib/datadog/appsec/assets/blocked.json
125
+ - lib/datadog/appsec/assets/blocked.text
122
126
  - lib/datadog/appsec/assets/waf_rules/README.md
123
127
  - lib/datadog/appsec/assets/waf_rules/recommended.json
124
128
  - lib/datadog/appsec/assets/waf_rules/risky.json
@@ -168,6 +172,7 @@ files:
168
172
  - lib/datadog/appsec/reactive/engine.rb
169
173
  - lib/datadog/appsec/reactive/operation.rb
170
174
  - lib/datadog/appsec/reactive/subscriber.rb
175
+ - lib/datadog/appsec/response.rb
171
176
  - lib/datadog/ci.rb
172
177
  - lib/datadog/ci/configuration/components.rb
173
178
  - lib/datadog/ci/configuration/settings.rb
@@ -492,6 +497,8 @@ files:
492
497
  - lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb
493
498
  - lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb
494
499
  - lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb
500
+ - lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb
501
+ - lib/datadog/tracing/contrib/grpc/distributed/propagation.rb
495
502
  - lib/datadog/tracing/contrib/grpc/ext.rb
496
503
  - lib/datadog/tracing/contrib/grpc/integration.rb
497
504
  - lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb
@@ -506,6 +513,8 @@ files:
506
513
  - lib/datadog/tracing/contrib/hanami/router_tracing.rb
507
514
  - lib/datadog/tracing/contrib/http/circuit_breaker.rb
508
515
  - lib/datadog/tracing/contrib/http/configuration/settings.rb
516
+ - lib/datadog/tracing/contrib/http/distributed/fetcher.rb
517
+ - lib/datadog/tracing/contrib/http/distributed/propagation.rb
509
518
  - lib/datadog/tracing/contrib/http/ext.rb
510
519
  - lib/datadog/tracing/contrib/http/instrumentation.rb
511
520
  - lib/datadog/tracing/contrib/http/integration.rb
@@ -689,17 +698,14 @@ files:
689
698
  - lib/datadog/tracing/contrib/utils/quantization/hash.rb
690
699
  - lib/datadog/tracing/contrib/utils/quantization/http.rb
691
700
  - lib/datadog/tracing/correlation.rb
701
+ - lib/datadog/tracing/distributed/b3.rb
702
+ - lib/datadog/tracing/distributed/b3_single.rb
703
+ - lib/datadog/tracing/distributed/datadog.rb
692
704
  - lib/datadog/tracing/distributed/datadog_tags_codec.rb
693
- - lib/datadog/tracing/distributed/headers/b3.rb
694
- - lib/datadog/tracing/distributed/headers/b3_single.rb
695
- - lib/datadog/tracing/distributed/headers/datadog.rb
705
+ - lib/datadog/tracing/distributed/fetcher.rb
696
706
  - lib/datadog/tracing/distributed/headers/ext.rb
697
- - lib/datadog/tracing/distributed/headers/parser.rb
698
707
  - lib/datadog/tracing/distributed/helpers.rb
699
- - lib/datadog/tracing/distributed/metadata/b3.rb
700
- - lib/datadog/tracing/distributed/metadata/b3_single.rb
701
- - lib/datadog/tracing/distributed/metadata/datadog.rb
702
- - lib/datadog/tracing/distributed/metadata/parser.rb
708
+ - lib/datadog/tracing/distributed/propagation.rb
703
709
  - lib/datadog/tracing/event.rb
704
710
  - lib/datadog/tracing/flush.rb
705
711
  - lib/datadog/tracing/metadata.rb
@@ -710,7 +716,6 @@ files:
710
716
  - lib/datadog/tracing/pipeline.rb
711
717
  - lib/datadog/tracing/pipeline/span_filter.rb
712
718
  - lib/datadog/tracing/pipeline/span_processor.rb
713
- - lib/datadog/tracing/propagation/grpc.rb
714
719
  - lib/datadog/tracing/propagation/http.rb
715
720
  - lib/datadog/tracing/runtime/metrics.rb
716
721
  - lib/datadog/tracing/sampling/all_sampler.rb
@@ -796,7 +801,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
796
801
  - !ruby/object:Gem::Version
797
802
  version: 2.0.0
798
803
  requirements: []
799
- rubygems_version: 3.3.7
804
+ rubygems_version: 3.1.6
800
805
  signing_key:
801
806
  specification_version: 4
802
807
  summary: Datadog tracing code for your Ruby applications
@@ -1,55 +0,0 @@
1
- # typed: true
2
-
3
- require_relative 'parser'
4
- require_relative '../helpers'
5
- require_relative 'ext'
6
- require_relative '../../trace_digest'
7
-
8
- module Datadog
9
- module Tracing
10
- module Distributed
11
- module Headers
12
- # B3 provides helpers to inject or extract headers for B3 style headers
13
- module B3
14
- include Ext
15
-
16
- def self.inject!(digest, env)
17
- return if digest.nil?
18
-
19
- # DEV: We need these to be hex encoded
20
- env[B3_HEADER_TRACE_ID] = digest.trace_id.to_s(16)
21
- env[B3_HEADER_SPAN_ID] = digest.span_id.to_s(16)
22
-
23
- if digest.trace_sampling_priority
24
- sampling_priority = Helpers.clamp_sampling_priority(
25
- digest.trace_sampling_priority
26
- )
27
- env[B3_HEADER_SAMPLED] = sampling_priority.to_s
28
- end
29
-
30
- env
31
- end
32
-
33
- def self.extract(env)
34
- # Extract values from headers
35
- # DEV: B3 doesn't have "origin"
36
- headers = Parser.new(env)
37
- trace_id = headers.id(B3_HEADER_TRACE_ID, 16)
38
- span_id = headers.id(B3_HEADER_SPAN_ID, 16)
39
- # We don't need to try and convert sampled since B3 supports 0/1 (AUTO_REJECT/AUTO_KEEP)
40
- sampling_priority = headers.number(B3_HEADER_SAMPLED)
41
-
42
- # Return early if this propagation is not valid
43
- return unless trace_id && span_id
44
-
45
- TraceDigest.new(
46
- trace_id: trace_id,
47
- span_id: span_id,
48
- trace_sampling_priority: sampling_priority
49
- )
50
- end
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,67 +0,0 @@
1
- # typed: true
2
-
3
- require_relative 'parser'
4
- require_relative '../helpers'
5
- require_relative 'ext'
6
- require_relative '../../trace_digest'
7
-
8
- module Datadog
9
- module Tracing
10
- module Distributed
11
- module Headers
12
- # B3Single provides helpers to inject or extract headers for B3 single header style headers
13
- module B3Single
14
- include Ext
15
-
16
- def self.inject!(digest, env)
17
- return if digest.nil?
18
-
19
- # Header format:
20
- # b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}
21
- # https://github.com/apache/incubator-zipkin-b3-propagation/tree/7c6e9f14d6627832bd80baa87ac7dabee7be23cf#single-header
22
- # DEV: `{SamplingState}` and `{ParentSpanId`}` are optional
23
-
24
- # DEV: We need these to be hex encoded
25
- header = "#{digest.trace_id.to_s(16)}-#{digest.span_id.to_s(16)}"
26
-
27
- if digest.trace_sampling_priority
28
- sampling_priority = Helpers.clamp_sampling_priority(
29
- digest.trace_sampling_priority
30
- )
31
- header += "-#{sampling_priority}"
32
- end
33
-
34
- env[B3_HEADER_SINGLE] = header
35
-
36
- env
37
- end
38
-
39
- def self.extract(env)
40
- # Header format:
41
- # b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}
42
- # https://github.com/apache/incubator-zipkin-b3-propagation/tree/7c6e9f14d6627832bd80baa87ac7dabee7be23cf#single-header
43
- # DEV: `{SamplingState}` and `{ParentSpanId`}` are optional
44
-
45
- headers = Parser.new(env)
46
- value = headers.header(B3_HEADER_SINGLE)
47
- return if value.nil?
48
-
49
- parts = value.split('-')
50
- trace_id = Helpers.value_to_id(parts[0], 16) unless parts.empty?
51
- span_id = Helpers.value_to_id(parts[1], 16) if parts.length > 1
52
- sampling_priority = Helpers.value_to_number(parts[2]) if parts.length > 2
53
-
54
- # Return early if this propagation is not valid
55
- return unless trace_id && span_id
56
-
57
- TraceDigest.new(
58
- span_id: span_id,
59
- trace_id: trace_id,
60
- trace_sampling_priority: sampling_priority
61
- )
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end
@@ -1,144 +0,0 @@
1
- # frozen_string_literal: true
2
- # typed: true
3
-
4
- require_relative 'parser'
5
- require_relative 'ext'
6
- require_relative '../../metadata/ext'
7
- require_relative '../../trace_digest'
8
- require_relative '../datadog_tags_codec'
9
-
10
- module Datadog
11
- module Tracing
12
- module Distributed
13
- module Headers
14
- # Datadog provides helpers to inject or extract headers for Datadog style headers
15
- module Datadog
16
- class << self
17
- include Ext
18
-
19
- def inject!(digest, env)
20
- return if digest.nil?
21
-
22
- env[HTTP_HEADER_TRACE_ID] = digest.trace_id.to_s
23
- env[HTTP_HEADER_PARENT_ID] = digest.span_id.to_s
24
- env[HTTP_HEADER_SAMPLING_PRIORITY] = digest.trace_sampling_priority.to_s if digest.trace_sampling_priority
25
- env[HTTP_HEADER_ORIGIN] = digest.trace_origin.to_s unless digest.trace_origin.nil?
26
-
27
- inject_tags(digest, env)
28
-
29
- env
30
- end
31
-
32
- def extract(env)
33
- # Extract values from headers
34
- headers = Parser.new(env)
35
- trace_id = headers.id(HTTP_HEADER_TRACE_ID)
36
- parent_id = headers.id(HTTP_HEADER_PARENT_ID)
37
- origin = headers.header(HTTP_HEADER_ORIGIN)
38
- sampling_priority = headers.number(HTTP_HEADER_SAMPLING_PRIORITY)
39
-
40
- # Return early if this propagation is not valid
41
- # DEV: To be valid we need to have a trace id and a parent id
42
- # or when it is a synthetics trace, just the trace id.
43
- # DEV: `Parser#id` will not return 0
44
- return unless (trace_id && parent_id) || (origin && trace_id)
45
-
46
- trace_distributed_tags = extract_tags(headers)
47
-
48
- # Return new trace headers
49
- TraceDigest.new(
50
- span_id: parent_id,
51
- trace_id: trace_id,
52
- trace_origin: origin,
53
- trace_sampling_priority: sampling_priority,
54
- trace_distributed_tags: trace_distributed_tags,
55
- )
56
- end
57
-
58
- private
59
-
60
- # Export trace distributed tags through the `x-datadog-tags` header.
61
- #
62
- # DEV: This method accesses global state (the active trace) to record its error state as a trace tag.
63
- # DEV: This means errors cannot be reported if there's not active span.
64
- # DEV: Ideally, we'd have a dedicated error reporting stream for all of ddtrace.
65
- # DEV: The same comment applies to the {.extract_tags}.
66
- def inject_tags(digest, env)
67
- return if digest.trace_distributed_tags.nil? || digest.trace_distributed_tags.empty?
68
-
69
- if ::Datadog.configuration.tracing.x_datadog_tags_max_length <= 0
70
- active_trace = Tracing.active_trace
71
- active_trace.set_tag('_dd.propagation_error', 'disabled') if active_trace
72
- return
73
- end
74
-
75
- encoded_tags = DatadogTagsCodec.encode(digest.trace_distributed_tags)
76
-
77
- if encoded_tags.size > ::Datadog.configuration.tracing.x_datadog_tags_max_length
78
- active_trace = Tracing.active_trace
79
- active_trace.set_tag('_dd.propagation_error', 'inject_max_size') if active_trace
80
-
81
- ::Datadog.logger.warn(
82
- "Failed to inject x-datadog-tags: tags are too large (size:#{encoded_tags.size} " \
83
- "limit:#{::Datadog.configuration.tracing.x_datadog_tags_max_length}). This limit can be configured " \
84
- 'through the DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH environment variable.'
85
- )
86
- return
87
- end
88
-
89
- env[HTTP_HEADER_TAGS] = encoded_tags
90
- rescue => e
91
- active_trace = Tracing.active_trace
92
- active_trace.set_tag('_dd.propagation_error', 'encoding_error') if active_trace
93
- ::Datadog.logger.warn(
94
- "Failed to inject x-datadog-tags: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
95
- )
96
- end
97
-
98
- # Import `x-datadog-tags` header tags as trace distributed tags.
99
- # Only tags that have the `_dd.p.` prefix are processed.
100
- def extract_tags(headers)
101
- tags_header = headers.header(HTTP_HEADER_TAGS)
102
- return unless tags_header
103
-
104
- if ::Datadog.configuration.tracing.x_datadog_tags_max_length <= 0
105
- active_trace = Tracing.active_trace
106
- active_trace.set_tag('_dd.propagation_error', 'disabled') if active_trace
107
- return
108
- end
109
-
110
- if tags_header.size > ::Datadog.configuration.tracing.x_datadog_tags_max_length
111
- active_trace = Tracing.active_trace
112
- active_trace.set_tag('_dd.propagation_error', 'extract_max_size') if active_trace
113
-
114
- ::Datadog.logger.warn(
115
- "Failed to extract x-datadog-tags: tags are too large (size:#{tags_header.size} " \
116
- "limit:#{::Datadog.configuration.tracing.x_datadog_tags_max_length}). This limit can be configured " \
117
- 'through the DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH environment variable.'
118
- )
119
- return
120
- end
121
-
122
- tags = DatadogTagsCodec.decode(tags_header)
123
- # Only extract keys with the expected Datadog prefix
124
- tags.select! do |key, _|
125
- key.start_with?(Tracing::Metadata::Ext::Distributed::TAGS_PREFIX) && key != EXCLUDED_TAG
126
- end
127
- tags
128
- rescue => e
129
- active_trace = Tracing.active_trace
130
- active_trace.set_tag('_dd.propagation_error', 'decoding_error') if active_trace
131
- ::Datadog.logger.warn(
132
- "Failed to extract x-datadog-tags: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
133
- )
134
- end
135
-
136
- # We want to exclude tags that we don't want to propagate downstream.
137
- EXCLUDED_TAG = '_dd.p.upstream_services'
138
- private_constant :EXCLUDED_TAG
139
- end
140
- end
141
- end
142
- end
143
- end
144
- end
@@ -1,37 +0,0 @@
1
- # typed: false
2
-
3
- require_relative '../helpers'
4
-
5
- module Datadog
6
- module Tracing
7
- module Distributed
8
- module Headers
9
- # Parser provides easy access and validation methods for Rack headers
10
- class Parser
11
- def initialize(env)
12
- @env = env
13
- end
14
-
15
- # TODO: Don't assume Rack format.
16
- # Make distributed tracing headers apathetic.
17
- def header(name)
18
- rack_header = "http-#{name}".upcase!.tr('-', '_')
19
-
20
- hdr = @env[rack_header]
21
-
22
- # Only return the value if it is not an empty string
23
- hdr if hdr != ''
24
- end
25
-
26
- def id(hdr, base = 10)
27
- Helpers.value_to_id(header(hdr), base)
28
- end
29
-
30
- def number(hdr, base = 10)
31
- Helpers.value_to_number(header(hdr), base)
32
- end
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,55 +0,0 @@
1
- # typed: true
2
-
3
- require_relative '../helpers'
4
- require_relative 'parser'
5
- require_relative '../headers/ext'
6
- require_relative '../../trace_digest'
7
-
8
- module Datadog
9
- module Tracing
10
- module Distributed
11
- module Metadata
12
- # B3 provides helpers to inject or extract metadata for B3 style headers
13
- module B3
14
- include Distributed::Headers::Ext
15
-
16
- def self.inject!(digest, metadata)
17
- return if digest.nil?
18
-
19
- # DEV: We need these to be hex encoded
20
- metadata[B3_HEADER_TRACE_ID] = digest.trace_id.to_s(16)
21
- metadata[B3_HEADER_SPAN_ID] = digest.span_id.to_s(16)
22
-
23
- if digest.trace_sampling_priority
24
- sampling_priority = Helpers.clamp_sampling_priority(
25
- digest.trace_sampling_priority
26
- )
27
- metadata[B3_HEADER_SAMPLED] = sampling_priority.to_s
28
- end
29
-
30
- metadata
31
- end
32
-
33
- def self.extract(metadata)
34
- # Extract values from gRPC metadata
35
- # DEV: B3 doesn't have "origin"
36
- metadata = Parser.new(metadata)
37
- trace_id = metadata.id(B3_HEADER_TRACE_ID, 16)
38
- span_id = metadata.id(B3_HEADER_SPAN_ID, 16)
39
- # We don't need to try and convert sampled since B3 supports 0/1 (AUTO_REJECT/AUTO_KEEP)
40
- sampling_priority = metadata.number(B3_HEADER_SAMPLED)
41
-
42
- # Return early if this propagation is not valid
43
- return unless trace_id && span_id
44
-
45
- TraceDigest.new(
46
- trace_id: trace_id,
47
- span_id: span_id,
48
- trace_sampling_priority: sampling_priority
49
- )
50
- end
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,66 +0,0 @@
1
- # typed: true
2
-
3
- require_relative 'parser'
4
- require_relative '../helpers'
5
- require_relative '../headers/ext'
6
- require_relative '../../trace_digest'
7
-
8
- module Datadog
9
- module Tracing
10
- module Distributed
11
- module Metadata
12
- # B3Single provides helpers to inject or extract metadata for B3 single header style headers
13
- module B3Single
14
- include Distributed::Headers::Ext
15
-
16
- def self.inject!(digest, metadata)
17
- return if digest.nil?
18
-
19
- # Header format:
20
- # b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}
21
- # https://github.com/apache/incubator-zipkin-b3-propagation/tree/7c6e9f14d6627832bd80baa87ac7dabee7be23cf#single-header
22
- # DEV: `{SamplingState}` and `{ParentSpanId`}` are optional
23
-
24
- # DEV: We need these to be hex encoded
25
- b3_header = "#{digest.trace_id.to_s(16)}-#{digest.span_id.to_s(16)}"
26
-
27
- if digest.trace_sampling_priority
28
- sampling_priority = Helpers.clamp_sampling_priority(
29
- digest.trace_sampling_priority
30
- )
31
- b3_header += "-#{sampling_priority}"
32
- end
33
-
34
- metadata[B3_HEADER_SINGLE] = b3_header
35
-
36
- metadata
37
- end
38
-
39
- def self.extract(metadata)
40
- # Metadata format:
41
- # b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}
42
- # https://github.com/apache/incubator-zipkin-b3-propagation/tree/7c6e9f14d6627832bd80baa87ac7dabee7be23cf#single-header
43
- # DEV: `{SamplingState}` and `{ParentSpanId`}` are optional
44
-
45
- b3_single = Parser.new(metadata).metadata_for_key(B3_HEADER_SINGLE)
46
- return if b3_single.nil?
47
-
48
- parts = b3_single.split('-')
49
- trace_id = Helpers.value_to_id(parts[0], 16) unless parts.empty?
50
- span_id = Helpers.value_to_id(parts[1], 16) if parts.length > 1
51
- sampling_priority = Helpers.value_to_number(parts[2]) if parts.length > 2
52
-
53
- # Return early if this propagation is not valid
54
- return unless trace_id && span_id
55
-
56
- TraceDigest.new(
57
- span_id: span_id,
58
- trace_id: trace_id,
59
- trace_sampling_priority: sampling_priority
60
- )
61
- end
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,73 +0,0 @@
1
- require_relative '../headers/ext'
2
- require_relative 'parser'
3
-
4
- module Datadog
5
- module Tracing
6
- module Distributed
7
- module Metadata
8
- # Datadog provides helpers to inject or extract metadata for Datadog style headers
9
- class Datadog
10
- include Distributed::Headers::Ext
11
-
12
- def self.inject!(digest, metadata)
13
- return if digest.nil?
14
-
15
- metadata[GRPC_METADATA_TRACE_ID] = digest.trace_id.to_s
16
- metadata[GRPC_METADATA_PARENT_ID] = digest.span_id.to_s
17
- if digest.trace_sampling_priority
18
- metadata[GRPC_METADATA_SAMPLING_PRIORITY] =
19
- digest.trace_sampling_priority.to_s
20
- end
21
- metadata[GRPC_METADATA_ORIGIN] = digest.trace_origin.to_s if digest.trace_origin
22
-
23
- metadata
24
- end
25
-
26
- def self.extract(metadata)
27
- carrier = Carrier.new(metadata)
28
-
29
- return nil unless carrier.valid?
30
-
31
- TraceDigest.new(
32
- span_id: carrier.parent_id,
33
- trace_id: carrier.trace_id,
34
- trace_origin: carrier.origin,
35
- trace_sampling_priority: carrier.sampling_priority
36
- )
37
- end
38
-
39
- # opentracing.io compliant carrier object
40
- class Carrier
41
- include Distributed::Headers::Ext
42
-
43
- def initialize(metadata = {})
44
- @metadata = Parser.new(metadata || {})
45
- end
46
-
47
- def valid?
48
- (trace_id && parent_id) || (origin && trace_id)
49
- end
50
-
51
- def trace_id
52
- @metadata.id(GRPC_METADATA_TRACE_ID)
53
- end
54
-
55
- def parent_id
56
- @metadata.id(GRPC_METADATA_PARENT_ID)
57
- end
58
-
59
- def sampling_priority
60
- value = @metadata.metadata_for_key(GRPC_METADATA_SAMPLING_PRIORITY)
61
- value && value.to_i
62
- end
63
-
64
- def origin
65
- value = @metadata.metadata_for_key(GRPC_METADATA_ORIGIN)
66
- value if value != ''
67
- end
68
- end
69
- end
70
- end
71
- end
72
- end
73
- end
@@ -1,34 +0,0 @@
1
- require_relative '../helpers'
2
-
3
- module Datadog
4
- module Tracing
5
- module Distributed
6
- module Metadata
7
- # Parser provides easy access and validation methods for metadata headers
8
- class Parser
9
- def initialize(metadata)
10
- @metadata = metadata
11
- end
12
-
13
- def id(key, base = 10)
14
- Helpers.value_to_id(metadata_for_key(key), base)
15
- end
16
-
17
- def number(key, base = 10)
18
- Helpers.value_to_number(metadata_for_key(key), base)
19
- end
20
-
21
- def metadata_for_key(key)
22
- # metadata values can be arrays (multiple headers with the same key)
23
- value = @metadata[key]
24
- if value.is_a?(Array)
25
- value.first
26
- else
27
- value
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
34
- end