ddtrace 0.20.0 → 0.21.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 (116) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -3
  3. data/Rakefile +1 -1
  4. data/docs/GettingStarted.md +25 -7
  5. data/lib/ddtrace.rb +4 -31
  6. data/lib/ddtrace/configuration.rb +13 -46
  7. data/lib/ddtrace/configuration/{resolver.rb → dependency_resolver.rb} +2 -2
  8. data/lib/ddtrace/configuration/option.rb +32 -0
  9. data/lib/ddtrace/configuration/option_definition.rb +27 -0
  10. data/lib/ddtrace/configuration/option_definition_set.rb +18 -0
  11. data/lib/ddtrace/configuration/option_set.rb +6 -0
  12. data/lib/ddtrace/configuration/options.rb +93 -0
  13. data/lib/ddtrace/configuration/pin_setup.rb +1 -1
  14. data/lib/ddtrace/configuration/settings.rb +47 -0
  15. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +8 -0
  16. data/lib/ddtrace/contrib/active_model_serializers/event.rb +6 -0
  17. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +2 -2
  18. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +8 -0
  19. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +7 -0
  20. data/lib/ddtrace/contrib/active_record/events/sql.rb +6 -0
  21. data/lib/ddtrace/contrib/active_record/ext.rb +2 -3
  22. data/lib/ddtrace/contrib/analytics.rb +3 -4
  23. data/lib/ddtrace/contrib/aws/configuration/settings.rb +8 -0
  24. data/lib/ddtrace/contrib/aws/ext.rb +5 -6
  25. data/lib/ddtrace/contrib/aws/instrumentation.rb +7 -0
  26. data/lib/ddtrace/contrib/configuration/settings.rb +4 -14
  27. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +8 -0
  28. data/lib/ddtrace/contrib/dalli/ext.rb +3 -2
  29. data/lib/ddtrace/contrib/dalli/instrumentation.rb +7 -0
  30. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +1 -1
  31. data/lib/ddtrace/contrib/delayed_job/ext.rb +1 -1
  32. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +8 -0
  33. data/lib/ddtrace/contrib/elasticsearch/ext.rb +2 -2
  34. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +11 -1
  35. data/lib/ddtrace/contrib/excon/configuration/settings.rb +8 -0
  36. data/lib/ddtrace/contrib/excon/ext.rb +2 -1
  37. data/lib/ddtrace/contrib/excon/middleware.rb +15 -0
  38. data/lib/ddtrace/contrib/extensions.rb +62 -0
  39. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +8 -0
  40. data/lib/ddtrace/contrib/faraday/ext.rb +2 -1
  41. data/lib/ddtrace/contrib/faraday/middleware.rb +15 -0
  42. data/lib/ddtrace/contrib/grape/configuration/settings.rb +8 -0
  43. data/lib/ddtrace/contrib/grape/endpoint.rb +19 -0
  44. data/lib/ddtrace/contrib/grape/ext.rb +2 -2
  45. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +8 -0
  46. data/lib/ddtrace/contrib/graphql/ext.rb +2 -0
  47. data/lib/ddtrace/contrib/graphql/patcher.rb +8 -2
  48. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +8 -0
  49. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +9 -0
  50. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +4 -0
  51. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -0
  52. data/lib/ddtrace/contrib/grpc/ext.rb +2 -1
  53. data/lib/ddtrace/contrib/http/configuration/settings.rb +8 -0
  54. data/lib/ddtrace/contrib/http/ext.rb +2 -1
  55. data/lib/ddtrace/contrib/http/instrumentation.rb +54 -19
  56. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +8 -0
  57. data/lib/ddtrace/contrib/mongodb/ext.rb +2 -2
  58. data/lib/ddtrace/contrib/mongodb/subscribers.rb +18 -0
  59. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +8 -0
  60. data/lib/ddtrace/contrib/mysql2/ext.rb +2 -2
  61. data/lib/ddtrace/contrib/mysql2/{client.rb → instrumentation.rb} +32 -12
  62. data/lib/ddtrace/contrib/mysql2/patcher.rb +2 -2
  63. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +1 -1
  64. data/lib/ddtrace/contrib/racecar/ext.rb +1 -1
  65. data/lib/ddtrace/contrib/rack/configuration/settings.rb +1 -1
  66. data/lib/ddtrace/contrib/rack/ext.rb +1 -1
  67. data/lib/ddtrace/contrib/rails/action_controller.rb +3 -0
  68. data/lib/ddtrace/contrib/rails/active_support.rb +1 -0
  69. data/lib/ddtrace/contrib/rails/configuration/settings.rb +8 -0
  70. data/lib/ddtrace/contrib/rails/ext.rb +2 -5
  71. data/lib/ddtrace/contrib/rails/utils.rb +17 -1
  72. data/lib/ddtrace/contrib/rake/configuration/settings.rb +1 -1
  73. data/lib/ddtrace/contrib/rake/ext.rb +1 -1
  74. data/lib/ddtrace/contrib/redis/configuration/settings.rb +8 -0
  75. data/lib/ddtrace/contrib/redis/ext.rb +4 -5
  76. data/lib/ddtrace/contrib/redis/tags.rb +24 -6
  77. data/lib/ddtrace/contrib/registerable.rb +1 -1
  78. data/lib/ddtrace/contrib/registry.rb +42 -0
  79. data/lib/ddtrace/contrib/resque/configuration/settings.rb +1 -1
  80. data/lib/ddtrace/contrib/resque/ext.rb +1 -1
  81. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +8 -0
  82. data/lib/ddtrace/contrib/rest_client/ext.rb +2 -1
  83. data/lib/ddtrace/contrib/rest_client/request_patch.rb +14 -0
  84. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -1
  85. data/lib/ddtrace/contrib/sequel/database.rb +2 -0
  86. data/lib/ddtrace/contrib/sequel/dataset.rb +2 -0
  87. data/lib/ddtrace/contrib/sequel/ext.rb +2 -2
  88. data/lib/ddtrace/contrib/sequel/utils.rb +32 -14
  89. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -1
  90. data/lib/ddtrace/contrib/shoryuken/ext.rb +1 -1
  91. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +1 -1
  92. data/lib/ddtrace/contrib/sidekiq/ext.rb +1 -1
  93. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +8 -0
  94. data/lib/ddtrace/contrib/sinatra/ext.rb +3 -4
  95. data/lib/ddtrace/contrib/sinatra/tracer.rb +1 -0
  96. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +12 -0
  97. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +1 -1
  98. data/lib/ddtrace/contrib/sucker_punch/ext.rb +1 -1
  99. data/lib/ddtrace/environment.rb +15 -0
  100. data/lib/ddtrace/ext/analytics.rb +1 -0
  101. data/lib/ddtrace/opentracer/global_tracer.rb +1 -1
  102. data/lib/ddtrace/propagation/distributed_headers.rb +14 -4
  103. data/lib/ddtrace/span.rb +4 -0
  104. data/lib/ddtrace/tracer.rb +6 -1
  105. data/lib/ddtrace/version.rb +1 -1
  106. metadata +14 -15
  107. data/lib/ddtrace/configurable.rb +0 -83
  108. data/lib/ddtrace/configuration/proxy.rb +0 -25
  109. data/lib/ddtrace/contrib/base.rb +0 -16
  110. data/lib/ddtrace/contrib/configuration/option.rb +0 -33
  111. data/lib/ddtrace/contrib/configuration/option_definition.rb +0 -29
  112. data/lib/ddtrace/contrib/configuration/option_definition_set.rb +0 -20
  113. data/lib/ddtrace/contrib/configuration/option_set.rb +0 -8
  114. data/lib/ddtrace/contrib/configuration/options.rb +0 -95
  115. data/lib/ddtrace/registry.rb +0 -42
  116. data/lib/ddtrace/registry/registerable.rb +0 -20
@@ -0,0 +1,18 @@
1
+ require 'ddtrace/configuration/dependency_resolver'
2
+
3
+ module Datadog
4
+ module Configuration
5
+ # Represents a set of configuration option definitions for an integration
6
+ class OptionDefinitionSet < Hash
7
+ def dependency_order
8
+ DependencyResolver.new(dependency_graph).call
9
+ end
10
+
11
+ def dependency_graph
12
+ each_with_object({}) do |(name, option), graph|
13
+ graph[name] = option.depends_on
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,6 @@
1
+ module Datadog
2
+ module Configuration
3
+ class OptionSet < Hash
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,93 @@
1
+ require 'ddtrace/configuration/option'
2
+ require 'ddtrace/configuration/option_set'
3
+ require 'ddtrace/configuration/option_definition'
4
+ require 'ddtrace/configuration/option_definition_set'
5
+
6
+ module Datadog
7
+ module Configuration
8
+ # Behavior for a configuration object that has options
9
+ module Options
10
+ def self.included(base)
11
+ base.send(:extend, ClassMethods)
12
+ base.send(:include, InstanceMethods)
13
+ end
14
+
15
+ # Class behavior for a configuration object with options
16
+ module ClassMethods
17
+ def options
18
+ @options ||= begin
19
+ # Allows for class inheritance of option definitions
20
+ superclass <= Options ? superclass.options.dup : OptionDefinitionSet.new
21
+ end
22
+ end
23
+
24
+ protected
25
+
26
+ def option(name, meta = {}, &block)
27
+ options[name] = OptionDefinition.new(name, meta, &block).tap do
28
+ define_option_accessors(name)
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def define_option_accessors(name)
35
+ option_name = name
36
+
37
+ define_method(option_name) do
38
+ get_option(option_name)
39
+ end
40
+
41
+ define_method("#{option_name}=") do |value|
42
+ set_option(option_name, value)
43
+ end
44
+ end
45
+ end
46
+
47
+ # Instance behavior for a configuration object with options
48
+ module InstanceMethods
49
+ def options
50
+ @options ||= OptionSet.new
51
+ end
52
+
53
+ def set_option(name, value)
54
+ add_option(name) unless options.key?(name)
55
+ options[name].set(value)
56
+ end
57
+
58
+ def get_option(name)
59
+ add_option(name) unless options.key?(name)
60
+ options[name].get
61
+ end
62
+
63
+ def to_h
64
+ options.each_with_object({}) do |(key, _), hash|
65
+ hash[key] = get_option(key)
66
+ end
67
+ end
68
+
69
+ def reset_options!
70
+ options.values.each(&:reset)
71
+ end
72
+
73
+ private
74
+
75
+ def add_option(name)
76
+ assert_valid_option!(name)
77
+ definition = self.class.options[name]
78
+ Option.new(definition, self).tap do |option|
79
+ options[name] = option
80
+ end
81
+ end
82
+
83
+ def assert_valid_option!(name)
84
+ unless self.class.options.key?(name)
85
+ raise(InvalidOptionError, "#{self.class.name} doesn't define the option: #{name}")
86
+ end
87
+ end
88
+ end
89
+
90
+ InvalidOptionError = Class.new(StandardError)
91
+ end
92
+ end
93
+ end
@@ -1,5 +1,5 @@
1
1
  module Datadog
2
- class Configuration
2
+ module Configuration
3
3
  # PinSetup translates a flat hash into a Pin configuration
4
4
  # This class should be removed if we ever remove/refactor the Pin class
5
5
  class PinSetup
@@ -0,0 +1,47 @@
1
+ require 'ddtrace/ext/analytics'
2
+ require 'ddtrace/environment'
3
+ require 'ddtrace/configuration/options'
4
+
5
+ module Datadog
6
+ module Configuration
7
+ # Global configuration settings for the trace library.
8
+ class Settings
9
+ extend Datadog::Environment::Helpers
10
+ include Options
11
+
12
+ option :analytics_enabled,
13
+ default: -> { env_to_bool(Ext::Analytics::ENV_TRACE_ANALYTICS_ENABLED, nil) },
14
+ lazy: true
15
+
16
+ option :tracer, default: Tracer.new
17
+
18
+ def initialize(options = {})
19
+ configure(options)
20
+ end
21
+
22
+ def configure(options = {})
23
+ self.class.options.dependency_order.each do |name|
24
+ next unless options.key?(name)
25
+ respond_to?("#{name}=") ? send("#{name}=", options[name]) : set_option(name, options[name])
26
+ end
27
+
28
+ yield(self) if block_given?
29
+ end
30
+
31
+ # Backwards compatibility for configuring tracer e.g. `c.tracer debug: true`
32
+ def tracer(options = nil)
33
+ tracer = options && options.key?(:instance) ? set_option(:tracer, options[:instance]) : get_option(:tracer)
34
+
35
+ tracer.tap do |t|
36
+ unless options.nil?
37
+ t.configure(options)
38
+ t.class.log = options[:log] if options[:log]
39
+ t.set_tags(options[:tags]) if options[:tags]
40
+ t.set_tags(env: options[:env]) if options[:env]
41
+ t.class.debug_logging = options.fetch(:debug, false)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -7,6 +7,14 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the ActiveModelSerializers integration
9
9
  class Settings < Contrib::Configuration::Settings
10
+ option :analytics_enabled,
11
+ default: -> { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) },
12
+ lazy: true
13
+
14
+ option :analytics_sample_rate,
15
+ default: -> { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) },
16
+ lazy: true
17
+
10
18
  option :service_name, default: Ext::SERVICE_NAME
11
19
  option :tracer, default: Datadog.tracer do |value|
12
20
  (value || Datadog.tracer).tap do |v|
@@ -1,4 +1,5 @@
1
1
  require 'ddtrace/ext/http'
2
+ require 'ddtrace/contrib/analytics'
2
3
  require 'ddtrace/contrib/active_support/notifications/event'
3
4
  require 'ddtrace/contrib/active_model_serializers/ext'
4
5
 
@@ -30,6 +31,11 @@ module Datadog
30
31
  def process(span, event, _id, payload)
31
32
  span.service = configuration[:service_name]
32
33
 
34
+ # Set analytics sample rate
35
+ if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
36
+ Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
37
+ end
38
+
33
39
  # Set the resource name and serializer name
34
40
  res = resource(payload[:serializer])
35
41
  span.resource = res
@@ -4,11 +4,11 @@ module Datadog
4
4
  # ActiveModelSerializers integration constants
5
5
  module Ext
6
6
  APP = 'active_model_serializers'.freeze
7
+ ENV_ANALYTICS_ENABLED = 'DD_ACTIVE_MODEL_SERIALIZERS_ANALYTICS_ENABLED'.freeze
8
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_ACTIVE_MODEL_SERIALIZERS_ANALYTICS_SAMPLE_RATE'.freeze
7
9
  SERVICE_NAME = 'active_model_serializers'.freeze
8
-
9
10
  SPAN_RENDER = 'active_model_serializers.render'.freeze
10
11
  SPAN_SERIALIZE = 'active_model_serializers.serialize'.freeze
11
-
12
12
  TAG_ADAPTER = 'active_model_serializers.adapter'.freeze
13
13
  TAG_SERIALIZER = 'active_model_serializers.serializer'.freeze
14
14
  end
@@ -8,6 +8,14 @@ module Datadog
8
8
  module Configuration
9
9
  # Custom settings for the ActiveRecord integration
10
10
  class Settings < Contrib::Configuration::Settings
11
+ option :analytics_enabled,
12
+ default: -> { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) },
13
+ lazy: true
14
+
15
+ option :analytics_sample_rate,
16
+ default: -> { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) },
17
+ lazy: true
18
+
11
19
  option :orm_service_name
12
20
  option :service_name, depends_on: [:tracer] do |value|
13
21
  (value || Utils.adapter_name).tap do |service_name|
@@ -1,3 +1,4 @@
1
+ require 'ddtrace/contrib/analytics'
1
2
  require 'ddtrace/contrib/active_record/ext'
2
3
  require 'ddtrace/contrib/active_record/event'
3
4
 
@@ -38,6 +39,12 @@ module Datadog
38
39
 
39
40
  span.resource = payload.fetch(:class_name)
40
41
  span.span_type = Ext::SPAN_TYPE_INSTANTIATION
42
+
43
+ # Set analytics sample rate
44
+ if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
45
+ Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
46
+ end
47
+
41
48
  span.set_tag(Ext::TAG_INSTANTIATION_CLASS_NAME, payload.fetch(:class_name))
42
49
  span.set_tag(Ext::TAG_INSTANTIATION_RECORD_COUNT, payload.fetch(:record_count))
43
50
  rescue StandardError => e
@@ -1,4 +1,5 @@
1
1
  require 'ddtrace/ext/net'
