instana 1.209.7 → 1.210.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7ad727e388d233521b7837cfc0157cd6b5af54f307529ad5e58207894d6863de
4
- data.tar.gz: 9fb40e5a5769d996195f076475c2ef5d67182e245e549cf14970dcc0779d6014
3
+ metadata.gz: f0c28b91f8eb2d64963d01cf4a2368efbdb21ca9d9a8290324c382730d7a4785
4
+ data.tar.gz: b36132d8b22cf57151889f9955f58656cf8d02048c148bf3c7bc62b619926604
5
5
  SHA512:
6
- metadata.gz: 0f9e58d31701ffd88af39ff5ac25e7c87a443153122a63b6e319e04c545d3926318d4c5862b8a628a215325f6f873d26852eb426440ceaa19746c4c80e9d19e6
7
- data.tar.gz: d83ea081e9721634bcbf0aff97b1fc67f78fdcfabe52bfbeda95f20fc144c017e16d137f74d02a54f9a0adbb028916c5a62596b7af2a7cb51a80880d0fc79f99
6
+ metadata.gz: b55ba81f80d1d99e79225cf611fe435b7db3ea64ff4dd2ce0044fa524d0ccf1618b52cf01de59daf9e60fc8d0c78caf6425f00c8a8983ad92eea505c5036e0a2
7
+ data.tar.gz: de69af23be0d789a7468f8927ed948ced66ebb7e3f49d78422d52dbc08988dfe2427c7690c06e105cb429d62447cd9bd863543ca9fd982864d8899cf38e3ca58
data/.circleci/config.yml CHANGED
@@ -38,6 +38,117 @@ executors:
38
38
  environment:
39
39
  POSTGRES_PASSWORD: 'test'
40
40
  POSTGRES_DB: 'ci_test'
41
+ ruby_30:
42
+ docker:
43
+ - image: cimg/ruby:3.0-node
44
+ environment:
45
+ MEMCACHED_HOST: '127.0.0.1:11211'
46
+ REDIS_URL: 'redis://127.0.0.1:6379'
47
+ DATABASE_URL: 'sqlite3::memory:'
48
+ - image: memcached
49
+ - image: redis
50
+ - image: amazon/dynamodb-local
51
+ - image: minio/minio:latest
52
+ command: ["server", "/data"]
53
+ - image: s12v/sns
54
+ - image: softwaremill/elasticmq-native
55
+ - image: mongo:5-focal
56
+ ruby_30_mysql2:
57
+ docker:
58
+ - image: cimg/ruby:3.0-node
59
+ environment:
60
+ DATABASE_URL: "mysql2://root@127.0.0.1:3306/ci_test"
61
+ - image: mariadb
62
+ environment:
63
+ MYSQL_DATABASE: 'ci_test'
64
+ MYSQL_USER: 'root'
65
+ MYSQL_PASSWORD: ''
66
+ MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
67
+ MYSQL_ROOT_PASSWORD: ''
68
+ MYSQL_ROOT_HOST: '%'
69
+ ruby_30_postgres:
70
+ docker:
71
+ - image: cimg/ruby:3.0-node
72
+ environment:
73
+ DATABASE_URL: "postgres://postgres:test@127.0.0.1:5432/ci_test"
74
+ - image: postgres
75
+ environment:
76
+ POSTGRES_PASSWORD: 'test'
77
+ POSTGRES_DB: 'ci_test'
78
+ ruby_31:
79
+ docker:
80
+ - image: cimg/ruby:3.1-node
81
+ environment:
82
+ MEMCACHED_HOST: '127.0.0.1:11211'
83
+ REDIS_URL: 'redis://127.0.0.1:6379'
84
+ DATABASE_URL: 'sqlite3::memory:'
85
+ - image: memcached
86
+ - image: redis
87
+ - image: amazon/dynamodb-local
88
+ - image: minio/minio:latest
89
+ command: ["server", "/data"]
90
+ - image: s12v/sns
91
+ - image: softwaremill/elasticmq-native
92
+ - image: mongo:5-focal
93
+ ruby_31_mysql2:
94
+ docker:
95
+ - image: cimg/ruby:3.1-node
96
+ environment:
97
+ DATABASE_URL: "mysql2://root@127.0.0.1:3306/ci_test"
98
+ - image: mariadb
99
+ environment:
100
+ MYSQL_DATABASE: 'ci_test'
101
+ MYSQL_USER: 'root'
102
+ MYSQL_PASSWORD: ''
103
+ MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
104
+ MYSQL_ROOT_PASSWORD: ''
105
+ MYSQL_ROOT_HOST: '%'
106
+ ruby_31_postgres:
107
+ docker:
108
+ - image: cimg/ruby:3.1-node
109
+ environment:
110
+ DATABASE_URL: "postgres://postgres:test@127.0.0.1:5432/ci_test"
111
+ - image: postgres
112
+ environment:
113
+ POSTGRES_PASSWORD: 'test'
114
+ POSTGRES_DB: 'ci_test'
115
+ ruby_32:
116
+ docker:
117
+ - image: cimg/ruby:3.2-node
118
+ environment:
119
+ MEMCACHED_HOST: '127.0.0.1:11211'
120
+ REDIS_URL: 'redis://127.0.0.1:6379'
121
+ DATABASE_URL: 'sqlite3::memory:'
122
+ - image: memcached
123
+ - image: redis
124
+ - image: amazon/dynamodb-local
125
+ - image: minio/minio:latest
126
+ command: ["server", "/data"]
127
+ - image: s12v/sns
128
+ - image: softwaremill/elasticmq-native
129
+ - image: mongo:5-focal
130
+ ruby_32_mysql2:
131
+ docker:
132
+ - image: cimg/ruby:3.2-node
133
+ environment:
134
+ DATABASE_URL: "mysql2://root@127.0.0.1:3306/ci_test"
135
+ - image: mariadb
136
+ environment:
137
+ MYSQL_DATABASE: 'ci_test'
138
+ MYSQL_USER: 'root'
139
+ MYSQL_PASSWORD: ''
140
+ MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
141
+ MYSQL_ROOT_PASSWORD: ''
142
+ MYSQL_ROOT_HOST: '%'
143
+ ruby_32_postgres:
144
+ docker:
145
+ - image: cimg/ruby:3.2-node
146
+ environment:
147
+ DATABASE_URL: "postgres://postgres:test@127.0.0.1:5432/ci_test"
148
+ - image: postgres
149
+ environment:
150
+ POSTGRES_PASSWORD: 'test'
151
+ POSTGRES_DB: 'ci_test'
41
152
 
