scout_apm 1.6.8 → 2.0.0.pre

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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +8 -1
  3. data/CHANGELOG.markdown +7 -57
  4. data/ext/allocations/allocations.c +84 -0
  5. data/ext/allocations/extconf.rb +3 -0
  6. data/lib/scout_apm/agent/reporting.rb +9 -32
  7. data/lib/scout_apm/agent.rb +45 -31
  8. data/lib/scout_apm/app_server_load.rb +1 -2
  9. data/lib/scout_apm/attribute_arranger.rb +0 -4
  10. data/lib/scout_apm/background_worker.rb +6 -9
  11. data/lib/scout_apm/bucket_name_splitter.rb +3 -3
  12. data/lib/scout_apm/call_set.rb +1 -0
  13. data/lib/scout_apm/config.rb +110 -66
  14. data/lib/scout_apm/environment.rb +16 -10
  15. data/lib/scout_apm/framework_integrations/rails_2.rb +12 -14
  16. data/lib/scout_apm/framework_integrations/rails_3_or_4.rb +5 -17
  17. data/lib/scout_apm/framework_integrations/ruby.rb +0 -4
  18. data/lib/scout_apm/framework_integrations/sinatra.rb +0 -4
  19. data/lib/scout_apm/histogram.rb +0 -20
  20. data/lib/scout_apm/instruments/action_controller_rails_3_rails4.rb +1 -4
  21. data/lib/scout_apm/instruments/active_record.rb +149 -8
  22. data/lib/scout_apm/instruments/mongoid.rb +5 -78
  23. data/lib/scout_apm/instruments/process/process_cpu.rb +0 -12
  24. data/lib/scout_apm/instruments/process/process_memory.rb +14 -43
  25. data/lib/scout_apm/layaway.rb +34 -134
  26. data/lib/scout_apm/layaway_file.rb +50 -27
  27. data/lib/scout_apm/layer.rb +45 -1
  28. data/lib/scout_apm/layer_converters/allocation_metric_converter.rb +17 -0
  29. data/lib/scout_apm/layer_converters/converter_base.rb +4 -6
  30. data/lib/scout_apm/layer_converters/job_converter.rb +1 -0
  31. data/lib/scout_apm/layer_converters/metric_converter.rb +2 -1
  32. data/lib/scout_apm/layer_converters/slow_job_converter.rb +42 -21
  33. data/lib/scout_apm/layer_converters/slow_request_converter.rb +58 -37
  34. data/lib/scout_apm/metric_meta.rb +1 -5
  35. data/lib/scout_apm/metric_set.rb +6 -15
  36. data/lib/scout_apm/reporter.rb +4 -6
  37. data/lib/scout_apm/serializers/metrics_to_json_serializer.rb +5 -1
  38. data/lib/scout_apm/serializers/payload_serializer_to_json.rb +1 -3
  39. data/lib/scout_apm/serializers/slow_jobs_serializer_to_json.rb +5 -3
  40. data/lib/scout_apm/slow_job_policy.rb +19 -89
  41. data/lib/scout_apm/slow_job_record.rb +12 -20
  42. data/lib/scout_apm/slow_request_policy.rb +12 -80
  43. data/lib/scout_apm/slow_transaction.rb +16 -20
  44. data/lib/scout_apm/stackprof_tree_collapser.rb +103 -0
  45. data/lib/scout_apm/store.rb +16 -78
  46. data/lib/scout_apm/tracked_request.rb +53 -36
  47. data/lib/scout_apm/utils/active_record_metric_name.rb +2 -0
  48. data/lib/scout_apm/utils/fake_stack_prof.rb +40 -0
  49. data/lib/scout_apm/utils/klass_helper.rb +26 -0
  50. data/lib/scout_apm/utils/sql_sanitizer.rb +1 -1
  51. data/lib/scout_apm/utils/sql_sanitizer_regex.rb +2 -2
  52. data/lib/scout_apm/utils/sql_sanitizer_regex_1_8_7.rb +2 -2
  53. data/lib/scout_apm/version.rb +1 -1
  54. data/lib/scout_apm.rb +13 -7
  55. data/scout_apm.gemspec +3 -1
  56. data/test/test_helper.rb +3 -4
  57. data/test/unit/layaway_test.rb +8 -5
  58. data/test/unit/serializers/payload_serializer_test.rb +2 -2
  59. data/test/unit/slow_item_set_test.rb +1 -2
  60. data/test/unit/sql_sanitizer_test.rb +0 -6
  61. metadata +28 -20
  62. data/LICENSE.md +0 -27
  63. data/lib/scout_apm/instruments/grape.rb +0 -69
  64. data/lib/scout_apm/instruments/percentile_sampler.rb +0 -37
  65. data/lib/scout_apm/request_histograms.rb +0 -46
  66. data/lib/scout_apm/scored_item_set.rb +0 -79
  67. data/test/unit/metric_set_test.rb +0 -101
  68. data/test/unit/scored_item_set_test.rb +0 -65
  69. data/test/unit/slow_request_policy_test.rb +0 -42
@@ -1,101 +0,0 @@
1
- require 'test_helper'
2
-
3
- require 'scout_apm/metric_set'
4
-
5
- module ScoutApm
6
- class MetricSetTest < Minitest::Test
7
- def setup
8
- @metric_set = ScoutApm::MetricSet.new
9
- end
10
-
11
- def test_absorb_one_passthrough_metric
12
- @metric_set.absorb(make_fake_stat("Controller/Foo", 1))
13
-
14
- assert_equal 1, @metric_set.metrics.length
15
- assert_equal "Controller/Foo", @metric_set.metrics.first.first.metric_name
16
- end
17
-
18
- def test_absorb_one_aggregate_metric
19
- @metric_set.absorb(make_fake_stat("ActiveRecord/Foo", 1))
20
-
21
- assert_equal 1, @metric_set.metrics.length
22
- assert_equal "ActiveRecord/all", @metric_set.metrics.first.first.metric_name
23
- end
24
-
25
- def test_absorb_many_aggregate_metric
26
- @metric_set.absorb(make_fake_stat("ActiveRecord/Foo", 1))
27
- @metric_set.absorb(make_fake_stat("ActiveRecord/Bar", 1))
28
- @metric_set.absorb(make_fake_stat("ActiveRecord/Baz", 1))
29
- @metric_set.absorb(make_fake_stat("HTTP/Get", 1))
30
- @metric_set.absorb(make_fake_stat("HTTP/Post", 1))
31
-
32
- metrics = @metric_set.metrics.to_a.sort_by { |m| m.first.metric_name }
33
- assert_equal 2, metrics.length
34
- assert_equal "ActiveRecord/all", metrics[0][0].metric_name
35
- assert_equal "HTTP/all", metrics[1][0].metric_name
36
- assert_equal 3, metrics[0][1].call_count
37
- assert_equal 2, metrics[1][1].call_count
38
- end
39
-
40
- def test_absorb_one_error
41
- @metric_set.absorb(make_fake_stat("Errors/Controller/public/index", 1))
42
-
43
- metrics = @metric_set.metrics.to_a.sort_by { |m| m.first.metric_name }
44
- assert_equal 2, metrics.length
45
- assert_equal "Errors/Controller/public/index", metrics[0].first.metric_name
46
- assert_equal "Errors/Request", metrics[1].first.metric_name
47
- end
48
-
49
- def test_absorb_many_metrics
50
- @metric_set.absorb_all([
51
- make_fake_stat("ActiveRecord/Foo", 1),
52
- make_fake_stat("Controller/Bar", 1)
53
- ])
54
-
55
- metrics = @metric_set.metrics.to_a.sort_by { |m| m.first.metric_name }
56
- assert_equal 2, metrics.length
57
- assert_equal "ActiveRecord/all", metrics[0].first.metric_name
58
- assert_equal "Controller/Bar", metrics[1].first.metric_name
59
- end
60
-
61
- def test_combine
62
- @other_set = ScoutApm::MetricSet.new
63
-
64
- @metric_set.absorb_all([
65
- make_fake_stat("ActiveRecord/Foo", 1),
66
- make_fake_stat("Controller/Bar", 1),
67
- make_fake_stat("Errors/Controller/public/index", 1),
68
- ])
69
-
70
- @other_set.absorb_all([
71
- make_fake_stat("ActiveRecord/Foo", 1),
72
- make_fake_stat("Controller/Bar", 1),
73
- make_fake_stat("Errors/Controller/public/index", 1),
74
- ])
75
-
76
- @metric_set.combine!(@other_set)
77
-
78
- metrics = @metric_set.metrics.to_a.sort_by { |m| m.first.metric_name }
79
- assert_equal 4, metrics.length
80
- assert_equal "ActiveRecord/all", metrics[0][0].metric_name
81
- assert_equal "Controller/Bar", metrics[1][0].metric_name
82
- assert_equal "Errors/Controller/public/index", metrics[2][0].metric_name
83
- assert_equal "Errors/Request", metrics[3][0].metric_name
84
-
85
- assert_equal 2, metrics[0][1].call_count
86
- assert_equal 2, metrics[1][1].call_count
87
- assert_equal 2, metrics[2][1].call_count
88
- assert_equal 2, metrics[3][1].call_count
89
- end
90
-
91
- ############################################################
92
- # Test helper functions
93
- ############################################################
94
- def make_fake_stat(name, count)
95
- meta = MetricMeta.new(name)
96
- stat = MetricStats.new
97
- stat.update!(count)
98
- [meta, stat]
99
- end
100
- end
101
- end
@@ -1,65 +0,0 @@
1
- require 'test_helper'
2
-
3
- require 'scout_apm/scored_item_set'
4
-
5
- class FakeScoredItem
6
- def initialize(name, score)
7
- @name = name
8
- @score = score
9
- end
10
- def name; @name; end
11
- def score; @score; end
12
- def call; "called_#{@score}_#{@name}"; end
13
- end
14
-
15
- class ScoredItemSetTest < Minitest::Test
16
- def test_empty_set_always_adds_item
17
- set = ScoutApm::ScoredItemSet.new
18
- set << FakeScoredItem.new("users/index", 10)
19
-
20
- assert_equal set.to_a.first, "called_10_users/index"
21
- assert_equal set.count, 1
22
- end
23
-
24
- def test_repeated_additions_chooses_most_expensive
25
- set = ScoutApm::ScoredItemSet.new
26
-
27
- [ FakeScoredItem.new("users/index", 10),
28
- FakeScoredItem.new("users/index", 11),
29
- FakeScoredItem.new("users/index", 12)
30
- ].shuffle.each { |fsi| set << fsi }
31
-
32
- assert_equal set.to_a.first, "called_12_users/index"
33
- assert_equal set.count, 1
34
- end
35
-
36
- def test_multiple_items_occupy_different_buckets
37
- set = ScoutApm::ScoredItemSet.new
38
-
39
- [ FakeScoredItem.new("users/index", 10),
40
- FakeScoredItem.new("users/index", 11),
41
- FakeScoredItem.new("users/show", 12),
42
- FakeScoredItem.new("users/show", 10)
43
- ].shuffle.each { |fsi| set << fsi }
44
-
45
- assert_equal set.count, 2
46
- assert set.to_a.include?("called_11_users/index")
47
- assert set.to_a.include?("called_12_users/show")
48
- end
49
-
50
- def test_evicts_at_capacity
51
- set = ScoutApm::ScoredItemSet.new(3) # Force max_size to 3
52
-
53
- [ FakeScoredItem.new("users/index", 10),
54
- FakeScoredItem.new("users/show", 11),
55
- FakeScoredItem.new("posts/index", 12),
56
- FakeScoredItem.new("posts/move", 13)
57
- ].shuffle.each { |fsi| set << fsi }
58
-
59
- assert_equal set.count, 3
60
- assert !set.to_a.include?("called_10_users/index"), "Did not Expect to see users/index in #{set.to_a.inspect}"
61
- assert set.to_a.include?("called_11_users/show"), "Expected to see users/show in #{set.to_a.inspect}"
62
- assert set.to_a.include?("called_12_posts/index"), "Expected to see posts/index in #{set.to_a.inspect}"
63
- assert set.to_a.include?("called_13_posts/move"), "Expected to see posts/move in #{set.to_a.inspect}"
64
- end
65
- end
@@ -1,42 +0,0 @@
1
- require 'test_helper'
2
-
3
- require 'scout_apm/slow_request_policy'
4
- require 'scout_apm/layer'
5
-
6
- class FakeRequest
7
- def initialize(name)
8
- @name = name
9
- @root_layer = ScoutApm::Layer.new("Controller", name)
10
- @root_layer.instance_variable_set("@stop_time", Time.now)
11
- end
12
- def unique_name; "Controller/foo/bar"; end
13
- def root_layer; @root_layer; end
14
- def set_duration(seconds)
15
- @root_layer.instance_variable_set("@start_time", Time.now - seconds)
16
- end
17
- end
18
-
19
- class SlowRequestPolicyTest < Minitest::Test
20
- def test_stored_records_current_time
21
- test_start = Time.now
22
- policy = ScoutApm::SlowRequestPolicy.new
23
- request = FakeRequest.new("users/index")
24
-
25
- policy.stored!(request)
26
- assert policy.last_seen[request.unique_name] > test_start
27
- end
28
-
29
- def test_score
30
- policy = ScoutApm::SlowRequestPolicy.new
31
- request = FakeRequest.new("users/index")
32
-
33
- request.set_duration(10) # 10 seconds
34
- policy.last_seen[request.unique_name] = Time.now - 120 # 2 minutes since last seen
35
- agent.request_histograms.add(request.unique_name, 1)
36
-
37
- # Actual value I have in console is 1.599
38
- assert policy.score(request) > 1.5
39
- assert policy.score(request) < 2.0
40
-
41
- end
42
- end