2
+ require 'ddtrace/contrib/analytics'
2
3
  require 'ddtrace/contrib/active_record/ext'
3
4
  require 'ddtrace/contrib/active_record/event'
4
5
 
@@ -38,6 +39,11 @@ module Datadog
38
39
  span.resource = payload.fetch(:sql)
39
40
  span.span_type = Datadog::Ext::SQL::TYPE
40
41
 
42
+ # Set analytics sample rate
43
+ if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
44
+ Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
45
+ end
46
+
41
47
  # Find out if the SQL query has been cached in this request. This meta is really
42
48
  # helpful to users because some spans may have 0ns of duration because the query
43
49
  # is simply cached from memory, so the notification is fired with start == finish.
@@ -4,13 +4,12 @@ module Datadog
4
4
  # ActiveRecord integration constants
5
5
  module Ext
6
6
  APP = 'active_record'.freeze
7
+ ENV_ANALYTICS_ENABLED = 'DD_ACTIVE_RECORD_ANALYTICS_ENABLED'.freeze
8
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_ACTIVE_RECORD_ANALYTICS_SAMPLE_RATE'.freeze
7
9
  SERVICE_NAME = 'active_record'.freeze
8
-
9
10
  SPAN_INSTANTIATION = 'active_record.instantiation'.freeze
10
11
  SPAN_SQL = 'active_record.sql'.freeze
11
-
12
12
  SPAN_TYPE_INSTANTIATION = 'custom'.freeze
13
-
14
13
  TAG_DB_CACHED = 'active_record.db.cached'.freeze
15
14
  TAG_DB_NAME = 'active_record.db.name'.freeze
16
15
  TAG_DB_VENDOR = 'active_record.db.vendor'.freeze
@@ -9,13 +9,12 @@ module Datadog
9
9
  # Checks whether analytics should be enabled.
10
10
  # `flag` is a truthy/falsey value that represents a setting on the integration.
11
11
  def enabled?(flag = nil)
12
- # TODO: Check global flag here.
13
- # (global_flag && flag != false) || flag == true
14
- flag == true
12
+ (Datadog.configuration.analytics_enabled && flag != false) || flag == true
15
13
  end
16
14
 
17
15
  def set_sample_rate(span, sample_rate)
18
- span.set_metric(Datadog::Ext::Analytics::TAG_SAMPLE_RATE, sample_rate) unless sample_rate.nil?
16
+ return if span.nil? || sample_rate.nil?
17
+ span.set_metric(Datadog::Ext::Analytics::TAG_SAMPLE_RATE, sample_rate)
19
18
  end
20
19
  end
21
20
  end
@@ -7,6 +7,14 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the AWS integration
9
9
  class Settings < Contrib::Configuration::Settings
10
+ option :analytics_enabled,
11
+ default: -> { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) },
12
+ lazy: true
13
+
14
+ option :analytics_sample_rate,
15
+ default: -> { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) },
16
+ lazy: true
17
+
10
18
  option :service_name, default: Ext::SERVICE_NAME
11
19
  end
12
20
  end
@@ -4,17 +4,16 @@ module Datadog
4
4
  # AWS integration constants
5
5
  module Ext
6
6
  APP = 'aws'.freeze
7
+ ENV_ANALYTICS_ENABLED = 'DD_AWS_ANALYTICS_ENABLED'.freeze
8
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_AWS_ANALYTICS_SAMPLE_RATE'.freeze
7
9
  SERVICE_NAME = 'aws'.freeze
8
-
9
10
  SPAN_COMMAND = 'aws.command'.freeze
10
-
11
11
  TAG_AGENT = 'aws.agent'.freeze
12
+ TAG_DEFAULT_AGENT = 'aws-sdk-ruby'.freeze
13
+ TAG_HOST = 'host'.freeze
12
14
  TAG_OPERATION = 'aws.operation'.freeze
13
- TAG_REGION = 'aws.region'.freeze
14
15
  TAG_PATH = 'path'.freeze
15
- TAG_HOST = 'host'.freeze
16
-
17
- TAG_DEFAULT_AGENT = 'aws-sdk-ruby'.freeze
16
+ TAG_REGION = 'aws.region'.freeze
18
17
  end
19
18
  end
20
19
  end