42
153
  commands:
43
154
  setup:
@@ -176,6 +287,9 @@ workflows:
176
287
  parameters:
177
288
  stack:
178
289
  - ruby_27
290
+ - ruby_30
291
+ - ruby_31
292
+ - ruby_32
179
293
  libraries:
180
294
  jobs:
181
295
  - test_apprisal:
@@ -183,6 +297,9 @@ workflows:
183
297
  parameters:
184
298
  stack:
185
299
  - ruby_27
300
+ - ruby_30
301
+ - ruby_31
302
+ - ruby_32
186
303
  gemfile:
187
304
  - "./gemfiles/aws_30.gemfile"
188
305
  - "./gemfiles/cuba_30.gemfile"
@@ -190,6 +307,7 @@ workflows:
190
307
  - "./gemfiles/dalli_20.gemfile"
191
308
  - "./gemfiles/excon_02.gemfile"
192
309
  - "./gemfiles/excon_079.gemfile"
310
+ - "./gemfiles/excon_100.gemfile"
193
311
  - "./gemfiles/graphql_10.gemfile"
194
312
  - "./gemfiles/graphql_20.gemfile"
195
313
  - "./gemfiles/grpc_10.gemfile"
@@ -205,10 +323,32 @@ workflows:
205
323
  - "./gemfiles/roda_30.gemfile"
206
324
  - "./gemfiles/sidekiq_42.gemfile"
207
325
  - "./gemfiles/sidekiq_50.gemfile"
326
+ - "./gemfiles/sidekiq_60.gemfile"
327
+ - "./gemfiles/sidekiq_70.gemfile"
208
328
  - "./gemfiles/sinatra_14.gemfile"
209
329
  - "./gemfiles/shoryuken_50.gemfile"
210
330
  - "./gemfiles/mongo_216.gemfile"
211
- rails:
331
+ exclude:
332
+ # Currently rest-client 1.6 gemfile pulls in mime-types 2.99.3
333
+ # and adaptation to mime-type 3.0 is only available in rest-client 2.0:
334
+ # https://github.com/rest-client/rest-client/issues/464
335
+ # But mime-types 2.99.3 is too old for Ruby 3.0 or newer:
336
+ # https://stackoverflow.com/a/68433864
337
+ # so we should exclude thiese scenarios
338
+ - stack: ruby_30
339
+ gemfile: "./gemfiles/rest_client_16.gemfile"
340
+ - stack: ruby_31
341
+ gemfile: "./gemfiles/rest_client_16.gemfile"
342
+ - stack: ruby_32
343
+ gemfile: "./gemfiles/rest_client_16.gemfile"
344
+ # Sinatra 1.4 relies on the Fixnum class
345
+ # which has been removed from Ruby 3.2, see:
346
+ # https://bugs.ruby-lang.org/issues/12005
347
+ # https://www.ruby-lang.org/en/news/2022/11/11/ruby-3-2-0-preview3-released/
348
+ - stack: ruby_32
349
+ gemfile: "./gemfiles/sinatra_14.gemfile"
350
+
351
+ rails_ruby_2:
212
352
  jobs:
213
353
  - test_apprisal:
214
354
  matrix:
@@ -221,3 +361,21 @@ workflows:
221
361
  - "./gemfiles/rails_60.gemfile"
222
362
  - "./gemfiles/rails_52.gemfile"
223
363
  - "./gemfiles/rails_50.gemfile"
364
+ rails_ruby_3:
365
+ jobs:
366
+ - test_apprisal:
367
+ matrix:
368
+ parameters:
369
+ stack:
370
+ - ruby_30
371
+ - ruby_30_postgres
372
+ - ruby_30_mysql2
373
+ - ruby_31
374
+ - ruby_31_postgres
375
+ - ruby_31_mysql2
376
+ - ruby_32
377
+ - ruby_32_postgres
378
+ - ruby_32_mysql2
379
+ gemfile:
380
+ - "./gemfiles/rails_61.gemfile"
381
+ - "./gemfiles/rails_70.gemfile"
@@ -0,0 +1,16 @@
1
+ # (c) Copyright IBM Corp. 2023
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rack", "<3.0.0"
6
+ gem "rake"
7
+ gem "minitest", "5.9.1"
8
+ gem "minitest-reporters"
9
+ gem "webmock"
10
+ gem "puma"
11
+ gem "rubocop", "~> 1.9"
12
+ gem "rack-test"
13
+ gem "simplecov", "~> 0.21.2"
14
+ gem "excon", ">= 0.100.0", "< 1.0"
15
+
16
+ gemspec path: "../"
@@ -13,6 +13,6 @@ gem "puma"
13
13
  gem "rubocop", "~> 1.9"
14
14
  gem "rack-test"
15
15
  gem "simplecov", "~> 0.21.2"
16
- gem "grpc", ">= 1.0", "< 2.0"
16
+ gem "grpc", ">= 1.55.0", "< 2.0"
17
17
 
18
18
  gemspec path: "../"
@@ -0,0 +1,22 @@
1
+ # This file was generated by Appraisal
2
+
3
+ # (c) Copyright IBM Corp. 2021
4
+ # (c) Copyright Instana Inc. 2021
5
+
6
+ source "https://rubygems.org"
7
+
8
+ gem "rake"
9
+ gem "minitest", "5.9.1"
10
+ gem "minitest-reporters"
11
+ gem "webmock"
12
+ gem "puma"
13
+ gem "rubocop", "~> 1.9"
14
+ gem "rack-test"
15
+ gem "simplecov", "~> 0.21.2"
16
+ gem "mail", ">= 2.8.1"
17
+ gem "rails", ">= 6.1", "< 7.0"
18
+ gem "mysql2", "0.5.5"
19
+ gem "pg"
20
+ gem "sqlite3", "~> 1.4"
21
+
22
+ gemspec path: "../"
@@ -0,0 +1,19 @@
1
+ # (c) Copyright IBM Corp. 2023
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "minitest", "5.9.1"
7
+ gem "minitest-reporters"
8
+ gem "webmock"
9
+ gem "puma"
10
+ gem "rubocop", "~> 1.9"
11
+ gem "rack-test"
12
+ gem "simplecov", "~> 0.21.2"
13
+ gem "mail", ">= 2.8.1"
14
+ gem "rails", ">= 7.0"
15
+ gem "mysql2", "0.5.5"
16
+ gem "pg"
17
+ gem "sqlite3", "~> 1.4"
18
+
19
+ gemspec path: "../"
@@ -14,6 +14,6 @@ gem "puma"
14
14
  gem "rubocop", "~> 1.9"
15
15
  gem "rack-test"
16
16
  gem "simplecov", "~> 0.21.2"
17
- gem "rest-client", ">= 2.0", "< 3.0"
17
+ gem "rest-client", ">= 2.1.0", "< 3.0"
18
18
 
19
19
  gemspec path: "../"
@@ -0,0 +1,15 @@
1
+ # (c) Copyright IBM Corp. 2023
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "minitest", "5.9.1"
7
+ gem "minitest-reporters"
8
+ gem "webmock"
9
+ gem "puma"
10
+ gem "rubocop", "~> 1.9"
11
+ gem "rack-test"
12
+ gem "simplecov", "~> 0.21.2"
13
+ gem "sidekiq", ">= 6.0", "< 7.0"
14
+
15
+ gemspec path: "../"
@@ -0,0 +1,15 @@
1
+ # (c) Copyright IBM Corp. 2023
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "minitest", "5.9.1"
7
+ gem "minitest-reporters"
8
+ gem "webmock"
9
+ gem "puma"
10
+ gem "rubocop", "~> 1.9"
11
+ gem "rack-test"
12
+ gem "simplecov", "~> 0.21.2"
13
+ gem "sidekiq", ">= 7.0"
14
+
15
+ gemspec path: "../"
@@ -15,7 +15,7 @@ module Instana
15
15
  end
16
16
 
17
17
  module ActionCableChannel
18
- def transmit(*args)
18
+ def transmit(data, via: nil)
19
19
  rpc_tags = {
20
20
  service: ::Instana::Util.get_app_name,
21
21
  rpc: {
@@ -28,7 +28,7 @@ module Instana
28
28
 
29
29
  context = connection.instana_trace_context
30
30
  ::Instana.tracer.start_or_continue_trace(:'rpc-server', rpc_tags, context) do
31
- super(*args)
31
+ super(data, via: via)
32
32
  end
33
33
  end
34
34
 
@@ -8,7 +8,7 @@ module Instana
8
8
  IGNORED_SQL = %w[BEGIN COMMIT SET].freeze
9
9
  SANITIZE_REGEXP = /('[\s\S][^']*'|\d*\.\d+|\d+|NULL)/i.freeze
10
10
 
11
- def log(sql, name = 'SQL', binds = [], *args)
11
+ def log(sql, name = 'SQL', binds = [], *args, **kwargs, &block)
12
12
  call_payload = {
13
13
  activerecord: {
14
14
  adapter: @config[:adapter],
@@ -24,7 +24,7 @@ module Instana
24
24
  call_payload[:activerecord][:binds] = mapped
25
25
  end
26
26
 
27
- maybe_trace(call_payload, name) { super(sql, name, binds, *args) }
27
+ maybe_trace(call_payload, name) { super(sql, name, binds, *args, **kwargs, &block) }
28
28
  end
29
29
 
30
30
  private
@@ -63,7 +63,20 @@ module Instana
63
63
  return [] unless parent.respond_to?(method)
64
64
 
65
65
  parent.send(method).map do |field|
66
- [{object: parent.name, field: field.name}] + walk_fields(field, method)
66
+ # Certain types like GraphQL::Language::Nodes::InlineFragment
67
+ # have no "name" instance variable defined,
68
+ # in such case we use the class's name
69
+ parent_name = if parent.instance_variable_defined?(:@name)
70
+ parent.name
71
+ else
72
+ parent.class.name.split('::').last
73
+ end
74
+ field_name = if field.instance_variable_defined?(:@name)
75
+ field.name
76
+ else
77
+ field.class.name.split('::').last
78
+ end
79
+ [{object: parent_name, field: field_name}] + walk_fields(field, method)
67
80
  end.flatten
68
81
  end
69
82
 
@@ -2,6 +2,6 @@
2
2
  # (c) Copyright Instana Inc. 2016
3
3
 
4
4
  module Instana
5
- VERSION = "1.209.7"
5
+ VERSION = "1.210.0"
6
6
  VERSION_FULL = "instana-#{VERSION}"
7
7
  end
data/lib/opentracing.rb CHANGED
@@ -17,8 +17,8 @@ module OpenTracing
17
17
 
18
18
  attr_accessor :global_tracer
19
19
 
20
- def method_missing(method_name, *args, &block)
21
- @global_tracer.send(method_name, *args, &block)
20
+ def method_missing(method_name, *args, **kwargs, &block)
21
+ @global_tracer.send(method_name, *args, **kwargs, &block)
22
22
  end
23
23
 
24
24
  def respond_to_missing?(name, all)
@@ -8,84 +8,213 @@ class GraphqlTest < Minitest::Test
8
8
  field :id, ID, null: false
9
9
  field :action, String, null: false
10
10
  end
11
-
11
+
12
+ class JobType < GraphQL::Schema::Object
13
+ field :id, ID, null: false
14
+ field :name, String, null: false
15
+ field :description, String, null: false
16
+ end
17
+
18
+ class TaskJobUnion < GraphQL::Schema::Union
19
+ description "A union type for Task and Job"
20
+ possible_types TaskType, JobType
21
+
22
+ def self.resolve_type(object, _context)
23
+ if !object.action.nil?
24
+ TaskType
25
+ elsif !object.description?
26
+ JobType
27
+ else
28
+ raise("Unexpected object: #{object}")
29
+ end
30
+ end
31
+ end
32
+
12
33
  class NewTaskType < GraphQL::Schema::Mutation
13
34
  argument :action, String, required: true
14
35
  field :task, TaskType, null: true
15
-
36
+
16
37
  def resolve(action:)
17
38
  {
18
39
  task: OpenStruct.new(id: '0', action: action)
19
40
  }
20
41
  end
21
42
  end
22
-
43
+
23
44
  class QueryType < GraphQL::Schema::Object
24
45
  field :tasks, TaskType.connection_type, null: false
25
-
46
+ field :jobs, JobType.connection_type, null: false
47
+ field :tasksorjobs, TaskJobUnion.connection_type, null: false
48
+
26
49
  def tasks()
27
50
  [
28
- OpenStruct.new(id: '0', action: 'Sample')
51
+ OpenStruct.new(id: '0', action: 'Sample 00'),
52
+ OpenStruct.new(id: '1', action: 'Sample 01'),
53
+ OpenStruct.new(id: '2', action: 'Sample 02'),
54
+ OpenStruct.new(id: '3', action: 'Sample 03'),
55
+ OpenStruct.new(id: '4', action: 'Sample 04')
56
+ ]
57
+ end
58
+
59
+ def jobs()
60
+ [
61
+ OpenStruct.new(id: '0', name: 'Name 00', description: 'Desc 00'),
62
+ OpenStruct.new(id: '1', name: 'Name 01', description: 'Desc 01'),
63
+ OpenStruct.new(id: '2', name: 'Name 02', description: 'Desc 02'),
64
+ OpenStruct.new(id: '3', name: 'Name 03', description: 'Desc 03'),
65
+ OpenStruct.new(id: '4', name: 'Name 04', description: 'Desc 04')
66
+ ]
67
+ end
68
+
69
+ def tasksorjobs()
70
+ [
71
+ OpenStruct.new(id: '0', action: 'Task 00'),
72
+ OpenStruct.new(id: '0', name: 'Job 00', description: 'Job Desc 00')
29
73
  ]
30
74
  end
31
75
  end
32
-
76
+
33
77
  class MutationType < GraphQL::Schema::Object
34
78
  field :create_task, mutation: NewTaskType
35
79
  end
36
-
80
+
37
81
  class Schema < GraphQL::Schema
38
82
  query QueryType
39
83
  mutation MutationType
40
84
  end
41
-
85
+
42
86
  def test_it_works
43
87
  assert defined?(GraphQL)
44
88
  end
45
-
46
- def test_config_defaults
89
+
90
+ def test_config_defaults
47
91
  assert ::Instana.config[:graphql].is_a?(Hash)
48
92
  assert ::Instana.config[:graphql].key?(:enabled)
49
93
  assert_equal true, ::Instana.config[:graphql][:enabled]
50
94
  end
51
-
95
+
52
96
  def test_query
53
97
  clear_all!
54
-
55
- query = "query Sample {
56
- tasks(after: \"\", first: 10) {
98
+
99
+ query = "query FirstTwoTaskSamples {
100
+ tasks(after: \"\", first: 2) {
57
101
  nodes {
58
102
  action
59
103
  }
60
104
  }
61
105
  }"
62
-
106
+
63
107
  expected_data = {
64
- :operationName => "Sample",
108
+ :operationName => "FirstTwoTaskSamples",
65
109
  :operationType => "query",
66
110
  :arguments => { "tasks" => ["after", "first"] },
67
111
  :fields => { "tasks" => ["nodes"], "nodes" => ["action"] }
68
112
  }
69
113
  expected_results = {
70
114
  "data" => {
71
- "tasks" => {
72
- "nodes" => [{ "action" => "Sample" }]
115
+ "tasks" => {
116
+ "nodes" => [{"action" => "Sample 00"}, {"action" => "Sample 01"}]
117
+ }
118
+ }
119
+ }
120
+
121
+ results = Instana.tracer.start_or_continue_trace('graphql-test') { Schema.execute(query) }
122
+ query_span, root_span = *Instana.processor.queued_spans
123
+
124
+ assert_equal expected_results, results.to_h
125
+ assert_equal :sdk, root_span[:n]
126
+ assert_equal :'graphql.server', query_span[:n]
127
+ assert_equal expected_data, query_span[:data][:graphql]
128
+ end
129
+
130
+ def test_query_with_fragment
131
+ clear_all!
132
+
133
+ query = "
134
+ fragment actionDetails on Task {
135
+ action
136
+ }
137
+
138
+ query SampleWithFragment {
139
+ tasks {
140
+ nodes {
141
+ ... actionDetails
142
+ }
143
+ }
144
+ }"
145
+
146
+ expected_data = {
147
+ :operationName => "SampleWithFragment",
148
+ :operationType => "query",
149
+ :arguments => {},
150
+ :fields => { "tasks" => ["nodes"], "nodes" => ["actionDetails"] }
151
+ }
152
+ expected_results = {
153
+ "data" => {
154
+ "tasks" => {
155
+ "nodes" => [{"action" => "Sample 00"}, {"action" => "Sample 01"},
156
+ {"action" => "Sample 02"}, {"action" => "Sample 03"},
157
+ {"action" => "Sample 04"}]
73
158
  }
74
159
  }
75
160
  }
76
-
161
+
77
162
  results = Instana.tracer.start_or_continue_trace('graphql-test') { Schema.execute(query) }
78
163
  query_span, root_span = *Instana.processor.queued_spans
79
-
164
+
80
165
  assert_equal expected_results, results.to_h
81
166
  assert_equal :sdk, root_span[:n]
82
167
  assert_equal :'graphql.server', query_span[:n]
83
168
  assert_equal expected_data, query_span[:data][:graphql]
84
169
  end
85
-
170
+
171
+ def test_query_union_with_fragment
172
+ clear_all!
173
+
174
+ query = "
175
+ query QueryUnionWithFragment {
176
+ tasksorjobs {
177
+ nodes {
178
+ ... on Task {
179
+ action
180
+ }
181
+ ... on Job {
182
+ name
183
+ description
184
+ }
185
+ }
186
+ }
187
+ }"
188
+
189
+ expected_data = {
190
+ :operationName => "QueryUnionWithFragment",
191
+ :operationType => "query",
192
+ :arguments => {},
193
+ :fields => { "tasksorjobs" => ["nodes"],
194
+ "nodes" => ["InlineFragment", "InlineFragment"],
195
+ "InlineFragment" => %w[action name description]}
196
+ }
197
+ expected_results = {
198
+ "data" => {
199
+ "tasksorjobs" => {
200
+ "nodes" => [{"action" => "Task 00"},
201
+ {"name" => "Job 00", "description" => "Job Desc 00"}]
202
+ }
203
+ }
204
+ }
205
+
206
+ results = Instana.tracer.start_or_continue_trace('graphql-test') { Schema.execute(query) }
207
+ query_span, root_span = *Instana.processor.queued_spans
208
+
209
+ assert_equal expected_results, results.to_h
210
+ assert_equal :sdk, root_span[:n]
211
+ assert_equal :'graphql.server', query_span[:n]
212
+ assert_equal expected_data, query_span[:data][:graphql]
213
+ end
214
+
86
215
  def test_mutation
87
216
  clear_all!
88
-
217
+
89
218
  query = "mutation Sample {
90
219
  createTask(action: \"Sample\") {
91
220
  task {
@@ -93,7 +222,7 @@ class GraphqlTest < Minitest::Test
93
222
  }
94
223
  }
95
224
  }"
96
-
225
+
97
226
  expected_data = {
98
227
  :operationName => "Sample",
99
228
  :operationType => "mutation",
@@ -102,15 +231,15 @@ class GraphqlTest < Minitest::Test
102
231
  }
103
232
  expected_results = {
104
233
  "data" => {
105
- "createTask" => {
234
+ "createTask" => {
106
235
  "task" => { "action" => "Sample" }
107
236
  }
108
237
  }
109
238
  }
110
-
239
+
111
240
  results = Instana.tracer.start_or_continue_trace('graphql-test') { Schema.execute(query) }
112
241
  query_span, root_span = *Instana.processor.queued_spans
113
-
242
+
114
243
  assert_equal expected_results, results.to_h
115
244
  assert_equal :sdk, root_span[:n]
116
245
  assert_equal :'graphql.server', query_span[:n]
@@ -22,7 +22,7 @@ class RailsActionCableTest < Minitest::Test
22
22
 
23
23
  channel_klass
24
24
  .new(connection, :test)
25
- .send(:transmit, 'action' => 'sample')
25
+ .send(:transmit, 'Sample message', via: nil)
26
26
 
27
27
  span, rest = Instana.processor.queued_spans
28
28
  data = span[:data]
@@ -47,7 +47,7 @@ class RailsActionCableTest < Minitest::Test
47
47
 
48
48
  channel_klass
49
49
  .new(connection, :test)
50
- .send(:transmit, 'action' => 'sample')
50
+ .send(:transmit, 'Sample message', via: 'Important')
51
51
 
52
52
  span, rest = Instana.processor.queued_spans
53
53
  data = span[:data]
@@ -125,7 +125,7 @@ class RailsActionCableTest < Minitest::Test
125
125
  config: OpenStruct.new(log_tags: [])
126
126
  )
127
127
  connection = ActionCable::Connection::Base.new(server, {})
128
- connection.define_singleton_method(:transmit) { |*_args| true }
128
+ connection.define_singleton_method(:transmit) { |*_args, **_kwargs| true }
129
129
  connection
130
130
  end
131
131
  end
@@ -7,13 +7,24 @@ require 'action_mailer'
7
7
  class RailsActionMailerTest < Minitest::Test
8
8
  class TestMailer < ActionMailer::Base
9
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
- )
10
+ mail_version = Gem::Specification.find_by_name('mail').version
11
+ if mail_version >= Gem::Version.new('2.8.1')
12
+ Mail.new do
13
+ from 'test@example.com'
14
+ to 'test@example.com'
15
+ subject 'Test Email'
16
+ body 'Hello'
17
+ content_type "text/html"
18
+ end
19
+ else
20
+ mail(
21
+ from: 'test@example.com',
22
+ to: 'test@example.com',
23
+ subject: 'Test Email',
24
+ body: 'Hello',
25
+ content_type: "text/html"
26
+ )
27
+ end
17
28
  end
18
29
  end
19
30
 
@@ -13,6 +13,18 @@ class RailsActionViewTest < Minitest::Test
13
13
 
14
14
  def setup
15
15
  clear_all!
16
+ @framework_version = Gem::Specification.find_by_name('rails').version
17
+ @supported_framework_version = @framework_version < Gem::Version.new('6.1')
18
+ @execute_test_if_framework_version_is_supported = lambda {
19
+ unless @supported_framework_version
20
+ skip "Skipping this test because Rails version #{@framework_version} is not yet supported!"
21
+ end
22
+ }
23
+ @execute_test_only_if_framework_version_is_not_supported = lambda {
24
+ if @supported_framework_version
25
+ skip "Skipping this test because Rails version #{@framework_version} is already supported!"
26
+ end
27
+ }
16
28
  end
17
29
 
18
30
  def test_config_defaults
@@ -21,7 +33,25 @@ class RailsActionViewTest < Minitest::Test
21
33
  assert_equal true, ::Instana.config[:action_view][:enabled]
22
34
  end
23
35
 
36
+ def test_no_tracing_if_unsupported_version_only_render_is_ok
37
+ @execute_test_only_if_framework_version_is_not_supported.call
38
+
39
+ ['/render_view', '/render_view_direct', '/render_partial', '/render_collection', '/render_file',
40
+ '/render_alternate_layout', '/render_json', '/render_xml',
41
+ '/render_rawbody', '/render_js'].each do |endpoint|
42
+ get endpoint
43
+ assert last_response.ok?
44
+ end
45
+
46
+ get '/render_partial_that_errors'
47
+ assert_equal false, last_response.ok?
48
+
49
+ spans = ::Instana.processor.queued_spans
50
+ assert_equal [], spans
51
+ end
52
+
24
53
  def test_render_view
54
+ @execute_test_if_framework_version_is_supported.call
25
55
  get '/render_view'
26
56
  assert last_response.ok?
27
57
 
@@ -32,6 +62,7 @@ class RailsActionViewTest < Minitest::Test
32
62
  end
33
63
 
34
64
  def test_render_view_direct
65
+ @execute_test_if_framework_version_is_supported.call
35
66
  get '/render_view_direct'
36
67
  assert last_response.ok?
37
68
 
@@ -54,6 +85,7 @@ class RailsActionViewTest < Minitest::Test
54
85
  end
55
86
 
56
87
  def test_render_file
88
+ @execute_test_if_framework_version_is_supported.call
57
89
  get '/render_file'
58
90
  assert last_response.ok?
59
91
 
@@ -64,6 +96,7 @@ class RailsActionViewTest < Minitest::Test
64
96
  end
65
97
 
66
98
  def test_render_json
99
+ @execute_test_if_framework_version_is_supported.call
67
100
  get '/render_json'
68
101
  assert last_response.ok?
69
102
 
@@ -74,6 +107,7 @@ class RailsActionViewTest < Minitest::Test
74
107
  end
75
108
 
76
109
  def test_render_xml
110
+ @execute_test_if_framework_version_is_supported.call
77
111
  get '/render_xml'
78
112
  assert last_response.ok?
79
113
 
@@ -84,6 +118,7 @@ class RailsActionViewTest < Minitest::Test
84
118
  end
85
119
 
86
120
  def test_render_body
121
+ @execute_test_if_framework_version_is_supported.call
87
122
  get '/render_rawbody'
88
123
  assert last_response.ok?
89
124
 
@@ -94,6 +129,7 @@ class RailsActionViewTest < Minitest::Test
94
129
  end
95
130
 
96
131
  def test_render_js
132
+ @execute_test_if_framework_version_is_supported.call
97
133
  get '/render_js'
98
134
  assert last_response.ok?
99
135
 
@@ -104,6 +140,7 @@ class RailsActionViewTest < Minitest::Test
104
140
  end
105
141
 
106
142
  def test_render_alternate_layout
143
+ @execute_test_if_framework_version_is_supported.call
107
144
  get '/render_alternate_layout'
108
145
  assert last_response.ok?
109
146
 
@@ -114,6 +151,7 @@ class RailsActionViewTest < Minitest::Test
114
151
  end
115
152
 
116
153
  def test_render_partial
154
+ @execute_test_if_framework_version_is_supported.call
117
155
  get '/render_partial'
118
156
  assert last_response.ok?
119
157
 
@@ -124,6 +162,7 @@ class RailsActionViewTest < Minitest::Test
124
162
  end
125
163
 
126
164
  def test_render_partial_that_errors
165
+ @execute_test_if_framework_version_is_supported.call
127
166
  get '/render_partial_that_errors'
128
167
  refute last_response.ok?
129
168
 
@@ -139,6 +178,7 @@ class RailsActionViewTest < Minitest::Test
139
178
  end
140
179
 
141
180
  def test_render_collection
181
+ @execute_test_if_framework_version_is_supported.call
142
182
  get '/render_collection'
143
183
  assert last_response.ok?
144
184
 
@@ -6,6 +6,19 @@ require 'support/apps/sidekiq/boot'
6
6
 
7
7
  class SidekiqClientTest < Minitest::Test
8
8
  def setup
9
+ @framework_version = Gem::Specification.find_by_name('sidekiq').version
10
+ @supported_framework_version = @framework_version < Gem::Version.new('5.3')
11
+ @execute_test_if_framework_version_is_supported = lambda {
12
+ unless @supported_framework_version
13
+ skip "Skipping this test because sidekiq version #{@framework_version} is not yet supported!"
14
+ end
15
+ }
16
+ @execute_test_only_if_framework_version_is_not_supported = lambda {
17
+ if @supported_framework_version
18
+ skip "Skipping this test because sidekiq version #{@framework_version} is already supported!"
19
+ end
20
+ }
21
+
9
22
  Sidekiq.configure_client do |config|
10
23
  config.redis = { url: ENV["REDIS_URL"] }
11
24
  end
@@ -19,6 +32,7 @@ class SidekiqClientTest < Minitest::Test
19
32
  end
20
33
 
21
34
  def test_enqueue
35
+ @execute_test_if_framework_version_is_supported.call
22
36
  clear_all!
23
37
  Instana.tracer.start_or_continue_trace(:sidekiqtests) do
24
38
  disable_redis_instrumentation
@@ -39,6 +53,7 @@ class SidekiqClientTest < Minitest::Test
39
53
  end
40
54
 
41
55
  def test_enqueue_failure
56
+ @execute_test_if_framework_version_is_supported.call
42
57
  clear_all!
43
58
 
44
59
  Instana.tracer.start_or_continue_trace(:sidekiqtests) do
@@ -6,6 +6,19 @@ require 'support/apps/sidekiq/boot'
6
6
 
7
7
  class SidekiqServerTest < Minitest::Test
8
8
  def setup
9
+ @framework_version = Gem::Specification.find_by_name('sidekiq').version
10
+ @supported_framework_version = @framework_version < Gem::Version.new('5.3')
11
+ @execute_test_if_framework_version_is_supported = lambda {
12
+ unless @supported_framework_version
13
+ skip "Skipping this test because sidekiq version #{@framework_version} is not yet supported!"
14
+ end
15
+ }
16
+ @execute_test_only_if_framework_version_is_not_supported = lambda {
17
+ if @supported_framework_version
18
+ skip "Skipping this test because sidekiq version #{@framework_version} is already supported!"
19
+ end
20
+ }
21
+
9
22
  Sidekiq.configure_client do |config|
10
23
  config.redis = { url: ENV["REDIS_URL"] }
11
24
  end
@@ -17,7 +30,30 @@ class SidekiqServerTest < Minitest::Test
17
30
  assert_equal true, ::Instana.config[:'sidekiq-worker'][:enabled]
18
31
  end
19
32
 
33
+ def test_no_sidekiq_tracing_if_unsupported_version_only_redis
34
+ @execute_test_only_if_framework_version_is_not_supported.call
35
+ clear_all!
36
+ ::Sidekiq.redis_pool.with do |redis|
37
+ redis.sadd('queues'.freeze, 'important')
38
+ redis.lpush(
39
+ 'queue:important',
40
+ <<-JSON
41
+ {
42
+ "class":"SidekiqJobOne",
43
+ "args":[1,2,3],
44
+ "queue":"important",
45
+ "jid":"123456789"
46
+ }
47
+ JSON
48
+ )
49
+ end
50
+
51
+ spans = Instana.processor.queued_spans
52
+ assert spans
53
+ end
54
+
20
55
  def test_successful_worker_starts_new_trace
56
+ @execute_test_if_framework_version_is_supported.call
21
57
  clear_all!
22
58
  $sidekiq_mode = :server
23
59
  inject_instrumentation
@@ -48,6 +84,7 @@ class SidekiqServerTest < Minitest::Test
48
84
  end
49
85
 
50
86
  def test_failed_worker_starts_new_trace
87
+ @execute_test_if_framework_version_is_supported.call
51
88
  clear_all!
52
89
  $sidekiq_mode = :server
53
90
  inject_instrumentation
@@ -79,6 +116,7 @@ class SidekiqServerTest < Minitest::Test
79
116
  end
80
117
 
81
118
  def test_successful_worker_continues_previous_trace
119
+ @execute_test_if_framework_version_is_supported.call
82
120
  clear_all!
83
121
  $sidekiq_mode = :server
84
122
  inject_instrumentation
@@ -112,6 +150,7 @@ class SidekiqServerTest < Minitest::Test
112
150
  end
113
151
 
114
152
  def test_failed_worker_continues_previous_trace
153
+ @execute_test_if_framework_version_is_supported.call
115
154
  clear_all!
116
155
  $sidekiq_mode = :server
117
156
  inject_instrumentation
@@ -22,7 +22,7 @@ Thread.new do
22
22
  end
23
23
  }
24
24
 
25
- Rack::Handler::Puma.run(app, {:Host => '127.0.0.1', :Port => 6511})
25
+ Rack::Handler::Puma.run(app, Host: '127.0.0.1', Port: 6511)
26
26
  end
27
27
 
28
28
  sleep(2)
@@ -12,12 +12,19 @@ require_relative 'jobs/sidekiq_job_2'
12
12
  ::Instana.logger.info "Booting instrumented sidekiq worker for tests."
13
13
  ::Sidekiq.logger.level = ::Logger::FATAL
14
14
 
15
+ properties = {queues: ['important'], concurrency: 2}
16
+
17
+ sidekiq_version = Gem::Specification.find_by_name('sidekiq').version
18
+ config_or_options =
19
+ if sidekiq_version >= Gem::Version.new('7.0.0')
20
+ ::Sidekiq::Config.new(Sidekiq.default_configuration.merge!(properties))
21
+ else
22
+ ::Sidekiq.options.merge(properties)
23
+ end
24
+
15
25
  sidekiq_thread = Thread.new do
16
26
  launcher = ::Sidekiq::Launcher.new(
17
- ::Sidekiq.options.merge(
18
- queues: ['important'],
19
- concurrency: 2
20
- )
27
+ config_or_options
21
28
  )
22
29
  launcher.run
23
30
  Thread.current[:worker] = launcher
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.209.7
4
+ version: 1.210.0
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: 2023-05-24 00:00:00.000000000 Z
11
+ date: 2023-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -162,6 +162,7 @@ files:
162
162
  - gemfiles/excon_02.gemfile
163
163
  - gemfiles/excon_021.gemfile
164
164
  - gemfiles/excon_079.gemfile
165
+ - gemfiles/excon_100.gemfile
165
166
  - gemfiles/graphql_10.gemfile
166
167
  - gemfiles/graphql_20.gemfile
167
168
  - gemfiles/grpc_10.gemfile
@@ -173,6 +174,8 @@ files:
173
174
  - gemfiles/rails_50.gemfile
174
175
  - gemfiles/rails_52.gemfile
175
176
  - gemfiles/rails_60.gemfile
177
+ - gemfiles/rails_61.gemfile
178
+ - gemfiles/rails_70.gemfile
176
179
  - gemfiles/redis_40.gemfile
177
180
  - gemfiles/resque_122.gemfile
178
181
  - gemfiles/resque_20.gemfile
@@ -183,6 +186,8 @@ files:
183
186
  - gemfiles/shoryuken_50.gemfile
184
187
  - gemfiles/sidekiq_42.gemfile
185
188
  - gemfiles/sidekiq_50.gemfile
189
+ - gemfiles/sidekiq_60.gemfile
190
+ - gemfiles/sidekiq_70.gemfile
186
191
  - gemfiles/sinatra_14.gemfile
187
192
  - instana.gemspec
188
193
  - lib/instana.rb