scout_apm 0.1.16 → 0.1.17

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5728ecccdb01d128fdc5e222cf7db8f28078c7d1
4
- data.tar.gz: 40a2a8ffe2e6a22b859a377916a6ade0777867f3
3
+ metadata.gz: d868630dc6de8b7e4387d2fc6e0e40860df1500d
4
+ data.tar.gz: 585b6bbb87aeaeec7408cc24750fa3089165e4b8
5
5
  SHA512:
6
- metadata.gz: f3652b37e73e8ea2c2e38297e4ca4967db8e7d4a8c485b17bb74b5b4ad68a700299aea8289ba97b504447a557203a3c28d8afc2524b6c8710884a9f378ad8742
7
- data.tar.gz: 5b776864017a983996c0ef1d3c27be70bd3f6986b82d3e62a8225128af4b4f36383ad26251b4e3e65f294aee7c1b7afba0eb7c6e537c1d637755a2afc7472ac2
6
+ metadata.gz: 0be21301d0033dbb09c11bfa79a6723c4ac24b900e99afab977152331a46dc7db8739813ae8d27f80b0fd65f04f02c5cd10f53fe4a0de89e8b3bfc7c1a6420e8
7
+ data.tar.gz: 2e604678abf6cafcfd6a13ce39955212eae6486a69b92290427ad5f703ab4fa8556643388723dbe5f761409a039b49d8507bc730f1effc2af391216d85fb9a76
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,7 @@
1
+ # 0.1.17
2
+
3
+ * Scrub sql strings for invalid encoding characters.
4
+
1
5
  # 0.1.16
2
6
 
3
7
  * Beta support for Sinatra monitoring.
@@ -19,6 +19,14 @@ module ScoutApm
19
19
 
20
20
  # TODO: Fetch the name
21
21
  def application_name
22
+ possible = ObjectSpace.each_object(Class).select { |klass| klass < Sinatra::Base } - [Sinatra::Application]
23
+ if possible.length == 1
24
+ possible.first.name
25
+ else
26
+ "Sinatra"
27
+ end
28
+ rescue => e
29
+ logger.debug "Failed getting Sinatra Application Name: #{e.message}\n#{e.backtrace.join("\n\t")}"
22
30
  "Sinatra"
23
31
  end
24
32
 
@@ -2,7 +2,7 @@ class ScoutApm::SlowTransaction
2
2
  BACKTRACE_THRESHOLD = 0.5 # the minimum threshold to record the backtrace for a metric.
3
3
  BACKTRACE_LIMIT = 5 # Max length of callers to display
4
4
  MAX_SIZE = 100 # Limits the size of the metric hash to prevent a metric explosion.
5
- attr_reader :metric_name, :total_call_time, :metrics, :meta, :uri, :context, :time
5
+ attr_reader :metric_name, :total_call_time, :metrics, :meta, :uri, :context, :time, :prof, :raw_prof
6
6
 
7
7
  # Given a call stack, generates a filtered backtrace that:
8
8
  # * Limits to the app/models, app/controllers, or app/views directories
@@ -16,12 +16,11 @@ module ScoutApm
16
16
  attr_accessor :database_engine
17
17
 
18
18
  def initialize(sql)
19
- @sql = sql.dup
19
+ @sql = scrubbed(sql.dup)
20
20
  @database_engine = ScoutApm::Environment.instance.database_engine
21
21
  end
22
22
 
23
23
  def to_s
24
- return nil if sql.length > 1000 # safeguard - don't sanitize large SQL statements
25
24
  case database_engine
26
25
  when :postgres then to_s_postgres
27
26
  when :mysql then to_s_mysql
@@ -60,6 +59,25 @@ module ScoutApm
60
59
  sql.gsub!(MULTIPLE_SPACES, ' ')
61
60
  sql.gsub!(TRAILING_SPACES, '')
62
61
  end
62
+
63
+ def has_encodings?(encodings=['UTF-8', 'binary'])
64
+ encodings.all?{|enc| Encoding.find(enc) rescue false}
65
+ end
66
+
67
+ def scrubbed(str)
68
+ return '' if !str.is_a?(String) || str.length > 1000 # safeguard - don't sanitize or scrub large SQL statements
69
+ return str if !str.respond_to?(:encode) # Ruby <= 1.8 doesn't have string encoding
70
+ return str if str.valid_encoding? # Whatever encoding it is, it is valid and we can operate on it
71
+ ScoutApm::Agent.instance.logger.debug "Scrubbing invalid sql encoding."
72
+ if str.respond_to?(:scrub) # Prefer to scrub before we have to convert
73
+ return str.scrub('_')
74
+ elsif has_encodings?(['UTF-8', 'binary'])
75
+ return str.encode('UTF-8', 'binary', :invalid => :replace, :undef => :replace, :replace => '_')
76
+ end
77
+ ScoutApm::Agent.instance.logger.debug "Unable to scrub invalid sql encoding."
78
+ ''
79
+ end
80
+
63
81
  end
64
82
  end
65
83
  end
@@ -1,4 +1,4 @@
1
1
  module ScoutApm
2
- VERSION = "0.1.16"
2
+ VERSION = "0.1.17"
3
3
  end
4
4
 
@@ -8,7 +8,7 @@ module ScoutApm
8
8
  # Too long, and we just bail out to prevent long running instrumentation
9
9
  def test_long_sql
10
10
  sql = " " * 1001
11
- assert_nil SqlSanitizer.new(sql).to_s
11
+ assert_equal '', SqlSanitizer.new(sql).to_s
12
12
  end
13
13
 
14
14
  def test_postgres_simple_select_of_first
@@ -62,6 +62,16 @@ module ScoutApm
62
62
  ss = SqlSanitizer.new(sql).tap{ |it| it.database_engine = :mysql }
63
63
  assert_equal %q|SELECT `blogs`.* FROM `blogs` WHERE (title = ?)|, ss.to_s
64
64
  end
65
+
66
+ def test_scrubs_invalid_encoding
67
+ sql = "SELECT `blogs`.* FROM `blogs` WHERE (title = 'a\255c')".force_encoding('UTF-8')
68
+ assert_equal false, sql.valid_encoding?
69
+ ss = SqlSanitizer.new(sql).tap{ |it| it.database_engine = :mysql }
70
+ assert_equal %q|SELECT `blogs`.* FROM `blogs` WHERE (title = 'a_c')|, ss.sql
71
+ assert_nothing_raised do
72
+ assert_equal %q|SELECT `blogs`.* FROM `blogs` WHERE (title = ?)|, ss.to_s
73
+ end
74
+ end
65
75
  end
66
76
  end
67
77
  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: 0.1.16
4
+ version: 0.1.17
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: 2015-09-24 00:00:00.000000000 Z
12
+ date: 2015-09-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -146,10 +146,4 @@ rubygems_version: 2.2.2
146
146
  signing_key:
147
147
  specification_version: 4
148
148
  summary: Ruby application performance monitoring
149
- test_files:
150
- - test/data/config_test_1.yml
151
- - test/test_helper.rb
152
- - test/unit/config_test.rb
153
- - test/unit/environment_test.rb
154
- - test/unit/instruments/active_record_instruments_test.rb
155
- - test/unit/sql_sanitizer_test.rb
149
+ test_files: []