@@ -1,3 +1,4 @@
1
+ require 'ddtrace/contrib/analytics'
1
2
  require 'ddtrace/contrib/aws/ext'
2
3
 
3
4
  module Datadog
@@ -27,6 +28,12 @@ module Datadog
27
28
  span.span_type = Datadog::Ext::AppTypes::WEB
28
29
  span.name = Ext::SPAN_COMMAND
29
30
  span.resource = context.safely(:resource)
31
+
32
+ # Set analytics sample rate
33
+ if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
34
+ Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
35
+ end
36
+
30
37
  span.set_tag(Ext::TAG_AGENT, Ext::TAG_DEFAULT_AGENT)
31
38
  span.set_tag(Ext::TAG_OPERATION, context.safely(:operation))
32
39
  span.set_tag(Ext::TAG_REGION, context.safely(:region))
@@ -1,11 +1,13 @@
1
- require 'ddtrace/contrib/configuration/options'
1
+ require 'ddtrace/environment'
2
+ require 'ddtrace/configuration/options'
2
3
 
3
4
  module Datadog
4
5
  module Contrib
5
6
  module Configuration
6
7
  # Common settings for all integrations
7
8
  class Settings
8
- include Options
9
+ extend Datadog::Environment::Helpers
10
+ include Datadog::Configuration::Options
9
11
 
10
12
  option :service_name
11
13
  option :tracer, default: Datadog.tracer
@@ -31,18 +33,6 @@ module Datadog
31
33
  def []=(name, value)
32
34
  respond_to?("#{name}=") ? send("#{name}=", value) : set_option(name, value)
33
35
  end
34
-
35
- class << self
36
- private
37
-
38
- def env_to_bool(var, default = nil)
39
- ENV.key?(var) ? ENV[var].to_s.downcase == 'true' : default
40
- end
41
-
42
- def env_to_float(var, default = nil)
43
- ENV.key?(var) ? ENV[var].to_f : default
44
- end
45
- end
46
36
  end
47
37
  end
48
38
  end
@@ -7,6 +7,14 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the Dalli integration
9
9
  class Settings < Contrib::Configuration::Settings
10
+ option :analytics_enabled,
11
+ default: -> { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) },
12
+ lazy: true
13
+
14
+ option :analytics_sample_rate,
15
+ default: -> { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) },
16
+ lazy: true
17
+
10
18
  option :service_name, default: Ext::SERVICE_NAME
11
19
  end
12
20
  end
@@ -4,9 +4,10 @@ module Datadog
4
4
  # Dalli integration constants
5
5
  module Ext
6
6
  APP = 'dalli'.freeze
7
- SERVICE_NAME = 'memcached'.freeze
8
-
7
+ ENV_ANALYTICS_ENABLED = 'DD_DALLI_ANALYTICS_ENABLED'.freeze
8
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_DALLI_ANALYTICS_SAMPLE_RATE'.freeze
9
9
  QUANTIZE_MAX_CMD_LENGTH = 100
10
+ SERVICE_NAME = 'memcached'.freeze
10
11
  SPAN_COMMAND = 'memcached.command'.freeze
11
12
  TAG_COMMAND = 'memcached.command'.freeze
12
13
  end
@@ -1,5 +1,6 @@
1
1
  require 'ddtrace/ext/app_types'
2
2
  require 'ddtrace/ext/net'
3
+ require 'ddtrace/contrib/analytics'
3
4
  require 'ddtrace/contrib/dalli/quantize'
4
5
 
5
6
  module Datadog
@@ -35,6 +36,12 @@ module Datadog
35
36
  span.resource = op.to_s.upcase
36
37
  span.service = datadog_configuration[:service_name]
37
38
  span.span_type = Datadog::Ext::AppTypes::CACHE
39
+
40
+ # Set analytics sample rate
41
+ if Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled])
42
+ Contrib::Analytics.set_sample_rate(span, datadog_configuration[:analytics_sample_rate])
43
+ end
44
+
38
45
  span.set_tag(Datadog::Ext::NET::TARGET_HOST, hostname)
39
46
  span.set_tag(Datadog::Ext::NET::TARGET_PORT, port)
40
47
  cmd = Datadog::Contrib::Dalli::Quantize.format_command(op, args)