instana 1.201.0 → 1.204.0.pre1
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/.circleci/config.yml +14 -5
- data/.github/ISSUE_TEMPLATE/bug.yml +39 -0
- data/.github/ISSUE_TEMPLATE/config.yml +5 -0
- data/Appraisals +1 -0
- data/README.md +1 -1
- data/gemfiles/aws_30.gemfile +1 -0
- data/lib/instana/activator.rb +2 -0
- data/lib/instana/activators/action_mailer.rb +22 -0
- data/lib/instana/activators/aws_sdk_lambda.rb +20 -0
- data/lib/instana/config.rb +4 -1
- data/lib/instana/frameworks/rails.rb +5 -5
- data/lib/instana/instrumentation/action_mailer.rb +22 -0
- data/lib/instana/instrumentation/aws_sdk_lambda.rb +37 -0
- data/lib/instana/instrumentation/resque.rb +11 -1
- data/lib/instana/instrumented_logger.rb +26 -0
- data/lib/instana/serverless.rb +24 -3
- data/lib/instana/setup.rb +2 -0
- data/lib/instana/tracing/processor.rb +1 -0
- data/lib/instana/tracing/span.rb +16 -31
- data/lib/instana/version.rb +1 -1
- data/test/instrumentation/aws_test.rb +35 -0
- data/test/instrumentation/rails_action_mailer_test.rb +37 -0
- data/test/instrumentation/rails_active_record_database_missing_test.rb +43 -0
- data/test/instrumentation/resque_test.rb +57 -6
- data/test/serverless_test.rb +46 -0
- data/test/support/apps/resque/jobs/resque_fast_job.rb +3 -1
- data/test/test_helper.rb +10 -1
- data/test/tracing/instrumented_logger_test.rb +39 -0
- metadata +17 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99eb3bcbb6b1c801c556d28c7c9831d2bd65c6d17f07ae53ac6a9336dc423e41
|
4
|
+
data.tar.gz: '0804abf2466856db1597e10146865e8fa3bdb10db167dda3c850ac29ae7c44de'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d422c7e103d9839835aeac082b2a42fbbb1bf46f7b0f891ee065d4cbfda5de2257bc4e0470ded8768bb2bf52a6c717591b8f76b4183a09a31167d51faba44fb3
|
7
|
+
data.tar.gz: 6395be74fa6318c073abcd3b5c3e71022d59269b11accda6fef9996a7c3a5f21a353cde4afc6e766f414678c6992b21ad69474cce83fd7c025504f95e375187a
|
data/.circleci/config.yml
CHANGED
@@ -132,12 +132,12 @@ commands:
|
|
132
132
|
name: Install Depdendecies
|
133
133
|
command: |
|
134
134
|
bundle check || bundle install
|
135
|
-
|
135
|
+
run_sonarqube:
|
136
136
|
steps:
|
137
137
|
- run:
|
138
|
-
name:
|
138
|
+
name: Install Java
|
139
139
|
command: |
|
140
|
-
|
140
|
+
sudo apt-get install openjdk-11-jdk
|
141
141
|
- run:
|
142
142
|
name: Run SonarQube to capture coverage
|
143
143
|
command: |
|
@@ -147,8 +147,16 @@ commands:
|
|
147
147
|
-Dsonar.projectKey=ruby-sensor \
|
148
148
|
-Dsonar.sources=. \
|
149
149
|
-Dsonar.host.url="${SONARQUBE_URL}" \
|
150
|
-
-Dsonar.login="${SONARQUBE_LOGIN}"
|
151
|
-
|
150
|
+
-Dsonar.login="${SONARQUBE_LOGIN}"
|
151
|
+
run_tests:
|
152
|
+
steps:
|
153
|
+
- run:
|
154
|
+
name: Run Tests
|
155
|
+
command: |
|
156
|
+
mkdir _junit
|
157
|
+
bundle exec rake
|
158
|
+
- store_test_results:
|
159
|
+
path: ~/_junit
|
152
160
|
run_rubocop:
|
153
161
|
steps:
|
154
162
|
- run:
|
@@ -201,6 +209,7 @@ jobs:
|
|
201
209
|
- checkout
|
202
210
|
- setup
|
203
211
|
- run_rubocop
|
212
|
+
- run_sonarqube
|
204
213
|
publish:
|
205
214
|
executor: ruby_27
|
206
215
|
steps:
|
@@ -0,0 +1,39 @@
|
|
1
|
+
name: Bug Report
|
2
|
+
description: File a bug report
|
3
|
+
title: "[Bug]: "
|
4
|
+
labels: [bug]
|
5
|
+
body:
|
6
|
+
- type: markdown
|
7
|
+
attributes:
|
8
|
+
value: |
|
9
|
+
Thank you for taking the time to fill out this report. Remember that these issues are public and if you need to discuss implementation specific issues securely, please [use our support portal](https://support.instana.com/hc/en-us).
|
10
|
+
- type: textarea
|
11
|
+
id: problem-description
|
12
|
+
attributes:
|
13
|
+
label: Problem Description
|
14
|
+
description: What was the issue that caused you to file this bug?
|
15
|
+
validations:
|
16
|
+
required: true
|
17
|
+
- type: textarea
|
18
|
+
id: mcve
|
19
|
+
attributes:
|
20
|
+
label: Minimal, Complete, Verifiable, Example
|
21
|
+
description: Can you provide steps needed to reproduce this issue outside of your application?
|
22
|
+
validations:
|
23
|
+
required: false
|
24
|
+
- type: textarea
|
25
|
+
id: gemfile-lock
|
26
|
+
attributes:
|
27
|
+
label: Gemfile.lock
|
28
|
+
description: Please paste the contents of the Gemfile.lock for the application that was affected by this bug.
|
29
|
+
render: shell
|
30
|
+
validations:
|
31
|
+
required: true
|
32
|
+
- type: textarea
|
33
|
+
id: ruby-version
|
34
|
+
attributes:
|
35
|
+
label: Ruby Version
|
36
|
+
description: What version of Ruby was the application running under when it encountered this bug?
|
37
|
+
render: shell
|
38
|
+
validations:
|
39
|
+
required: true
|
data/Appraisals
CHANGED
data/README.md
CHANGED
@@ -77,5 +77,5 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/instan
|
|
77
77
|
|
78
78
|
## More
|
79
79
|
|
80
|
-
Want to instrument other languages? See our [Node.js](https://github.com/instana/nodejs
|
80
|
+
Want to instrument other languages? See our [Node.js](https://github.com/instana/nodejs), [Go](https://github.com/instana/golang-sensor), [Python](https://github.com/instana/python-sensor) repositories or [many other supported technologies](https://www.instana.com/supported-technologies/).
|
81
81
|
|
data/gemfiles/aws_30.gemfile
CHANGED
data/lib/instana/activator.rb
CHANGED
@@ -46,11 +46,13 @@ end
|
|
46
46
|
Dir["#{__dir__}/activators/*.rb"]
|
47
47
|
.sort
|
48
48
|
.select do |f|
|
49
|
+
# :nocov:
|
49
50
|
if ENV['INSTANA_ACTIVATE_SET']
|
50
51
|
base = File.basename(f, '.rb')
|
51
52
|
ENV.fetch('INSTANA_ACTIVATE_SET', '').split(',').include?(base)
|
52
53
|
else
|
53
54
|
true
|
54
55
|
end
|
56
|
+
# :nocov:
|
55
57
|
end
|
56
58
|
.each { |f| require(f) }
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
module Instana
|
5
|
+
module Activators
|
6
|
+
class ActionMailer < Activator
|
7
|
+
def can_instrument?
|
8
|
+
defined?(::ActionMailer::Base)
|
9
|
+
end
|
10
|
+
|
11
|
+
def instrument
|
12
|
+
require 'instana/instrumentation/action_mailer'
|
13
|
+
|
14
|
+
::ActionMailer::Base
|
15
|
+
.singleton_class
|
16
|
+
.prepend(Instana::Instrumentation::ActionMailer)
|
17
|
+
|
18
|
+
true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
module Instana
|
5
|
+
module Activators
|
6
|
+
class AwsSdkLambda < Activator
|
7
|
+
def can_instrument?
|
8
|
+
defined?(::Aws::Lambda::Client) && ::Aws::Lambda::Client.respond_to?(:add_plugin)
|
9
|
+
end
|
10
|
+
|
11
|
+
def instrument
|
12
|
+
require 'instana/instrumentation/aws_sdk_lambda'
|
13
|
+
|
14
|
+
::Aws::Lambda::Client.add_plugin(Instana::Instrumentation::Lambda)
|
15
|
+
|
16
|
+
true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/instana/config.rb
CHANGED
@@ -27,6 +27,9 @@ module Instana
|
|
27
27
|
# Enable/disable tracing (default: enabled)
|
28
28
|
@config[:tracing] = { :enabled => true }
|
29
29
|
|
30
|
+
# Enable/Disable logging
|
31
|
+
@config[:logging] = { :enabled => true }
|
32
|
+
|
30
33
|
# Collector interval
|
31
34
|
@config[:collector] = { :enabled => true, :interval => 1 }
|
32
35
|
|
@@ -64,7 +67,7 @@ module Instana
|
|
64
67
|
@config[:graphql] = { :enabled => true }
|
65
68
|
@config[:nethttp] = { :enabled => true }
|
66
69
|
@config[:redis] = { :enabled => true }
|
67
|
-
@config[:'resque-client'] = { :enabled => true }
|
70
|
+
@config[:'resque-client'] = { :enabled => true, :propagate => true }
|
68
71
|
@config[:'resque-worker'] = { :enabled => true, :'setup-fork' => true }
|
69
72
|
@config[:'rest-client'] = { :enabled => true }
|
70
73
|
@config[:'sidekiq-client'] = { :enabled => true }
|
@@ -3,9 +3,6 @@
|
|
3
3
|
|
4
4
|
if ::Rails::VERSION::MAJOR < 3
|
5
5
|
::Rails.configuration.after_initialize do
|
6
|
-
# In Rails, let's use the Rails logger
|
7
|
-
::Instana.logger = ::Rails.logger if ::Rails.logger
|
8
|
-
|
9
6
|
if ::Instana.config[:tracing][:enabled]
|
10
7
|
::Instana.logger.debug "Instrumenting Rack"
|
11
8
|
::Rails.configuration.middleware.insert 0, ::Instana::Rack
|
@@ -17,8 +14,11 @@ else
|
|
17
14
|
module ::Instana
|
18
15
|
class Railtie < ::Rails::Railtie
|
19
16
|
initializer 'instana.rack' do |app|
|
20
|
-
#
|
21
|
-
::Instana.
|
17
|
+
# Configure the Instrumented Logger
|
18
|
+
if ::Instana.config[:logging][:enabled] && !ENV.key?('INSTANA_TEST')
|
19
|
+
logger = ::Instana::InstrumentedLogger.new('/dev/null')
|
20
|
+
Rails.logger.extend(ActiveSupport::Logger.broadcast(logger))
|
21
|
+
end
|
22
22
|
|
23
23
|
if ::Instana.config[:tracing][:enabled]
|
24
24
|
::Instana.logger.debug "Instrumenting Rack"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
module Instana
|
5
|
+
module Instrumentation
|
6
|
+
module ActionMailer
|
7
|
+
def method_missing(method_name, *args) # rubocop:disable Style/MissingRespondToMissing
|
8
|
+
if action_methods.include?(method_name.to_s)
|
9
|
+
tags = {
|
10
|
+
actionmailer: {
|
11
|
+
class: to_s,
|
12
|
+
method: method_name.to_s
|
13
|
+
}
|
14
|
+
}
|
15
|
+
Instana::Tracer.trace(:'mail.actionmailer', tags) { super }
|
16
|
+
else
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
require 'base64'
|
4
|
+
|
5
|
+
module Instana
|
6
|
+
module Instrumentation
|
7
|
+
class Lambda < Seahorse::Client::Plugin
|
8
|
+
class Handler < Seahorse::Client::Handler
|
9
|
+
def call(context)
|
10
|
+
return @handler.call(context) unless [:invoke_async, :invoke].include?(context.operation_name)
|
11
|
+
|
12
|
+
if context.params[:client_context].nil? && ::Instana.tracer.tracing? && context.operation_name == :invoke
|
13
|
+
span_context = ::Instana.tracer.context
|
14
|
+
payload = {
|
15
|
+
'X-INSTANA-T' => span_context.trace_id,
|
16
|
+
'X-INSTANA-S' => span_context.span_id,
|
17
|
+
'X-INSTANA-L' => span_context.level.to_s
|
18
|
+
}
|
19
|
+
|
20
|
+
context.params[:client_context] = JSON.dump(payload)
|
21
|
+
end
|
22
|
+
|
23
|
+
tags = {
|
24
|
+
function: context.params[:function_name],
|
25
|
+
type: context.params[:invocation_type]
|
26
|
+
}.reject { |_, v| v.nil? }
|
27
|
+
|
28
|
+
::Instana.tracer.trace(:"aws.lambda.invoke", {aws: {lambda: {invoke: tags}}}) { @handler.call(context) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_handlers(handlers, _config)
|
33
|
+
handlers.add(Handler, step: :initialize)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -28,6 +28,7 @@ module Instana
|
|
28
28
|
kvs = collect_kvs(:enqueue, klass, args)
|
29
29
|
|
30
30
|
Instana.tracer.trace(:'resque-client', kvs) do
|
31
|
+
args.push(::Instana.tracer.context.to_hash) if ::Instana.config[:'resque-client'][:propagate]
|
31
32
|
super(klass, *args)
|
32
33
|
end
|
33
34
|
else
|
@@ -41,6 +42,7 @@ module Instana
|
|
41
42
|
kvs[:Queue] = queue.to_s if queue
|
42
43
|
|
43
44
|
Instana.tracer.trace(:'resque-client', kvs) do
|
45
|
+
args.push(::Instana.tracer.context.to_hash) if ::Instana.config[:'resque-client'][:propagate]
|
44
46
|
super(queue, klass, *args)
|
45
47
|
end
|
46
48
|
else
|
@@ -76,7 +78,15 @@ module Instana
|
|
76
78
|
::Instana.logger.debug { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" } if Instana::Config[:verbose]
|
77
79
|
end
|
78
80
|
|
79
|
-
Instana.
|
81
|
+
trace_context = if ::Instana.config[:'resque-client'][:propagate] && job.payload['args'][-1].is_a?(Hash) && job.payload['args'][-1].keys.include?('trace_id')
|
82
|
+
context_from_wire = job.payload['args'].pop
|
83
|
+
::Instana::SpanContext.new(
|
84
|
+
context_from_wire['trace_id'],
|
85
|
+
context_from_wire['span_id']
|
86
|
+
)
|
87
|
+
end
|
88
|
+
|
89
|
+
Instana.tracer.start_or_continue_trace(:'resque-worker', kvs, trace_context) do
|
80
90
|
super(job)
|
81
91
|
end
|
82
92
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
module Instana
|
5
|
+
class InstrumentedLogger < Logger
|
6
|
+
LEVEL_LABELS = %w[Debug Info Warn Error Fatal Any].freeze
|
7
|
+
|
8
|
+
def instana_log_level
|
9
|
+
WARN
|
10
|
+
end
|
11
|
+
|
12
|
+
def add(severity, message = nil, progname = nil)
|
13
|
+
severity ||= UNKNOWN
|
14
|
+
|
15
|
+
if severity >= instana_log_level && ::Instana.tracer.tracing?
|
16
|
+
tags = {
|
17
|
+
level: LEVEL_LABELS[severity],
|
18
|
+
message: "#{message} #{progname}".strip
|
19
|
+
}
|
20
|
+
Instana::Tracer.trace(:log, {log: tags}) {}
|
21
|
+
end
|
22
|
+
|
23
|
+
super(severity, message, progname)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/instana/serverless.rb
CHANGED
@@ -23,7 +23,7 @@ module Instana
|
|
23
23
|
|
24
24
|
def wrap_aws(event, context, &block)
|
25
25
|
Thread.current[:instana_function_arn] = [context.invoked_function_arn, context.function_version].join(':')
|
26
|
-
trigger, event_tags, span_context = trigger_from_event(event)
|
26
|
+
trigger, event_tags, span_context = trigger_from_event(event, context)
|
27
27
|
|
28
28
|
tags = {
|
29
29
|
lambda: {
|
@@ -53,7 +53,7 @@ module Instana
|
|
53
53
|
|
54
54
|
private
|
55
55
|
|
56
|
-
def trigger_from_event(event) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
56
|
+
def trigger_from_event(event, context) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
57
57
|
case event
|
58
58
|
when ->(e) { defined?(::Instana::InstrumentedRequest) && e.is_a?(Hash) && e.key?('requestContext') && e['requestContext'].key?('elb') }
|
59
59
|
request = InstrumentedRequest.new(event_to_rack(event))
|
@@ -74,7 +74,28 @@ module Instana
|
|
74
74
|
tags = decode_sqs(event)
|
75
75
|
['aws:sqs', {sqs: tags}, {}]
|
76
76
|
else
|
77
|
-
|
77
|
+
ctx = context_from_lambda_context(context)
|
78
|
+
if ctx.empty?
|
79
|
+
['aws:api.gateway.noproxy', {}, {}]
|
80
|
+
else
|
81
|
+
['aws.lambda.invoke', {}, ctx]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def context_from_lambda_context(context)
|
87
|
+
return {} unless context.client_context
|
88
|
+
|
89
|
+
begin
|
90
|
+
context = JSON.parse(Base64.decode64(context.client_context))
|
91
|
+
|
92
|
+
{
|
93
|
+
trace_id: context['X-INSTANA-T'],
|
94
|
+
span_id: context['X-INSTANA-S'],
|
95
|
+
level: Integer(context['X-INSTANA-L'])
|
96
|
+
}
|
97
|
+
rescue TypeError, JSON::ParserError, NoMethodError => _e
|
98
|
+
{}
|
78
99
|
end
|
79
100
|
end
|
80
101
|
|
data/lib/instana/setup.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
# (c) Copyright IBM Corp. 2021
|
2
2
|
# (c) Copyright Instana Inc. 2016
|
3
3
|
|
4
|
+
require 'logger'
|
4
5
|
require 'concurrent'
|
5
6
|
require 'sys-proctable'
|
6
7
|
|
7
8
|
require 'instana/logger_delegator'
|
9
|
+
require 'instana/instrumented_logger'
|
8
10
|
|
9
11
|
require "instana/base"
|
10
12
|
require "instana/config"
|
data/lib/instana/tracing/span.rb
CHANGED
@@ -6,10 +6,13 @@ module Instana
|
|
6
6
|
REGISTERED_SPANS = [ :actioncontroller, :actionview, :activerecord, :excon,
|
7
7
|
:memcache, :'net-http', :rack, :render, :'rpc-client',
|
8
8
|
:'rpc-server', :'sidekiq-client', :'sidekiq-worker',
|
9
|
-
:redis, :'resque-client', :'resque-worker', :'graphql.server', :dynamodb, :s3, :sns, :sqs, :'aws.lambda.entry', :activejob
|
10
|
-
|
9
|
+
:redis, :'resque-client', :'resque-worker', :'graphql.server', :dynamodb, :s3, :sns, :sqs, :'aws.lambda.entry', :activejob, :log, :"mail.actionmailer",
|
10
|
+
:"aws.lambda.invoke" ].freeze
|
11
|
+
ENTRY_SPANS = [ :rack, :'resque-worker', :'rpc-server', :'sidekiq-worker', :'graphql.server', :sqs,
|
12
|
+
:'aws.lambda.entry' ].freeze
|
11
13
|
EXIT_SPANS = [ :activerecord, :excon, :'net-http', :'resque-client',
|
12
|
-
:'rpc-client', :'sidekiq-client', :redis, :dynamodb, :s3, :sns, :sqs
|
14
|
+
:'rpc-client', :'sidekiq-client', :redis, :dynamodb, :s3, :sns, :sqs, :log, :"mail.actionmailer",
|
15
|
+
:"aws.lambda.invoke" ].freeze
|
13
16
|
HTTP_SPANS = [ :rack, :excon, :'net-http' ].freeze
|
14
17
|
|
15
18
|
attr_accessor :parent
|
@@ -77,34 +80,16 @@ module Instana
|
|
77
80
|
# @param limit [Integer] Limit the backtrace to the top <limit> frames
|
78
81
|
#
|
79
82
|
def add_stack(limit: 30, stack: Kernel.caller)
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
x = i.split(':')
|
92
|
-
|
93
|
-
sanitized_stack << {
|
94
|
-
:c => x[0],
|
95
|
-
:n => x[1],
|
96
|
-
:m => x[2]
|
97
|
-
}
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
if sanitized_stack.length > limit
|
102
|
-
# (limit * -1) gives us negative form of <limit> used for
|
103
|
-
# slicing from the end of the list. e.g. stack[-30, 30]
|
104
|
-
@data[:stack] = sanitized_stack[limit*-1, limit]
|
105
|
-
else
|
106
|
-
@data[:stack] = sanitized_stack
|
107
|
-
end
|
83
|
+
@data[:stack] = stack
|
84
|
+
.map do |call|
|
85
|
+
file, line, *method = call.split(':')
|
86
|
+
|
87
|
+
{
|
88
|
+
c: file,
|
89
|
+
n: line,
|
90
|
+
m: method.join(' ')
|
91
|
+
}
|
92
|
+
end.take(limit > 40 ? 40 : limit)
|
108
93
|
end
|
109
94
|
|
110
95
|
# Log an error into the span
|
data/lib/instana/version.rb
CHANGED
@@ -158,4 +158,39 @@ class AwsTest < Minitest::Test
|
|
158
158
|
assert_equal send_span[:s], message.message_attributes['X_INSTANA_S'].string_value
|
159
159
|
assert_equal 'Sample', message.body
|
160
160
|
end
|
161
|
+
|
162
|
+
def test_lambda
|
163
|
+
stub_request(:post, "https://lambda.local.amazonaws.com/2015-03-31/functions/Test/invocations")
|
164
|
+
.with(
|
165
|
+
body: "data",
|
166
|
+
headers: {
|
167
|
+
'X-Amz-Client-Context' => /.+/
|
168
|
+
}
|
169
|
+
)
|
170
|
+
.to_return(status: 200, body: "", headers: {})
|
171
|
+
|
172
|
+
lambda = Aws::Lambda::Client.new(
|
173
|
+
endpoint: 'https://lambda.local.amazonaws.com',
|
174
|
+
region: 'local',
|
175
|
+
access_key_id: "test",
|
176
|
+
secret_access_key: "test"
|
177
|
+
)
|
178
|
+
|
179
|
+
Instana::Tracer.start_or_continue_trace(:lambda_test, {}) do
|
180
|
+
lambda.invoke(
|
181
|
+
function_name: 'Test',
|
182
|
+
invocation_type: 'Event',
|
183
|
+
payload: 'data'
|
184
|
+
)
|
185
|
+
end
|
186
|
+
|
187
|
+
spans = ::Instana.processor.queued_spans
|
188
|
+
lambda_span, _entry_span, *rest = spans
|
189
|
+
|
190
|
+
assert rest.empty?
|
191
|
+
|
192
|
+
assert_equal :"aws.lambda.invoke", lambda_span[:n]
|
193
|
+
assert_equal 'Test', lambda_span[:data][:aws][:lambda][:invoke][:function]
|
194
|
+
assert_equal 'Event', lambda_span[:data][:aws][:lambda][:invoke][:type]
|
195
|
+
end
|
161
196
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
require 'test_helper'
|
5
|
+
require 'action_mailer'
|
6
|
+
|
7
|
+
class RailsActionMailerTest < Minitest::Test
|
8
|
+
class TestMailer < ActionMailer::Base
|
9
|
+
def sample_email
|
10
|
+
mail(
|
11
|
+
from: 'test@example.com',
|
12
|
+
to: 'test@example.com',
|
13
|
+
subject: 'Test Email',
|
14
|
+
body: 'Hello',
|
15
|
+
content_type: "text/html"
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup
|
21
|
+
TestMailer.delivery_method = :sendmail
|
22
|
+
|
23
|
+
clear_all!
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_mailer
|
27
|
+
Instana.tracer.start_or_continue_trace(:test) do
|
28
|
+
TestMailer.sample_email.deliver_now
|
29
|
+
end
|
30
|
+
|
31
|
+
mail_span, = *::Instana.processor.queued_spans
|
32
|
+
|
33
|
+
assert_equal :"mail.actionmailer", mail_span[:n]
|
34
|
+
assert_equal 'RailsActionMailerTest::TestMailer', mail_span[:data][:actionmailer][:class]
|
35
|
+
assert_equal 'sample_email', mail_span[:data][:actionmailer][:method]
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
require 'test_helper'
|
5
|
+
require 'support/apps/active_record/active_record'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
class RailsActiveRecordDatabaseMissingTest < Minitest::Test
|
9
|
+
def setup
|
10
|
+
skip unless ENV['DATABASE_URL']
|
11
|
+
|
12
|
+
@old_url = ENV['DATABASE_URL']
|
13
|
+
SQLite3::Database.new('/tmp/test.db')
|
14
|
+
ENV['DATABASE_URL'] = 'sqlite3:///tmp/test.db'
|
15
|
+
|
16
|
+
@connection = ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'])
|
17
|
+
ActiveRecord::Migration.suppress_messages do
|
18
|
+
ActiveRecord::Migration.run(CreateBlocks, direction: :up)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def teardown
|
23
|
+
ActiveRecord::Base.remove_connection(@connection)
|
24
|
+
ENV['DATABASE_URL'] = @old_url
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_error_on_missing_database
|
28
|
+
assert_raises(ActiveRecord::StatementInvalid) do
|
29
|
+
Instana::Tracer.start_or_continue_trace(:ar_test, {}) do
|
30
|
+
b = Block.new
|
31
|
+
FileUtils.rm('/tmp/test.db')
|
32
|
+
b.save!
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
spans = ::Instana.processor.queued_spans
|
37
|
+
assert_equal 3, spans.length
|
38
|
+
span = find_first_span_by_name(spans, :activerecord)
|
39
|
+
|
40
|
+
assert_equal 1, span[:ec]
|
41
|
+
assert span[:data][:activerecord][:error].include?("SQLite3::ReadOnlyException: attempt to write a readonly database")
|
42
|
+
end
|
43
|
+
end
|
@@ -22,6 +22,7 @@ class ResqueClientTest < Minitest::Test
|
|
22
22
|
::Resque.enqueue(FastJob)
|
23
23
|
end
|
24
24
|
|
25
|
+
resque_job = Resque.reserve('critical')
|
25
26
|
spans = ::Instana.processor.queued_spans
|
26
27
|
assert_equal 2, spans.length
|
27
28
|
|
@@ -34,6 +35,9 @@ class ResqueClientTest < Minitest::Test
|
|
34
35
|
assert_equal "FastJob", resque_span[:data][:'resque-client'][:job]
|
35
36
|
assert_equal :critical, resque_span[:data][:'resque-client'][:queue]
|
36
37
|
assert_equal false, resque_span[:data][:'resque-client'].key?(:error)
|
38
|
+
|
39
|
+
assert_equal resque_job.args.first['trace_id'], resque_span[:t]
|
40
|
+
assert_equal resque_job.args.first['span_id'], resque_span[:s]
|
37
41
|
end
|
38
42
|
|
39
43
|
def test_enqueue_to
|
@@ -41,6 +45,7 @@ class ResqueClientTest < Minitest::Test
|
|
41
45
|
::Resque.enqueue_to(:critical, FastJob)
|
42
46
|
end
|
43
47
|
|
48
|
+
resque_job = Resque.reserve('critical')
|
44
49
|
spans = ::Instana.processor.queued_spans
|
45
50
|
assert_equal 2, spans.length
|
46
51
|
|
@@ -52,6 +57,9 @@ class ResqueClientTest < Minitest::Test
|
|
52
57
|
assert_equal "FastJob", resque_span[:data][:'resque-client'][:job]
|
53
58
|
assert_equal :critical, resque_span[:data][:'resque-client'][:queue]
|
54
59
|
assert_equal false, resque_span[:data][:'resque-client'].key?(:error)
|
60
|
+
|
61
|
+
assert_equal resque_job.args.first['trace_id'], resque_span[:t]
|
62
|
+
assert_equal resque_job.args.first['span_id'], resque_span[:s]
|
55
63
|
end
|
56
64
|
|
57
65
|
def test_dequeue
|
@@ -73,17 +81,58 @@ class ResqueClientTest < Minitest::Test
|
|
73
81
|
end
|
74
82
|
|
75
83
|
def test_worker_job
|
76
|
-
|
77
|
-
|
84
|
+
::Instana.tracer.start_or_continue_trace(:'resque-client_test') do
|
85
|
+
::Resque.enqueue_to(:critical, FastJob)
|
86
|
+
end
|
87
|
+
|
88
|
+
resque_job = Resque.reserve('critical')
|
89
|
+
@worker.work_one_job(resque_job)
|
90
|
+
|
91
|
+
spans = ::Instana.processor.queued_spans
|
92
|
+
assert_equal 5, spans.length
|
93
|
+
|
94
|
+
client_span = spans[0]
|
95
|
+
resque_span = spans[4]
|
96
|
+
redis1_span = spans[3]
|
97
|
+
redis2_span = spans[2]
|
98
|
+
|
99
|
+
assert_equal :'resque-client', client_span[:n]
|
100
|
+
|
101
|
+
assert_equal :'resque-worker', resque_span[:n]
|
102
|
+
assert_equal client_span[:s], resque_span[:p]
|
103
|
+
assert_equal false, resque_span.key?(:error)
|
104
|
+
assert_equal false, resque_span.key?(:ec)
|
105
|
+
assert_equal "FastJob", resque_span[:data][:'resque-worker'][:job]
|
106
|
+
assert_equal "critical", resque_span[:data][:'resque-worker'][:queue]
|
107
|
+
assert_equal false, resque_span[:data][:'resque-worker'].key?(:error)
|
108
|
+
|
109
|
+
assert_equal :redis, redis1_span[:n]
|
110
|
+
assert_equal "SET", redis1_span[:data][:redis][:command]
|
111
|
+
assert_equal :redis, redis2_span[:n]
|
112
|
+
assert_equal "SET", redis2_span[:data][:redis][:command]
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_worker_job_no_propagate
|
116
|
+
::Instana.config[:'resque-client'][:propagate] = false
|
117
|
+
::Instana.tracer.start_or_continue_trace(:'resque-client_test') do
|
118
|
+
::Resque.enqueue_to(:critical, FastJob)
|
119
|
+
end
|
120
|
+
|
121
|
+
resque_job = Resque.reserve('critical')
|
122
|
+
@worker.work_one_job(resque_job)
|
78
123
|
|
79
124
|
spans = ::Instana.processor.queued_spans
|
80
|
-
assert_equal
|
125
|
+
assert_equal 5, spans.length
|
126
|
+
|
127
|
+
client_span = spans[0]
|
128
|
+
resque_span = spans[4]
|
129
|
+
redis1_span = spans[3]
|
130
|
+
redis2_span = spans[2]
|
81
131
|
|
82
|
-
|
83
|
-
redis1_span = spans[1]
|
84
|
-
redis2_span = spans[0]
|
132
|
+
assert_equal :'resque-client', client_span[:n]
|
85
133
|
|
86
134
|
assert_equal :'resque-worker', resque_span[:n]
|
135
|
+
refute_equal client_span[:s], resque_span[:p]
|
87
136
|
assert_equal false, resque_span.key?(:error)
|
88
137
|
assert_equal false, resque_span.key?(:ec)
|
89
138
|
assert_equal "FastJob", resque_span[:data][:'resque-worker'][:job]
|
@@ -94,6 +143,8 @@ class ResqueClientTest < Minitest::Test
|
|
94
143
|
assert_equal "SET", redis1_span[:data][:redis][:command]
|
95
144
|
assert_equal :redis, redis2_span[:n]
|
96
145
|
assert_equal "SET", redis2_span[:data][:redis][:command]
|
146
|
+
ensure
|
147
|
+
::Instana.config[:'resque-client'][:propagate] = true
|
97
148
|
end
|
98
149
|
|
99
150
|
def test_worker_error_job
|
data/test/serverless_test.rb
CHANGED
@@ -320,4 +320,50 @@ class ServerlessTest < Minitest::Test
|
|
320
320
|
|
321
321
|
assert_equal 'test_arn', data[:messages].first[:queue]
|
322
322
|
end
|
323
|
+
|
324
|
+
def test_lambda_client_context
|
325
|
+
clear_all!
|
326
|
+
|
327
|
+
mock_context = OpenStruct.new(
|
328
|
+
invoked_function_arn: 'test_arn',
|
329
|
+
function_name: 'test_function',
|
330
|
+
function_version: '$TEST',
|
331
|
+
client_context: "eyJYLUlOU1RBTkEtVCI6IjEyMyIsIlgtSU5TVEFOQS1TIjoiNDU2IiwiWC1J\nTlNUQU5BLUwiOiIxIn0=\n"
|
332
|
+
)
|
333
|
+
mock_event = {
|
334
|
+
"Invoked" => true
|
335
|
+
}
|
336
|
+
|
337
|
+
@subject.wrap_aws(mock_event, mock_context) { 0 }
|
338
|
+
|
339
|
+
lambda_span, *rest = Instana.processor.queued_spans
|
340
|
+
assert rest.empty?
|
341
|
+
|
342
|
+
assert_equal 'aws.lambda.invoke', lambda_span[:data][:lambda][:trigger]
|
343
|
+
assert_equal '123', lambda_span[:t]
|
344
|
+
assert_equal '456', lambda_span[:p]
|
345
|
+
end
|
346
|
+
|
347
|
+
def test_lambda_client_context_error
|
348
|
+
clear_all!
|
349
|
+
|
350
|
+
mock_context = OpenStruct.new(
|
351
|
+
invoked_function_arn: 'test_arn',
|
352
|
+
function_name: 'test_function',
|
353
|
+
function_version: '$TEST',
|
354
|
+
client_context: "eyJYLUlOU1RBkEtVCI6IjEyMyIsIlgtSU5TVEFOQS1TIjoiNDU2IiwiWC1J\nTlNUQU5BLUwiOiIxIn0=\n"
|
355
|
+
)
|
356
|
+
mock_event = {
|
357
|
+
"Invoked" => true
|
358
|
+
}
|
359
|
+
|
360
|
+
@subject.wrap_aws(mock_event, mock_context) { 0 }
|
361
|
+
|
362
|
+
lambda_span, *rest = Instana.processor.queued_spans
|
363
|
+
assert rest.empty?
|
364
|
+
|
365
|
+
refute_equal 'aws.lambda.invoke', lambda_span[:data][:lambda][:trigger]
|
366
|
+
refute_equal '123', lambda_span[:t]
|
367
|
+
refute_equal '456', lambda_span[:p]
|
368
|
+
end
|
323
369
|
end
|
data/test/test_helper.rb
CHANGED
@@ -50,5 +50,14 @@ WebMock.disable_net_connect!(
|
|
50
50
|
|
51
51
|
Dir['test/support/*.rb'].each { |f| load(f) }
|
52
52
|
|
53
|
-
|
53
|
+
if ENV['CI']
|
54
|
+
Minitest::Reporters.use!([
|
55
|
+
Minitest::Reporters::JUnitReporter.new('_junit', false),
|
56
|
+
Minitest::Reporters::SpecReporter.new
|
57
|
+
])
|
58
|
+
else
|
59
|
+
Minitest::Reporters.use!([
|
60
|
+
MiniTest::Reporters::SpecReporter.new
|
61
|
+
])
|
62
|
+
end
|
54
63
|
Minitest::Test.include(Instana::TestHelpers)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
require 'test_helper'
|
5
|
+
|
6
|
+
class InstrumentedLoggerTest < Minitest::Test
|
7
|
+
def setup
|
8
|
+
clear_all!
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_log_warn_error
|
12
|
+
subject = Instana::InstrumentedLogger.new('/dev/null')
|
13
|
+
|
14
|
+
Instana::Tracer.start_or_continue_trace(:test_logging) do
|
15
|
+
subject.warn('warn')
|
16
|
+
subject.debug('test')
|
17
|
+
subject.error('error')
|
18
|
+
end
|
19
|
+
|
20
|
+
spans = ::Instana.processor.queued_spans
|
21
|
+
|
22
|
+
warn_span, error_span, = *spans
|
23
|
+
|
24
|
+
assert_equal :log, warn_span[:n]
|
25
|
+
assert_equal 'warn', warn_span[:data][:log][:message]
|
26
|
+
assert_equal 'Warn', warn_span[:data][:log][:level]
|
27
|
+
|
28
|
+
assert_equal :log, error_span[:n]
|
29
|
+
assert_equal 'error', error_span[:data][:log][:message]
|
30
|
+
assert_equal 'Error', error_span[:data][:log][:level]
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_no_trace
|
34
|
+
subject = Instana::InstrumentedLogger.new('/dev/null')
|
35
|
+
subject.warn('warn')
|
36
|
+
|
37
|
+
assert_equal [], ::Instana.processor.queued_spans
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: instana
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.204.0.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Giacomo Lombardo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -135,6 +135,8 @@ files:
|
|
135
135
|
- ".codeclimate.yml"
|
136
136
|
- ".editorconfig"
|
137
137
|
- ".fasterer.yml"
|
138
|
+
- ".github/ISSUE_TEMPLATE/bug.yml"
|
139
|
+
- ".github/ISSUE_TEMPLATE/config.yml"
|
138
140
|
- ".gitignore"
|
139
141
|
- ".rubocop.yml"
|
140
142
|
- ".rubocop_todo.yml"
|
@@ -182,10 +184,12 @@ files:
|
|
182
184
|
- lib/instana/activators/action_cable.rb
|
183
185
|
- lib/instana/activators/action_controller_api.rb
|
184
186
|
- lib/instana/activators/action_controller_base.rb
|
187
|
+
- lib/instana/activators/action_mailer.rb
|
185
188
|
- lib/instana/activators/action_view.rb
|
186
189
|
- lib/instana/activators/active_job.rb
|
187
190
|
- lib/instana/activators/active_record.rb
|
188
191
|
- lib/instana/activators/aws_sdk_dynamodb.rb
|
192
|
+
- lib/instana/activators/aws_sdk_lambda.rb
|
189
193
|
- lib/instana/activators/aws_sdk_s3.rb
|
190
194
|
- lib/instana/activators/aws_sdk_sns.rb
|
191
195
|
- lib/instana/activators/aws_sdk_sqs.rb
|
@@ -224,10 +228,12 @@ files:
|
|
224
228
|
- lib/instana/frameworks/sinatra.rb
|
225
229
|
- lib/instana/instrumentation/action_cable.rb
|
226
230
|
- lib/instana/instrumentation/action_controller.rb
|
231
|
+
- lib/instana/instrumentation/action_mailer.rb
|
227
232
|
- lib/instana/instrumentation/action_view.rb
|
228
233
|
- lib/instana/instrumentation/active_job.rb
|
229
234
|
- lib/instana/instrumentation/active_record.rb
|
230
235
|
- lib/instana/instrumentation/aws_sdk_dynamodb.rb
|
236
|
+
- lib/instana/instrumentation/aws_sdk_lambda.rb
|
231
237
|
- lib/instana/instrumentation/aws_sdk_s3.rb
|
232
238
|
- lib/instana/instrumentation/aws_sdk_sns.rb
|
233
239
|
- lib/instana/instrumentation/aws_sdk_sqs.rb
|
@@ -244,6 +250,7 @@ files:
|
|
244
250
|
- lib/instana/instrumentation/shoryuken.rb
|
245
251
|
- lib/instana/instrumentation/sidekiq-client.rb
|
246
252
|
- lib/instana/instrumentation/sidekiq-worker.rb
|
253
|
+
- lib/instana/instrumented_logger.rb
|
247
254
|
- lib/instana/logger_delegator.rb
|
248
255
|
- lib/instana/open_tracing/carrier.rb
|
249
256
|
- lib/instana/open_tracing/instana_tracer.rb
|
@@ -295,8 +302,10 @@ files:
|
|
295
302
|
- test/instrumentation/rack_test.rb
|
296
303
|
- test/instrumentation/rails_action_cable_test.rb
|
297
304
|
- test/instrumentation/rails_action_controller_test.rb
|
305
|
+
- test/instrumentation/rails_action_mailer_test.rb
|
298
306
|
- test/instrumentation/rails_action_view_test.rb
|
299
307
|
- test/instrumentation/rails_active_job_test.rb
|
308
|
+
- test/instrumentation/rails_active_record_database_missing_test.rb
|
300
309
|
- test/instrumentation/rails_active_record_test.rb
|
301
310
|
- test/instrumentation/redis_test.rb
|
302
311
|
- test/instrumentation/resque_test.rb
|
@@ -334,6 +343,7 @@ files:
|
|
334
343
|
- test/test_helper.rb
|
335
344
|
- test/tracing/custom_test.rb
|
336
345
|
- test/tracing/id_management_test.rb
|
346
|
+
- test/tracing/instrumented_logger_test.rb
|
337
347
|
- test/tracing/opentracing_test.rb
|
338
348
|
- test/tracing/processor_test.rb
|
339
349
|
- test/tracing/span_context_test.rb
|
@@ -360,9 +370,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
360
370
|
version: '2.1'
|
361
371
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
362
372
|
requirements:
|
363
|
-
- - "
|
373
|
+
- - ">"
|
364
374
|
- !ruby/object:Gem::Version
|
365
|
-
version:
|
375
|
+
version: 1.3.1
|
366
376
|
requirements: []
|
367
377
|
rubygems_version: 3.1.6
|
368
378
|
signing_key:
|
@@ -396,8 +406,10 @@ test_files:
|
|
396
406
|
- test/instrumentation/rack_test.rb
|
397
407
|
- test/instrumentation/rails_action_cable_test.rb
|
398
408
|
- test/instrumentation/rails_action_controller_test.rb
|
409
|
+
- test/instrumentation/rails_action_mailer_test.rb
|
399
410
|
- test/instrumentation/rails_action_view_test.rb
|
400
411
|
- test/instrumentation/rails_active_job_test.rb
|
412
|
+
- test/instrumentation/rails_active_record_database_missing_test.rb
|
401
413
|
- test/instrumentation/rails_active_record_test.rb
|
402
414
|
- test/instrumentation/redis_test.rb
|
403
415
|
- test/instrumentation/resque_test.rb
|
@@ -435,6 +447,7 @@ test_files:
|
|
435
447
|
- test/test_helper.rb
|
436
448
|
- test/tracing/custom_test.rb
|
437
449
|
- test/tracing/id_management_test.rb
|
450
|
+
- test/tracing/instrumented_logger_test.rb
|
438
451
|
- test/tracing/opentracing_test.rb
|
439
452
|
- test/tracing/processor_test.rb
|
440
453
|
- test/tracing/span_context_test.rb
|