datadog 2.19.0 → 2.20.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -1
- data/ext/libdatadog_api/extconf.rb +3 -1
- data/ext/libdatadog_extconf_helpers.rb +13 -3
- data/lib/datadog/appsec/component.rb +3 -13
- data/lib/datadog/appsec/context.rb +23 -0
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +2 -1
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +2 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +0 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +0 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +14 -22
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +23 -2
- data/lib/datadog/appsec/contrib/rails/patcher.rb +14 -26
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +27 -0
- data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -0
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +0 -1
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +23 -0
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +8 -18
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
- data/lib/datadog/appsec/event.rb +3 -18
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +16 -0
- data/lib/datadog/appsec/metrics/collector.rb +7 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +28 -0
- data/lib/datadog/appsec/metrics.rb +1 -0
- data/lib/datadog/appsec/security_engine/engine.rb +14 -32
- data/lib/datadog/appsec/security_engine/result.rb +16 -0
- data/lib/datadog/appsec/security_engine/runner.rb +18 -4
- data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
- data/lib/datadog/appsec/trace_keeper.rb +24 -0
- data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
- data/lib/datadog/appsec.rb +0 -7
- data/lib/datadog/auto_instrument_base.rb +2 -1
- data/lib/datadog/core/configuration/option.rb +29 -20
- data/lib/datadog/core/configuration/option_definition.rb +2 -2
- data/lib/datadog/core/configuration/options.rb +13 -7
- data/lib/datadog/di/boot.rb +7 -0
- data/lib/datadog/di/component.rb +7 -0
- data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
- data/lib/datadog/di/probe_file_loader.rb +82 -0
- data/lib/datadog/di/remote.rb +3 -5
- data/lib/datadog/di.rb +0 -1
- data/lib/datadog/kit/appsec/events/v2.rb +5 -4
- data/lib/datadog/kit/appsec/events.rb +11 -10
- data/lib/datadog/kit/identity.rb +17 -11
- data/lib/datadog/opentelemetry/api/baggage.rb +2 -2
- data/lib/datadog/opentelemetry/api/context.rb +10 -9
- data/lib/datadog/opentelemetry/sdk/propagator.rb +4 -4
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +8 -8
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +14 -10
- data/lib/datadog/opentelemetry/trace.rb +4 -4
- data/lib/datadog/profiling.rb +6 -8
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +7 -7
- data/lib/datadog/tracing/configuration/dynamic.rb +4 -6
- data/lib/datadog/tracing/configuration/ext.rb +3 -2
- data/lib/datadog/tracing/configuration/settings.rb +17 -0
- data/lib/datadog/tracing/context.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -3
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +5 -5
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/utils.rb +15 -15
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +6 -6
- data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +7 -9
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +3 -1
- data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
- data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
- data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/configurable.rb +6 -6
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
- data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/dalli/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +51 -53
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +5 -5
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -2
- data/lib/datadog/tracing/contrib/ext.rb +3 -3
- data/lib/datadog/tracing/contrib/extensions.rb +9 -9
- data/lib/datadog/tracing/contrib/faraday/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +4 -2
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +8 -8
- data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +24 -24
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +8 -8
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -3
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +9 -11
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
- data/lib/datadog/tracing/contrib/http/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -5
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/httprb/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +13 -13
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +6 -6
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +68 -70
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
- data/lib/datadog/tracing/contrib/patcher.rb +7 -9
- data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
- data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/event.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +32 -32
- data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +21 -17
- data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +5 -4
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +4 -4
- data/lib/datadog/tracing/contrib/registry.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +3 -3
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/database.rb +5 -5
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +38 -40
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +11 -11
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +5 -1
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +73 -8
- data/lib/datadog/tracing/distributed/datadog.rb +4 -5
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -13
- data/lib/datadog/tracing/distributed/helpers.rb +1 -1
- data/lib/datadog/tracing/distributed/none.rb +4 -2
- data/lib/datadog/tracing/distributed/propagation.rb +4 -1
- data/lib/datadog/tracing/distributed/propagation_policy.rb +1 -1
- data/lib/datadog/tracing/distributed/trace_context.rb +22 -16
- data/lib/datadog/tracing/event.rb +5 -7
- data/lib/datadog/tracing/flush.rb +1 -1
- data/lib/datadog/tracing/metadata/analytics.rb +1 -1
- data/lib/datadog/tracing/metadata/tagging.rb +4 -4
- data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
- data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
- data/lib/datadog/tracing/pipeline.rb +1 -1
- data/lib/datadog/tracing/sampling/ext.rb +0 -2
- data/lib/datadog/tracing/sampling/rule_sampler.rb +30 -30
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
- data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
- data/lib/datadog/tracing/span.rb +1 -1
- data/lib/datadog/tracing/span_event.rb +10 -10
- data/lib/datadog/tracing/span_link.rb +12 -12
- data/lib/datadog/tracing/span_operation.rb +9 -11
- data/lib/datadog/tracing/trace_digest.rb +21 -23
- data/lib/datadog/tracing/trace_operation.rb +84 -88
- data/lib/datadog/tracing/trace_segment.rb +2 -2
- data/lib/datadog/tracing/tracer.rb +36 -38
- data/lib/datadog/tracing/transport/http/client.rb +1 -1
- data/lib/datadog/tracing/transport/http/traces.rb +2 -2
- data/lib/datadog/tracing/transport/io/client.rb +5 -5
- data/lib/datadog/tracing/transport/io/traces.rb +4 -4
- data/lib/datadog/tracing/transport/statistics.rb +1 -1
- data/lib/datadog/tracing/transport/traces.rb +5 -5
- data/lib/datadog/tracing/workers/trace_writer.rb +12 -12
- data/lib/datadog/tracing/workers.rb +2 -2
- data/lib/datadog/tracing.rb +2 -2
- data/lib/datadog/version.rb +1 -1
- metadata +15 -6
@@ -30,26 +30,26 @@ module Datadog
|
|
30
30
|
default_sampler: nil
|
31
31
|
)
|
32
32
|
@rules = if default_sample_rate && !default_sampler
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
# Add to the end of the rule list a rule always matches any trace
|
34
|
+
rules << SimpleRule.new(sample_rate: default_sample_rate)
|
35
|
+
else
|
36
|
+
rules
|
37
|
+
end
|
38
38
|
@rate_limiter = if rate_limiter
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
rate_limiter
|
40
|
+
elsif rate_limit
|
41
|
+
Core::TokenBucket.new(rate_limit)
|
42
|
+
else
|
43
|
+
Core::UnlimitedLimiter.new
|
44
|
+
end
|
45
45
|
@default_sampler = if default_sampler
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
46
|
+
default_sampler
|
47
|
+
elsif default_sample_rate
|
48
|
+
nil
|
49
|
+
else
|
50
|
+
# TODO: Simplify .tags access, as `Tracer#tags` can't be arbitrarily changed anymore
|
51
|
+
RateByServiceSampler.new(1.0, env: -> { Tracing.send(:tracer).tags['env'] })
|
52
|
+
end
|
53
53
|
end
|
54
54
|
|
55
55
|
def self.parse(rules, rate_limit, default_sample_rate)
|
@@ -130,17 +130,17 @@ module Datadog
|
|
130
130
|
set_limiter_metrics(trace, rate_limiter.effective_rate)
|
131
131
|
|
132
132
|
provenance = case rule.provenance
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
133
|
+
when Rule::PROVENANCE_REMOTE_USER
|
134
|
+
Ext::Decision::REMOTE_USER_RULE
|
135
|
+
when Rule::PROVENANCE_REMOTE_DYNAMIC
|
136
|
+
Ext::Decision::REMOTE_DYNAMIC_RULE
|
137
|
+
else
|
138
|
+
Ext::Decision::TRACE_SAMPLING_RULE
|
139
|
+
end
|
140
140
|
|
141
141
|
trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, provenance)
|
142
142
|
end
|
143
|
-
rescue
|
143
|
+
rescue => e
|
144
144
|
Datadog.logger.error(
|
145
145
|
"Rule sampling failed. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
|
146
146
|
)
|
@@ -153,10 +153,10 @@ module Datadog
|
|
153
153
|
# was responsible for the sampling decision.
|
154
154
|
def set_priority(trace, sampled)
|
155
155
|
trace.sampling_priority = if sampled
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
156
|
+
Sampling::Ext::Priority::USER_KEEP
|
157
|
+
else
|
158
|
+
Sampling::Ext::Priority::USER_REJECT
|
159
|
+
end
|
160
160
|
end
|
161
161
|
|
162
162
|
def set_rule_metrics(trace, sample_rate)
|
@@ -28,7 +28,7 @@ module Datadog
|
|
28
28
|
list = JSON.parse(rules)
|
29
29
|
rescue => e
|
30
30
|
Datadog.logger.warn(
|
31
|
-
"Error parsing Span Sampling Rules `#{rules.inspect}`: "\
|
31
|
+
"Error parsing Span Sampling Rules `#{rules.inspect}`: " \
|
32
32
|
"#{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
|
33
33
|
)
|
34
34
|
return nil
|
@@ -58,13 +58,6 @@ module Datadog
|
|
58
58
|
|
59
59
|
next if decision == :not_matched # Iterate until we find a matching decision
|
60
60
|
|
61
|
-
if decision == :kept
|
62
|
-
trace_op.set_tag(
|
63
|
-
Metadata::Ext::Distributed::TAG_DECISION_MAKER,
|
64
|
-
Sampling::Ext::Decision::SPAN_SAMPLING_RATE
|
65
|
-
)
|
66
|
-
end
|
67
|
-
|
68
61
|
break # Found either a `kept` or `rejected` decision
|
69
62
|
end
|
70
63
|
|
data/lib/datadog/tracing/span.rb
CHANGED
@@ -41,7 +41,7 @@ module Datadog
|
|
41
41
|
# of being limiting span events to the size limit of a span tag.
|
42
42
|
# All Datadog agents support this format.
|
43
43
|
def to_hash
|
44
|
-
h = {
|
44
|
+
h = {'name' => @name, 'time_unix_nano' => @time_unix_nano}
|
45
45
|
h['attributes'] = @attributes unless @attributes.empty?
|
46
46
|
h
|
47
47
|
end
|
@@ -51,15 +51,15 @@ module Datadog
|
|
51
51
|
# This serialization format removes the serialization limitations of the `span.set_tag('events)` approach,
|
52
52
|
# but is only supported by newer version of the Datadog agent.
|
53
53
|
def to_native_format
|
54
|
-
h = {
|
54
|
+
h = {'name' => @name, 'time_unix_nano' => @time_unix_nano}
|
55
55
|
|
56
56
|
attr = {}
|
57
57
|
@attributes.each do |key, value|
|
58
58
|
attr[key] = if value.is_a?(Array)
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
59
|
+
{type: ARRAY_TYPE, array_value: {values: value.map { |v| serialize_native_attribute(v) }}}
|
60
|
+
else
|
61
|
+
serialize_native_attribute(value)
|
62
|
+
end
|
63
63
|
end
|
64
64
|
|
65
65
|
h['attributes'] = attr unless @attributes.empty?
|
@@ -144,13 +144,13 @@ module Datadog
|
|
144
144
|
def serialize_native_attribute(value)
|
145
145
|
case value
|
146
146
|
when String
|
147
|
-
{
|
147
|
+
{type: STRING_TYPE, string_value: value}
|
148
148
|
when TrueClass, FalseClass
|
149
|
-
{
|
149
|
+
{type: BOOLEAN_TYPE, bool_value: value}
|
150
150
|
when Integer
|
151
|
-
{
|
151
|
+
{type: INTEGER_TYPE, int_value: value}
|
152
152
|
when Float
|
153
|
-
{
|
153
|
+
{type: DOUBLE_TYPE, double_value: value}
|
154
154
|
else
|
155
155
|
# This is technically unreachable due to the validation in #initialize.
|
156
156
|
raise ArgumentError, "Attribute must be a string, number, or boolean: #{value}."
|
@@ -47,15 +47,15 @@ module Datadog
|
|
47
47
|
@span_id = digest.span_id
|
48
48
|
@trace_id = digest.trace_id
|
49
49
|
@trace_flags = if digest.trace_sampling_priority.nil?
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
@trace_state = digest.trace_state
|
50
|
+
nil
|
51
|
+
elsif digest.trace_sampling_priority > 0
|
52
|
+
1
|
53
|
+
else
|
54
|
+
0
|
55
|
+
end
|
56
|
+
@trace_state = digest.trace_state&.dup
|
57
57
|
@dropped_attributes = 0
|
58
|
-
@attributes =
|
58
|
+
@attributes = attributes&.dup || {}
|
59
59
|
end
|
60
60
|
|
61
61
|
def to_hash
|
@@ -81,10 +81,10 @@ module Datadog
|
|
81
81
|
# If traceflags set, the high bit (bit 31) should be set to 1 (uint32).
|
82
82
|
# This helps us distinguish between when the sample decision is zero or not set
|
83
83
|
h[:flags] = if @trace_flags.nil?
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
84
|
+
0
|
85
|
+
else
|
86
|
+
@trace_flags | (1 << 31)
|
87
|
+
end
|
88
88
|
h
|
89
89
|
end
|
90
90
|
end
|
@@ -157,7 +157,7 @@ module Datadog
|
|
157
157
|
# running, to minimize impact on normal application function.
|
158
158
|
begin
|
159
159
|
start
|
160
|
-
rescue
|
160
|
+
rescue => e
|
161
161
|
logger.debug { "Failed to start span: #{e}" }
|
162
162
|
ensure
|
163
163
|
# We should yield to the provided block when possible, as this
|
@@ -387,7 +387,7 @@ module Datadog
|
|
387
387
|
class Events
|
388
388
|
include Tracing::Events
|
389
389
|
|
390
|
-
DEFAULT_ON_ERROR = proc { |span_op, error| span_op
|
390
|
+
DEFAULT_ON_ERROR = proc { |span_op, error| span_op&.set_error(error) }
|
391
391
|
|
392
392
|
attr_reader \
|
393
393
|
:logger,
|
@@ -448,23 +448,21 @@ module Datadog
|
|
448
448
|
original = @handler
|
449
449
|
|
450
450
|
@handler = proc do |op, error|
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
"Custom on_error handler #{@handler} failed, using fallback behavior. \
|
451
|
+
yield(op, error)
|
452
|
+
rescue => e
|
453
|
+
logger.debug do
|
454
|
+
"Custom on_error handler #{@handler} failed, using fallback behavior. \
|
456
455
|
Cause: #{e.class}: #{e} Location: #{Array(e.backtrace).first}"
|
457
|
-
end
|
458
|
-
|
459
|
-
original.call(op, error) if original
|
460
456
|
end
|
457
|
+
|
458
|
+
original&.call(op, error)
|
461
459
|
end
|
462
460
|
end
|
463
461
|
|
464
462
|
def publish(*args)
|
465
463
|
begin
|
466
464
|
@handler.call(*args)
|
467
|
-
rescue
|
465
|
+
rescue => e
|
468
466
|
logger.debug do
|
469
467
|
"Error in on_error handler '#{@default}': #{e.class}: #{e} at #{Array(e.backtrace).first}"
|
470
468
|
end
|
@@ -162,29 +162,27 @@ module Datadog
|
|
162
162
|
# DEV: Because we want to sometimes freeze the values provided to `TraceDigest`, it's best
|
163
163
|
# DEV: to let `#initialize` decide how to handle each field, instead of duplicating that logic here.
|
164
164
|
TraceDigest.new(
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
baggage: baggage
|
187
|
-
}.merge!(field_value_pairs)
|
165
|
+
span_id: span_id,
|
166
|
+
span_name: span_name,
|
167
|
+
span_resource: span_resource,
|
168
|
+
span_service: span_service,
|
169
|
+
span_type: span_type,
|
170
|
+
trace_distributed_tags: trace_distributed_tags,
|
171
|
+
trace_hostname: trace_hostname,
|
172
|
+
trace_id: trace_id,
|
173
|
+
trace_name: trace_name,
|
174
|
+
trace_origin: trace_origin,
|
175
|
+
trace_process_id: trace_process_id,
|
176
|
+
trace_resource: trace_resource,
|
177
|
+
trace_runtime_id: trace_runtime_id,
|
178
|
+
trace_sampling_priority: trace_sampling_priority,
|
179
|
+
trace_service: trace_service,
|
180
|
+
trace_distributed_id: trace_distributed_id,
|
181
|
+
trace_flags: trace_flags,
|
182
|
+
trace_state: trace_state,
|
183
|
+
trace_state_unknown_fields: trace_state_unknown_fields,
|
184
|
+
span_remote: span_remote,
|
185
|
+
baggage: baggage, **field_value_pairs
|
188
186
|
)
|
189
187
|
end
|
190
188
|
end
|
@@ -163,20 +163,20 @@ module Datadog
|
|
163
163
|
end
|
164
164
|
|
165
165
|
def name
|
166
|
-
@name ||
|
166
|
+
@name || root_span&.name
|
167
167
|
end
|
168
168
|
|
169
169
|
def resource
|
170
|
-
@resource ||
|
170
|
+
@resource || root_span&.resource
|
171
171
|
end
|
172
172
|
|
173
173
|
# When retrieving tags or metrics we need to include root span tags for sampling purposes
|
174
174
|
def get_tag(key)
|
175
|
-
super ||
|
175
|
+
super || root_span&.get_tag(key)
|
176
176
|
end
|
177
177
|
|
178
178
|
def get_metric(key)
|
179
|
-
super ||
|
179
|
+
super || root_span&.get_metric(key)
|
180
180
|
end
|
181
181
|
|
182
182
|
def set_distributed_source(product_bit)
|
@@ -201,7 +201,7 @@ module Datadog
|
|
201
201
|
end
|
202
202
|
|
203
203
|
def service
|
204
|
-
@service ||
|
204
|
+
@service || root_span&.service
|
205
205
|
end
|
206
206
|
|
207
207
|
def measure(
|
@@ -220,9 +220,11 @@ module Datadog
|
|
220
220
|
# Don't allow more span measurements if the
|
221
221
|
# trace is already completed. Prevents multiple
|
222
222
|
# root spans with parent_span_id = 0.
|
223
|
-
|
224
|
-
|
225
|
-
|
223
|
+
if finished? || full?
|
224
|
+
return yield(
|
225
|
+
SpanOperation.new(op_name, logger: logger),
|
226
|
+
TraceOperation.new(logger: logger))
|
227
|
+
end
|
226
228
|
|
227
229
|
# Create new span
|
228
230
|
span_op = build_span(
|
@@ -253,51 +255,49 @@ module Datadog
|
|
253
255
|
type: nil,
|
254
256
|
id: nil
|
255
257
|
)
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
parent = @active_span
|
262
|
-
|
263
|
-
# Use active span's span ID if available. Otherwise, the parent span ID.
|
264
|
-
# Necessary when this trace continues from another, e.g. distributed trace.
|
265
|
-
parent_id = parent ? parent.id : @parent_span_id || 0
|
266
|
-
|
267
|
-
# Build events
|
268
|
-
events ||= SpanOperation::Events.new(logger: logger)
|
269
|
-
|
270
|
-
# Before start: activate the span, publish events.
|
271
|
-
events.before_start.subscribe do |span_op|
|
272
|
-
start_span(span_op)
|
273
|
-
end
|
258
|
+
# Resolve span options:
|
259
|
+
# Parent, service name, etc.
|
260
|
+
# Add default options
|
261
|
+
trace_id = @id
|
262
|
+
parent = @active_span
|
274
263
|
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
264
|
+
# Use active span's span ID if available. Otherwise, the parent span ID.
|
265
|
+
# Necessary when this trace continues from another, e.g. distributed trace.
|
266
|
+
parent_id = parent ? parent.id : @parent_span_id || 0
|
267
|
+
|
268
|
+
# Build events
|
269
|
+
events ||= SpanOperation::Events.new(logger: logger)
|
279
270
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
logger: logger,
|
284
|
-
events: events,
|
285
|
-
on_error: on_error,
|
286
|
-
parent_id: parent_id,
|
287
|
-
resource: resource || op_name,
|
288
|
-
service: service,
|
289
|
-
start_time: start_time,
|
290
|
-
tags: tags,
|
291
|
-
trace_id: trace_id,
|
292
|
-
type: type,
|
293
|
-
id: id
|
294
|
-
)
|
295
|
-
rescue StandardError => e
|
296
|
-
logger.debug { "Failed to build new span: #{e}" }
|
297
|
-
|
298
|
-
# Return dummy span
|
299
|
-
SpanOperation.new(op_name, logger: logger)
|
271
|
+
# Before start: activate the span, publish events.
|
272
|
+
events.before_start.subscribe do |span_op|
|
273
|
+
start_span(span_op)
|
300
274
|
end
|
275
|
+
|
276
|
+
# After finish: deactivate the span, record, publish events.
|
277
|
+
events.after_finish.subscribe do |span, span_op|
|
278
|
+
finish_span(span, span_op, parent)
|
279
|
+
end
|
280
|
+
|
281
|
+
# Build a new span operation
|
282
|
+
SpanOperation.new(
|
283
|
+
op_name,
|
284
|
+
logger: logger,
|
285
|
+
events: events,
|
286
|
+
on_error: on_error,
|
287
|
+
parent_id: parent_id,
|
288
|
+
resource: resource || op_name,
|
289
|
+
service: service,
|
290
|
+
start_time: start_time,
|
291
|
+
tags: tags,
|
292
|
+
trace_id: trace_id,
|
293
|
+
type: type,
|
294
|
+
id: id
|
295
|
+
)
|
296
|
+
rescue => e
|
297
|
+
logger.debug { "Failed to build new span: #{e}" }
|
298
|
+
|
299
|
+
# Return dummy span
|
300
|
+
SpanOperation.new(op_name, logger: logger)
|
301
301
|
end
|
302
302
|
|
303
303
|
# Returns a {TraceSegment} with all finished spans that can be flushed
|
@@ -325,7 +325,7 @@ module Datadog
|
|
325
325
|
# We should move the sample call to inject and right before moving to new contexts(threads, forking etc.)
|
326
326
|
def to_digest
|
327
327
|
# Resolve current span ID
|
328
|
-
span_id = @active_span
|
328
|
+
span_id = @active_span&.id
|
329
329
|
span_id ||= @parent_span_id unless finished?
|
330
330
|
# sample the trace_operation with the tracer
|
331
331
|
events.trace_propagated.publish(self)
|
@@ -349,13 +349,13 @@ module Datadog
|
|
349
349
|
trace_state: @trace_state,
|
350
350
|
trace_state_unknown_fields: @trace_state_unknown_fields,
|
351
351
|
span_remote: @remote_parent && @active_span.nil?,
|
352
|
-
baggage: @baggage.nil? || @baggage.empty? ? nil : @baggage
|
352
|
+
baggage: (@baggage.nil? || @baggage.empty?) ? nil : @baggage
|
353
353
|
).freeze
|
354
354
|
end
|
355
355
|
|
356
356
|
def to_correlation
|
357
357
|
# Resolve current span ID
|
358
|
-
span_id = @active_span
|
358
|
+
span_id = @active_span&.id
|
359
359
|
span_id ||= @parent_span_id unless finished?
|
360
360
|
|
361
361
|
Correlation::Identifier.new(
|
@@ -369,22 +369,22 @@ module Datadog
|
|
369
369
|
def fork_clone
|
370
370
|
self.class.new(
|
371
371
|
agent_sample_rate: @agent_sample_rate,
|
372
|
-
events: @events
|
373
|
-
hostname: @hostname
|
372
|
+
events: @events&.dup,
|
373
|
+
hostname: @hostname&.dup,
|
374
374
|
id: @id,
|
375
375
|
max_length: @max_length,
|
376
|
-
name: name
|
377
|
-
origin: @origin
|
378
|
-
parent_span_id:
|
376
|
+
name: name&.dup,
|
377
|
+
origin: @origin&.dup,
|
378
|
+
parent_span_id: @active_span&.id || @parent_span_id,
|
379
379
|
rate_limiter_rate: @rate_limiter_rate,
|
380
|
-
resource: resource
|
380
|
+
resource: resource&.dup,
|
381
381
|
rule_sample_rate: @rule_sample_rate,
|
382
382
|
sample_rate: @sample_rate,
|
383
383
|
sampled: @sampled,
|
384
384
|
sampling_priority: @sampling_priority,
|
385
|
-
service: service
|
386
|
-
trace_state: @trace_state
|
387
|
-
trace_state_unknown_fields: @trace_state_unknown_fields
|
385
|
+
service: service&.dup,
|
386
|
+
trace_state: @trace_state&.dup,
|
387
|
+
trace_state_unknown_fields: @trace_state_unknown_fields&.dup,
|
388
388
|
tags: meta.dup,
|
389
389
|
metrics: metrics.dup,
|
390
390
|
remote_parent: @remote_parent
|
@@ -472,41 +472,37 @@ module Datadog
|
|
472
472
|
end
|
473
473
|
|
474
474
|
def start_span(span_op)
|
475
|
-
|
476
|
-
activate_span!(span_op)
|
475
|
+
activate_span!(span_op)
|
477
476
|
|
478
|
-
|
479
|
-
|
477
|
+
# Update active span count
|
478
|
+
@active_span_count += 1
|
480
479
|
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
end
|
480
|
+
# Publish :span_before_start event
|
481
|
+
events.span_before_start.publish(span_op, self)
|
482
|
+
rescue => e
|
483
|
+
logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
|
486
484
|
end
|
487
485
|
|
488
486
|
def finish_span(span, span_op, parent)
|
489
|
-
|
490
|
-
|
491
|
-
@spans << span unless span.nil?
|
487
|
+
# Save finished span & root span
|
488
|
+
@spans << span unless span.nil?
|
492
489
|
|
493
|
-
|
494
|
-
|
490
|
+
# Deactivate the span, re-activate parent.
|
491
|
+
deactivate_span!(span_op)
|
495
492
|
|
496
|
-
|
497
|
-
|
493
|
+
# Set finished, to signal root span has completed.
|
494
|
+
@finished = true if span_op == root_span
|
498
495
|
|
499
|
-
|
500
|
-
|
496
|
+
# Update active span count
|
497
|
+
@active_span_count -= 1
|
501
498
|
|
502
|
-
|
503
|
-
|
499
|
+
# Publish :span_finished event
|
500
|
+
events.span_finished.publish(span, self)
|
504
501
|
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
end
|
502
|
+
# Publish :trace_finished event
|
503
|
+
events.trace_finished.publish(self) if finished?
|
504
|
+
rescue => e
|
505
|
+
logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
|
510
506
|
end
|
511
507
|
|
512
508
|
# Track the root span
|
@@ -535,7 +531,7 @@ module Datadog
|
|
535
531
|
service: service,
|
536
532
|
tags: meta,
|
537
533
|
metrics: metrics,
|
538
|
-
root_span_id: !partial ? root_span
|
534
|
+
root_span_id: (!partial) ? root_span&.id : nil,
|
539
535
|
profiling_enabled: @profiling_enabled,
|
540
536
|
apm_tracing_enabled: @apm_tracing_enabled
|
541
537
|
)
|
@@ -68,8 +68,8 @@ module Datadog
|
|
68
68
|
|
69
69
|
# Does not make an effort to move metrics out of tags
|
70
70
|
# The caller is expected to have done that
|
71
|
-
@meta =
|
72
|
-
@metrics =
|
71
|
+
@meta = tags&.dup || {}
|
72
|
+
@metrics = metrics&.dup || {}
|
73
73
|
|
74
74
|
# Set well-known tags, defaulting to getting the values from tags
|
75
75
|
@agent_sample_rate = agent_sample_rate || agent_sample_rate_tag
|