appsignal 2.11.1 → 2.11.2

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
  SHA256:
3
- metadata.gz: 2e4d082500efd101198339616a3f7fc05170684bb6020864bda78c34121a96ff
4
- data.tar.gz: 467372cf2a4f5f0be4353a6cba168b8fad3c25b242902b4b79c949f4b9692fbc
3
+ metadata.gz: 2207fe155b6aec1d0fa6e271f8257e5006db693f3d30d45da0f522185b5498a6
4
+ data.tar.gz: 42f76f14cf36b7309ade272924f9137e763f0ca56446189d97ea83b8f95a12f6
5
5
  SHA512:
6
- metadata.gz: 52206e43698413eea911c3ef8c72aba46d50718abbe5f435d66d2bc235b97cbe6899e35c639bc205c0f228a8dbd52fed48493748123be3107eace29873ddd615
7
- data.tar.gz: a8eaa5c959545cc26bdc63e0d55619c906bc6496514a229febcebb606a40c552e8a981163ff532610133a17533ddca6bff3e701baa8e935a9e28df874097faca
6
+ metadata.gz: af7b2665f84a0ef9dc8fb7806e0095b00f48aa6273a5e5d5a75bf3c59e0910123fb50fd0380b16d6b154bf0a6c0ec8a1b42ce990b02511eaa648372a1178ac1d
7
+ data.tar.gz: cdbc11ff5c3e7e3b756a8e3ad4dcb1483d7e6772346e652b042e7b3e08e00130d39c2160ea7ef5e47c44f1c8818a678d0393828bf9730f456bab401393754ad0
@@ -31,6 +31,7 @@ global_job_config:
31
31
  prologue:
32
32
  commands:
33
33
  - checkout
34
+ - git -C /home/semaphore/.rbenv/plugins/ruby-build pull
34
35
  - sem-version ruby $RUBY_VERSION
35
36
  - "./support/check_versions"
36
37
  - cache restore $_BUNDLER_CACHE-bundler-$RUBY_VERSION-$GEMSET-$(checksum $BUNDLE_GEMFILE)
@@ -992,6 +993,202 @@ blocks:
992
993
  commands:
993
994
  - "./support/bundler_wrapper exec rake test"
994
995
  - "./support/bundler_wrapper exec rake test:failure"
996
+ - name: Ruby 3.0.0
997
+ dependencies:
998
+ - Validation
999
+ task:
1000
+ prologue:
1001
+ commands:
1002
+ - "./support/bundler_wrapper exec rake extension:install"
1003
+ jobs:
1004
+ - name: Ruby 3.0.0 for no_dependencies
1005
+ env_vars:
1006
+ - name: RUBY_VERSION
1007
+ value: 3.0.0
1008
+ - name: GEMSET
1009
+ value: no_dependencies
1010
+ - name: BUNDLE_GEMFILE
1011
+ value: gemfiles/no_dependencies.gemfile
1012
+ - name: _RUBYGEMS_VERSION
1013
+ value: latest
1014
+ - name: _BUNDLER_VERSION
1015
+ value: latest
1016
+ commands:
1017
+ - "./support/bundler_wrapper exec rake test"
1018
+ - "./support/bundler_wrapper exec rake test:failure"
1019
+ - name: Ruby 3.0.0 - Gems
1020
+ dependencies:
1021
+ - Ruby 3.0.0
1022
+ task:
1023
+ prologue:
1024
+ commands:
1025
+ - "./support/bundler_wrapper exec rake extension:install"
1026
+ jobs:
1027
+ - name: Ruby 3.0.0 for capistrano2
1028
+ env_vars:
1029
+ - name: RUBY_VERSION
1030
+ value: 3.0.0
1031
+ - name: GEMSET
1032
+ value: capistrano2
1033
+ - name: BUNDLE_GEMFILE
1034
+ value: gemfiles/capistrano2.gemfile
1035
+ - name: _RUBYGEMS_VERSION
1036
+ value: latest
1037
+ - name: _BUNDLER_VERSION
1038
+ value: latest
1039
+ commands:
1040
+ - "./support/bundler_wrapper exec rake test"
1041
+ - "./support/bundler_wrapper exec rake test:failure"
1042
+ - name: Ruby 3.0.0 for capistrano3
1043
+ env_vars:
1044
+ - name: RUBY_VERSION
1045
+ value: 3.0.0
1046
+ - name: GEMSET
1047
+ value: capistrano3
1048
+ - name: BUNDLE_GEMFILE
1049
+ value: gemfiles/capistrano3.gemfile
1050
+ - name: _RUBYGEMS_VERSION
1051
+ value: latest
1052
+ - name: _BUNDLER_VERSION
1053
+ value: latest
1054
+ commands:
1055
+ - "./support/bundler_wrapper exec rake test"
1056
+ - "./support/bundler_wrapper exec rake test:failure"
1057
+ - name: Ruby 3.0.0 for grape
1058
+ env_vars:
1059
+ - name: RUBY_VERSION
1060
+ value: 3.0.0
1061
+ - name: GEMSET
1062
+ value: grape
1063
+ - name: BUNDLE_GEMFILE
1064
+ value: gemfiles/grape.gemfile
1065
+ - name: _RUBYGEMS_VERSION
1066
+ value: latest
1067
+ - name: _BUNDLER_VERSION
1068
+ value: latest
1069
+ commands:
1070
+ - "./support/bundler_wrapper exec rake test"
1071
+ - "./support/bundler_wrapper exec rake test:failure"
1072
+ - name: Ruby 3.0.0 for padrino
1073
+ env_vars:
1074
+ - name: RUBY_VERSION
1075
+ value: 3.0.0
1076
+ - name: GEMSET
1077
+ value: padrino
1078
+ - name: BUNDLE_GEMFILE
1079
+ value: gemfiles/padrino.gemfile
1080
+ - name: _RUBYGEMS_VERSION
1081
+ value: latest
1082
+ - name: _BUNDLER_VERSION
1083
+ value: latest
1084
+ commands:
1085
+ - "./support/bundler_wrapper exec rake test"
1086
+ - "./support/bundler_wrapper exec rake test:failure"
1087
+ - name: Ruby 3.0.0 for que
1088
+ env_vars:
1089
+ - name: RUBY_VERSION
1090
+ value: 3.0.0
1091
+ - name: GEMSET
1092
+ value: que
1093
+ - name: BUNDLE_GEMFILE
1094
+ value: gemfiles/que.gemfile
1095
+ - name: _RUBYGEMS_VERSION
1096
+ value: latest
1097
+ - name: _BUNDLER_VERSION
1098
+ value: latest
1099
+ commands:
1100
+ - "./support/bundler_wrapper exec rake test"
1101
+ - "./support/bundler_wrapper exec rake test:failure"
1102
+ - name: Ruby 3.0.0 for que_beta
1103
+ env_vars:
1104
+ - name: RUBY_VERSION
1105
+ value: 3.0.0
1106
+ - name: GEMSET
1107
+ value: que_beta
1108
+ - name: BUNDLE_GEMFILE
1109
+ value: gemfiles/que_beta.gemfile
1110
+ - name: _RUBYGEMS_VERSION
1111
+ value: latest
1112
+ - name: _BUNDLER_VERSION
1113
+ value: latest
1114
+ commands:
1115
+ - "./support/bundler_wrapper exec rake test"
1116
+ - "./support/bundler_wrapper exec rake test:failure"
1117
+ - name: Ruby 3.0.0 for rails-6.0
1118
+ env_vars:
1119
+ - name: RUBY_VERSION
1120
+ value: 3.0.0
1121
+ - name: GEMSET
1122
+ value: rails-6.0
1123
+ - name: BUNDLE_GEMFILE
1124
+ value: gemfiles/rails-6.0.gemfile
1125
+ - name: _RUBYGEMS_VERSION
1126
+ value: latest
1127
+ - name: _BUNDLER_VERSION
1128
+ value: latest
1129
+ commands:
1130
+ - "./support/bundler_wrapper exec rake test"
1131
+ - "./support/bundler_wrapper exec rake test:failure"
1132
+ - name: Ruby 3.0.0 for resque-2
1133
+ env_vars:
1134
+ - name: RUBY_VERSION
1135
+ value: 3.0.0
1136
+ - name: GEMSET
1137
+ value: resque-2
1138
+ - name: BUNDLE_GEMFILE
1139
+ value: gemfiles/resque-2.gemfile
1140
+ - name: _RUBYGEMS_VERSION
1141
+ value: latest
1142
+ - name: _BUNDLER_VERSION
1143
+ value: latest
1144
+ commands:
1145
+ - "./support/bundler_wrapper exec rake test"
1146
+ - "./support/bundler_wrapper exec rake test:failure"
1147
+ - name: Ruby 3.0.0 for sequel
1148
+ env_vars:
1149
+ - name: RUBY_VERSION
1150
+ value: 3.0.0
1151
+ - name: GEMSET
1152
+ value: sequel
1153
+ - name: BUNDLE_GEMFILE
1154
+ value: gemfiles/sequel.gemfile
1155
+ - name: _RUBYGEMS_VERSION
1156
+ value: latest
1157
+ - name: _BUNDLER_VERSION
1158
+ value: latest
1159
+ commands:
1160
+ - "./support/bundler_wrapper exec rake test"
1161
+ - "./support/bundler_wrapper exec rake test:failure"
1162
+ - name: Ruby 3.0.0 for sinatra
1163
+ env_vars:
1164
+ - name: RUBY_VERSION
1165
+ value: 3.0.0
1166
+ - name: GEMSET
1167
+ value: sinatra
1168
+ - name: BUNDLE_GEMFILE
1169
+ value: gemfiles/sinatra.gemfile
1170
+ - name: _RUBYGEMS_VERSION
1171
+ value: latest
1172
+ - name: _BUNDLER_VERSION
1173
+ value: latest
1174
+ commands:
1175
+ - "./support/bundler_wrapper exec rake test"
1176
+ - "./support/bundler_wrapper exec rake test:failure"
1177
+ - name: Ruby 3.0.0 for webmachine
1178
+ env_vars:
1179
+ - name: RUBY_VERSION
1180
+ value: 3.0.0
1181
+ - name: GEMSET
1182
+ value: webmachine
1183
+ - name: BUNDLE_GEMFILE
1184
+ value: gemfiles/webmachine.gemfile
1185
+ - name: _RUBYGEMS_VERSION
1186
+ value: latest
1187
+ - name: _BUNDLER_VERSION
1188
+ value: latest
1189
+ commands:
1190
+ - "./support/bundler_wrapper exec rake test"
1191
+ - "./support/bundler_wrapper exec rake test:failure"
995
1192
  - name: Ruby jruby-9.1.17.0
996
1193
  dependencies:
997
1194
  - Validation
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ # 2.11.2
4
+ - Support Ruby 3.0. PR #681
5
+ - Support breadcrumbs. PR #666
6
+ - Log Ruby errors on extension download. PR #679
7
+ - Fix Ruby 1.9 build. PR #680
8
+
3
9
  # 2.11.1
4
10
  - Support AS notifications instrumenters that use `start` and `finish`.
5
11
  - Updated agent with better logging and an IO stats fix.
data/README.md CHANGED
@@ -157,6 +157,15 @@ as most Linux distributions, FreeBSD, macOS, excluding Microsoft Windows.
157
157
  For more detailed information please visit our [Supported
158
158
  systems][supported-systems] page.
159
159
 
160
+ ## Releases
161
+
162
+ Following the process below to release a new version of the Ruby gem.
163
+
164
+ 1. Run: `rake publish`
165
+ 1. Update the Ruby gem version number when prompted.
166
+ 1. Update the `CHANGELOG` file with the changes since the last release.
167
+ 1. Confirm with your two-factor authentication token for Rubygems.org, _twice_.
168
+
160
169
  ## Development
161
170
 
162
171
  ### Installation
@@ -32,6 +32,7 @@ semaphore: # Default `.semaphore/semaphore.yml` contents
32
32
  prologue:
33
33
  commands:
34
34
  - checkout
35
+ - git -C /home/semaphore/.rbenv/plugins/ruby-build pull
35
36
  - sem-version ruby $RUBY_VERSION
36
37
  - ./support/check_versions
37
38
  - cache restore $_BUNDLER_CACHE-bundler-$RUBY_VERSION-$GEMSET-$(checksum $BUNDLE_GEMFILE)
@@ -116,6 +117,7 @@ matrix:
116
117
  gems: "minimal"
117
118
  - ruby: "2.6.5"
118
119
  - ruby: "2.7.1"
120
+ - ruby: "3.0.0"
119
121
  - ruby: "jruby-9.1.17.0"
120
122
  gems: "minimal"
121
123
  gems:
@@ -138,24 +140,29 @@ matrix:
138
140
  ruby:
139
141
  - "2.6.5"
140
142
  - "2.7.1"
143
+ - "3.0.0"
141
144
  - gem: "rails-4.2"
142
145
  bundler: "1.17.3"
143
146
  exclude:
144
147
  ruby:
145
148
  - "2.6.5"
146
149
  - "2.7.1"
150
+ - "3.0.0"
147
151
  - gem: "rails-5.0"
148
152
  exclude:
149
153
  ruby:
150
154
  - "2.0.0-p648"
155
+ - "3.0.0"
151
156
  - gem: "rails-5.1"
152
157
  exclude:
153
158
  ruby:
154
159
  - "2.0.0-p648"
160
+ - "3.0.0"
155
161
  - gem: "rails-5.2"
156
162
  exclude:
157
163
  ruby:
158
164
  - "2.0.0-p648"
165
+ - "3.0.0"
159
166
  - gem: "rails-6.0"
160
167
  exclude:
161
168
  ruby:
@@ -167,11 +174,17 @@ matrix:
167
174
  - "jruby-9.1.17.0"
168
175
  - gem: "resque-1"
169
176
  bundler: "1.17.3"
177
+ exclude:
178
+ ruby:
179
+ - "3.0.0"
170
180
  - gem: "resque-2"
171
181
  exclude:
172
182
  ruby:
173
183
  - "2.0.0-p648"
174
184
  - gem: "sequel"
175
185
  - gem: "sequel-435"
186
+ exclude:
187
+ ruby:
188
+ - "3.0.0"
176
189
  - gem: "sinatra"
177
190
  - gem: "webmachine"
@@ -119,30 +119,33 @@ def download_archive(type)
119
119
 
120
120
  version = AGENT_CONFIG["version"]
121
121
  filename = ARCH_CONFIG[type]["filename"]
122
- attempted_mirror_urls = []
122
+ download_errors = []
123
123
 
124
124
  AGENT_CONFIG["mirrors"].each do |mirror|
125
125
  download_url = [mirror, version, filename].join("/")
126
- attempted_mirror_urls << download_url
127
126
  report["download"]["download_url"] = download_url
128
127
 
129
128
  begin
130
- return open(
129
+ args = [
131
130
  download_url,
132
131
  :ssl_ca_cert => CA_CERT_PATH,
133
132
  :proxy => http_proxy
134
- )
135
- rescue
133
+ ]
134
+ if URI.respond_to?(:open) # rubocop:disable Style/GuardClause
135
+ return URI.open(*args)
136
+ else
137
+ return open(*args)
138
+ end
139
+ rescue => error
140
+ download_errors << "- URL: #{download_url}\n Error: #{error.class}: #{error.message}"
136
141
  next
137
142
  end
138
143
  end
139
144
 
140
- attempted_mirror_urls_mapped = attempted_mirror_urls.map { |mirror| "- #{mirror}" }
141
145
  abort_installation(
142
146
  "Could not download archive from any of our mirrors. " \
143
- "Attempted to download the archive from the following urls:\n" \
144
- "#{attempted_mirror_urls_mapped.join("\n")}\n" \
145
- "Please make sure your network allows access to any of these mirrors."
147
+ "Please make sure your network allows access to any of these mirrors.\n" \
148
+ "Attempted to download the archive from the following urls:\n#{download_errors.join("\n")}"
146
149
  )
147
150
  end
148
151
 
@@ -2,4 +2,11 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rack', '~> 1.6'
4
4
 
5
+ ruby_version = Gem::Version.new(RUBY_VERSION)
6
+ if ruby_version < Gem::Version.new("2.0.0")
7
+ # Newer versions of this gem have rexml as a dependency which doesn't work on
8
+ # Ruby 1.9
9
+ gem "crack", "0.4.4"
10
+ end
11
+
5
12
  gemspec :path => '../'
@@ -2,7 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'resque', "~> 2.0"
4
4
  gem 'sinatra'
5
- gem 'mime-types', '~> 2.6'
6
5
 
7
6
  gemspec :path => '../'
8
7
 
@@ -1,5 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'webmachine'
4
+ gem 'webrick'
4
5
 
5
6
  gemspec :path => '../'
@@ -34,20 +34,17 @@ module Appsignal
34
34
  end
35
35
 
36
36
  def self.parse_yaml(contents)
37
- arguments = [contents]
38
37
  if YAML.respond_to? :safe_load
39
- method = :safe_load
40
- arguments << \
41
- if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.6.0")
42
- # Use keyword params for Ruby 2.6 and up
43
- { :permitted_classes => [Time] }
44
- else
45
- [Time]
46
- end
38
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.6.0")
39
+ # Use keyword params for Ruby 2.6 and up
40
+ YAML.safe_load(contents, :permitted_classes => [Time])
41
+ else
42
+ YAML.safe_load(contents, [Time])
43
+ end
47
44
  else
48
- method = :load
45
+ # Support for Ruby versions without YAML.safe_load
46
+ YAML.load(contents) # rubocop:disable Security/YAMLLoad
49
47
  end
50
- YAML.send(method, *arguments)
51
48
  end
52
49
  end
53
50
  end
@@ -278,14 +278,11 @@ module Appsignal
278
278
  "../../../resources/appsignal.yml.erb"
279
279
  )
280
280
  file_contents = File.read(filename)
281
- arguments = [file_contents]
282
- if ruby_2_6_or_up?
283
- arguments << { :trim_mode => "-" }
284
- else
285
- arguments << nil
286
- arguments << "-"
287
- end
288
- template = ERB.new(*arguments)
281
+ template = if ruby_2_6_or_up?
282
+ ERB.new(file_contents, :trim_mode => "-")
283
+ else
284
+ ERB.new(file_contents, nil, "-")
285
+ end
289
286
  config = template.result(OpenStruct.new(data).instance_eval { binding })
290
287
 
291
288
  FileUtils.mkdir_p(File.join(Dir.pwd, "config"))
@@ -380,6 +380,38 @@ module Appsignal
380
380
  end
381
381
  alias :tag_job :tag_request
382
382
 
383
+ # Add breadcrumbs to the transaction.
384
+ #
385
+ # Breadcrumbs can be used to trace what path a user has taken
386
+ # before encounterin an error.
387
+ #
388
+ # Only the last 20 added breadcrumbs will be saved.
389
+ #
390
+ # @example
391
+ # Appsignal.add_breadcrumb("Navigation", "http://blablabla.com", "", { :response => 200 }, Time.now.utc)
392
+ # Appsignal.add_breadcrumb("Network", "[GET] http://blablabla.com", "", { :response => 500 })
393
+ # Appsignal.add_breadcrumb("UI", "closed modal(change_password)", "User closed modal without actions")
394
+ #
395
+ # @param category [String] category of breadcrumb
396
+ # e.g. "UI", "Network", "Navigation", "Console".
397
+ # @param action [String] name of breadcrumb
398
+ # e.g "The user clicked a button", "HTTP 500 from http://blablabla.com"
399
+ # @option message [String] optional message in string format
400
+ # @option metadata [Hash<String,String>] key/value metadata in <string, string> format
401
+ # @option time [Time] time of breadcrumb, should respond to `.to_i` defaults to `Time.now.utc`
402
+ # @return [void]
403
+ #
404
+ # @see Transaction#add_breadcrumb
405
+ # @see http://docs.appsignal.com/ruby/instrumentation/breadcrumbs.html
406
+ # Breadcrumb reference
407
+ # @since 2.12.0
408
+ def add_breadcrumb(category, action, message = "", metadata = {}, time = Time.now.utc)
409
+ return unless active?
410
+ transaction = Appsignal::Transaction.current
411
+ return false unless transaction
412
+ transaction.add_breadcrumb(category, action, message, metadata, time)
413
+ end
414
+
383
415
  # Instrument helper for AppSignal.
384
416
  #
385
417
  # For more help, read our custom instrumentation guide, listed under "See
@@ -11,6 +11,7 @@ module Appsignal
11
11
  BLANK = "".freeze
12
12
  ALLOWED_TAG_KEY_TYPES = [Symbol, String].freeze
13
13
  ALLOWED_TAG_VALUE_TYPES = [Symbol, String, Integer].freeze
14
+ BREADCRUMB_LIMIT = 20
14
15
 
15
16
  class << self
16
17
  def create(id, namespace, request, options = {})
@@ -58,7 +59,7 @@ module Appsignal
58
59
  end
59
60
  end
60
61
 
61
- attr_reader :ext, :transaction_id, :action, :namespace, :request, :paused, :tags, :options, :discarded
62
+ attr_reader :ext, :transaction_id, :action, :namespace, :request, :paused, :tags, :options, :discarded, :breadcrumbs
62
63
 
63
64
  # @!attribute params
64
65
  # Attribute for parameters of the transaction.
@@ -80,6 +81,7 @@ module Appsignal
80
81
  @paused = false
81
82
  @discarded = false
82
83
  @tags = {}
84
+ @breadcrumbs = []
83
85
  @store = Hash.new({})
84
86
  @options = options
85
87
  @options[:params_method] ||= :params
@@ -156,6 +158,31 @@ module Appsignal
156
158
  @tags.merge!(given_tags)
157
159
  end
158
160
 
161
+ # Add breadcrumbs to the transaction.
162
+ #
163
+ # @param category [String] category of breadcrumb
164
+ # e.g. "UI", "Network", "Navigation", "Console".
165
+ # @param action [String] name of breadcrumb
166
+ # e.g "The user clicked a button", "HTTP 500 from http://blablabla.com"
167
+ # @option message [String] optional message in string format
168
+ # @option metadata [Hash<String,String>] key/value metadata in <string, string> format
169
+ # @option time [Time] time of breadcrumb, should respond to `.to_i` defaults to `Time.now.utc`
170
+ # @return [void]
171
+ #
172
+ # @see Appsignal.add_breadcrumb
173
+ # @see http://docs.appsignal.com/ruby/instrumentation/breadcrumbs.html
174
+ # Breadcrumb reference
175
+ def add_breadcrumb(category, action, message = "", metadata = {}, time = Time.now.utc)
176
+ @breadcrumbs.push(
177
+ :time => time.to_i,
178
+ :category => category,
179
+ :action => action,
180
+ :message => message,
181
+ :metadata => metadata
182
+ )
183
+ @breadcrumbs = @breadcrumbs.last(BREADCRUMB_LIMIT)
184
+ end
185
+
159
186
  # Set an action name for the transaction.
160
187
  #
161
188
  # An action name is used to identify the location of a certain sample;
@@ -287,7 +314,8 @@ module Appsignal
287
314
  :environment => sanitized_environment,
288
315
  :session_data => sanitized_session_data,
289
316
  :metadata => metadata,
290
- :tags => sanitized_tags
317
+ :tags => sanitized_tags,
318
+ :breadcrumbs => breadcrumbs
291
319
  }.each do |key, data|
292
320
  set_sample_data(key, data)
293
321
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "2.11.1".freeze
4
+ VERSION = "2.11.2".freeze
5
5
  end
@@ -60,7 +60,10 @@ describe Appsignal::Hooks::ResqueHook do
60
60
  "error" => nil,
61
61
  "namespace" => namespace,
62
62
  "metadata" => {},
63
- "sample_data" => { "tags" => { "queue" => queue } }
63
+ "sample_data" => {
64
+ "breadcrumbs" => [],
65
+ "tags" => { "queue" => queue }
66
+ }
64
67
  )
65
68
  expect(transaction_hash["events"].map { |e| e["name"] })
66
69
  .to eql(["perform.resque"])
@@ -84,7 +87,10 @@ describe Appsignal::Hooks::ResqueHook do
84
87
  },
85
88
  "namespace" => namespace,
86
89
  "metadata" => {},
87
- "sample_data" => { "tags" => { "queue" => queue } }
90
+ "sample_data" => {
91
+ "breadcrumbs" => [],
92
+ "tags" => { "queue" => queue }
93
+ }
88
94
  )
89
95
  end
90
96
  end
@@ -118,6 +124,7 @@ describe Appsignal::Hooks::ResqueHook do
118
124
  "metadata" => {},
119
125
  "sample_data" => {
120
126
  "tags" => { "queue" => queue },
127
+ "breadcrumbs" => [],
121
128
  "params" => [
122
129
  "foo",
123
130
  {
@@ -174,6 +181,7 @@ describe Appsignal::Hooks::ResqueHook do
174
181
  "namespace" => namespace,
175
182
  "metadata" => {},
176
183
  "sample_data" => {
184
+ "breadcrumbs" => [],
177
185
  "tags" => { "queue" => queue }
178
186
  # Params will be set by the ActiveJob integration
179
187
  }
@@ -262,7 +262,8 @@ describe Appsignal::Hooks::SidekiqPlugin, :with_yaml_parse_error => false do
262
262
  "sample_data" => {
263
263
  "environment" => {},
264
264
  "params" => expected_args,
265
- "tags" => {}
265
+ "tags" => {},
266
+ "breadcrumbs" => []
266
267
  }
267
268
  )
268
269
  expect_transaction_to_have_sidekiq_event(transaction_hash)
@@ -290,7 +291,8 @@ describe Appsignal::Hooks::SidekiqPlugin, :with_yaml_parse_error => false do
290
291
  "sample_data" => {
291
292
  "environment" => {},
292
293
  "params" => expected_args,
293
- "tags" => {}
294
+ "tags" => {},
295
+ "breadcrumbs" => []
294
296
  }
295
297
  )
296
298
  # TODO: Not available in transaction.to_h yet.
@@ -356,6 +356,57 @@ describe Appsignal::Transaction do
356
356
  end
357
357
  end
358
358
 
359
+ describe "#add_breadcrumb" do
360
+ context "when over the limit" do
361
+ before do
362
+ 22.times do |i|
363
+ transaction.add_breadcrumb(
364
+ "network",
365
+ "GET http://localhost",
366
+ "User made external network request",
367
+ { :code => i + 1 },
368
+ Time.parse("10-10-2010 10:00:00 UTC")
369
+ )
370
+ end
371
+ transaction.sample_data
372
+ end
373
+
374
+ it "stores last <LIMIT> breadcrumbs on the transaction" do
375
+ expect(transaction.to_h["sample_data"]["breadcrumbs"].length).to eql(20)
376
+ expect(transaction.to_h["sample_data"]["breadcrumbs"][0]).to eq(
377
+ "action" => "GET http://localhost",
378
+ "category" => "network",
379
+ "message" => "User made external network request",
380
+ "metadata" => { "code" => 3 },
381
+ "time" => 1286704800 # rubocop:disable Style/NumericLiterals
382
+ )
383
+ expect(transaction.to_h["sample_data"]["breadcrumbs"][19]).to eq(
384
+ "action" => "GET http://localhost",
385
+ "category" => "network",
386
+ "message" => "User made external network request",
387
+ "metadata" => { "code" => 22 },
388
+ "time" => 1286704800 # rubocop:disable Style/NumericLiterals
389
+ )
390
+ end
391
+ end
392
+
393
+ context "with defaults" do
394
+ it "stores breadcrumb with defaults on transaction" do
395
+ timeframe_start = Time.now.utc.to_i
396
+ transaction.add_breadcrumb("user_action", "clicked HOME")
397
+ transaction.sample_data
398
+ timeframe_end = Time.now.utc.to_i
399
+
400
+ breadcrumb = transaction.to_h["sample_data"]["breadcrumbs"][0]
401
+ expect(breadcrumb["category"]).to eq("user_action")
402
+ expect(breadcrumb["action"]).to eq("clicked HOME")
403
+ expect(breadcrumb["message"]).to eq("")
404
+ expect(breadcrumb["time"]).to be_between(timeframe_start, timeframe_end)
405
+ expect(breadcrumb["metadata"]).to eq({})
406
+ end
407
+ end
408
+ end
409
+
359
410
  describe "#set_action" do
360
411
  context "when the action is set" do
361
412
  it "updates the action name on the transaction" do
@@ -649,6 +700,10 @@ describe Appsignal::Transaction do
649
700
  "tags",
650
701
  Appsignal::Utils::Data.generate({})
651
702
  ).once
703
+ expect(transaction.ext).to receive(:set_sample_data).with(
704
+ "breadcrumbs",
705
+ Appsignal::Utils::Data.generate([])
706
+ ).once
652
707
 
653
708
  transaction.sample_data
654
709
  end
@@ -491,6 +491,36 @@ describe Appsignal do
491
491
  end
492
492
  end
493
493
 
494
+ describe ".add_breadcrumb" do
495
+ before { allow(Appsignal::Transaction).to receive(:current).and_return(transaction) }
496
+
497
+ context "with transaction" do
498
+ let(:transaction) { double }
499
+ it "should call add_breadcrumb on transaction" do
500
+ expect(transaction).to receive(:add_breadcrumb)
501
+ .with("Network", "http", "User made network request", { :response => 200 }, fixed_time)
502
+ end
503
+
504
+ after do
505
+ Appsignal.add_breadcrumb(
506
+ "Network",
507
+ "http",
508
+ "User made network request",
509
+ { :response => 200 },
510
+ fixed_time
511
+ )
512
+ end
513
+ end
514
+
515
+ context "without transaction" do
516
+ let(:transaction) { nil }
517
+
518
+ it "should not call add_breadcrumb on transaction" do
519
+ expect(Appsignal.add_breadcrumb("Network", "http")).to be_falsy
520
+ end
521
+ end
522
+ end
523
+
494
524
  describe "custom stats" do
495
525
  let(:tags) { { :foo => "bar" } }
496
526
 
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appsignal
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.1
4
+ version: 2.11.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Beekman
8
8
  - Thijs Cadier
9
9
  - Tom de Bruijn
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-12-15 00:00:00.000000000 Z
13
+ date: 2021-01-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -399,7 +399,7 @@ metadata:
399
399
  documentation_uri: https://docs.appsignal.com/ruby/
400
400
  homepage_uri: https://docs.appsignal.com/ruby/
401
401
  source_code_uri: https://github.com/appsignal/appsignal-ruby
402
- post_install_message:
402
+ post_install_message:
403
403
  rdoc_options: []
404
404
  require_paths:
405
405
  - lib
@@ -415,8 +415,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
415
415
  - !ruby/object:Gem::Version
416
416
  version: '0'
417
417
  requirements: []
418
- rubygems_version: 3.1.2
419
- signing_key:
418
+ rubygems_version: 3.1.4
419
+ signing_key:
420
420
  specification_version: 4
421
421
  summary: Logs performance and exception data from your app to appsignal.com
422
422
  test_files: