ddtrace 0.20.0 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
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)