appsignal 2.10.3 → 2.10.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,10 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 3.2.14'
4
4
  gem 'test-unit'
5
- if Gem::Version.new(RUBY_VERSION) <= Gem::Version.new("2.1.0")
6
- gem 'public_suffix', "~> 2.0.0"
7
- else
8
- gem 'public_suffix'
9
- end
10
5
 
11
6
  gemspec :path => '../'
@@ -2,10 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 4.0.0'
4
4
  gem 'mime-types', '~> 2.6'
5
- if Gem::Version.new(RUBY_VERSION) <= Gem::Version.new("2.1.0")
6
- gem 'public_suffix', "~> 2.0.0"
7
- else
8
- gem 'public_suffix'
9
- end
10
5
 
11
6
  gemspec :path => '../'
@@ -2,10 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 4.1.0'
4
4
  gem 'mime-types', '~> 2.6'
5
- if Gem::Version.new(RUBY_VERSION) <= Gem::Version.new("2.1.0")
6
- gem 'public_suffix', "~> 2.0.0"
7
- else
8
- gem 'public_suffix'
9
- end
10
5
 
11
6
  gemspec :path => '../'
@@ -8,8 +8,3 @@ gemspec :path => '../'
8
8
  if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.1.0")
9
9
  gem 'nokogiri', '~> 1.6.0'
10
10
  end
11
- if Gem::Version.new(RUBY_VERSION) <= Gem::Version.new("2.1.0")
12
- gem 'public_suffix', "~> 2.0.0"
13
- else
14
- gem 'public_suffix'
15
- end
@@ -9,8 +9,3 @@ gemspec :path => '../'
9
9
  if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.1.0")
10
10
  gem 'nokogiri', '~> 1.6.0'
11
11
  end
12
- if Gem::Version.new(RUBY_VERSION) <= Gem::Version.new("2.1.0")
13
- gem 'public_suffix', "~> 2.0.0"
14
- else
15
- gem 'public_suffix'
16
- end
@@ -337,7 +337,7 @@ module Appsignal
337
337
  path = File.expand_path("../../../../ext/install.report", __FILE__)
338
338
  raw_report = File.read(path)
339
339
  Utils.parse_yaml(raw_report)
340
- rescue => e
340
+ rescue StandardError, Psych::SyntaxError => e # rubocop:disable Lint/ShadowedException
341
341
  {
342
342
  "parsing_error" => {
343
343
  "error" => "#{e.class}: #{e}",
@@ -13,15 +13,20 @@ module Appsignal
13
13
  end
14
14
 
15
15
  def install
16
- Net::HTTP.class_eval do
17
- alias request_without_appsignal request
16
+ if Appsignal::System.ruby_2_or_up?
17
+ require "appsignal/integrations/net_http"
18
+ Net::HTTP.send(:prepend, Appsignal::Integrations::NetHttpIntegration)
19
+ else
20
+ Net::HTTP.class_eval do
21
+ alias request_without_appsignal request
18
22
 
19
- def request(request, body = nil, &block)
20
- Appsignal.instrument(
21
- "request.net_http",
22
- "#{request.method} #{use_ssl? ? "https" : "http"}://#{request["host"] || address}"
23
- ) do
24
- request_without_appsignal(request, body, &block)
23
+ def request(request, body = nil, &block)
24
+ Appsignal.instrument(
25
+ "request.net_http",
26
+ "#{request.method} #{use_ssl? ? "https" : "http"}://#{request["host"] || address}"
27
+ ) do
28
+ request_without_appsignal(request, body, &block)
29
+ end
25
30
  end
26
31
  end
27
32
  end
@@ -23,7 +23,8 @@ module Appsignal
23
23
  begin
24
24
  app.call(env)
25
25
  rescue Exception => error # rubocop:disable Lint/RescueException
26
- transaction.set_error(error)
26
+ # Do not set error if "grape.skip_appsignal_error" is set to `true`.
27
+ transaction.set_error(error) unless env["grape.skip_appsignal_error"]
27
28
  raise error
28
29
  ensure
29
30
  request_method = request.request_method.to_s.upcase
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appsignal
4
+ module Integrations
5
+ module NetHttpIntegration
6
+ def request(request, body = nil, &block)
7
+ Appsignal.instrument(
8
+ "request.net_http",
9
+ "#{request.method} #{use_ssl? ? "https" : "http"}://#{request["host"] || address}"
10
+ ) do
11
+ super
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -76,8 +76,14 @@ module Appsignal
76
76
  ldd_version && ldd_version[0]
77
77
  end
78
78
 
79
+ # @api private
79
80
  def self.jruby?
80
81
  RUBY_PLATFORM == "java"
81
82
  end
83
+
84
+ # @api private
85
+ def self.ruby_2_or_up?
86
+ versionify(RUBY_VERSION) >= versionify("2.0")
87
+ end
82
88
  end
83
89
  end
@@ -218,7 +218,7 @@ module Appsignal
218
218
  from[:controller] || from[:class],
219
219
  from[:action] || from[:method]
220
220
  ]
221
- set_action(group_and_action.compact.join("#"))
221
+ set_action_if_nil(group_and_action.compact.join("#"))
222
222
  end
223
223
 
224
224
  def set_queue_start(start)
@@ -248,7 +248,12 @@ module Appsignal
248
248
  Appsignal::Utils::Data.generate(data)
249
249
  )
250
250
  rescue RuntimeError => e
251
- Appsignal.logger.error("Error generating data (#{e.class}: #{e.message}) for '#{data.inspect}'")
251
+ begin
252
+ inspected_data = data.inspect
253
+ Appsignal.logger.error("Error generating data (#{e.class}: #{e.message}) for '#{inspected_data}'")
254
+ rescue => e
255
+ Appsignal.logger.error("Error generating data (#{e.class}: #{e.message}). Can't inspect data.")
256
+ end
252
257
  end
253
258
 
254
259
  def sample_data
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "2.10.3".freeze
4
+ VERSION = "2.10.5".freeze
5
5
  end
@@ -39,7 +39,7 @@ describe Appsignal::AuthCheck do
39
39
  end
40
40
  end
41
41
 
42
- context "when encountering an exception" do
42
+ context "when encountering an exception", :not_ruby19 do
43
43
  before { stubbed_request.to_timeout }
44
44
 
45
45
  it "raises an error" do
@@ -38,7 +38,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
38
38
  # Because this is saved on the class rather than an instance of the
39
39
  # class we need to clear it like this in case a certain test doesn't
40
40
  # generate a report.
41
- cli_class.remove_instance_variable :@data
41
+ cli_class.send :remove_instance_variable, :@data
42
42
  end
43
43
 
44
44
  if DependencyHelper.rails_present?
@@ -93,6 +93,16 @@ if DependencyHelper.grape_present?
93
93
  expect(transaction).to receive(:set_error).with(kind_of(ExampleException))
94
94
  end
95
95
 
96
+ context "with env['grape.skip_appsignal_error'] = true" do
97
+ before do
98
+ env["grape.skip_appsignal_error"] = true
99
+ end
100
+
101
+ it "does not add the error" do
102
+ expect(transaction).to_not receive(:set_error)
103
+ end
104
+ end
105
+
96
106
  after do
97
107
  expect { middleware.call(env) }.to raise_error ExampleException
98
108
  end
@@ -93,4 +93,40 @@ describe Appsignal::System do
93
93
  end
94
94
  end
95
95
  end
96
+
97
+ describe ".ruby_2_or_up?" do
98
+ around do |example|
99
+ original_ruby_version = RUBY_VERSION
100
+ Object.send(:remove_const, "RUBY_VERSION")
101
+ Object.const_set("RUBY_VERSION", ruby_version)
102
+ example.run
103
+ Object.send(:remove_const, "RUBY_VERSION")
104
+ Object.const_set("RUBY_VERSION", original_ruby_version)
105
+ end
106
+ subject { described_class.ruby_2_or_up? }
107
+
108
+ context "when on Ruby 1.9" do
109
+ let(:ruby_version) { "1.9.3-p533" }
110
+
111
+ it "returns false" do
112
+ is_expected.to be(false)
113
+ end
114
+ end
115
+
116
+ context "when on Ruby 2.0" do
117
+ let(:ruby_version) { "2.0.0" }
118
+
119
+ it "returns true" do
120
+ is_expected.to be(true)
121
+ end
122
+ end
123
+
124
+ context "when on Ruby 2.x" do
125
+ let(:ruby_version) { "2.1.0" }
126
+
127
+ it "returns true" do
128
+ is_expected.to be(true)
129
+ end
130
+ end
131
+ end
96
132
  end
@@ -441,30 +441,36 @@ describe Appsignal::Transaction do
441
441
 
442
442
  describe "#set_http_or_background_action" do
443
443
  context "for a hash with controller and action" do
444
- let(:from) { { :controller => "HomeController", :action => "show" } }
445
-
446
- it "should set the action" do
447
- expect(transaction).to receive(:set_action).with("HomeController#show")
444
+ it "sets the action" do
445
+ transaction.set_http_or_background_action(
446
+ :controller => "HomeController",
447
+ :action => "show"
448
+ )
449
+ expect(transaction.to_h["action"]).to eql("HomeController#show")
448
450
  end
449
451
  end
450
452
 
451
453
  context "for a hash with just action" do
452
- let(:from) { { :action => "show" } }
453
-
454
- it "should set the action" do
455
- expect(transaction).to receive(:set_action).with("show")
454
+ it "sets the action" do
455
+ transaction.set_http_or_background_action(:action => "show")
456
+ expect(transaction.to_h["action"]).to eql("show")
456
457
  end
457
458
  end
458
459
 
459
460
  context "for a hash with class and method" do
460
- let(:from) { { :class => "Worker", :method => "perform" } }
461
-
462
- it "should set the action" do
463
- expect(transaction).to receive(:set_action).with("Worker#perform")
461
+ it "sets the action" do
462
+ transaction.set_http_or_background_action(:class => "Worker", :method => "perform")
463
+ expect(transaction.to_h["action"]).to eql("Worker#perform")
464
464
  end
465
465
  end
466
466
 
467
- after { transaction.set_http_or_background_action(from) }
467
+ context "when action is already set" do
468
+ it "does not overwrite the set action" do
469
+ transaction.set_action("MyCustomAction#perform")
470
+ transaction.set_http_or_background_action(:class => "Worker", :method => "perform")
471
+ expect(transaction.to_h["action"]).to eql("MyCustomAction#perform")
472
+ end
473
+ end
468
474
  end
469
475
 
470
476
  describe "set_queue_start" do
@@ -568,7 +574,7 @@ describe Appsignal::Transaction do
568
574
  end
569
575
 
570
576
  context "when the data cannot be converted to JSON" do
571
- it "does not update the sample data on the transaction" do
577
+ it "does not update the sample data on the transaction", :not_ruby19 do
572
578
  klass = Class.new do
573
579
  def to_s
574
580
  raise "foo" # Cause a deliberate error
@@ -580,6 +586,19 @@ describe Appsignal::Transaction do
580
586
  expect(log_contents(log)).to contains_log :error,
581
587
  "Error generating data (RuntimeError: foo) for"
582
588
  end
589
+
590
+ it "does not update the sample data on the transaction", :only_ruby19 do
591
+ klass = Class.new do
592
+ def to_s
593
+ raise "foo" # Cause a deliberate error
594
+ end
595
+ end
596
+ transaction.set_sample_data("params", klass.new => 1)
597
+
598
+ expect(transaction.to_h["sample_data"]).to eq({})
599
+ expect(log_contents(log)).to contains_log :error,
600
+ "Error generating data (RuntimeError: foo). Can't inspect data."
601
+ end
583
602
  end
584
603
  end
585
604
 
@@ -143,7 +143,9 @@ describe Appsignal::Transmitter do
143
143
  context "with a proxy" do
144
144
  let(:config) { project_fixture_config("production", :http_proxy => "http://localhost:8080") }
145
145
 
146
- it { expect(subject).to be_instance_of(Net::HTTP) }
146
+ it "is of Net::HTTP class", :not_ruby19 do
147
+ expect(subject).to be_instance_of(Net::HTTP)
148
+ end
147
149
  it { expect(subject.proxy?).to be_truthy }
148
150
  it { expect(subject.proxy_address).to eq "localhost" }
149
151
  it { expect(subject.proxy_port).to eq 8080 }
@@ -9,7 +9,6 @@ Bundler.require :default
9
9
  require "cgi"
10
10
  require "rack"
11
11
  require "rspec"
12
- require "pry"
13
12
  require "timecop"
14
13
  require "webmock/rspec"
15
14
 
@@ -30,6 +29,7 @@ if DependencyHelper.rails_present?
30
29
  require f
31
30
  end
32
31
  end
32
+ require "pry" if DependencyHelper.dependency_present?("pry")
33
33
  require "appsignal"
34
34
  # Include patches of AppSignal modules and classes to make test helpers
35
35
  # available.
@@ -81,6 +81,20 @@ RSpec.configure do |config|
81
81
  FileUtils.mkdir_p(spec_system_tmp_dir)
82
82
  end
83
83
 
84
+ config.before :each, :only_ruby19 => true do
85
+ is_ruby19 = Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.0.0")
86
+ next if is_ruby19
87
+
88
+ skip "Skipping spec. Only for Ruby 1.9"
89
+ end
90
+
91
+ config.before :each, :not_ruby19 => true do
92
+ is_ruby19 = Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.0.0")
93
+ next unless is_ruby19
94
+
95
+ skip "Skipping spec for Ruby 1.9"
96
+ end
97
+
84
98
  config.before do
85
99
  stop_minutely_probes
86
100
  ENV["RAILS_ENV"] ||= "test"
@@ -0,0 +1,22 @@
1
+ #!/bin/bash
2
+
3
+ set -eu
4
+
5
+ actual_ruby_version=$(ruby --version)
6
+ if [[ "$actual_ruby_version" == *"jruby"* ]]; then
7
+ # Replace "-" from specified RUBY_VERSION string. Semaphore/rbenv version uses
8
+ # a dash, where `jruby --version` uses a space.
9
+ sanitized_ruby_version="${RUBY_VERSION//-/ }"
10
+ else
11
+ # Strip "-" from specified RUBY_VERSION string. Semaphore/rbenv version uses
12
+ # a dash, where `ruby --version` does not.
13
+ sanitized_ruby_version="${RUBY_VERSION//-}"
14
+ fi
15
+ if [[ "$actual_ruby_version" == *"$sanitized_ruby_version"* ]]; then
16
+ echo "Ruby version is $RUBY_VERSION"
17
+ exit 0
18
+ else
19
+ echo "Ruby version is: $actual_ruby_version"
20
+ echo "Ruby version should be: $sanitized_ruby_version"
21
+ exit 1
22
+ fi
@@ -2,20 +2,25 @@
2
2
 
3
3
  set -eu
4
4
 
5
+ gem_args="--no-verbose"
6
+ if [[ $(ruby --version) != "ruby 1.9.3"* ]]; then
7
+ gem_args+=" --no-document"
8
+ fi
9
+
5
10
  case "${_RUBYGEMS_VERSION-"latest"}" in
6
11
  "latest")
7
- gem update --no-document --system
12
+ gem update $gem_args --system
8
13
  ;;
9
14
  *)
10
- gem update --no-document --system $_RUBYGEMS_VERSION
15
+ gem update $gem_args --system $_RUBYGEMS_VERSION
11
16
  ;;
12
17
  esac
13
18
 
14
19
  case "${_BUNDLER_VERSION-"latest"}" in
15
20
  "latest")
16
- gem update bundler --no-document
21
+ gem update bundler $gem_args
17
22
  ;;
18
23
  *)
19
- gem install bundler --no-document --version $_BUNDLER_VERSION
24
+ gem install bundler $gem_args --version $_BUNDLER_VERSION
20
25
  ;;
21
26
  esac
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appsignal
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.3
4
+ version: 2.10.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Beekman
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-02-21 00:00:00.000000000 Z
13
+ date: 2020-04-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -55,7 +55,7 @@ dependencies:
55
55
  - !ruby/object:Gem::Version
56
56
  version: '3.8'
57
57
  - !ruby/object:Gem::Dependency
58
- name: pry
58
+ name: timecop
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - ">="
@@ -69,7 +69,7 @@ dependencies:
69
69
  - !ruby/object:Gem::Version
70
70
  version: '0'
71
71
  - !ruby/object:Gem::Dependency
72
- name: timecop
72
+ name: webmock
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
75
  - - ">="
@@ -83,47 +83,47 @@ dependencies:
83
83
  - !ruby/object:Gem::Version
84
84
  version: '0'
85
85
  - !ruby/object:Gem::Dependency
86
- name: webmock
86
+ name: yard
87
87
  requirement: !ruby/object:Gem::Requirement
88
88
  requirements:
89
89
  - - ">="
90
90
  - !ruby/object:Gem::Version
91
- version: '0'
91
+ version: 0.9.20
92
92
  type: :development
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
96
  - - ">="
97
97
  - !ruby/object:Gem::Version
98
- version: '0'
98
+ version: 0.9.20
99
99
  - !ruby/object:Gem::Dependency
100
- name: rubocop
100
+ name: pry
101
101
  requirement: !ruby/object:Gem::Requirement
102
102
  requirements:
103
- - - '='
103
+ - - ">="
104
104
  - !ruby/object:Gem::Version
105
- version: 0.50.0
105
+ version: '0'
106
106
  type: :development
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
- - - '='
110
+ - - ">="
111
111
  - !ruby/object:Gem::Version
112
- version: 0.50.0
112
+ version: '0'
113
113
  - !ruby/object:Gem::Dependency
114
- name: yard
114
+ name: rubocop
115
115
  requirement: !ruby/object:Gem::Requirement
116
116
  requirements:
117
- - - ">="
117
+ - - '='
118
118
  - !ruby/object:Gem::Version
119
- version: 0.9.20
119
+ version: 0.50.0
120
120
  type: :development
121
121
  prerelease: false
122
122
  version_requirements: !ruby/object:Gem::Requirement
123
123
  requirements:
124
- - - ">="
124
+ - - '='
125
125
  - !ruby/object:Gem::Version
126
- version: 0.9.20
126
+ version: 0.50.0
127
127
  description: The official appsignal.com gem
128
128
  email:
129
129
  - support@appsignal.com
@@ -139,7 +139,7 @@ files:
139
139
  - ".rspec"
140
140
  - ".rubocop.yml"
141
141
  - ".rubocop_todo.yml"
142
- - ".travis.yml"
142
+ - ".semaphore/semaphore.yml"
143
143
  - ".yardopts"
144
144
  - CHANGELOG.md
145
145
  - CODE_OF_CONDUCT.md
@@ -227,6 +227,7 @@ files:
227
227
  - lib/appsignal/integrations/delayed_job_plugin.rb
228
228
  - lib/appsignal/integrations/grape.rb
229
229
  - lib/appsignal/integrations/mongo_ruby_driver.rb
230
+ - lib/appsignal/integrations/net_http.rb
230
231
  - lib/appsignal/integrations/object.rb
231
232
  - lib/appsignal/integrations/padrino.rb
232
233
  - lib/appsignal/integrations/que.rb
@@ -368,6 +369,7 @@ files:
368
369
  - spec/support/stubs/sidekiq/api.rb
369
370
  - spec/support/testing.rb
370
371
  - support/bundler_wrapper
372
+ - support/check_versions
371
373
  - support/install_deps
372
374
  homepage: https://github.com/appsignal/appsignal-ruby
373
375
  licenses: