appsignal 2.3.0.beta.1 → 2.3.0.beta.2

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: 5785ecc19ccd3550a6a654429274f796d462b6b4
4
- data.tar.gz: ec699ff6da87026d7b003c1343d77c0ed3513914
3
+ metadata.gz: c8993e01c5974b60000801e1e46ea7742d928bd7
4
+ data.tar.gz: 3da3e926724a76fac40d950810663eeacea9d9d8
5
5
  SHA512:
6
- metadata.gz: f533af191e8b214188d676db0d834d117e3c0ed4bad7d52cacb83b2a5ed78285e640a738a1fde78f9a29f0cabab97277034ec74a242b833f63236d1fe2d1bf8b
7
- data.tar.gz: 71dac0fc78a0964425672356ac88ca2518f16c47a340408c2fafd7d15991f99df7907c34790c91dc093b2c30f1199b7705c7e9eef16004df133e36ef31e2f78a
6
+ metadata.gz: 547b5cb15977cbca5cfba66f6559101f0ef8763e0e2a5db530a696e631929dabd361c658bd0f47e8fd59d1fda46aa8b4c91a69fa80abcf6e349f79658c2c2e28
7
+ data.tar.gz: 7760ba42ef65a3f1915aa3e5d149f6f07d95591e8a16d18598cfa1a771733dac53ecccb4300aa6b7763a0452b38f1230da9329b2338913ea12c58ed6c9b38668
data/CHANGELOG.md CHANGED
@@ -6,12 +6,15 @@
6
6
  * Improve log messages for transactions. PR #293
7
7
  * Remove thread_safe dependency. PR #294
8
8
  * Add `Transaction#params` attribute for custom parameters. PR #295
9
+ * Fix queue time on DelayedJob integration. PR #297
9
10
  * Add ActionCable support. PR #309
10
11
  * Finish ActiveSupport notifications events when they would encounter a `raise`
11
12
  or a `throw`. PR #310
12
13
  * Add `ignore_namespaces` option. PR #312
13
14
  * Truncate lengthy parameter values to 2000 characters.
14
15
  Commit 65de1382f5f453b624781cde6e0544c89fdf89ef
16
+ * Disable gracefully on Microsoft Windows. PR #313
17
+ * Add tags and namespace arguments to `Appsignal.set_error`. PR #317
15
18
 
16
19
  # 2.2.1
17
20
  * Fix support for Rails 5.1. PR #286
data/lib/appsignal.rb CHANGED
@@ -315,11 +315,14 @@ module Appsignal
315
315
  # @see http://docs.appsignal.com/ruby/instrumentation/exception-handling.html
316
316
  # Exception handling guide
317
317
  # @since 0.6.6
318
- def set_error(exception)
318
+ def set_error(exception, tags = nil, namespace = nil)
319
319
  return if !active? ||
320
320
  Appsignal::Transaction.current.nil? ||
321
321
  exception.nil?
322
- Appsignal::Transaction.current.set_error(exception)
322
+ transaction = Appsignal::Transaction.current
323
+ transaction.set_error(exception)
324
+ transaction.set_tags(tags) if tags
325
+ transaction.set_namespace(namespace) if namespace
323
326
  end
324
327
  alias :set_exception :set_error
325
328
  alias :add_exception :set_error
@@ -69,6 +69,7 @@ module Appsignal
69
69
  # @return [void]
70
70
  # @api private
71
71
  def run(options = {})
72
+ $stdout.sync = true
72
73
  header
73
74
  empty_line
74
75
 
@@ -171,6 +172,11 @@ module Appsignal
171
172
 
172
173
  def run_agent_diagnose_mode
173
174
  puts "Agent diagnostics"
175
+ unless Appsignal.extension_loaded?
176
+ puts " Extension is not loaded. No agent report created."
177
+ return
178
+ end
179
+
174
180
  ENV["_APPSIGNAL_DIAGNOSE"] = "true"
175
181
  diagnostics_report_string = Appsignal::Extension.diagnose
176
182
  ENV.delete("_APPSIGNAL_DIAGNOSE")
@@ -288,7 +294,12 @@ module Appsignal
288
294
  puts "Host information"
289
295
  data_section :host do
290
296
  puts_and_save :architecture, "Architecture", rbconfig["host_cpu"]
291
- puts_and_save :os, "Operating System", rbconfig["host_os"]
297
+
298
+ os_label = os = rbconfig["host_os"]
299
+ os_label = "#{os_label} (Microsoft Windows is not supported.)" if Gem.win_platform?
300
+ save :os, os
301
+ puts_value "Operating System", os_label
302
+
292
303
  puts_and_save :language_version, "Ruby version",
293
304
  "#{rbconfig["ruby_version"]}-p#{rbconfig["PATCHLEVEL"]}"
294
305
 
@@ -370,7 +381,7 @@ module Appsignal
370
381
  file_uid = File.stat(path).uid
371
382
  {
372
383
  :uid => file_uid,
373
- :user => Etc.getpwuid(file_uid).name
384
+ :user => username_for_uid(file_uid)
374
385
  }
375
386
  end
376
387
 
@@ -380,7 +391,7 @@ module Appsignal
380
391
  process_uid = Process.uid
381
392
  @process_user = {
382
393
  :uid => process_uid,
383
- :user => Etc.getpwuid(process_uid).name
394
+ :user => username_for_uid(process_uid)
384
395
  }
385
396
  end
386
397
 
@@ -458,6 +469,12 @@ module Appsignal
458
469
  end
459
470
  end
460
471
 
472
+ def username_for_uid(uid)
473
+ passwd_struct = Etc.getpwuid(uid)
474
+ return unless passwd_struct
475
+ passwd_struct.name
476
+ end
477
+
461
478
  def empty_line
462
479
  puts "\n"
463
480
  end
@@ -29,7 +29,7 @@ module Appsignal
29
29
  def press_any_key
30
30
  puts
31
31
  print " Ready? Press any key:"
32
- stdin.getch
32
+ stdin.getc
33
33
  puts
34
34
  puts
35
35
  end
@@ -12,6 +12,8 @@ module Appsignal
12
12
 
13
13
  class << self
14
14
  def run(push_api_key)
15
+ $stdout.sync = true
16
+
15
17
  puts
16
18
  puts colorize "#######################################", :green
17
19
  puts colorize "## Starting AppSignal Installer ##", :green
@@ -24,7 +26,7 @@ module Appsignal
24
26
  puts colorize "Problem encountered:", :red
25
27
  puts " No push API key entered."
26
28
  puts " - Sign up for AppSignal and follow the instructions"
27
- puts " - Already signed up? Click 'New app' on the account overview page"
29
+ puts " - Already signed up? Click 'Add app' on the account overview page"
28
30
  puts
29
31
  puts colorize "Exiting installer...", :red
30
32
  return
@@ -59,7 +61,12 @@ module Appsignal
59
61
  elsif installed_frameworks.include?(:sinatra)
60
62
  install_for_sinatra(config)
61
63
  else
62
- puts "We could not detect which framework you are using. We'd be very grateful if you email us on support@appsignal.com with information about your setup."
64
+ print colorize "Warning:", :red
65
+ puts " We could not detect which framework you are using. "\
66
+ "We'd be very grateful if you email us on support@appsignal.com "\
67
+ "with information about your setup."
68
+ puts
69
+ done_notice
63
70
  end
64
71
  end
65
72
 
@@ -199,7 +206,10 @@ module Appsignal
199
206
  sleep 0.3
200
207
  puts
201
208
  if Gem.win_platform?
202
- puts "The AppSignal agent currently does not work on Windows, please push these changes to your test/staging/production environment"
209
+ puts "The AppSignal agent currently does not work on Microsoft " \
210
+ "Windows. Please push these changes to your staging/production " \
211
+ "environment and make sure some actions are performed. " \
212
+ "AppSignal should pick up your app after a few minutes."
203
213
  else
204
214
  puts " Sending example data to AppSignal..."
205
215
  if Appsignal::Demo.transmit
@@ -2,10 +2,10 @@ require "erb"
2
2
  require "yaml"
3
3
  require "uri"
4
4
  require "socket"
5
+ require "tmpdir"
5
6
 
6
7
  module Appsignal
7
8
  class Config
8
- SYSTEM_TMP_DIR = File.realpath("/tmp")
9
9
  DEFAULT_CONFIG = {
10
10
  :debug => false,
11
11
  :log => "file",
@@ -84,6 +84,16 @@ module Appsignal
84
84
  validate
85
85
  end
86
86
 
87
+ # @api private
88
+ # @return [String] System's tmp directory.
89
+ def self.system_tmp_dir
90
+ if Gem.win_platform?
91
+ Dir.tmpdir
92
+ else
93
+ File.realpath("/tmp")
94
+ end
95
+ end
96
+
87
97
  def [](key)
88
98
  config_hash[key]
89
99
  end
@@ -98,14 +108,15 @@ module Appsignal
98
108
  return File.join(File.realpath(path), "appsignal.log")
99
109
  end
100
110
 
101
- if File.writable? SYSTEM_TMP_DIR
111
+ system_tmp_dir = self.class.system_tmp_dir
112
+ if File.writable? system_tmp_dir
102
113
  $stdout.puts "appsignal: Unable to log to '#{path}'. Logging to "\
103
- "'#{SYSTEM_TMP_DIR}' instead. Please check the "\
114
+ "'#{system_tmp_dir}' instead. Please check the "\
104
115
  "permissions for the application's (log) directory."
105
- File.join(SYSTEM_TMP_DIR, "appsignal.log")
116
+ File.join(system_tmp_dir, "appsignal.log")
106
117
  else
107
118
  $stdout.puts "appsignal: Unable to log to '#{path}' or the "\
108
- "'#{SYSTEM_TMP_DIR}' fallback. Please check the permissions "\
119
+ "'#{system_tmp_dir}' fallback. Please check the permissions "\
109
120
  "for the application's (log) directory."
110
121
  end
111
122
  end
@@ -43,7 +43,7 @@ module Appsignal
43
43
  :attempts => extract_value(job_data, :attempts, 0)
44
44
  },
45
45
  :params => params,
46
- :queue_start => extract_value(job_data, :created_at)
46
+ :queue_start => extract_value(job_data, :run_at)
47
47
  ) do
48
48
  block.call(job)
49
49
  end
@@ -1,5 +1,5 @@
1
1
  require "yaml"
2
2
 
3
3
  module Appsignal
4
- VERSION = "2.3.0.beta.1".freeze
4
+ VERSION = "2.3.0.beta.2".freeze
5
5
  end
@@ -29,7 +29,15 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :report => true do
29
29
  let(:process_user) { Etc.getpwuid(Process.uid).name }
30
30
  before(:context) { Appsignal.stop }
31
31
  before do
32
+ # Clear previous reports
32
33
  DiagnosticsReportEndpoint.clear_report!
34
+ if cli.instance_variable_defined? :@data
35
+ # Because this is saved on the class rather than an instance of the
36
+ # class we need to clear it like this in case a certain test doesn't
37
+ # generate a report.
38
+ cli.remove_instance_variable :@data
39
+ end
40
+
33
41
  if DependencyHelper.rails_present?
34
42
  allow(Rails).to receive(:root).and_return(Pathname.new(config.root_path))
35
43
  end
@@ -260,6 +268,24 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :report => true do
260
268
  end
261
269
  end
262
270
 
271
+ context "when the extension is not loaded" do
272
+ before do
273
+ DiagnosticsReportEndpoint.clear_report!
274
+ expect(Appsignal).to receive(:extension_loaded?).and_return(false)
275
+ run
276
+ end
277
+
278
+ it "prints a warning" do
279
+ expect(output).to include \
280
+ "Agent diagnostics",
281
+ " Extension is not loaded. No agent report created."
282
+ end
283
+
284
+ it "adds the output to the report" do
285
+ expect(received_report["agent"]).to be_nil
286
+ end
287
+ end
288
+
263
289
  context "when the report contains an error" do
264
290
  let(:agent_report) do
265
291
  { "error" => "fatal error" }
@@ -373,6 +399,23 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :report => true do
373
399
  "Ruby version: #{language_version}"
374
400
  end
375
401
 
402
+ context "when on Microsoft Windows" do
403
+ before do
404
+ expect(RbConfig::CONFIG).to receive(:[]).with("host_os").and_return("mingw32")
405
+ expect(RbConfig::CONFIG).to receive(:[]).at_least(:once).and_call_original
406
+ expect(Gem).to receive(:win_platform?).and_return(true)
407
+ run
408
+ end
409
+
410
+ it "adds the arch to the report" do
411
+ expect(received_report["host"]["os"]).to eq("mingw32")
412
+ end
413
+
414
+ it "prints warning that Microsoft Windows is not supported" do
415
+ expect(output).to match(/Operating System: .+ \(Microsoft Windows is not supported\.\)/)
416
+ end
417
+ end
418
+
376
419
  it "transmits host information in report" do
377
420
  run
378
421
  host_report = received_report["host"]
@@ -594,7 +637,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :report => true do
594
637
  end
595
638
 
596
639
  describe "paths" do
597
- let(:system_tmp_dir) { Appsignal::Config::SYSTEM_TMP_DIR }
640
+ let(:system_tmp_dir) { Appsignal::Config.system_tmp_dir }
598
641
  before do
599
642
  FileUtils.mkdir_p(root_path)
600
643
  FileUtils.mkdir_p(system_tmp_dir)
@@ -210,8 +210,8 @@ describe Appsignal::CLI::Install do
210
210
  end
211
211
 
212
212
  it "prints a warning for windows" do
213
- expect(output).to include("The AppSignal agent currently does not work on Windows")
214
- expect(output).to include("test/staging/production environment")
213
+ expect(output).to include("The AppSignal agent currently does not work on Microsoft Windows")
214
+ expect(output).to include("staging/production environment")
215
215
  end
216
216
  end
217
217
 
@@ -614,12 +614,15 @@ describe Appsignal::CLI::Install do
614
614
  context "with unknown framework" do
615
615
  let(:push_api_key) { "my_key" }
616
616
 
617
+ it_behaves_like "windows installation"
617
618
  it_behaves_like "push_api_key validation"
619
+ it_behaves_like "demo data"
618
620
 
619
621
  it "prints a message about unknown framework" do
620
622
  run
621
623
 
622
- expect(output).to include "We could not detect which framework you are using."
624
+ expect(output).to include \
625
+ "\e[31mWarning:\e[0m We could not detect which framework you are using."
623
626
  expect(output).to_not include_env_push_api_key
624
627
  expect(output).to_not include_env_app_name
625
628
  expect(File.exist?(config_file_path)).to be_falsy
@@ -444,7 +444,7 @@ describe Appsignal::Config do
444
444
  end
445
445
 
446
446
  shared_examples "#log_file_path: tmp path" do
447
- let(:system_tmp_dir) { described_class::SYSTEM_TMP_DIR }
447
+ let(:system_tmp_dir) { described_class.system_tmp_dir }
448
448
  before { FileUtils.mkdir_p(system_tmp_dir) }
449
449
  after { FileUtils.rm_rf(system_tmp_dir) }
450
450
 
@@ -558,4 +558,31 @@ describe Appsignal::Config do
558
558
  end
559
559
  end
560
560
  end
561
+
562
+ describe ".system_tmp_dir" do
563
+ before do
564
+ # To counteract the stub in spec_helper
565
+ expect(Appsignal::Config).to receive(:system_tmp_dir).and_call_original
566
+ end
567
+
568
+ context "when on a *NIX OS" do
569
+ before do
570
+ expect(Gem).to receive(:win_platform?).and_return(false)
571
+ end
572
+
573
+ it "returns the system's tmp dir" do
574
+ expect(described_class.system_tmp_dir).to eq(File.realpath("/tmp"))
575
+ end
576
+ end
577
+
578
+ context "when on Microsoft Windows" do
579
+ before do
580
+ expect(Gem).to receive(:win_platform?).and_return(true)
581
+ end
582
+
583
+ it "returns the system's tmp dir" do
584
+ expect(described_class.system_tmp_dir).to eq(Dir.tmpdir)
585
+ end
586
+ end
587
+ end
561
588
  end
@@ -34,6 +34,8 @@ describe Appsignal::Hooks::DelayedJobHook do
34
34
  describe ".invoke_with_instrumentation" do
35
35
  let(:plugin) { Appsignal::Hooks::DelayedJobPlugin }
36
36
  let(:time) { Time.parse("01-01-2001 10:01:00UTC") }
37
+ let(:created_at) { time - 3600 }
38
+ let(:run_at) { time - 3600 }
37
39
  let(:job_data) do
38
40
  {
39
41
  :id => 123,
@@ -41,7 +43,8 @@ describe Appsignal::Hooks::DelayedJobHook do
41
43
  :priority => 1,
42
44
  :attempts => 1,
43
45
  :queue => "default",
44
- :created_at => time - 60_000,
46
+ :created_at => created_at,
47
+ :run_at => run_at,
45
48
  :payload_object => double(:args => args)
46
49
  }
47
50
  end
@@ -60,7 +63,8 @@ describe Appsignal::Hooks::DelayedJobHook do
60
63
  :queue => "default",
61
64
  :id => "123"
62
65
  },
63
- :queue_start => time - 60_000
66
+ :params => args,
67
+ :queue_start => run_at
64
68
  }
65
69
  end
66
70
  after do
@@ -116,6 +120,17 @@ describe Appsignal::Hooks::DelayedJobHook do
116
120
  end
117
121
  end
118
122
 
123
+ context "with run_at in the future" do
124
+ let(:run_at) { Time.parse("2017-01-01 10:01:00UTC") }
125
+
126
+ it "reports queue_start with run_at time" do
127
+ expect(Appsignal).to receive(:monitor_transaction).with(
128
+ "perform_job.delayed_job",
129
+ default_params.merge(:queue_start => run_at)
130
+ )
131
+ end
132
+ end
133
+
119
134
  context "with custom name call" do
120
135
  let(:job_data) do
121
136
  {
@@ -128,7 +143,8 @@ describe Appsignal::Hooks::DelayedJobHook do
128
143
  :priority => 1,
129
144
  :attempts => 1,
130
145
  :queue => "default",
131
- :created_at => time - 60_000
146
+ :created_at => created_at,
147
+ :run_at => run_at
132
148
  }
133
149
  end
134
150
  let(:default_params) do
@@ -141,7 +157,7 @@ describe Appsignal::Hooks::DelayedJobHook do
141
157
  :queue => "default",
142
158
  :id => "123"
143
159
  },
144
- :queue_start => time - 60_000
160
+ :queue_start => run_at
145
161
  }
146
162
  end
147
163
 
@@ -210,16 +226,20 @@ describe Appsignal::Hooks::DelayedJobHook do
210
226
  :queue => "default",
211
227
  :id => "123"
212
228
  },
213
- :queue_start => time - 60_000
229
+ :queue_start => run_at,
230
+ :params => args
214
231
  }
215
232
  end
233
+ let(:args) { ["activejob_argument"] }
216
234
  before { job_data[:args] = args }
217
235
 
218
- it "wraps it in a transaction with the correct params" do
219
- expect(Appsignal).to receive(:monitor_transaction).with(
220
- "perform_job.delayed_job",
221
- default_params.merge(:params => ["argument"])
222
- )
236
+ context "with simple params" do
237
+ it "wraps it in a transaction with the correct params" do
238
+ expect(Appsignal).to receive(:monitor_transaction).with(
239
+ "perform_job.delayed_job",
240
+ default_params.merge(:params => ["activejob_argument"])
241
+ )
242
+ end
223
243
  end
224
244
 
225
245
  context "with more complex params" do
@@ -261,6 +281,17 @@ describe Appsignal::Hooks::DelayedJobHook do
261
281
  end
262
282
  end
263
283
  end
284
+
285
+ context "with run_at in the future" do
286
+ let(:run_at) { Time.parse("2017-01-01 10:01:00UTC") }
287
+
288
+ it "reports queue_start with run_at time" do
289
+ expect(Appsignal).to receive(:monitor_transaction).with(
290
+ "perform_job.delayed_job",
291
+ default_params.merge(:queue_start => run_at)
292
+ )
293
+ end
294
+ end
264
295
  end
265
296
  end
266
297
  end
@@ -605,7 +605,7 @@ describe Appsignal do
605
605
  context "when the log path and fallback path are not writable" do
606
606
  before do
607
607
  FileUtils.chmod 0o444, log_path
608
- FileUtils.chmod 0o444, Appsignal::Config::SYSTEM_TMP_DIR
608
+ FileUtils.chmod 0o444, Appsignal::Config.system_tmp_dir
609
609
 
610
610
  capture_stdout(out_stream) do
611
611
  Appsignal.start_logger
@@ -613,7 +613,7 @@ describe Appsignal do
613
613
  end
614
614
  end
615
615
  after do
616
- FileUtils.chmod 0o755, Appsignal::Config::SYSTEM_TMP_DIR
616
+ FileUtils.chmod 0o755, Appsignal::Config.system_tmp_dir
617
617
  end
618
618
 
619
619
  it "logs to stdout" do
@@ -628,7 +628,7 @@ describe Appsignal do
628
628
  it "outputs a warning" do
629
629
  expect(output).to include \
630
630
  "appsignal: Unable to log to '#{log_path}' "\
631
- "or the '#{Appsignal::Config::SYSTEM_TMP_DIR}' fallback."
631
+ "or the '#{Appsignal::Config.system_tmp_dir}' fallback."
632
632
  end
633
633
  end
634
634
 
@@ -712,42 +712,69 @@ describe Appsignal do
712
712
  end
713
713
 
714
714
  describe ".send_error" do
715
- let(:tags) { nil }
715
+ let(:transaction) do
716
+ Appsignal::Transaction.new(
717
+ SecureRandom.uuid,
718
+ Appsignal::Transaction::HTTP_REQUEST,
719
+ Appsignal::Transaction::GenericRequest.new({})
720
+ )
721
+ end
716
722
  let(:error) { VerySpecificError.new }
717
723
 
718
- it "should send the error to AppSignal" do
719
- expect(Appsignal::Transaction).to receive(:new).and_call_original
724
+ it "sends the error to AppSignal" do
725
+ expect(Appsignal::Transaction).to receive(:new).with(
726
+ kind_of(String),
727
+ Appsignal::Transaction::HTTP_REQUEST,
728
+ kind_of(Appsignal::Transaction::GenericRequest)
729
+ ).and_return(transaction)
730
+ expect(transaction).to receive(:set_error).with(error)
731
+ expect(transaction).to_not receive(:set_tags)
732
+ expect(transaction).to receive(:complete)
733
+
734
+ Appsignal.send_error(error)
735
+ end
736
+
737
+ context "when given error is not an Exception" do
738
+ let(:error) { double }
739
+
740
+ it "logs an error message" do
741
+ expect(Appsignal.logger).to receive(:error)
742
+ .with("Can't send error, given value is not an exception")
743
+ end
744
+
745
+ it "does not send the error" do
746
+ expect(Appsignal::Transaction).to_not receive(:create)
747
+ end
748
+
749
+ after { Appsignal.send_error(error) }
720
750
  end
721
751
 
722
752
  context "with tags" do
723
753
  let(:tags) { { :a => "a", :b => "b" } }
724
-
725
- it "should tag the request before sending" do
726
- transaction = Appsignal::Transaction.new(
727
- SecureRandom.uuid,
728
- Appsignal::Transaction::HTTP_REQUEST,
729
- Appsignal::Transaction::GenericRequest.new({})
730
- )
754
+ before do
731
755
  allow(Appsignal::Transaction).to receive(:new).and_return(transaction)
732
- expect(transaction).to receive(:set_tags).with(tags)
756
+ end
757
+
758
+ it "tags the request before sending it" do
759
+ expect(transaction).to receive(:set_tags).with(tags).and_call_original
733
760
  expect(transaction).to receive(:complete)
761
+
762
+ Appsignal.send_error(error, tags)
734
763
  end
735
764
  end
736
765
 
737
- context "when given class is not an error" do
738
- let(:error) { double }
766
+ context "with namespace" do
767
+ let(:namespace) { "admin" }
739
768
 
740
- it "should log a message" do
741
- expect(Appsignal.logger).to receive(:error).with('Can\'t send error, given value is not an exception')
769
+ it "sets the namespace on the transaction" do
770
+ expect(Appsignal::Transaction).to receive(:new).with(
771
+ kind_of(String),
772
+ "admin",
773
+ kind_of(Appsignal::Transaction::GenericRequest)
774
+ ).and_call_original
742
775
  end
743
776
 
744
- it "should not send the error" do
745
- expect(Appsignal::Transaction).to_not receive(:create)
746
- end
747
- end
748
-
749
- after do
750
- Appsignal.send_error(error, tags)
777
+ after { Appsignal.send_error(error, nil, namespace) }
751
778
  end
752
779
  end
753
780
 
@@ -766,24 +793,58 @@ describe Appsignal do
766
793
  before { allow(Appsignal::Transaction).to receive(:current).and_return(transaction) }
767
794
  let(:error) { RuntimeError.new("I am an exception") }
768
795
 
769
- it "should add the error to the current transaction" do
770
- expect(transaction).to receive(:set_error).with(error)
796
+ context "when there is an active transaction" do
797
+ it "adds the error to the active transaction" do
798
+ expect(transaction).to receive(:set_error).with(error)
799
+ expect(transaction).to_not receive(:set_tags)
800
+ expect(transaction).to_not receive(:set_namespace)
771
801
 
772
- Appsignal.set_error(error)
773
- end
802
+ Appsignal.set_error(error)
803
+ end
774
804
 
775
- it "should do nothing if there is no current transaction" do
776
- allow(Appsignal::Transaction).to receive(:current).and_return(nil)
805
+ context "when the error is nil" do
806
+ it "does nothing" do
807
+ expect(transaction).to_not receive(:set_error)
808
+ expect(transaction).to_not receive(:set_tags)
809
+ expect(transaction).to_not receive(:set_namespace)
810
+
811
+ Appsignal.set_error(nil)
812
+ end
813
+ end
814
+
815
+ context "with tags" do
816
+ let(:tags) { { "foo" => "bar" } }
777
817
 
778
- expect(transaction).to_not receive(:set_error)
818
+ it "sets the tags on the transaction" do
819
+ expect(transaction).to receive(:set_error).with(error)
820
+ expect(transaction).to receive(:set_tags).with(tags)
821
+ expect(transaction).to_not receive(:set_namespace)
779
822
 
780
- Appsignal.set_error(error)
823
+ Appsignal.set_error(error, tags)
824
+ end
825
+ end
826
+
827
+ context "with namespace" do
828
+ let(:namespace) { "admin" }
829
+
830
+ it "sets the namespace on the transaction" do
831
+ expect(transaction).to receive(:set_error).with(error)
832
+ expect(transaction).to_not receive(:set_tags)
833
+ expect(transaction).to receive(:set_namespace).with(namespace)
834
+
835
+ Appsignal.set_error(error, nil, namespace)
836
+ end
837
+ end
781
838
  end
782
839
 
783
- it "should do nothing if the error is nil" do
784
- expect(transaction).to_not receive(:set_error)
840
+ context "when there is no active transaction" do
841
+ it "does nothing" do
842
+ allow(Appsignal::Transaction).to receive(:current).and_return(nil)
785
843
 
786
- Appsignal.set_error(nil)
844
+ expect(transaction).to_not receive(:set_error)
845
+
846
+ Appsignal.set_error(error)
847
+ end
787
848
  end
788
849
  end
789
850
 
data/spec/spec_helper.rb CHANGED
@@ -60,14 +60,13 @@ RSpec.configure do |config|
60
60
 
61
61
  config.fail_if_no_examples = true
62
62
 
63
- config.before :context do
64
- # Use modified SYSTEM_TMP_DIR
65
- Appsignal::Config.send :remove_const, :SYSTEM_TMP_DIR
66
- Appsignal::Config.send :const_set, :SYSTEM_TMP_DIR,
67
- File.join(tmp_dir, "system-tmp")
63
+ def spec_system_tmp_dir
64
+ File.join(tmp_dir, "system-tmp")
65
+ end
68
66
 
67
+ config.before :context do
69
68
  FileUtils.rm_rf(tmp_dir)
70
- FileUtils.mkdir_p(Appsignal::Config::SYSTEM_TMP_DIR)
69
+ FileUtils.mkdir_p(spec_system_tmp_dir)
71
70
  end
72
71
 
73
72
  config.before do
@@ -79,6 +78,9 @@ RSpec.configure do |config|
79
78
  appsignal_key_prefixes = %w(APPSIGNAL_ _APPSIGNAL_)
80
79
  env_keys = ENV.keys.select { |key| key.start_with?(*appsignal_key_prefixes) }
81
80
  env_keys.each { |key| ENV.delete(key) }
81
+
82
+ # Stub system_tmp_dir to something in the project dir for specs
83
+ allow(Appsignal::Config).to receive(:system_tmp_dir).and_return(spec_system_tmp_dir)
82
84
  end
83
85
 
84
86
  config.after do
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.3.0.beta.1
4
+ version: 2.3.0.beta.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Beekman
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-06-16 00:00:00.000000000 Z
12
+ date: 2017-06-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack