scout_apm 4.0.4 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +4 -0
  3. data/CHANGELOG.markdown +33 -0
  4. data/LICENSE.md +21 -28
  5. data/gems/typhoeus.gemfile +3 -0
  6. data/lib/scout_apm/agent/preconditions.rb +3 -3
  7. data/lib/scout_apm/auto_instrument/rails.rb +0 -1
  8. data/lib/scout_apm/background_job_integrations/shoryuken.rb +2 -0
  9. data/lib/scout_apm/background_job_integrations/sidekiq.rb +13 -2
  10. data/lib/scout_apm/config.rb +10 -0
  11. data/lib/scout_apm/error_service/middleware.rb +2 -2
  12. data/lib/scout_apm/error_service/payload.rb +1 -1
  13. data/lib/scout_apm/error_service.rb +3 -1
  14. data/lib/scout_apm/external_service_metric_set.rb +97 -0
  15. data/lib/scout_apm/external_service_metric_stats.rb +85 -0
  16. data/lib/scout_apm/fake_store.rb +3 -0
  17. data/lib/scout_apm/framework_integrations/rails_3_or_4.rb +5 -1
  18. data/lib/scout_apm/git_revision.rb +9 -0
  19. data/lib/scout_apm/ignored_uris.rb +3 -1
  20. data/lib/scout_apm/instant/middleware.rb +2 -0
  21. data/lib/scout_apm/instruments/action_controller_rails_3_rails4.rb +5 -2
  22. data/lib/scout_apm/instruments/action_view.rb +13 -5
  23. data/lib/scout_apm/instruments/active_record.rb +2 -0
  24. data/lib/scout_apm/instruments/elasticsearch.rb +2 -0
  25. data/lib/scout_apm/instruments/sinatra.rb +2 -0
  26. data/lib/scout_apm/instruments/typhoeus.rb +8 -6
  27. data/lib/scout_apm/layer_converters/external_service_converter.rb +65 -0
  28. data/lib/scout_apm/layer_converters/find_layer_by_type.rb +4 -0
  29. data/lib/scout_apm/layer_converters/request_queue_time_converter.rb +2 -0
  30. data/lib/scout_apm/logger.rb +2 -2
  31. data/lib/scout_apm/reporting.rb +2 -1
  32. data/lib/scout_apm/serializers/external_service_serializer_to_json.rb +15 -0
  33. data/lib/scout_apm/serializers/payload_serializer.rb +4 -3
  34. data/lib/scout_apm/serializers/payload_serializer_to_json.rb +4 -1
  35. data/lib/scout_apm/store.rb +21 -1
  36. data/lib/scout_apm/tracked_request.rb +7 -1
  37. data/lib/scout_apm/utils/sql_sanitizer.rb +32 -6
  38. data/lib/scout_apm/version.rb +1 -1
  39. data/lib/scout_apm.rb +5 -0
  40. data/scout_apm.gemspec +0 -2
  41. data/test/unit/auto_instrument/anonymous_block_value.rb +7 -0
  42. data/test/unit/auto_instrument/hanging_method.rb +6 -0
  43. data/test/unit/auto_instrument_test.rb +8 -0
  44. data/test/unit/external_service_metric_set_test.rb +67 -0
  45. data/test/unit/external_service_metric_stats_test.rb +106 -0
  46. data/test/unit/ignored_uris_test.rb +6 -0
  47. data/test/unit/instruments/typhoeus_test.rb +42 -0
  48. data/test/unit/remote/{test_message.rb → message_test.rb} +0 -0
  49. data/test/unit/remote/{test_router.rb → route_test.rb} +0 -0
  50. data/test/unit/remote/{test_server.rb → server_test.rb} +4 -1
  51. data/test/unit/serializers/payload_serializer_test.rb +3 -3
  52. data/test/unit/sql_sanitizer_test.rb +19 -2
  53. metadata +16 -9
  54. data/.travis.yml +0 -22
  55. data/lib/scout_apm/utils/sql_sanitizer_regex.rb +0 -32
  56. data/lib/scout_apm/utils/sql_sanitizer_regex_1_8_7.rb +0 -32
@@ -8,7 +8,7 @@ class PayloadSerializerTest < Minitest::Test
8
8
  :unique_id => "unique_idz",
9
9
  :agent_version => 123
10
10
  }
11
- payload = ScoutApm::Serializers::PayloadSerializerToJson.serialize(metadata, {}, {}, [], [], [], {}, [])
11
+ payload = ScoutApm::Serializers::PayloadSerializerToJson.serialize(metadata, {}, {}, [], [], [], {}, {}, [])
12
12
 
13
13
  # symbol keys turn to strings
14
14
  formatted_metadata = {
@@ -49,7 +49,7 @@ class PayloadSerializerTest < Minitest::Test
49
49
  stats.total_exclusive_time = 0.078132088
50
50
  }
51
51
  }
52
- payload = ScoutApm::Serializers::PayloadSerializerToJson.serialize({}, metrics, {}, [], [], [], {}, [])
52
+ payload = ScoutApm::Serializers::PayloadSerializerToJson.serialize({}, metrics, {}, [], [], [], {}, {}, [])
53
53
  formatted_metrics = [
54
54
  {
55
55
  "key" => {
@@ -94,7 +94,7 @@ class PayloadSerializerTest < Minitest::Test
94
94
  :quotie => "here are some \"quotes\"",
95
95
  :payload_version => 2,
96
96
  }
97
- payload = ScoutApm::Serializers::PayloadSerializerToJson.serialize(metadata, {}, {}, [], [], [], {}, [])
97
+ payload = ScoutApm::Serializers::PayloadSerializerToJson.serialize(metadata, {}, {}, [], [], [], {}, {}, [])
98
98
 
99
99
  # symbol keys turn to strings
100
100
  formatted_metadata = {
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: false
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  module ScoutApm
@@ -38,9 +40,9 @@ module ScoutApm
38
40
  end
39
41
 
40
42
  def test_postgres_strips_subquery_strings
41
- raw_sql = %q|"SELECT 'orgs'.* FROM "orgs" WHERE "orgs"."name" = 'Scout' AND "orgs"."created_by_user_id" IN (SELECT 'users'.'id' FROM "users" WHERE (id > AVG(id)) AND "type" = 'USER' AND "created_at" BETWEEN '2019-04-17 12:28:00.000000' AND '2019-04-18 12:28:00.000000')"|
43
+ raw_sql = %q|"SELECT "orgs".* FROM "orgs" WHERE "orgs"."name" = 'Scout' AND "orgs"."created_by_user_id" IN (SELECT "users"."id" FROM "users" WHERE (id > AVG(id)) AND "type" = 'USER' AND "created_at" BETWEEN '2019-04-17 12:28:00.000000' AND '2019-04-18 12:28:00.000000')"|
42
44
  sanitized_sql = SqlSanitizer.new(raw_sql).tap { |it| it.database_engine = :postgres}
43
- expected_sql = %q|"SELECT 'orgs'.* FROM "orgs" WHERE "orgs"."name" = ? AND "orgs"."created_by_user_id" IN (SELECT 'users'.'id' FROM "users" WHERE (id > AVG(id)) AND "type" = ? AND "created_at" BETWEEN ? AND ?)"|
45
+ expected_sql = %q|"SELECT "orgs".* FROM "orgs" WHERE "orgs"."name" = ? AND "orgs"."created_by_user_id" IN (SELECT "users"."id" FROM "users" WHERE (id > AVG(id)) AND "type" = ? AND "created_at" BETWEEN ? AND ?)"|
44
46
  assert_equal expected_sql, sanitized_sql.to_s
45
47
  end
46
48
 
@@ -66,6 +68,21 @@ module ScoutApm
66
68
  end
67
69
  end
68
70
 
71
+ def test_postgres_inner_join_subquery
72
+ sql = %q{SELECT x AS y
73
+ FROM t1
74
+ INNER JOIN (
75
+ SELECT id,
76
+ (ts_rank((to_tsvector('simple', coalesce("pg_search_documents"."content"::text, ''))), (to_tsquery('simple', 'xyz' || 'omg' || 'secret')), ?)) AS rank
77
+ FROM t2
78
+ WHERE name = 'literal') sub ON sub.id = t1.id WHERE age > 10}
79
+
80
+ expected = %q{SELECT x AS y FROM t1 INNER JOIN ( SELECT id, (ts_rank((to_tsvector(?, coalesce("pg_search_documents"."content"::text, ?))), (to_tsquery(?, ? || ? || ?)), ?)) AS rank FROM t2 WHERE name = ?) sub ON sub.id = t1.id WHERE age > ?}
81
+ ss = SqlSanitizer.new(sql).tap{ |it| it.database_engine = :postgres }
82
+
83
+ assert_equal expected, ss.to_s
84
+ end
85
+
69
86
  def test_mysql_where
70
87
  sql = %q|SELECT `users`.* FROM `users` WHERE `users`.`name` = ? [["name", "chris"]]|
71
88
  ss = SqlSanitizer.new(sql).tap{ |it| it.database_engine = :mysql }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scout_apm
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.4
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Derek Haynes
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-02-10 00:00:00.000000000 Z
12
+ date: 2021-11-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -219,7 +219,6 @@ files:
219
219
  - ".github/workflows/test.yml"
220
220
  - ".gitignore"
221
221
  - ".rubocop.yml"
222
- - ".travis.yml"
223
222
  - CHANGELOG.markdown
224
223
  - Gemfile
225
224
  - Guardfile
@@ -238,6 +237,7 @@ files:
238
237
  - gems/rails4.gemfile
239
238
  - gems/rails5.gemfile
240
239
  - gems/rails6.gemfile
240
+ - gems/typhoeus.gemfile
241
241
  - lib/scout_apm.rb
242
242
  - lib/scout_apm/agent.rb
243
243
  - lib/scout_apm/agent/exit_handler.rb
@@ -282,6 +282,8 @@ files:
282
282
  - lib/scout_apm/error_service/sidekiq.rb
283
283
  - lib/scout_apm/extensions/config.rb
284
284
  - lib/scout_apm/extensions/transaction_callback_payload.rb
285
+ - lib/scout_apm/external_service_metric_set.rb
286
+ - lib/scout_apm/external_service_metric_stats.rb
285
287
  - lib/scout_apm/fake_store.rb
286
288
  - lib/scout_apm/framework_integrations/rails_2.rb
287
289
  - lib/scout_apm/framework_integrations/rails_3_or_4.rb
@@ -328,6 +330,7 @@ files:
328
330
  - lib/scout_apm/layer_converters/database_converter.rb
329
331
  - lib/scout_apm/layer_converters/depth_first_walker.rb
330
332
  - lib/scout_apm/layer_converters/error_converter.rb
333
+ - lib/scout_apm/layer_converters/external_service_converter.rb
331
334
  - lib/scout_apm/layer_converters/find_layer_by_type.rb
332
335
  - lib/scout_apm/layer_converters/histograms.rb
333
336
  - lib/scout_apm/layer_converters/job_converter.rb
@@ -359,6 +362,7 @@ files:
359
362
  - lib/scout_apm/serializers/app_server_load_serializer.rb
360
363
  - lib/scout_apm/serializers/db_query_serializer_to_json.rb
361
364
  - lib/scout_apm/serializers/directive_serializer.rb
365
+ - lib/scout_apm/serializers/external_service_serializer_to_json.rb
362
366
  - lib/scout_apm/serializers/histograms_serializer_to_json.rb
363
367
  - lib/scout_apm/serializers/jobs_serializer_to_json.rb
364
368
  - lib/scout_apm/serializers/metrics_to_json_serializer.rb
@@ -398,8 +402,6 @@ files:
398
402
  - lib/scout_apm/utils/numbers.rb
399
403
  - lib/scout_apm/utils/scm.rb
400
404
  - lib/scout_apm/utils/sql_sanitizer.rb
401
- - lib/scout_apm/utils/sql_sanitizer_regex.rb
402
- - lib/scout_apm/utils/sql_sanitizer_regex_1_8_7.rb
403
405
  - lib/scout_apm/utils/time.rb
404
406
  - lib/scout_apm/utils/unique_id.rb
405
407
  - lib/scout_apm/version.rb
@@ -410,11 +412,13 @@ files:
410
412
  - test/tmp/README.md
411
413
  - test/unit/agent_context_test.rb
412
414
  - test/unit/agent_test.rb
415
+ - test/unit/auto_instrument/anonymous_block_value.rb
413
416
  - test/unit/auto_instrument/assignments-instrumented.rb
414
417
  - test/unit/auto_instrument/assignments.rb
415
418
  - test/unit/auto_instrument/controller-ast.txt
416
419
  - test/unit/auto_instrument/controller-instrumented.rb
417
420
  - test/unit/auto_instrument/controller.rb
421
+ - test/unit/auto_instrument/hanging_method.rb
418
422
  - test/unit/auto_instrument/rescue_from-instrumented.rb
419
423
  - test/unit/auto_instrument/rescue_from.rb
420
424
  - test/unit/auto_instrument_test.rb
@@ -428,6 +432,8 @@ files:
428
432
  - test/unit/error_service/ignored_exceptions_test.rb
429
433
  - test/unit/extensions/periodic_callbacks_test.rb
430
434
  - test/unit/extensions/transaction_callbacks_test.rb
435
+ - test/unit/external_service_metric_set_test.rb
436
+ - test/unit/external_service_metric_stats_test.rb
431
437
  - test/unit/fake_store_test.rb
432
438
  - test/unit/git_revision_test.rb
433
439
  - test/unit/histogram_test.rb
@@ -435,6 +441,7 @@ files:
435
441
  - test/unit/instruments/active_record_test.rb
436
442
  - test/unit/instruments/net_http_test.rb
437
443
  - test/unit/instruments/percentile_sampler_test.rb
444
+ - test/unit/instruments/typhoeus_test.rb
438
445
  - test/unit/layaway_test.rb
439
446
  - test/unit/layer_children_set_test.rb
440
447
  - test/unit/layer_converters/depth_first_walker_test.rb
@@ -443,9 +450,9 @@ files:
443
450
  - test/unit/limited_layer_test.rb
444
451
  - test/unit/logger_test.rb
445
452
  - test/unit/metric_set_test.rb
446
- - test/unit/remote/test_message.rb
447
- - test/unit/remote/test_router.rb
448
- - test/unit/remote/test_server.rb
453
+ - test/unit/remote/message_test.rb
454
+ - test/unit/remote/route_test.rb
455
+ - test/unit/remote/server_test.rb
449
456
  - test/unit/request_histograms_test.rb
450
457
  - test/unit/scored_item_set_test.rb
451
458
  - test/unit/serializers/payload_serializer_test.rb
@@ -480,7 +487,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
480
487
  - !ruby/object:Gem::Version
481
488
  version: '0'
482
489
  requirements: []
483
- rubygems_version: 3.1.2
490
+ rubygems_version: 3.0.3
484
491
  signing_key:
485
492
  specification_version: 4
486
493
  summary: Ruby application performance monitoring
data/.travis.yml DELETED
@@ -1,22 +0,0 @@
1
- language: ruby
2
- dist: xenial
3
- cache: bundler
4
-
5
- matrix:
6
- include:
7
- - rvm: 2.1
8
- gemfile: gems/rails3.gemfile
9
- - rvm: 2.2
10
- - rvm: 2.3
11
- - rvm: 2.4
12
- - rvm: 2.5
13
- - rvm: 2.6
14
- - rvm: 2.7
15
- - rvm: 3.0
16
- - rvm: 2.6
17
- gemfile: gems/octoshark.gemfile
18
- - rvm: 2.6
19
- name: rubocop yo
20
- script: bundle exec rubocop
21
- - rvm: 2.6
22
- gemfile: gems/rails3.gemfile
@@ -1,32 +0,0 @@
1
-
2
- module ScoutApm
3
- module Utils
4
- module SqlRegex
5
- MULTIPLE_SPACES = %r|\s+|.freeze
6
- MULTIPLE_QUESTIONS = /\?(,\?)+/.freeze
7
-
8
- PSQL_VAR_INTERPOLATION = %r|\[\[.*\]\]\s*\z|.freeze
9
- PSQL_REMOVE_STRINGS = /'(?:[^']|'')*'/.freeze
10
- PSQL_REMOVE_INTEGERS = /(?<!LIMIT )\b\d+\b/.freeze
11
- PSQL_PLACEHOLDER = /\$\d+/.freeze
12
- PSQL_IN_CLAUSE = /IN\s+\(\?[^\)]*\)/.freeze
13
- PSQL_AFTER_WHERE = /(?:WHERE\s+).*?(?:SELECT|\z)/im.freeze
14
- PSQL_AFTER_SET = /(?:SET\s+).*?(?:WHERE|\z)/im.freeze
15
-
16
- MYSQL_VAR_INTERPOLATION = %r|\[\[.*\]\]\s*$|.freeze
17
- MYSQL_REMOVE_INTEGERS = /(?<!LIMIT )\b\d+\b/.freeze
18
- MYSQL_REMOVE_SINGLE_QUOTE_STRINGS = %r{'(?:\\'|[^']|'')*'}.freeze
19
- MYSQL_REMOVE_DOUBLE_QUOTE_STRINGS = %r{"(?:\\"|[^"]|"")*"}.freeze
20
- MYSQL_IN_CLAUSE = /IN\s+\(\?[^\)]*\)/.freeze
21
-
22
- SQLITE_VAR_INTERPOLATION = %r|\[\[.*\]\]\s*$|.freeze
23
- SQLITE_REMOVE_STRINGS = /'(?:[^']|'')*'/.freeze
24
- SQLITE_REMOVE_INTEGERS = /(?<!LIMIT )\b\d+\b/.freeze
25
-
26
- # => "EXEC sp_executesql N'SELECT [users].* FROM [users] WHERE (age > 50) ORDER BY [users].[id] ASC OFFSET 0 ROWS FETCH NEXT @0 ROWS ONLY', N'@0 int', @0 = 10"
27
- SQLSERVER_EXECUTESQL = /EXEC sp_executesql N'(.*?)'.*/
28
- SQLSERVER_REMOVE_INTEGERS = /(?<!LIMIT )\b(?<!@)\d+\b/.freeze
29
- SQLSERVER_IN_CLAUSE = /IN\s+\(\?[^\)]*\)/.freeze
30
- end
31
- end
32
- end
@@ -1,32 +0,0 @@
1
-
2
- module ScoutApm
3
- module Utils
4
- module SqlRegex
5
- MULTIPLE_SPACES = %r|\s+|.freeze
6
- MULTIPLE_QUESTIONS = /\?(,\?)+/.freeze
7
-
8
- PSQL_VAR_INTERPOLATION = %r|\[\[.*\]\]\s*$|.freeze
9
- PSQL_REMOVE_STRINGS = /'(?:[^']|'')*'/.freeze
10
- PSQL_REMOVE_INTEGERS = /\b\d+\b/.freeze
11
- PSQL_PLACEHOLDER = /\$\d+/.freeze
12
- PSQL_IN_CLAUSE = /IN\s+\(\?[^\)]*\)/.freeze
13
- PSQL_AFTER_WHERE = /(?:WHERE\s+).*?(?:SELECT|$)/i.freeze
14
- PSQL_AFTER_SET = /(?:SET\s+).*?(?:WHERE|$)/i.freeze
15
-
16
- MYSQL_VAR_INTERPOLATION = %r|\[\[.*\]\]\s*$|.freeze
17
- MYSQL_REMOVE_INTEGERS = /\b\d+\b/.freeze
18
- MYSQL_REMOVE_SINGLE_QUOTE_STRINGS = /'(?:\\'|[^']|'')*'/.freeze
19
- MYSQL_REMOVE_DOUBLE_QUOTE_STRINGS = /"(?:\\"|[^"]|"")*"/.freeze
20
- MYSQL_IN_CLAUSE = /IN\s+\(\?[^\)]*\)/.freeze
21
-
22
- SQLITE_VAR_INTERPOLATION = %r|\[\[.*\]\]\s*$|.freeze
23
- SQLITE_REMOVE_STRINGS = /'(?:[^']|'')*'/.freeze
24
- SQLITE_REMOVE_INTEGERS = /\b\d+\b/.freeze
25
-
26
- # This is not officially supported, but will do its best.
27
- SQLSERVER_EXECUTESQL = /EXEC sp_executesql N'(.*?)'.*/
28
- SQLSERVER_REMOVE_INTEGERS = /\b\d+\b/.freeze
29
- SQLSERVER_IN_CLAUSE = /IN\s+\(\?[^\)]*\)/.freeze
30
- end
31
- end
32
- end