appsignal 3.6.2 → 3.6.3

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: 0fe85cc642a413909a757ef143180354523bf05327df1f0eae2c0a29a1ce4570
4
- data.tar.gz: ae2bd9370beec37c374885e5bf10b5316394243ed73038f5d377553734789597
3
+ metadata.gz: db089487df57543ad4137b7c7f73b0ecd1a7a70747a31be628a4001af560dd61
4
+ data.tar.gz: 63ec67e524abc5fac18bb85746b0f45b3dcb3aa05870b23fb46d8cf44381054c
5
5
  SHA512:
6
- metadata.gz: 042fcd15607fa4ea121422ae7064181d90f2654d51dcea8f553aa3a6af8cafedc9ad60e5d6a3e74f15c701109d1aae65fb5ac66d1e597ca2dc83e91ec6342e52
7
- data.tar.gz: 9e732c7b94dfa76013a8def22d31202feb6c7e4ecffb74a74408e2787ed8ae7b98fd8477b9a2af7242edc35d912d65f2c60a9228ef2ce019574082919ae4d622
6
+ metadata.gz: c886c6433461ae0369852670075e9a5ea1e6547ca62f78734d395cee0ad2cf58fc8ac88e5b28df6afc9e6b146b5888e7c0b557aefc0467e11b81178f842d831e
7
+ data.tar.gz: e7b735d7384c2c9ef43141b1eb2d2eb2704c9a42d23185fd7748bdb09e786afcf2717b2a8b80ad0401503f9f65b9dd510bbdc3545e48ce40a7e8a0f6ef5ee375
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # AppSignal for Ruby gem Changelog
2
2
 
3
+ ## 3.6.3
4
+
5
+ _Published on 2024-03-20._
6
+
7
+ ### Added
8
+
9
+ - [e50433fb](https://github.com/appsignal/appsignal-ruby/commit/e50433fbcb109ef741a889b0b7e78f16b884bd81) patch - Implement CPU count configuration option. Use it to override the auto-detected, cgroups-provided number of CPUs that is used to calculate CPU usage percentages.
10
+
11
+ To set it, use the the `cpu_count`
12
+ configuration option or the `APPSIGNAL_CPU_COUNT` environment variable.
13
+
14
+ ### Fixed
15
+
16
+ - [c6dd9779](https://github.com/appsignal/appsignal-ruby/commit/c6dd9779bb50dd9385da8962ccf1057ca1a44c7a) patch - Add request parameters, path and method tags to errors reported in controllers via the Rails error reporter.
17
+
3
18
  ## 3.6.2
4
19
 
5
20
  _Published on 2024-03-08._
@@ -1459,7 +1474,7 @@ Yanked
1459
1474
  - Support for arrays, literal value types and function arguments in sql lexer
1460
1475
 
1461
1476
  ## 1.2.2
1462
- - Handle out of range numbers in queue lenght and metrics api
1477
+ - Handle out of range numbers in queue length and metrics api
1463
1478
 
1464
1479
  ## 1.2.1
1465
1480
  - Use Dir.pwd in CLI install wizard
@@ -1484,7 +1499,7 @@ Yanked
1484
1499
  ## 1.1.7
1485
1500
  - Make logging resilient for closing FD's (daemons gem does this)
1486
1501
  - Add support for using Resque through ActiveJob
1487
- - Rescue more expections in json generation
1502
+ - Rescue more exceptions in json generation
1488
1503
 
1489
1504
  ## 1.1.6
1490
1505
  - Generic Rack instrumentation middleware
@@ -1534,7 +1549,7 @@ Yanked
1534
1549
  - Improved sql sanitization
1535
1550
  - Improved mongoid/mongodb sanitization
1536
1551
  - Minor performance improvements
1537
- - Better handling for non-utf8 convertable strings
1552
+ - Better handling for non-utf8 convertible strings
1538
1553
  - Make gem installable (but not functional) on JRuby
1539
1554
 
1540
1555
  ## 1.0.4
@@ -1715,7 +1730,7 @@ Yanked
1715
1730
  Yanked
1716
1731
 
1717
1732
  ## 0.8.8
1718
- - Explicitely require securerandom
1733
+ - Explicitly require securerandom
1719
1734
 
1720
1735
  ## 0.8.7
1721
1736
  - Dup process action event to avoid threading issue
data/Rakefile CHANGED
@@ -219,7 +219,7 @@ namespace :build do
219
219
  Gem::PackageTask.new(base_gemspec, &block)
220
220
  rescue StandardError => e
221
221
  puts "Warning: An error occurred defining `build:#{task_name}:gem` Rake task."
222
- puts "This task will not be availble."
222
+ puts "This task will not be available."
223
223
  if ENV["DEBUG"]
224
224
  puts "#{e}: #{e.message}"
225
225
  puts e.backtrace
data/ext/agent.rb CHANGED
@@ -6,7 +6,7 @@
6
6
  # Modifications to this file will be overwritten with the next agent release.
7
7
 
8
8
  APPSIGNAL_AGENT_CONFIG = {
9
- "version" => "0.33.2",
9
+ "version" => "0.34.1",
10
10
  "mirrors" => [
11
11
  "https://appsignal-agent-releases.global.ssl.fastly.net",
12
12
  "https://d135dj0rjqvssy.cloudfront.net"
@@ -14,131 +14,131 @@ APPSIGNAL_AGENT_CONFIG = {
14
14
  "triples" => {
15
15
  "x86_64-darwin" => {
16
16
  "static" => {
17
- "checksum" => "0864691f001133fa479b34b00a682e76f374c40c161e7715756a3c036e3c8798",
17
+ "checksum" => "351f3dae916d3e84177d8cc35eaeaca5345f4deca9e0925a29353915cc0530d2",
18
18
  "filename" => "appsignal-x86_64-darwin-all-static.tar.gz"
19
19
  },
20
20
  "dynamic" => {
21
- "checksum" => "5141528c4293e4bd619107ae79afc8e07fdc8b33835899c5cf3f82ab3d31de8f",
21
+ "checksum" => "91ecacdf5e826dd21d5da26c07c5ecffd668cb16eaf15388d08a223425e716bb",
22
22
  "filename" => "appsignal-x86_64-darwin-all-dynamic.tar.gz"
23
23
  }
24
24
  },
25
25
  "universal-darwin" => {
26
26
  "static" => {
27
- "checksum" => "0864691f001133fa479b34b00a682e76f374c40c161e7715756a3c036e3c8798",
27
+ "checksum" => "351f3dae916d3e84177d8cc35eaeaca5345f4deca9e0925a29353915cc0530d2",
28
28
  "filename" => "appsignal-x86_64-darwin-all-static.tar.gz"
29
29
  },
30
30
  "dynamic" => {
31
- "checksum" => "5141528c4293e4bd619107ae79afc8e07fdc8b33835899c5cf3f82ab3d31de8f",
31
+ "checksum" => "91ecacdf5e826dd21d5da26c07c5ecffd668cb16eaf15388d08a223425e716bb",
32
32
  "filename" => "appsignal-x86_64-darwin-all-dynamic.tar.gz"
33
33
  }
34
34
  },
35
35
  "aarch64-darwin" => {
36
36
  "static" => {
37
- "checksum" => "13506e5911523e7107a8cb714e18b3bcb690f3eeef88bf9aff54777ba540fdc4",
37
+ "checksum" => "fd7359232fbd65f10ee565fcf65f4afa6d7a2ba1a8dead200c34736ca942df16",
38
38
  "filename" => "appsignal-aarch64-darwin-all-static.tar.gz"
39
39
  },
40
40
  "dynamic" => {
41
- "checksum" => "9d4deef17f42dc54981344a5af6b872e06dbd3d317be68b6abeb2403ffd65e23",
41
+ "checksum" => "a53ed8cc13d2821a4eee1ea7e4e58346125f27309973d4a2e8f059f129e927e2",
42
42
  "filename" => "appsignal-aarch64-darwin-all-dynamic.tar.gz"
43
43
  }
44
44
  },
45
45
  "arm64-darwin" => {
46
46
  "static" => {
47
- "checksum" => "13506e5911523e7107a8cb714e18b3bcb690f3eeef88bf9aff54777ba540fdc4",
47
+ "checksum" => "fd7359232fbd65f10ee565fcf65f4afa6d7a2ba1a8dead200c34736ca942df16",
48
48
  "filename" => "appsignal-aarch64-darwin-all-static.tar.gz"
49
49
  },
50
50
  "dynamic" => {
51
- "checksum" => "9d4deef17f42dc54981344a5af6b872e06dbd3d317be68b6abeb2403ffd65e23",
51
+ "checksum" => "a53ed8cc13d2821a4eee1ea7e4e58346125f27309973d4a2e8f059f129e927e2",
52
52
  "filename" => "appsignal-aarch64-darwin-all-dynamic.tar.gz"
53
53
  }
54
54
  },
55
55
  "arm-darwin" => {
56
56
  "static" => {
57
- "checksum" => "13506e5911523e7107a8cb714e18b3bcb690f3eeef88bf9aff54777ba540fdc4",
57
+ "checksum" => "fd7359232fbd65f10ee565fcf65f4afa6d7a2ba1a8dead200c34736ca942df16",
58
58
  "filename" => "appsignal-aarch64-darwin-all-static.tar.gz"
59
59
  },
60
60
  "dynamic" => {
61
- "checksum" => "9d4deef17f42dc54981344a5af6b872e06dbd3d317be68b6abeb2403ffd65e23",
61
+ "checksum" => "a53ed8cc13d2821a4eee1ea7e4e58346125f27309973d4a2e8f059f129e927e2",
62
62
  "filename" => "appsignal-aarch64-darwin-all-dynamic.tar.gz"
63
63
  }
64
64
  },
65
65
  "aarch64-linux" => {
66
66
  "static" => {
67
- "checksum" => "76702b5755d5bb45cc05df17dd38389b7e20e105a52324120a45ae1b481c7881",
67
+ "checksum" => "dfbab18b7faa24684bf0ab57666b6b493356a3da43ecdba2e992b2d6d513cf31",
68
68
  "filename" => "appsignal-aarch64-linux-all-static.tar.gz"
69
69
  },
70
70
  "dynamic" => {
71
- "checksum" => "bf518ce2cb4a9041fe819b6bf43e1bc793fe52b3e73527687d7812618c8e7407",
71
+ "checksum" => "865b8f034aa680aa6cdfe77cf117f071f9b5857c92cc7b6f36decfd5b2293b27",
72
72
  "filename" => "appsignal-aarch64-linux-all-dynamic.tar.gz"
73
73
  }
74
74
  },
75
75
  "i686-linux" => {
76
76
  "static" => {
77
- "checksum" => "22cbda11a8d801d75e9394033f5cf28f0ddcff66a2138720f827441bdcf919c2",
77
+ "checksum" => "ce4a819f3eaa4590795497915e4a20b3fe281a0821364b80d26ffd1391af67a8",
78
78
  "filename" => "appsignal-i686-linux-all-static.tar.gz"
79
79
  },
80
80
  "dynamic" => {
81
- "checksum" => "157492663e434421499f9cc0b510178387c8968e53bdc6e216db374b86d5c3dc",
81
+ "checksum" => "195d570b7f6b1ea5d2ced90dc12d68a6627e1886d078258b5483163e52afc620",
82
82
  "filename" => "appsignal-i686-linux-all-dynamic.tar.gz"
83
83
  }
84
84
  },
85
85
  "x86-linux" => {
86
86
  "static" => {
87
- "checksum" => "22cbda11a8d801d75e9394033f5cf28f0ddcff66a2138720f827441bdcf919c2",
87
+ "checksum" => "ce4a819f3eaa4590795497915e4a20b3fe281a0821364b80d26ffd1391af67a8",
88
88
  "filename" => "appsignal-i686-linux-all-static.tar.gz"
89
89
  },
90
90
  "dynamic" => {
91
- "checksum" => "157492663e434421499f9cc0b510178387c8968e53bdc6e216db374b86d5c3dc",
91
+ "checksum" => "195d570b7f6b1ea5d2ced90dc12d68a6627e1886d078258b5483163e52afc620",
92
92
  "filename" => "appsignal-i686-linux-all-dynamic.tar.gz"
93
93
  }
94
94
  },
95
95
  "x86_64-linux" => {
96
96
  "static" => {
97
- "checksum" => "8ff0b1d7bf0cfc1c66e918545a9ab5c29be35c371cde48f64a01c725290599ed",
97
+ "checksum" => "e55f9ecb4e4b51e9232918216487712b63a7cfea9710763f61077e8d40d53dbe",
98
98
  "filename" => "appsignal-x86_64-linux-all-static.tar.gz"
99
99
  },
100
100
  "dynamic" => {
101
- "checksum" => "a186c18536c3b7ec4802e852a62154cc976dcb5f554c3d0d8472d5cd7131b02b",
101
+ "checksum" => "b5edf38f4ac2725907995518a1d09dc09c70cae600d1d3a287e0b6404c2301d2",
102
102
  "filename" => "appsignal-x86_64-linux-all-dynamic.tar.gz"
103
103
  }
104
104
  },
105
105
  "x86_64-linux-musl" => {
106
106
  "static" => {
107
- "checksum" => "a5e0af3e5e1ad908792e79c7c46b59119272e9836e5ea96791c78e3cb12ed132",
107
+ "checksum" => "8963ebc98405648205a6d8aa371bafa49cb33cd104e0c3e6cc1856ba41fe3d8c",
108
108
  "filename" => "appsignal-x86_64-linux-musl-all-static.tar.gz"
109
109
  },
110
110
  "dynamic" => {
111
- "checksum" => "17c108a83dff86b2531bf7f348481bb31ece53b4cc62615ca0a34332c0df2970",
111
+ "checksum" => "6b5bab353f1597e64d0dc7638f02e8a0c4da2b341991f8e8efb251d8f94878a2",
112
112
  "filename" => "appsignal-x86_64-linux-musl-all-dynamic.tar.gz"
113
113
  }
114
114
  },
115
115
  "aarch64-linux-musl" => {
116
116
  "static" => {
117
- "checksum" => "92460560115d540a8140cbc360bd98beba8477e8a73eafd20ee611543b4528df",
117
+ "checksum" => "34bb72678b896a2a8289a97611a61a297b5a0e6110f5085a683ad93857cdf26c",
118
118
  "filename" => "appsignal-aarch64-linux-musl-all-static.tar.gz"
119
119
  },
120
120
  "dynamic" => {
121
- "checksum" => "d4749b10a1803080e0b1b0d8f95ef9d1fef0aa694fa0fc405df97812937d8e7c",
121
+ "checksum" => "999e0bdc36613f9e016b01d4a00fab864b5996472e32ff1e03a0019877cd5e5d",
122
122
  "filename" => "appsignal-aarch64-linux-musl-all-dynamic.tar.gz"
123
123
  }
124
124
  },
125
125
  "x86_64-freebsd" => {
126
126
  "static" => {
127
- "checksum" => "8d8733c2adc0f750553be11b5e54fd614b13207be67863d95c57e4739021a92f",
127
+ "checksum" => "68e882ba3bc87328953d9bfbb676b00d4199756a7090d5cdc265a4b32d857cc5",
128
128
  "filename" => "appsignal-x86_64-freebsd-all-static.tar.gz"
129
129
  },
130
130
  "dynamic" => {
131
- "checksum" => "8a9cbdc645b3833766458a252c2a8fefda76c62fceee8be795b286d65cc513c6",
131
+ "checksum" => "3e770a387ada2e12052929c6f4ea141d05bd3dec5337ca53bbcf1078a6a2537d",
132
132
  "filename" => "appsignal-x86_64-freebsd-all-dynamic.tar.gz"
133
133
  }
134
134
  },
135
135
  "amd64-freebsd" => {
136
136
  "static" => {
137
- "checksum" => "8d8733c2adc0f750553be11b5e54fd614b13207be67863d95c57e4739021a92f",
137
+ "checksum" => "68e882ba3bc87328953d9bfbb676b00d4199756a7090d5cdc265a4b32d857cc5",
138
138
  "filename" => "appsignal-x86_64-freebsd-all-static.tar.gz"
139
139
  },
140
140
  "dynamic" => {
141
- "checksum" => "8a9cbdc645b3833766458a252c2a8fefda76c62fceee8be795b286d65cc513c6",
141
+ "checksum" => "3e770a387ada2e12052929c6f4ea141d05bd3dec5337ca53bbcf1078a6a2537d",
142
142
  "filename" => "appsignal-x86_64-freebsd-all-dynamic.tar.gz"
143
143
  }
144
144
  }
@@ -40,7 +40,7 @@ module Appsignal
40
40
  # @return [Array<String/nil, String>] response tuple.
41
41
  # - First value is the response status code.
42
42
  # - Second value is a description of the response and the exception error
43
- # message if an exception occured.
43
+ # message if an exception occurred.
44
44
  def perform_with_result
45
45
  status = perform
46
46
  result =
@@ -70,6 +70,7 @@ module Appsignal
70
70
  "APPSIGNAL_APP_NAME" => :name,
71
71
  "APPSIGNAL_BIND_ADDRESS" => :bind_address,
72
72
  "APPSIGNAL_CA_FILE_PATH" => :ca_file_path,
73
+ "APPSIGNAL_CPU_COUNT" => :cpu_count,
73
74
  "APPSIGNAL_DEBUG" => :debug,
74
75
  "APPSIGNAL_DNS_SERVERS" => :dns_servers,
75
76
  "APPSIGNAL_ENABLE_ALLOCATION_TRACKING" => :enable_allocation_tracking,
@@ -167,6 +168,9 @@ module Appsignal
167
168
  APPSIGNAL_IGNORE_NAMESPACES
168
169
  APPSIGNAL_REQUEST_HEADERS
169
170
  ].freeze
171
+ ENV_FLOAT_KEYS = %w[
172
+ APPSIGNAL_CPU_COUNT
173
+ ].freeze
170
174
 
171
175
  # @attribute [r] system_config
172
176
  # Config detected on the system level.
@@ -344,6 +348,7 @@ module Appsignal
344
348
  ENV["_APPSIGNAL_APP_PATH"] = root_path.to_s
345
349
  ENV["_APPSIGNAL_BIND_ADDRESS"] = config_hash[:bind_address].to_s
346
350
  ENV["_APPSIGNAL_CA_FILE_PATH"] = config_hash[:ca_file_path].to_s
351
+ ENV["_APPSIGNAL_CPU_COUNT"] = config_hash[:cpu_count].to_s
347
352
  ENV["_APPSIGNAL_DEBUG_LOGGING"] = config_hash[:debug].to_s
348
353
  ENV["_APPSIGNAL_DNS_SERVERS"] = config_hash[:dns_servers].join(",")
349
354
  ENV["_APPSIGNAL_ENABLE_HOST_METRICS"] = config_hash[:enable_host_metrics].to_s
@@ -444,7 +449,7 @@ module Appsignal
444
449
  "'APPSIGNAL_INACTIVE_ON_CONFIG_FILE_ERROR=1' in your system " \
445
450
  "environment."
446
451
  end
447
- message = "An error occured while loading the AppSignal config file. " \
452
+ message = "An error occurred while loading the AppSignal config file. " \
448
453
  "#{extra_message}\n" \
449
454
  "File: #{config_file.inspect}\n" \
450
455
  "#{e.class.name}: #{e}"
@@ -501,6 +506,14 @@ module Appsignal
501
506
  config[ENV_TO_KEY_MAPPING[var]] = env_var.split(",")
502
507
  end
503
508
 
509
+ # Configuration with float type
510
+ ENV_FLOAT_KEYS.each do |var|
511
+ env_var = ENV.fetch(var, nil)
512
+ next unless env_var
513
+
514
+ config[ENV_TO_KEY_MAPPING[var]] = env_var.to_f
515
+ end
516
+
504
517
  config
505
518
  end
506
519
 
@@ -4,7 +4,7 @@ module Appsignal
4
4
  class EventFormatter
5
5
  # @api private
6
6
  module Sequel
7
- # Compatability with the sequel-rails gem.
7
+ # Compatibility with the sequel-rails gem.
8
8
  # The sequel-rails gem adds its own ActiveSupport::Notifications events
9
9
  # that conflict with our own sequel instrumentor. Without this event
10
10
  # formatter the sequel-rails events are recorded without the SQL query
@@ -60,9 +60,13 @@ module Appsignal
60
60
  return unless handled
61
61
 
62
62
  Appsignal.send_error(error) do |transaction|
63
- namespace, action_name, tags, custom_data = context_for(context.dup)
63
+ namespace, action_name, path, method, params, tags, custom_data =
64
+ context_for(context.dup)
64
65
  transaction.set_namespace(namespace) if namespace
65
66
  transaction.set_action(action_name) if action_name
67
+ transaction.set_metadata("path", path)
68
+ transaction.set_metadata("method", method)
69
+ transaction.params = params
66
70
  transaction.set_sample_data("custom_data", custom_data) if custom_data
67
71
 
68
72
  tags[:severity] = severity
@@ -81,9 +85,17 @@ module Appsignal
81
85
  # Fetch the namespace and action name based on the Rails execution
82
86
  # context.
83
87
  controller = context.delete(:controller)
88
+ path = nil
89
+ method = nil
90
+ params = nil
84
91
  if controller
85
92
  namespace = Appsignal::Transaction::HTTP_REQUEST
86
93
  action_name = "#{controller.class.name}##{controller.action_name}"
94
+ unless controller.request.nil?
95
+ path = controller.request.path
96
+ method = controller.request.method
97
+ params = controller.request.filtered_parameters
98
+ end
87
99
  end
88
100
  # ActiveJob transaction naming relies on the current AppSignal
89
101
  # transaction namespace and action name copying done after this.
@@ -115,7 +127,7 @@ module Appsignal
115
127
  end
116
128
  tags.merge!(context)
117
129
 
118
- [namespace, action_name, tags, custom_data]
130
+ [namespace, action_name, path, method, params, tags, custom_data]
119
131
  end
120
132
  end
121
133
  end
@@ -64,7 +64,7 @@ module Appsignal
64
64
  alias log add
65
65
 
66
66
  # Log a debug level message
67
- # @param message Mesage to log
67
+ # @param message Message to log
68
68
  # @param attributes Attributes to tag the log with
69
69
  # @return [void]
70
70
  def debug(message = nil, attributes = {})
@@ -77,7 +77,7 @@ module Appsignal
77
77
  end
78
78
 
79
79
  # Log an info level message
80
- # @param message Mesage to log
80
+ # @param message Message to log
81
81
  # @param attributes Attributes to tag the log with
82
82
  # @return [void]
83
83
  def info(message = nil, attributes = {})
@@ -90,7 +90,7 @@ module Appsignal
90
90
  end
91
91
 
92
92
  # Log a warn level message
93
- # @param message Mesage to log
93
+ # @param message Message to log
94
94
  # @param attributes Attributes to tag the log with
95
95
  # @return [void]
96
96
  def warn(message = nil, attributes = {})
@@ -103,7 +103,7 @@ module Appsignal
103
103
  end
104
104
 
105
105
  # Log an error level message
106
- # @param message Mesage to log
106
+ # @param message Message to log
107
107
  # @param attributes Attributes to tag the log with
108
108
  # @return [void]
109
109
  def error(message = nil, attributes = {})
@@ -116,7 +116,7 @@ module Appsignal
116
116
  end
117
117
 
118
118
  # Log a fatal level message
119
- # @param message Mesage to log
119
+ # @param message Message to log
120
120
  # @param attributes Attributes to tag the log with
121
121
  # @return [void]
122
122
  def fatal(message = nil, attributes = {})
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "3.6.2"
4
+ VERSION = "3.6.3"
5
5
  end
@@ -18,7 +18,7 @@ Puma::Plugin.create do # rubocop:disable Metrics/BlockLength
18
18
 
19
19
  loop do
20
20
  # Implement similar behavior to minutely probes.
21
- # Initial sleep to wait until the app is fully initalized.
21
+ # Initial sleep to wait until the app is fully initialized.
22
22
  # Then loop every 60 seconds and collect the Puma stats as AppSignal
23
23
  # metrics.
24
24
  sleep sleep_time
@@ -160,7 +160,7 @@ if DependencyHelper.capistrano2_present?
160
160
  run
161
161
  end
162
162
 
163
- it "transmits the overriden revision" do
163
+ it "transmits the overridden revision" do
164
164
  expect(output).to include \
165
165
  "Notifying AppSignal of deploy with: revision: abc123, user: batman",
166
166
  "AppSignal has been notified of this deploy!"
@@ -174,7 +174,7 @@ if DependencyHelper.capistrano2_present?
174
174
  run
175
175
  end
176
176
 
177
- it "transmits the overriden deploy user" do
177
+ it "transmits the overridden deploy user" do
178
178
  expect(output).to include \
179
179
  "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005," \
180
180
  " user: robin",
@@ -172,7 +172,7 @@ if DependencyHelper.capistrano3_present?
172
172
  run
173
173
  end
174
174
 
175
- it "transmits the overriden revision" do
175
+ it "transmits the overridden revision" do
176
176
  expect(output).to include \
177
177
  "Notifying AppSignal of deploy with: revision: abc123, user: batman",
178
178
  "AppSignal has been notified of this deploy!"
@@ -186,7 +186,7 @@ if DependencyHelper.capistrano3_present?
186
186
  run
187
187
  end
188
188
 
189
- it "transmits the overriden deploy user" do
189
+ it "transmits the overridden deploy user" do
190
190
  expect(output).to include \
191
191
  "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, " \
192
192
  "user: robin",
@@ -466,7 +466,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
466
466
  end
467
467
  end
468
468
 
469
- context "when the extention returns invalid JSON" do
469
+ context "when the extension returns invalid JSON" do
470
470
  before do
471
471
  expect(Appsignal::Extension).to receive(:diagnose).and_return("invalid agent\njson")
472
472
  run
@@ -6,7 +6,8 @@ describe Appsignal::Config do
6
6
  configured_env_keys = (
7
7
  config::ENV_STRING_KEYS +
8
8
  config::ENV_BOOLEAN_KEYS +
9
- config::ENV_ARRAY_KEYS
9
+ config::ENV_ARRAY_KEYS +
10
+ config::ENV_FLOAT_KEYS
10
11
  ).sort
11
12
 
12
13
  expect(mapped_env_keys).to eql(configured_env_keys)
@@ -264,7 +265,7 @@ describe Appsignal::Config do
264
265
  end
265
266
  end
266
267
 
267
- context "with an overriden config file" do
268
+ context "with an overridden config file" do
268
269
  let(:config) do
269
270
  project_fixture_config("production", {}, Appsignal.internal_logger,
270
271
  File.join(project_fixture_path, "config", "appsignal.yml"))
@@ -275,7 +276,7 @@ describe Appsignal::Config do
275
276
  expect(config.active?).to be_truthy
276
277
  end
277
278
 
278
- context "with an invalid overriden config file" do
279
+ context "with an invalid overridden config file" do
279
280
  let(:config) do
280
281
  project_fixture_config("production", {}, Appsignal.internal_logger,
281
282
  File.join(project_fixture_path, "config", "missing.yml"))
@@ -300,7 +301,7 @@ describe Appsignal::Config do
300
301
  stdout = std_stream
301
302
  stderr = std_stream
302
303
  log = capture_logs { capture_std_streams(stdout, stderr) { config } }
303
- message = "An error occured while loading the AppSignal config file. " \
304
+ message = "An error occurred while loading the AppSignal config file. " \
304
305
  "Skipping file config. " \
305
306
  "In future versions AppSignal will not start on a config file " \
306
307
  "error. To opt-in to this new behavior set " \
@@ -326,7 +327,7 @@ describe Appsignal::Config do
326
327
  ENV["APPSIGNAL_PUSH_API_KEY"] = "something valid"
327
328
  ENV["APPSIGNAL_INACTIVE_ON_CONFIG_FILE_ERROR"] = "1"
328
329
  log = capture_logs { capture_std_streams(stdout, stderr) { config } }
329
- message = "An error occured while loading the AppSignal config file. " \
330
+ message = "An error occurred while loading the AppSignal config file. " \
330
331
  "Not starting AppSignal because APPSIGNAL_INACTIVE_ON_CONFIG_FILE_ERROR is set.\n" \
331
332
  "File: #{File.join(config_path, "config", "appsignal.yml").inspect}\n" \
332
333
  "KeyError: key not found"
@@ -414,6 +415,7 @@ describe Appsignal::Config do
414
415
  :push_api_key => "aaa-bbb-ccc",
415
416
  :active => true,
416
417
  :bind_address => "0.0.0.0",
418
+ :cpu_count => 1.5,
417
419
  :name => "App name",
418
420
  :debug => true,
419
421
  :dns_servers => ["8.8.8.8", "8.8.4.4"],
@@ -436,6 +438,7 @@ describe Appsignal::Config do
436
438
  ENV["APPSIGNAL_ACTIVE"] = "true"
437
439
  ENV["APPSIGNAL_APP_NAME"] = "App name"
438
440
  ENV["APPSIGNAL_BIND_ADDRESS"] = "0.0.0.0"
441
+ ENV["APPSIGNAL_CPU_COUNT"] = "1.5"
439
442
  ENV["APPSIGNAL_DEBUG"] = "true"
440
443
  ENV["APPSIGNAL_DNS_SERVERS"] = "8.8.8.8,8.8.4.4"
441
444
  ENV["APPSIGNAL_IGNORE_ACTIONS"] = "action1,action2"
@@ -631,6 +634,7 @@ describe Appsignal::Config do
631
634
  let(:config) { project_fixture_config(:production) }
632
635
  before do
633
636
  config[:bind_address] = "0.0.0.0"
637
+ config[:cpu_count] = 1.5
634
638
  config[:logging_endpoint] = "http://localhost:123"
635
639
  config[:http_proxy] = "http://localhost"
636
640
  config[:ignore_actions] = %w[action1 action2]
@@ -654,6 +658,7 @@ describe Appsignal::Config do
654
658
  .to end_with("spec/support/fixtures/projects/valid")
655
659
  expect(ENV.fetch("_APPSIGNAL_AGENT_PATH", nil)).to end_with("/ext")
656
660
  expect(ENV.fetch("_APPSIGNAL_BIND_ADDRESS", nil)).to eq("0.0.0.0")
661
+ expect(ENV.fetch("_APPSIGNAL_CPU_COUNT", nil)).to eq("1.5")
657
662
  expect(ENV.fetch("_APPSIGNAL_DEBUG_LOGGING", nil)).to eq "false"
658
663
  expect(ENV.fetch("_APPSIGNAL_LOG", nil)).to eq "stdout"
659
664
  expect(ENV.fetch("_APPSIGNAL_LOG_FILE_PATH", nil)).to end_with("/tmp/appsignal.log")
@@ -90,7 +90,7 @@ describe Appsignal::Environment do
90
90
  end
91
91
  end
92
92
 
93
- context "when something unforseen errors" do
93
+ context "when something unforeseen errors" do
94
94
  it "does not re-raise the error and writes it to the log" do
95
95
  klass = Class.new do
96
96
  def inspect
@@ -127,7 +127,7 @@ describe Appsignal::Environment do
127
127
  expect(rake_spec.version.to_s).to_not be_empty
128
128
  end
129
129
 
130
- context "when something unforseen errors" do
130
+ context "when something unforeseen errors" do
131
131
  it "does not re-raise the error and writes it to the log" do
132
132
  expect(Bundler).to receive(:rubygems).and_raise(RuntimeError, "bundler error")
133
133
 
@@ -148,7 +148,7 @@ describe Appsignal::Environment do
148
148
  expect_environment_metadata("ruby_a_test_enabled", "true")
149
149
  end
150
150
 
151
- context "when something unforseen errors" do
151
+ context "when something unforeseen errors" do
152
152
  it "does not re-raise the error and writes it to the log" do
153
153
  klass = Class.new do
154
154
  def to_s
@@ -21,7 +21,7 @@ describe Appsignal::EventFormatter::MongoRubyDriver::QueryFormatter do
21
21
  formatter.format(strategy, command)
22
22
  end
23
23
 
24
- context "when strategy is unkown" do
24
+ context "when strategy is unknown" do
25
25
  let(:strategy) { :bananas }
26
26
 
27
27
  it "should return an empty hash" do
@@ -160,7 +160,7 @@ describe Appsignal::Hooks::ResqueHook do
160
160
  end
161
161
  after { Object.send(:remove_const, :ActiveJobMock) }
162
162
 
163
- it "does not set arguments but lets the ActiveJob intergration handle it" do
163
+ it "does not set arguments but lets the ActiveJob integration handle it" do
164
164
  perform_job(
165
165
  ResqueTestJob,
166
166
  "class" => "ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper",
@@ -47,7 +47,7 @@ describe Appsignal::Hooks do
47
47
  Appsignal::Hooks.hooks.delete(:mock_present_hook)
48
48
  end
49
49
 
50
- it "should not install if depencies are not present" do
50
+ it "should not install if dependencies are not present" do
51
51
  Appsignal::Hooks::Hook.register(:mock_not_present_hook, MockNotPresentHook)
52
52
 
53
53
  expect(Appsignal::Hooks.hooks[:mock_not_present_hook]).to be_instance_of(MockNotPresentHook)
@@ -256,10 +256,28 @@ if DependencyHelper.rails_present?
256
256
  end
257
257
 
258
258
  context "when no transaction is active" do
259
+ class ExampleRailsRequestMock
260
+ def path
261
+ "path"
262
+ end
263
+
264
+ def method
265
+ "GET"
266
+ end
267
+
268
+ def filtered_parameters
269
+ { :user_id => 123, :password => "[FILTERED]" }
270
+ end
271
+ end
272
+
259
273
  class ExampleRailsControllerMock
260
274
  def action_name
261
275
  "index"
262
276
  end
277
+
278
+ def request
279
+ @request ||= ExampleRailsRequestMock.new
280
+ end
263
281
  end
264
282
 
265
283
  class ExampleRailsJobMock
@@ -275,7 +293,7 @@ if DependencyHelper.rails_present?
275
293
  clear_current_transaction!
276
294
  end
277
295
 
278
- it "fetches the action from the controller in the context" do
296
+ it "fetches the action, path and method from the controller in the context" do
279
297
  # The controller key is set by Rails when raised in a controller
280
298
  given_context = { :controller => ExampleRailsControllerMock.new }
281
299
  with_rails_error_reporter do
@@ -285,7 +303,14 @@ if DependencyHelper.rails_present?
285
303
  transaction = last_transaction
286
304
  transaction_hash = transaction.to_h
287
305
  expect(transaction_hash).to include(
288
- "action" => "ExampleRailsControllerMock#index"
306
+ "action" => "ExampleRailsControllerMock#index",
307
+ "metadata" => hash_including(
308
+ "path" => "path",
309
+ "method" => "GET"
310
+ ),
311
+ "sample_data" => hash_including(
312
+ "params" => { "user_id" => 123, "password" => "[FILTERED]" }
313
+ )
289
314
  )
290
315
  end
291
316
 
@@ -8,7 +8,7 @@ describe Appsignal::Integrations::SidekiqErrorHandler do
8
8
  end
9
9
  around { |example| keep_transactions { example.run } }
10
10
 
11
- context "without a current transction" do
11
+ context "without a current transaction" do
12
12
  let(:exception) do
13
13
  raise ExampleStandardError, "uh oh"
14
14
  rescue => error
@@ -303,7 +303,7 @@ describe Appsignal::Transaction do
303
303
  context "with overridden options" do
304
304
  let(:options) { { :params_method => :filtered_params } }
305
305
 
306
- it "sets the overriden :params_method" do
306
+ it "sets the overridden :params_method" do
307
307
  expect(subject[:params_method]).to eq :filtered_params
308
308
  end
309
309
  end
@@ -751,7 +751,7 @@ describe Appsignal::Transaction do
751
751
  e
752
752
  end
753
753
 
754
- it "should also respond to add_exception for backwords compatibility" do
754
+ it "should also respond to add_exception for backwards compatibility" do
755
755
  expect(transaction).to respond_to(:add_exception)
756
756
  end
757
757
 
@@ -258,7 +258,7 @@ describe Appsignal do
258
258
  end
259
259
 
260
260
  describe ".listen_for_error" do
261
- it "does not record anyhing" do
261
+ it "does not record anything" do
262
262
  error = RuntimeError.new("specific error")
263
263
  expect do
264
264
  Appsignal.listen_for_error do
@@ -204,7 +204,7 @@ RSpec.describe "Puma plugin" do
204
204
  }
205
205
  end
206
206
 
207
- it "collects puma stats as guage metrics with the (summed) worker metrics" do
207
+ it "collects puma stats as gauge metrics with the (summed) worker metrics" do
208
208
  run_plugin(stats_data, appsignal_plugin) do
209
209
  expect(logs).to_not include([:error, kind_of(String)])
210
210
  expect_gauge(:workers, 2, "type" => "count")
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: 3.6.2
4
+ version: 3.6.3
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: 2024-03-08 00:00:00.000000000 Z
13
+ date: 2024-03-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack