datadog-lambda 0.6.0 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ccd6671ef8a47079a6553b3149d3cb7ddc352dcd31314c76705d1c4222999a7
4
- data.tar.gz: 0ab7bbfa7db1c8f016ba5b5c4b61948baff762f1e385be6f745d25df6da86492
3
+ metadata.gz: a8e991dcdf4df850e5a9a56fe9f402f94fd1a1c4d9e5558cf9d1eff868331472
4
+ data.tar.gz: 7e5d7ea704e3ee327496b9568e10ec620e77e48ad56eddf4059b59b16b7fcbd3
5
5
  SHA512:
6
- metadata.gz: '0059d491bfd95fb3512e97b241490866758ad8cdfae5b26cee5e0927c58a6be48736054279c2aed5eaef621a65206ed3370f12a3f13f55ba416594efad6a571d'
7
- data.tar.gz: 1dd458bace795179011bebdc1c57be77a0641b71ad25bae995bccfbefd87853bceab9ab1f659744aabe17fd966c8c48cede35921f80cf051ebf0cc116f042dac
6
+ metadata.gz: '081dccfc9c8e566e63d9a29f8cc28d8db0f66f8b5bdd0137bcadf618e277be28408225c5d874400db1cd20173e5623f95619c82bea703ea7c9f2adb6cef2f0a5'
7
+ data.tar.gz: 60ea065a6e8237182ff24872904c7ebb97262604763cbeea8977f7648e375f6304aab816bc1f2ad25ea7d298ee5dcfd280e5abfef8af09e6c1634c1055e12609
@@ -7,12 +7,14 @@
7
7
  # This product includes software developed at Datadog (https://www.datadoghq.com/).
8
8
  # Copyright 2019 Datadog, Inc.
9
9
  #
10
+ # rubocop:disable Metrics/ModuleLength
10
11
 
11
12
  require 'datadog/lambda/trace/listener'
12
13
  require 'datadog/lambda/utils/logger'
13
14
  require 'datadog/lambda/trace/patch_http'
14
15
  require 'json'
15
16
  require 'time'
17
+ require 'datadog/lambda/version'
16
18
 
17
19
  module Datadog
18
20
  # Instruments AWS Lambda functions with Datadog distributed tracing and
@@ -36,6 +38,7 @@ module Datadog
36
38
  c.tracer writer: Datadog::SyncWriter.new(
37
39
  transport: Datadog::Transport::IO.default
38
40
  )
41
+ c.tags = { "_dd.origin": 'lambda' }
39
42
  yield(c) if block_given?
40
43
  end
41
44
  end
@@ -67,7 +70,6 @@ module Datadog
67
70
  # Gets the current tracing context
68
71
  def self.trace_context
69
72
  context = Hash[Datadog::Trace.trace_context]
70
- context.delete(:source)
71
73
  context
72
74
  end
73
75
 
@@ -81,34 +83,65 @@ module Datadog
81
83
  raise 'value must be a number' unless value.is_a?(Numeric)
82
84
 
83
85
  time ||= Time.now
84
- tag_list = ['dd_lambda_layer:datadog-ruby25']
86
+ time_ms = time.to_f.to_i
87
+
88
+ tag_list = ["dd_lambda_layer:datadog-ruby#{dd_lambda_layer_tag}"]
85
89
  tags.each do |tag|
86
90
  tag_list.push("#{tag[0]}:#{tag[1]}")
87
91
  end
88
- time_ms = time.to_f.to_i
89
- metric = { e: time_ms, m: name, t: tag_list, v: value }.to_json
90
- puts metric
92
+ metric = { e: time_ms, m: name, t: tag_list, v: value }
93
+ puts metric.to_json
94
+ end
95
+
96
+ def self.dd_lambda_layer_tag
97
+ RUBY_VERSION[0, 3].tr('.', '')
91
98
  end
92
99
 
93
100
  # Generate tags for enhanced metrics
94
101
  # @param context [Object] https://docs.aws.amazon.com/lambda/latest/dg/ruby-context.html
95
102
  # @return [hash] a hash of the enhanced metrics tags
103
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
96
104
  def self.gen_enhanced_tags(context)
97
105
  arn_parts = context.invoked_function_arn.split(':')
98
- {
106
+ # Check if we have an alias or version
107
+ function_alias = arn_parts[7].nil? ? nil : arn_parts[7]
108
+
109
+ tags = {
99
110
  functionname: context.function_name,
100
111
  region: arn_parts[3],
101
112
  account_id: arn_parts[4],
102
113
  memorysize: context.memory_limit_in_mb,
103
114
  cold_start: @is_cold_start,
104
- runtime: "Ruby #{RUBY_VERSION}"
115
+ runtime: "Ruby #{RUBY_VERSION}",
116
+ resource: context.function_name,
117
+ datadog_lambda: Datadog::Lambda::VERSION::STRING.to_sym
105
118
  }
119
+ begin
120
+ tags[:dd_trace] = Gem.loaded_specs['ddtrace'].version
121
+ rescue StandardError
122
+ Datadog::Utils.logger.debug 'dd-trace unavailable'
123
+ end
124
+ # If we have an alias...
125
+ unless function_alias.nil?
126
+ # If the alis version is $Latest, drop the $ for ddog tag convention.
127
+ if function_alias.start_with?('$')
128
+ function_alias[0] = ''
129
+ # If the alias is not a version number add the executed version tag
130
+ elsif !/\A\d+\z/.match(function_alias)
131
+ tags[:executedversion] = context.function_version
132
+ end
133
+ # Append the alias to the resource tag
134
+ tags[:resource] = context.function_name + ':' + function_alias
135
+ end
136
+
137
+ tags
106
138
  rescue StandardError => e
107
139
  Datadog::Utils.logger.error 'Unable to parse Lambda context' \
108
140
  "#{context}: #{e}"
109
141
  {}
110
142
  end
111
143
 
144
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
112
145
  # Format and add tags to enhanced metrics
113
146
  # This method wraps the metric method, checking the DD_ENHANCED_METRICS
114
147
  # environment variable, adding 'aws.lambda.enhanced' to the metric name,
@@ -116,13 +149,13 @@ module Datadog
116
149
  # @param metric_name [String] basic name of the metric
117
150
  # @param context [Object] AWS Ruby Lambda Context
118
151
  # @return [boolean] false if the metric was not added for some reason,
119
- # true otherwise (for ease of testing)
152
+ # true otherwise (for ease of testing
120
153
 
121
154
  def self.record_enhanced(metric_name, context)
122
155
  return false unless do_enhanced_metrics?
123
156
 
124
157
  etags = gen_enhanced_tags(context)
125
- metric("aws.lambda.enhanced.#{metric_name}", 1, etags)
158
+ metric("aws.lambda.enhanced.#{metric_name}", 1, **etags)
126
159
  true
127
160
  end
128
161
 
@@ -131,7 +164,7 @@ module Datadog
131
164
  # enhanced metrics
132
165
  def self.do_enhanced_metrics?
133
166
  dd_enhanced_metrics = ENV['DD_ENHANCED_METRICS']
134
- return false if dd_enhanced_metrics.nil?
167
+ return true if dd_enhanced_metrics.nil?
135
168
 
136
169
  dd_enhanced_metrics.downcase == 'true'
137
170
  end
@@ -153,3 +186,4 @@ module Datadog
153
186
  end
154
187
  end
155
188
  end
189
+ # rubocop:enable Metrics/ModuleLength
@@ -37,22 +37,39 @@ module Datadog
37
37
  def on_end; end
38
38
 
39
39
  def on_wrap(request_context:, cold_start:, &block)
40
+ options = get_option_tags(
41
+ request_context: request_context,
42
+ cold_start: cold_start
43
+ )
44
+ context = Datadog::Trace.trace_context
45
+ source = context[:source] if context
46
+ options[:tags]['_dd.parent_source'] = source if source && source != 'ddtrace'
47
+ options[:resource] = @function_name
48
+ options[:service] = 'aws.lambda'
49
+ options[:span_type] = 'serverless'
50
+ Datadog::Trace.apply_datadog_trace_context(Datadog::Trace.trace_context)
51
+ Datadog::Trace.wrap_datadog(options) do
52
+ block.call
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ def get_option_tags(request_context:, cold_start:)
59
+ function_arn = request_context.invoked_function_arn.downcase
60
+ tk = function_arn.split(':')
61
+ function_arn = tk.length > 7 ? tk[0, 7].join(':') : function_arn
62
+ function_version = tk.length > 7 ? tk[7] : '$LATEST'
40
63
  options = {
41
64
  tags: {
42
65
  cold_start: cold_start,
43
- function_arn: request_context.invoked_function_arn.downcase,
66
+ function_arn: function_arn,
67
+ function_version: function_version,
44
68
  request_id: request_context.aws_request_id,
45
69
  resource_names: request_context.function_name
46
70
  }
47
71
  }
48
-
49
- options[:resource] = @handler_name
50
- options[:service] = @function_name
51
- options[:span_type] = 'serverless'
52
- Datadog::Trace.apply_datadog_trace_context(Datadog::Trace.trace_context)
53
- Datadog::Trace.wrap_datadog(options) do
54
- block.call
55
- end
72
+ options
56
73
  end
57
74
  end
58
75
  end
@@ -30,25 +30,31 @@ module Datadog
30
30
  # NetExtensions contains patches which add tracing context to http calls
31
31
  module NetExtensions
32
32
  def request(req, body = nil, &block)
33
- logger = Datadog::Utils.logger
34
33
  begin
35
34
  context = Datadog::Trace.current_trace_context(
36
35
  Datadog::Trace.trace_context
37
36
  )
38
37
 
39
- req[Datadog::Trace::DD_SAMPLING_PRIORITY_HEADER.to_sym] =
40
- context[:sample_mode]
41
- req[Datadog::Trace::DD_PARENT_ID_HEADER.to_sym] = context[:parent_id]
42
- req[Datadog::Trace::DD_TRACE_ID_HEADER.to_sym] = context[:trace_id]
43
- logger.debug("added context #{context} to request")
38
+ req = add_ctx_to_req(req, context)
44
39
  rescue StandardError => e
45
40
  trace = e.backtrace.join("\n ")
46
- logger.debug(
41
+ Datadog::Utils.logger.debug(
47
42
  "couldn't add tracing context #{context} to request #{e}:\n#{trace}"
48
43
  )
49
44
  end
50
45
  super(req, body, &block)
51
46
  end
47
+
48
+ private
49
+
50
+ def add_ctx_to_req(req, context)
51
+ req[Datadog::Trace::DD_SAMPLING_PRIORITY_HEADER.to_sym] =
52
+ context[:sample_mode]
53
+ req[Datadog::Trace::DD_PARENT_ID_HEADER.to_sym] = context[:parent_id]
54
+ req[Datadog::Trace::DD_TRACE_ID_HEADER.to_sym] = context[:trace_id]
55
+ Datadog::Utils.logger.debug("added context #{context} to request")
56
+ req
57
+ end
52
58
  end
53
59
  end
54
60
  end
@@ -11,8 +11,8 @@
11
11
  module Datadog
12
12
  module Lambda
13
13
  module VERSION
14
- MAJOR = 0
15
- MINOR = 6
14
+ MAJOR = 1
15
+ MINOR = 11
16
16
  PATCH = 0
17
17
  PRE = nil
18
18
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog-lambda
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-10 00:00:00.000000000 Z
11
+ date: 2020-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-xray-sdk
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.32'
33
+ version: '0.4'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.32'
40
+ version: '0.4'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -113,7 +113,7 @@ files:
113
113
  - lib/datadog/lambda/trace/xray.rb
114
114
  - lib/datadog/lambda/utils/logger.rb
115
115
  - lib/datadog/lambda/version.rb
116
- homepage: https://github.com/DataDog/dd-lambda-rb
116
+ homepage: https://github.com/DataDog/datadog-lambda-rb
117
117
  licenses:
118
118
  - Apache-2.0
119
119
  metadata: