appsignal 3.9.2-java → 3.10.0-java

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +3138 -0
  3. data/.rubocop.yml +28 -20
  4. data/.rubocop_todo.yml +7 -33
  5. data/CHANGELOG.md +130 -0
  6. data/README.md +0 -1
  7. data/Rakefile +80 -65
  8. data/appsignal.gemspec +1 -1
  9. data/build_matrix.yml +112 -184
  10. data/ext/base.rb +1 -1
  11. data/gemfiles/hanami-2.1.gemfile +7 -0
  12. data/gemfiles/webmachine1.gemfile +5 -4
  13. data/lib/appsignal/cli/diagnose.rb +1 -1
  14. data/lib/appsignal/config.rb +5 -1
  15. data/lib/appsignal/demo.rb +0 -1
  16. data/lib/appsignal/environment.rb +11 -2
  17. data/lib/appsignal/extension/jruby.rb +1 -1
  18. data/lib/appsignal/helpers/instrumentation.rb +164 -2
  19. data/lib/appsignal/hooks/active_job.rb +1 -6
  20. data/lib/appsignal/integrations/grape.rb +19 -47
  21. data/lib/appsignal/integrations/hanami.rb +8 -7
  22. data/lib/appsignal/integrations/padrino.rb +51 -52
  23. data/lib/appsignal/integrations/railtie.rb +0 -3
  24. data/lib/appsignal/integrations/rake.rb +46 -12
  25. data/lib/appsignal/integrations/sidekiq.rb +1 -11
  26. data/lib/appsignal/integrations/sinatra.rb +0 -1
  27. data/lib/appsignal/integrations/webmachine.rb +15 -9
  28. data/lib/appsignal/probes/gvl.rb +24 -2
  29. data/lib/appsignal/probes/sidekiq.rb +1 -1
  30. data/lib/appsignal/probes.rb +1 -1
  31. data/lib/appsignal/rack/abstract_middleware.rb +104 -33
  32. data/lib/appsignal/rack/body_wrapper.rb +143 -0
  33. data/lib/appsignal/rack/event_handler.rb +12 -3
  34. data/lib/appsignal/rack/generic_instrumentation.rb +5 -4
  35. data/lib/appsignal/rack/grape_middleware.rb +40 -0
  36. data/lib/appsignal/rack/hanami_middleware.rb +2 -12
  37. data/lib/appsignal/rack/instrumentation_middleware.rb +62 -0
  38. data/lib/appsignal/rack/rails_instrumentation.rb +14 -57
  39. data/lib/appsignal/rack/sinatra_instrumentation.rb +1 -3
  40. data/lib/appsignal/rack/streaming_listener.rb +13 -59
  41. data/lib/appsignal/rack.rb +31 -0
  42. data/lib/appsignal/transaction.rb +50 -8
  43. data/lib/appsignal/utils/integration_memory_logger.rb +78 -0
  44. data/lib/appsignal/utils.rb +1 -0
  45. data/lib/appsignal/version.rb +1 -1
  46. data/lib/appsignal.rb +36 -33
  47. data/spec/.rubocop.yml +1 -1
  48. data/spec/lib/appsignal/cli/diagnose_spec.rb +1 -1
  49. data/spec/lib/appsignal/cli/install_spec.rb +3 -3
  50. data/spec/lib/appsignal/config_spec.rb +8 -5
  51. data/spec/lib/appsignal/demo_spec.rb +38 -41
  52. data/spec/lib/appsignal/hooks/action_cable_spec.rb +86 -167
  53. data/spec/lib/appsignal/hooks/active_support_notifications/finish_with_state_shared_examples.rb +8 -20
  54. data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +38 -84
  55. data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +16 -37
  56. data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +4 -4
  57. data/spec/lib/appsignal/hooks/activejob_spec.rb +111 -200
  58. data/spec/lib/appsignal/hooks/delayed_job_spec.rb +54 -91
  59. data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +14 -32
  60. data/spec/lib/appsignal/hooks/excon_spec.rb +8 -12
  61. data/spec/lib/appsignal/hooks/net_http_spec.rb +7 -42
  62. data/spec/lib/appsignal/hooks/rake_spec.rb +107 -34
  63. data/spec/lib/appsignal/hooks/redis_client_spec.rb +18 -30
  64. data/spec/lib/appsignal/hooks/redis_spec.rb +10 -16
  65. data/spec/lib/appsignal/hooks/resque_spec.rb +42 -62
  66. data/spec/lib/appsignal/hooks/shoryuken_spec.rb +33 -74
  67. data/spec/lib/appsignal/integrations/hanami_spec.rb +79 -21
  68. data/spec/lib/appsignal/integrations/http_spec.rb +12 -20
  69. data/spec/lib/appsignal/integrations/net_http_spec.rb +33 -0
  70. data/spec/lib/appsignal/integrations/object_spec.rb +29 -36
  71. data/spec/lib/appsignal/integrations/padrino_spec.rb +190 -163
  72. data/spec/lib/appsignal/integrations/que_spec.rb +43 -70
  73. data/spec/lib/appsignal/integrations/railtie_spec.rb +26 -67
  74. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +86 -160
  75. data/spec/lib/appsignal/integrations/sinatra_spec.rb +10 -3
  76. data/spec/lib/appsignal/integrations/webmachine_spec.rb +77 -40
  77. data/spec/lib/appsignal/probes/gvl_spec.rb +80 -3
  78. data/spec/lib/appsignal/probes_spec.rb +7 -4
  79. data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +302 -105
  80. data/spec/lib/appsignal/rack/body_wrapper_spec.rb +263 -0
  81. data/spec/lib/appsignal/rack/event_handler_spec.rb +81 -78
  82. data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +70 -27
  83. data/spec/lib/appsignal/rack/grape_middleware_spec.rb +234 -0
  84. data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +2 -16
  85. data/spec/lib/appsignal/rack/instrumentation_middleware_spec.rb +38 -0
  86. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +67 -131
  87. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +36 -44
  88. data/spec/lib/appsignal/rack/streaming_listener_spec.rb +44 -139
  89. data/spec/lib/appsignal/transaction_spec.rb +239 -94
  90. data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +163 -0
  91. data/spec/lib/appsignal_spec.rb +556 -344
  92. data/spec/support/helpers/dependency_helper.rb +6 -1
  93. data/spec/support/helpers/std_streams_helper.rb +1 -1
  94. data/spec/support/helpers/transaction_helpers.rb +8 -0
  95. data/spec/support/matchers/transaction.rb +185 -0
  96. data/spec/support/mocks/dummy_app.rb +20 -0
  97. data/spec/support/shared_examples/instrument.rb +17 -12
  98. data/spec/support/testing.rb +18 -9
  99. metadata +20 -11
  100. data/.semaphore/semaphore.yml +0 -2347
  101. data/script/lint_git +0 -22
  102. data/spec/lib/appsignal/integrations/grape_spec.rb +0 -239
  103. data/spec/support/matchers/be_completed.rb +0 -5
  104. data/support/check_versions +0 -22
  105. /data/gemfiles/{hanami.gemfile → hanami-2.0.gemfile} +0 -0
@@ -40,10 +40,8 @@ describe Appsignal::Transaction do
40
40
  expect(transaction.namespace).to eq namespace
41
41
  expect(transaction.request).to eq request
42
42
 
43
- expect(transaction.to_h).to include(
44
- "id" => transaction_id,
45
- "namespace" => namespace
46
- )
43
+ expect(transaction).to have_id(transaction_id)
44
+ expect(transaction).to have_namespace(namespace)
47
45
  end
48
46
 
49
47
  it "assigns the transaction to current" do
@@ -85,10 +83,6 @@ describe Appsignal::Transaction do
85
83
  end
86
84
 
87
85
  describe ".current" do
88
- def current_transaction
89
- Appsignal::Transaction.current
90
- end
91
-
92
86
  context "when there is a current transaction" do
93
87
  let!(:transaction) do
94
88
  Appsignal::Transaction.create(transaction_id, namespace, request, options)
@@ -166,9 +160,7 @@ describe Appsignal::Transaction do
166
160
  it "samples data" do
167
161
  transaction.set_tags(:foo => "bar")
168
162
  keep_transactions { transaction.complete }
169
- expect(transaction.to_h["sample_data"]).to include(
170
- "tags" => { "foo" => "bar" }
171
- )
163
+ expect(transaction).to include_tags("foo" => "bar")
172
164
  end
173
165
  end
174
166
 
@@ -181,13 +173,13 @@ describe Appsignal::Transaction do
181
173
 
182
174
  context "when a transaction is marked as discarded" do
183
175
  it "does not complete the transaction" do
184
- expect(transaction.ext).to_not receive(:complete)
185
-
186
176
  expect do
187
177
  transaction.discard!
188
178
  end.to change { transaction.discarded? }.from(false).to(true)
189
179
 
190
180
  transaction.complete
181
+
182
+ expect(transaction).to_not be_completed
191
183
  end
192
184
 
193
185
  it "logs a debug message" do
@@ -202,13 +194,13 @@ describe Appsignal::Transaction do
202
194
  before { transaction.discard! }
203
195
 
204
196
  it "completes the transaction" do
205
- expect(transaction.ext).to receive(:complete).and_call_original
206
-
207
197
  expect do
208
198
  transaction.restore!
209
199
  end.to change { transaction.discarded? }.from(true).to(false)
210
200
 
211
201
  transaction.complete
202
+
203
+ expect(transaction).to be_completed
212
204
  end
213
205
  end
214
206
  end
@@ -334,6 +326,16 @@ describe Appsignal::Transaction do
334
326
  it "returns custom parameters" do
335
327
  expect(subject).to eq(:foo => "bar")
336
328
  end
329
+
330
+ context "when params is a callable object" do
331
+ it "calls the params object and sets the return value as parametesr" do
332
+ transaction.set_params { { "param1" => "value1" } }
333
+
334
+ expect(transaction.params).to eq(
335
+ "param1" => "value1"
336
+ )
337
+ end
338
+ end
337
339
  end
338
340
 
339
341
  context "without custom params set on transaction" do
@@ -354,9 +356,9 @@ describe Appsignal::Transaction do
354
356
  params = { "foo" => "bar" }
355
357
  silence { transaction.params = params }
356
358
 
357
- transaction.complete # Sample the data
359
+ transaction._sample
358
360
  expect(transaction.params).to eq(params)
359
- expect(transaction.to_h.dig("sample_data", "params")).to eq(params)
361
+ expect(transaction).to include_params(params)
360
362
  end
361
363
 
362
364
  it "logs a deprecation warning" do
@@ -378,9 +380,28 @@ describe Appsignal::Transaction do
378
380
  params = { "key" => "value" }
379
381
  transaction.set_params(params)
380
382
 
381
- transaction.complete # Sample the data
383
+ transaction._sample
382
384
  expect(transaction.params).to eq(params)
383
- expect(transaction.to_h.dig("sample_data", "params")).to eq(params)
385
+ expect(transaction).to include_params(params)
386
+ end
387
+
388
+ it "updates the params on the transaction with a block" do
389
+ params = { "key" => "value" }
390
+ transaction.set_params { params }
391
+
392
+ transaction._sample
393
+ expect(transaction.params).to eq(params)
394
+ expect(transaction).to include_params(params)
395
+ end
396
+
397
+ it "updates with the params argument when both an argument and block are given" do
398
+ arg_params = { "argument" => "value" }
399
+ block_params = { "block" => "value" }
400
+ transaction.set_params(arg_params) { block_params }
401
+
402
+ transaction._sample
403
+ expect(transaction.params).to eq(arg_params)
404
+ expect(transaction).to include_params(arg_params)
384
405
  end
385
406
  end
386
407
 
@@ -390,9 +411,9 @@ describe Appsignal::Transaction do
390
411
  transaction.set_params(params)
391
412
  transaction.set_params(nil)
392
413
 
393
- transaction.complete # Sample the data
414
+ transaction._sample
394
415
  expect(transaction.params).to eq(params)
395
- expect(transaction.to_h.dig("sample_data", "params")).to eq(params)
416
+ expect(transaction).to include_params(params)
396
417
  end
397
418
  end
398
419
  end
@@ -405,9 +426,28 @@ describe Appsignal::Transaction do
405
426
  params = { "key" => "value" }
406
427
  transaction.set_params_if_nil(params)
407
428
 
408
- transaction.complete # Sample the data
429
+ transaction._sample
409
430
  expect(transaction.params).to eq(params)
410
- expect(transaction.to_h.dig("sample_data", "params")).to eq(params)
431
+ expect(transaction).to include_params(params)
432
+ end
433
+
434
+ it "updates the params on the transaction with a block" do
435
+ params = { "key" => "value" }
436
+ transaction.set_params_if_nil { params }
437
+
438
+ transaction._sample
439
+ expect(transaction.params).to eq(params)
440
+ expect(transaction).to include_params(params)
441
+ end
442
+
443
+ it "updates with the params argument when both an argument and block are given" do
444
+ arg_params = { "argument" => "value" }
445
+ block_params = { "block" => "value" }
446
+ transaction.set_params_if_nil(arg_params) { block_params }
447
+
448
+ transaction._sample
449
+ expect(transaction.params).to eq(arg_params)
450
+ expect(transaction).to include_params(arg_params)
411
451
  end
412
452
 
413
453
  context "when the given params is nil" do
@@ -416,9 +456,9 @@ describe Appsignal::Transaction do
416
456
  transaction.set_params(params)
417
457
  transaction.set_params_if_nil(nil)
418
458
 
419
- transaction.complete # Sample the data
459
+ transaction._sample
420
460
  expect(transaction.params).to eq(params)
421
- expect(transaction.to_h.dig("sample_data", "params")).to eq(params)
461
+ expect(transaction).to include_params(params)
422
462
  end
423
463
  end
424
464
  end
@@ -430,16 +470,28 @@ describe Appsignal::Transaction do
430
470
  transaction.set_params(preset_params)
431
471
  transaction.set_params_if_nil(params)
432
472
 
433
- transaction.complete # Sample the data
473
+ transaction._sample
434
474
  expect(transaction.params).to eq(preset_params)
435
- expect(transaction.to_h.dig("sample_data", "params")).to eq(preset_params)
475
+ expect(transaction).to include_params(preset_params)
476
+ end
477
+
478
+ it "does not update the params with a block on the transaction" do
479
+ preset_params = { "other" => "params" }
480
+ params = { "key" => "value" }
481
+ transaction.set_params(preset_params)
482
+ transaction.set_params_if_nil { params }
483
+
484
+ transaction._sample
485
+ expect(transaction.params).to eq(preset_params)
486
+ expect(transaction).to include_params(preset_params)
436
487
  end
437
488
  end
438
489
  end
439
490
 
440
491
  describe "#set_tags" do
441
492
  let(:long_string) { "a" * 10_001 }
442
- before do
493
+
494
+ it "stores tags on the transaction" do
443
495
  transaction.set_tags(
444
496
  :valid_key => "valid_value",
445
497
  "valid_string_key" => "valid_value",
@@ -451,11 +503,9 @@ describe Appsignal::Transaction do
451
503
  :too_long_value => long_string,
452
504
  long_string => "too_long_key"
453
505
  )
454
- transaction.sample_data
455
- end
506
+ transaction._sample
456
507
 
457
- it "stores tags on the transaction" do
458
- expect(transaction.to_h["sample_data"]["tags"]).to eq(
508
+ expect(transaction).to include_tags(
459
509
  "valid_key" => "valid_value",
460
510
  "valid_string_key" => "valid_value",
461
511
  "both_symbols" => "valid_value",
@@ -464,6 +514,96 @@ describe Appsignal::Transaction do
464
514
  long_string => "too_long_key"
465
515
  )
466
516
  end
517
+
518
+ it "merges the tags when called multiple times" do
519
+ transaction.set_tags(:key1 => "value1")
520
+ transaction.set_tags(:key2 => "value2")
521
+ transaction._sample
522
+
523
+ expect(transaction).to include_tags(
524
+ "key1" => "value1",
525
+ "key2" => "value2"
526
+ )
527
+ end
528
+ end
529
+
530
+ describe "#set_custom_data" do
531
+ let(:log_stream) { std_stream }
532
+ let(:logs) { log_contents(log_stream) }
533
+ around { |example| use_logger_with(log_stream) { example.run } }
534
+
535
+ it "stores custom Hash data on the transaction" do
536
+ transaction.set_custom_data(
537
+ :user => {
538
+ :id => 123,
539
+ :locale => "abc"
540
+ },
541
+ :organization => {
542
+ :slug => "appsignal",
543
+ :plan => "enterprise"
544
+ }
545
+ )
546
+
547
+ transaction._sample
548
+ expect(transaction).to include_custom_data(
549
+ "user" => {
550
+ "id" => 123,
551
+ "locale" => "abc"
552
+ },
553
+ "organization" => {
554
+ "slug" => "appsignal",
555
+ "plan" => "enterprise"
556
+ }
557
+ )
558
+ end
559
+
560
+ it "stores custom Array data on the transaction" do
561
+ transaction.set_custom_data([
562
+ [123, "abc"],
563
+ ["appsignal", "enterprise"]
564
+ ])
565
+
566
+ transaction._sample
567
+ expect(transaction).to include_custom_data([
568
+ [123, "abc"],
569
+ ["appsignal", "enterprise"]
570
+ ])
571
+ end
572
+
573
+ it "does not store non Hash or Array custom data" do
574
+ transaction.set_custom_data("abc")
575
+ transaction._sample
576
+ expect(transaction).to_not include_custom_data
577
+
578
+ transaction.set_custom_data(123)
579
+ transaction._sample
580
+ expect(transaction).to_not include_custom_data
581
+
582
+ transaction.set_custom_data(Object.new)
583
+ transaction._sample
584
+ expect(transaction).to_not include_custom_data
585
+
586
+ expect(logs).to contains_log(
587
+ :error,
588
+ "set_custom_data: Unsupported data type String received."
589
+ )
590
+ expect(logs).to contains_log(
591
+ :error,
592
+ "set_custom_data: Unsupported data type Integer received."
593
+ )
594
+ expect(logs).to contains_log(
595
+ :error,
596
+ "set_custom_data: Unsupported data type String received."
597
+ )
598
+ end
599
+
600
+ it "overwrites the custom data if called multiple times" do
601
+ transaction.set_custom_data("user" => { "id" => 123 })
602
+ transaction.set_custom_data("user" => { "id" => 456 })
603
+
604
+ transaction._sample
605
+ expect(transaction).to include_custom_data("user" => { "id" => 456 })
606
+ end
467
607
  end
468
608
 
469
609
  describe "#add_breadcrumb" do
@@ -507,12 +647,13 @@ describe Appsignal::Transaction do
507
647
  transaction.sample_data
508
648
  timeframe_end = Time.now.utc.to_i
509
649
 
510
- breadcrumb = transaction.to_h["sample_data"]["breadcrumbs"][0]
511
- expect(breadcrumb["category"]).to eq("user_action")
512
- expect(breadcrumb["action"]).to eq("clicked HOME")
513
- expect(breadcrumb["message"]).to eq("")
514
- expect(breadcrumb["time"]).to be_between(timeframe_start, timeframe_end)
515
- expect(breadcrumb["metadata"]).to eq({})
650
+ expect(transaction).to include_breadcrumb(
651
+ "clicked HOME",
652
+ "user_action",
653
+ "",
654
+ {},
655
+ be_between(timeframe_start, timeframe_end)
656
+ )
516
657
  end
517
658
  end
518
659
 
@@ -521,7 +662,7 @@ describe Appsignal::Transaction do
521
662
  transaction.add_breadcrumb("category", "action", "message", "invalid metadata")
522
663
  transaction.sample_data
523
664
 
524
- expect(transaction.to_h["sample_data"]["breadcrumbs"]).to be_empty
665
+ expect(transaction).to_not include_breadcrumbs
525
666
  expect(log_contents(log)).to contains_log(
526
667
  :error,
527
668
  "add_breadcrumb: Cannot add breadcrumb. The given metadata argument is not a Hash."
@@ -537,7 +678,7 @@ describe Appsignal::Transaction do
537
678
  transaction.set_action(action_name)
538
679
 
539
680
  expect(transaction.action).to eq(action_name)
540
- expect(transaction.to_h["action"]).to eq(action_name)
681
+ expect(transaction).to have_action(action_name)
541
682
  end
542
683
  end
543
684
 
@@ -548,7 +689,7 @@ describe Appsignal::Transaction do
548
689
  transaction.set_action(nil)
549
690
 
550
691
  expect(transaction.action).to eq(action_name)
551
- expect(transaction.to_h["action"]).to eq(action_name)
692
+ expect(transaction).to have_action(action_name)
552
693
  end
553
694
  end
554
695
  end
@@ -557,13 +698,13 @@ describe Appsignal::Transaction do
557
698
  context "when the action is not set" do
558
699
  it "updates the action name on the transaction" do
559
700
  expect(transaction.action).to eq(nil)
560
- expect(transaction.to_h["action"]).to eq(nil)
701
+ expect(transaction).to_not have_action
561
702
 
562
703
  action_name = "PagesController#show"
563
704
  transaction.set_action_if_nil(action_name)
564
705
 
565
706
  expect(transaction.action).to eq(action_name)
566
- expect(transaction.to_h["action"]).to eq(action_name)
707
+ expect(transaction).to have_action(action_name)
567
708
  end
568
709
 
569
710
  context "when the given action is nil" do
@@ -573,7 +714,7 @@ describe Appsignal::Transaction do
573
714
  transaction.set_action_if_nil(nil)
574
715
 
575
716
  expect(transaction.action).to eq(action_name)
576
- expect(transaction.to_h["action"]).to eq(action_name)
717
+ expect(transaction).to have_action(action_name)
577
718
  end
578
719
  end
579
720
  end
@@ -585,7 +726,7 @@ describe Appsignal::Transaction do
585
726
  transaction.set_action_if_nil("something else")
586
727
 
587
728
  expect(transaction.action).to eq(action_name)
588
- expect(transaction.to_h["action"]).to eq(action_name)
729
+ expect(transaction).to have_action(action_name)
589
730
  end
590
731
  end
591
732
  end
@@ -597,7 +738,7 @@ describe Appsignal::Transaction do
597
738
  transaction.set_namespace(namespace)
598
739
 
599
740
  expect(transaction.namespace).to eq namespace
600
- expect(transaction.to_h["namespace"]).to eq(namespace)
741
+ expect(transaction).to have_namespace(namespace)
601
742
  end
602
743
  end
603
744
 
@@ -608,7 +749,7 @@ describe Appsignal::Transaction do
608
749
  transaction.set_namespace(nil)
609
750
 
610
751
  expect(transaction.namespace).to eq(namespace)
611
- expect(transaction.to_h["namespace"]).to eq(namespace)
752
+ expect(transaction).to have_namespace(namespace)
612
753
  end
613
754
  end
614
755
  end
@@ -620,21 +761,21 @@ describe Appsignal::Transaction do
620
761
  :controller => "HomeController",
621
762
  :action => "show"
622
763
  )
623
- expect(transaction.to_h["action"]).to eql("HomeController#show")
764
+ expect(transaction).to have_action("HomeController#show")
624
765
  end
625
766
  end
626
767
 
627
768
  context "for a hash with just action" do
628
769
  it "sets the action" do
629
770
  transaction.set_http_or_background_action(:action => "show")
630
- expect(transaction.to_h["action"]).to eql("show")
771
+ expect(transaction).to have_action("show")
631
772
  end
632
773
  end
633
774
 
634
775
  context "for a hash with class and method" do
635
776
  it "sets the action" do
636
777
  transaction.set_http_or_background_action(:class => "Worker", :method => "perform")
637
- expect(transaction.to_h["action"]).to eql("Worker#perform")
778
+ expect(transaction).to have_action("Worker#perform")
638
779
  end
639
780
  end
640
781
 
@@ -642,7 +783,7 @@ describe Appsignal::Transaction do
642
783
  it "does not overwrite the set action" do
643
784
  transaction.set_action("MyCustomAction#perform")
644
785
  transaction.set_http_or_background_action(:class => "Worker", :method => "perform")
645
- expect(transaction.to_h["action"]).to eql("MyCustomAction#perform")
786
+ expect(transaction).to have_action("MyCustomAction#perform")
646
787
  end
647
788
  end
648
789
  end
@@ -665,9 +806,7 @@ describe Appsignal::Transaction do
665
806
 
666
807
  expect(Appsignal.internal_logger).to receive(:warn).with("Queue start value 10 is too big")
667
808
 
668
- expect do
669
- transaction.set_queue_start(10)
670
- end.to_not raise_error
809
+ transaction.set_queue_start(10)
671
810
  end
672
811
  end
673
812
 
@@ -716,7 +855,7 @@ describe Appsignal::Transaction do
716
855
  it "updates the metadata on the transaction" do
717
856
  transaction.set_metadata("request_method", "GET")
718
857
 
719
- expect(transaction.to_h["metadata"]).to eq("request_method" => "GET")
858
+ expect(transaction).to include_metadata("request_method" => "GET")
720
859
  end
721
860
 
722
861
  context "when filter_metadata includes metadata key" do
@@ -727,7 +866,7 @@ describe Appsignal::Transaction do
727
866
  transaction.set_metadata(:filter_key, "filtered value")
728
867
  transaction.set_metadata("filter_key", "filtered value")
729
868
 
730
- expect(transaction.to_h["metadata"].keys).to_not include("filter_key")
869
+ expect(transaction).to_not include_metadata("filter_key" => anything)
731
870
  end
732
871
  end
733
872
 
@@ -735,7 +874,7 @@ describe Appsignal::Transaction do
735
874
  it "does not update the metadata on the transaction" do
736
875
  transaction.set_metadata(nil, "GET")
737
876
 
738
- expect(transaction.to_h["metadata"]).to eq({})
877
+ expect(transaction).to_not include_metadata
739
878
  end
740
879
  end
741
880
 
@@ -743,7 +882,7 @@ describe Appsignal::Transaction do
743
882
  it "does not update the metadata on the transaction" do
744
883
  transaction.set_metadata("request_method", nil)
745
884
 
746
- expect(transaction.to_h["metadata"]).to eq({})
885
+ expect(transaction).to_not include_metadata
747
886
  end
748
887
  end
749
888
  end
@@ -757,12 +896,10 @@ describe Appsignal::Transaction do
757
896
  :id => "1"
758
897
  )
759
898
 
760
- expect(transaction.to_h["sample_data"]).to eq(
761
- "params" => {
762
- "action" => "show",
763
- "controller" => "blog_posts",
764
- "id" => "1"
765
- }
899
+ expect(transaction).to include_params(
900
+ "action" => "show",
901
+ "controller" => "blog_posts",
902
+ "id" => "1"
766
903
  )
767
904
  end
768
905
 
@@ -785,7 +922,7 @@ describe Appsignal::Transaction do
785
922
  end
786
923
  transaction.set_sample_data("params", klass.new => 1)
787
924
 
788
- expect(transaction.to_h["sample_data"]).to eq({})
925
+ expect(transaction).to_not include_params
789
926
  expect(log_contents(log)).to contains_log :error,
790
927
  "Error generating data (RuntimeError: foo) for"
791
928
  end
@@ -800,29 +937,39 @@ describe Appsignal::Transaction do
800
937
  transaction.add_breadcrumb "category", "action", "message", "key" => "value"
801
938
  transaction.sample_data
802
939
 
803
- sample_data = transaction.to_h["sample_data"]
804
- expect(sample_data["environment"]).to include(
940
+ expect(transaction).to include_environment(
805
941
  "REQUEST_METHOD" => "GET",
806
942
  "SERVER_NAME" => "example.org",
807
943
  "SERVER_PORT" => "80",
808
944
  "PATH_INFO" => "/blog"
809
945
  )
810
- expect(sample_data["session_data"]).to eq("session" => "value")
811
- expect(sample_data["params"]).to eq(
946
+ expect(transaction).to include_session_data("session" => "value")
947
+ expect(transaction).to include_params(
812
948
  "controller" => "blog_posts",
813
949
  "action" => "show",
814
950
  "id" => "1"
815
951
  )
816
- expect(sample_data["metadata"]).to eq("key" => "value")
817
- expect(sample_data["tags"]).to eq("tag" => "value")
818
- expect(sample_data["breadcrumbs"]).to contain_exactly(
819
- "action" => "action",
820
- "category" => "category",
821
- "message" => "message",
822
- "metadata" => { "key" => "value" },
823
- "time" => kind_of(Integer)
952
+ expect(transaction).to include_sample_metadata("key" => "value")
953
+ expect(transaction).to include_tags("tag" => "value")
954
+ expect(transaction).to include_breadcrumb(
955
+ "action",
956
+ "category",
957
+ "message",
958
+ { "key" => "value" },
959
+ kind_of(Integer)
824
960
  )
825
961
  end
962
+
963
+ context "when params is a callable object" do
964
+ it "calls the params object and sets the return value as parametesr" do
965
+ transaction.set_params { { "param1" => "value1" } }
966
+
967
+ transaction.sample_data
968
+ expect(transaction).to include_params(
969
+ "param1" => "value1"
970
+ )
971
+ end
972
+ end
826
973
  end
827
974
 
828
975
  describe "#set_error" do
@@ -972,7 +1119,7 @@ describe Appsignal::Transaction do
972
1119
  end
973
1120
 
974
1121
  it "should not raise an error" do
975
- expect { transaction.set_error(error) }.to_not raise_error
1122
+ transaction.set_error(error)
976
1123
  end
977
1124
 
978
1125
  it "should set an error in the extension" do
@@ -1613,22 +1760,20 @@ describe Appsignal::Transaction do
1613
1760
  subject { Appsignal::Transaction::NilTransaction.new }
1614
1761
 
1615
1762
  it "should have method stubs" do
1616
- expect do
1617
- subject.complete
1618
- subject.pause!
1619
- subject.resume!
1620
- subject.paused?
1621
- subject.store(:key)
1622
- subject.set_tags(:tag => 1)
1623
- subject.set_action("action")
1624
- subject.set_http_or_background_action
1625
- subject.set_queue_start(1)
1626
- subject.set_http_or_background_queue_start
1627
- subject.set_metadata("key", "value")
1628
- subject.set_sample_data("key", "data")
1629
- subject.sample_data
1630
- subject.set_error("a")
1631
- end.to_not raise_error
1763
+ subject.complete
1764
+ subject.pause!
1765
+ subject.resume!
1766
+ subject.paused?
1767
+ subject.store(:key)
1768
+ subject.set_tags(:tag => 1)
1769
+ subject.set_action("action")
1770
+ subject.set_http_or_background_action
1771
+ subject.set_queue_start(1)
1772
+ subject.set_http_or_background_queue_start
1773
+ subject.set_metadata("key", "value")
1774
+ subject.set_sample_data("key", "data")
1775
+ subject.sample_data
1776
+ subject.set_error("a")
1632
1777
  end
1633
1778
  end
1634
1779
  end