scout_apm 1.2.13 → 1.3.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
  SHA1:
3
- metadata.gz: 0f13ea6034c312de70bf591cd4098cd925439d0a
4
- data.tar.gz: 46cfdd7065339dd4089eec27cdb9faa855e09224
3
+ metadata.gz: 775fbb31b292af0249e53823fd743b051f12a612
4
+ data.tar.gz: c38270792896a7d986a4ef87171b7d532ca8d39d
5
5
  SHA512:
6
- metadata.gz: 89411a5bd8b03ef4d7db33297827c03df6f9acc965dbd0b512993c7bf9b5d4eef9f4b2d0e51ca657ff2decfd2f2fd096a3b0dc412c98ce9cdefbe018381afbbc
7
- data.tar.gz: c0d3c36fd63ca7332826a5ad69eabc2e803b7ebdfcf63bb879372213abb32f5d7c8c6aea75c5a0d48f895f8ba3c36d249bcbff504b5eef31f28336ebf693fe25
6
+ metadata.gz: f86a5da6ce114547d61fedb7b955233e43b65246064edf74ca4630affdf872a709946f8dff9aef5c2cf3e695a91e22c1d118ceb79e718899d0075618a16bcd3c
7
+ data.tar.gz: bc6adffb1608d105d4aface08d72a4afb00ae29feed3f07cbd1e0f11cfd8eed0c1197aa2e879848749432f6c2921ef2145df8bc9f2aa9a8fddc53849396db80f
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,7 @@
1
+ # 1.3.0
2
+
3
+ * Lazy metric naming for ActiveRecord calls
4
+
1
5
  # 1.2.13
2
6
 
3
7
  * SQL Sanitation-Related performance improvements:
data/README.markdown CHANGED
@@ -26,7 +26,7 @@ Your config file should look like:
26
26
 
27
27
  ## Supported Rubies
28
28
 
29
- * Ruby 1.8.7 through Ruby 2.1.2
29
+ * Ruby 1.8.7 through Ruby 2.3
30
30
 
31
31
  ## Supported Application Servers
32
32
 
@@ -39,4 +39,4 @@ Your config file should look like:
39
39
 
40
40
  ## Help
41
41
 
42
- Email support@scoutapp.com if you need a hand.
42
+ See our [help site](http://help.apm.scoutapp.com/) or email support@scoutapp.com if you need a hand.
@@ -8,7 +8,7 @@ module ScoutApm
8
8
 
9
9
  def init_logger
10
10
  begin
11
- @log_file ||= wants_stdout? ? STDOUT : "#{log_file_path}/scout_apm.log"
11
+ @log_file ||= determine_log_destination
12
12
  rescue => e
13
13
  end
14
14
 
@@ -43,13 +43,25 @@ module ScoutApm
43
43
  end
44
44
  end
45
45
 
46
- def log_file_path
47
- config.value('log_file_path') || default_log_path
46
+ def determine_log_destination
47
+ case true
48
+ when wants_stdout? then STDOUT
49
+ when wants_stderr? then STDERR
50
+ else "#{log_file_path}/scout_apm.log"
51
+ end
48
52
  end
49
53
 
50
54
  def wants_stdout?
51
55
  config.value('log_file_path').to_s.upcase == 'STDOUT' || environment.platform_integration.log_to_stdout?
52
56
  end
57
+
58
+ def wants_stderr?
59
+ config.value('log_file_path').to_s.upcase == 'STDERR'
60
+ end
61
+
62
+ def log_file_path
63
+ config.value('log_file_path') || default_log_path
64
+ end
53
65
  end
54
66
  include Logging
55
67
  end
@@ -59,7 +59,7 @@ module ScoutApm
59
59
  def log_with_scout_instruments(*args, &block)
60
60
  sql, name = args
61
61
  self.class.instrument("ActiveRecord",
62
- Utils::ActiveRecordMetricName.new(sql, name).metric_name,
62
+ Utils::ActiveRecordMetricName.new(sql, name),
63
63
  :desc => Utils::SqlSanitizer.new(sql) ) do
64
64
  log_without_scout_instruments(sql, name, &block)
65
65
  end
@@ -54,13 +54,16 @@ module ScoutApm
54
54
  {:scope => scope_layer.legacy_metric_name}
55
55
  end
56
56
 
57
- meta = MetricMeta.new(layer.legacy_metric_name, meta_options)
57
+ # we don't need to use the full metric name for scoped metrics as we only display metrics aggregrated
58
+ # by type.
59
+ metric_name = meta_options.has_key?(:scope) ? layer.type : layer.legacy_metric_name
60
+
61
+ meta = MetricMeta.new(metric_name, meta_options)
58
62
  metric_hash[meta] ||= MetricStats.new( meta_options.has_key?(:scope) )
59
63
 
60
64
  stat = metric_hash[meta]
61
65
  stat.update!(layer.total_call_time, layer.total_exclusive_time)
62
66
  end
63
-
64
67
  metric_hash
65
68
  end
66
69
  end
@@ -87,14 +90,15 @@ module ScoutApm
87
90
  class LayerSlowTransactionConverter < LayerConverterBase
88
91
  def call
89
92
  policy = ScoutApm::Agent.instance.slow_request_policy.capture_type(root_layer.total_call_time)
90
-
91
- case policy
92
- when ScoutApm::SlowRequestPolicy::CAPTURE_SUMMARY
93
- return [nil, {}]
94
- when ScoutApm::SlowRequestPolicy::CAPTURE_NONE
95
- return [nil, {}]
93
+ if policy == ScoutApm::SlowRequestPolicy::CAPTURE_NONE
94
+ return [nil, {}]
96
95
  end
97
96
 
97
+ # increment the slow transaction count if this is a slow transaction.
98
+ meta = MetricMeta.new("SlowTransaction/#{scope_layer.legacy_metric_name}")
99
+ stat = MetricStats.new
100
+ stat.update!(1)
101
+
98
102
  scope = scope_layer
99
103
  return [nil, {}] unless scope
100
104
 
@@ -104,10 +108,6 @@ module ScoutApm
104
108
  # Disable stackprof output for now
105
109
  stackprof = [] # request.stackprof
106
110
 
107
- meta = MetricMeta.new("SlowTransaction/#{scope_layer.legacy_metric_name}")
108
- stat = MetricStats.new
109
- stat.update!(1)
110
-
111
111
  [
112
112
  SlowTransaction.new(uri,
113
113
  scope.legacy_metric_name,
@@ -8,7 +8,6 @@ module ScoutApm
8
8
  class SlowRequestPolicy
9
9
  CAPTURE_TYPES = [
10
10
  CAPTURE_DETAIL = "capture_detail",
11
- CAPTURE_SUMMARY = "capture_summary",
12
11
  CAPTURE_NONE = "capture_none",
13
12
  ]
14
13
 
@@ -16,8 +15,11 @@ module ScoutApm
16
15
  SLOW_REQUEST_TIME_THRESHOLD = 2.0 # seconds
17
16
 
18
17
  def capture_type(time)
19
- return CAPTURE_NONE unless slow_enough?(time)
20
- return CAPTURE_DETAIL
18
+ if !slow_enough?(time)
19
+ CAPTURE_NONE
20
+ else
21
+ CAPTURE_DETAIL
22
+ end
21
23
  end
22
24
 
23
25
  private
@@ -15,10 +15,14 @@ module ScoutApm
15
15
  StoreReportingPeriodTimestamp.new
16
16
  end
17
17
 
18
+ def current_period
19
+ reporting_periods[current_timestamp]
20
+ end
21
+
18
22
  # Save newly collected metrics
19
23
  def track!(metrics, options={})
20
24
  @mutex.synchronize {
21
- reporting_periods[current_timestamp].merge_metrics!(metrics)
25
+ current_period.merge_metrics!(metrics)
22
26
  }
23
27
  end
24
28
 
@@ -33,7 +37,7 @@ module ScoutApm
33
37
  def track_slow_transaction!(slow_transaction)
34
38
  return unless slow_transaction
35
39
  @mutex.synchronize {
36
- reporting_periods[current_timestamp].merge_slow_transactions!(slow_transaction)
40
+ current_period.merge_slow_transactions!(slow_transaction)
37
41
  }
38
42
  end
39
43
 
@@ -89,7 +93,7 @@ module ScoutApm
89
93
 
90
94
  # One period of Storage. Typically 1 minute
91
95
  class StoreReportingPeriod
92
- # An array of SlowTransaction objects
96
+ # A SlowTransactionSet object.
93
97
  attr_reader :slow_transactions
94
98
 
95
99
  # A StoreReportingPeriodTimestamp representing the time that this
@@ -142,21 +146,6 @@ module ScoutApm
142
146
 
143
147
  private
144
148
 
145
- # Removes payloads from slow transactions that exceed +SlowRequestPolicy::MAX_DETAIL_PER_MINUTE+ to avoid
146
- # bloating the layaway file.
147
- def trim_slow_transaction_metrics
148
- count_with_metrics = 0
149
- @slow_transactions.each do |s|
150
-
151
- if s.has_metrics?
152
- count_with_metrics += 1
153
- if count_with_metrics > SlowRequestPolicy::MAX_DETAIL_PER_MINUTE
154
- s.clear_metrics!
155
- end
156
- end
157
- end
158
- end
159
-
160
149
  # We can't aggregate CPU, Memory, Capacity, or Controller, so pass through these metrics directly
161
150
  # TODO: Figure out a way to not have this duplicate what's in Samplers, and also on server's ingest
162
151
  PASSTHROUGH_METRICS = ["CPU", "Memory", "Instance", "Controller", "SlowTransaction"]
@@ -14,7 +14,7 @@ module ScoutApm
14
14
 
15
15
  module ClassMethods
16
16
  # Type: the Layer type - "View" or similar
17
- # Name: specific name - "users/_gravatar"
17
+ # Name: specific name - "users/_gravatar". The object must respond to "#to_s". This allows us to be more efficient - in most cases, the metric name isn't needed unless we are processing a slow transaction.
18
18
  # A Block: The code to be instrumented
19
19
  #
20
20
  # Options:
@@ -16,7 +16,7 @@ module ScoutApm
16
16
  # sql: SELECT "places".* FROM "places" ORDER BY "places"."position" ASC
17
17
  # name: Place Load
18
18
  # metric_name: Place/find
19
- def metric_name
19
+ def to_s
20
20
  return DEFAULT_METRIC unless name
21
21
  return DEFAULT_METRIC unless model && operation
22
22
 
@@ -1,4 +1,4 @@
1
1
  module ScoutApm
2
- VERSION = "1.2.13"
2
+ VERSION = "1.3.0"
3
3
  end
4
4
 
@@ -9,7 +9,7 @@ class ActiveRecordMetricNameTest < Minitest::Test
9
9
  name = :skip_logging
10
10
 
11
11
  mn = ScoutApm::Utils::ActiveRecordMetricName.new(sql, name)
12
- assert_equal "SQL/Unknown", mn.metric_name
12
+ assert_equal "SQL/Unknown", mn.to_s
13
13
  end
14
14
 
15
15
  def test_postgres_column_lookup
@@ -27,7 +27,7 @@ class ActiveRecordMetricNameTest < Minitest::Test
27
27
  name = "SCHEMA"
28
28
 
29
29
  mn = ScoutApm::Utils::ActiveRecordMetricName.new(sql, name)
30
- assert_equal "SQL/Unknown", mn.metric_name
30
+ assert_equal "SQL/Unknown", mn.to_s
31
31
  end
32
32
 
33
33
 
@@ -36,7 +36,7 @@ class ActiveRecordMetricNameTest < Minitest::Test
36
36
  name = "User Load"
37
37
 
38
38
  mn = ScoutApm::Utils::ActiveRecordMetricName.new(sql, name)
39
- assert_equal "User/find", mn.metric_name
39
+ assert_equal "User/find", mn.to_s
40
40
  end
41
41
 
42
42
  def test_without_name
@@ -44,7 +44,7 @@ class ActiveRecordMetricNameTest < Minitest::Test
44
44
  name = nil
45
45
 
46
46
  mn = ScoutApm::Utils::ActiveRecordMetricName.new(sql, name)
47
- assert_equal "SQL/Unknown", mn.metric_name
47
+ assert_equal "SQL/Unknown", mn.to_s
48
48
  end
49
49
 
50
50
  # TODO: Determine if there should be a distinction between Unknown and Other.
@@ -53,6 +53,6 @@ class ActiveRecordMetricNameTest < Minitest::Test
53
53
  name = "A whole sentance describing what's what"
54
54
 
55
55
  mn = ScoutApm::Utils::ActiveRecordMetricName.new(sql, name)
56
- assert_equal "SQL/other", mn.metric_name
56
+ assert_equal "SQL/other", mn.to_s
57
57
  end
58
58
  end
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: 1.2.13
4
+ version: 1.3.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: 2016-02-02 00:00:00.000000000 Z
12
+ date: 2016-02-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest