appsignal 3.12.5 → 3.13.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -125,6 +125,28 @@ describe Appsignal do
125
125
  expect(Appsignal.config[:push_api_key]).to eq("key")
126
126
  end
127
127
 
128
+ it "loads a new config if the path is not the same" do
129
+ Appsignal._config = Appsignal::Config.new(
130
+ "/some/path",
131
+ :my_env,
132
+ :name => "Some name",
133
+ :push_api_key => "Some key",
134
+ :ignore_actions => ["My action"]
135
+ )
136
+
137
+ Appsignal.configure(:my_env, :root_path => project_fixture_path) do |config|
138
+ expect(config.ignore_actions).to be_empty
139
+ config.active = true
140
+ config.name = "My app"
141
+ config.push_api_key = "key"
142
+ end
143
+ expect(Appsignal.config.valid?).to be(true)
144
+ expect(Appsignal.config.env).to eq("my_env")
145
+ expect(Appsignal.config[:active]).to be(true)
146
+ expect(Appsignal.config[:name]).to eq("My app")
147
+ expect(Appsignal.config[:push_api_key]).to eq("key")
148
+ end
149
+
128
150
  it "calls configure if not started yet" do
129
151
  Appsignal.configure(:my_env) do |config|
130
152
  config.active = false
@@ -165,6 +187,16 @@ describe Appsignal do
165
187
  expect(Appsignal.config.env).to eq("env_arg")
166
188
  end
167
189
 
190
+ it "uses the given root path to read the config file" do
191
+ Appsignal.configure(:test, :root_path => project_fixture_path)
192
+
193
+ Appsignal.start
194
+ expect(Appsignal.config.env).to eq("test")
195
+ expect(Appsignal.config[:push_api_key]).to eq("abc")
196
+ # Ensure it loads from the config file in the given path
197
+ expect(Appsignal.config.file_config).to_not be_empty
198
+ end
199
+
168
200
  it "loads the config without a block being given" do
169
201
  Dir.chdir project_fixture_path do
170
202
  Appsignal.configure(:test)
@@ -172,6 +204,8 @@ describe Appsignal do
172
204
 
173
205
  expect(Appsignal.config.env).to eq("test")
174
206
  expect(Appsignal.config[:push_api_key]).to eq("abc")
207
+ # Ensure it loads from the config file in the current working directory
208
+ expect(Appsignal.config.file_config).to_not be_empty
175
209
  end
176
210
 
177
211
  it "allows customization of config in the block" do
@@ -1571,6 +1605,24 @@ describe Appsignal do
1571
1605
  describe ".listen_for_error" do
1572
1606
  around { |example| keep_transactions { example.run } }
1573
1607
 
1608
+ it "prints and logs a deprecation warning" do
1609
+ err_stream = std_stream
1610
+ logs =
1611
+ capture_logs do
1612
+ capture_std_streams(std_stream, err_stream) do
1613
+ Appsignal.listen_for_error do
1614
+ # Do nothing
1615
+ end
1616
+ end
1617
+ end
1618
+ expect(err_stream.read)
1619
+ .to include("appsignal WARNING: The `Appsignal.listen_for_error` helper is deprecated.")
1620
+ expect(logs).to contains_log(
1621
+ :warn,
1622
+ "The `Appsignal.listen_for_error` helper is deprecated."
1623
+ )
1624
+ end
1625
+
1574
1626
  it "records the error and re-raise it" do
1575
1627
  expect do
1576
1628
  expect 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: 3.12.5
4
+ version: 3.13.0
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-08-01 00:00:00.000000000 Z
13
+ date: 2024-08-14 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -186,6 +186,8 @@ files:
186
186
  - lib/appsignal.rb
187
187
  - lib/appsignal/auth_check.rb
188
188
  - lib/appsignal/capistrano.rb
189
+ - lib/appsignal/check_in.rb
190
+ - lib/appsignal/check_in/cron.rb
189
191
  - lib/appsignal/cli.rb
190
192
  - lib/appsignal/cli/demo.rb
191
193
  - lib/appsignal/cli/diagnose.rb
@@ -209,8 +211,7 @@ files:
209
211
  - lib/appsignal/extension.rb
210
212
  - lib/appsignal/extension/jruby.rb
211
213
  - lib/appsignal/garbage_collection.rb
212
- - lib/appsignal/heartbeat.rb
213
- - lib/appsignal/helpers/heartbeats.rb
214
+ - lib/appsignal/helpers/heartbeat.rb
214
215
  - lib/appsignal/helpers/instrumentation.rb
215
216
  - lib/appsignal/helpers/metrics.rb
216
217
  - lib/appsignal/hooks.rb
@@ -312,6 +313,7 @@ files:
312
313
  - spec/lib/appsignal/auth_check_spec.rb
313
314
  - spec/lib/appsignal/capistrano2_spec.rb
314
315
  - spec/lib/appsignal/capistrano3_spec.rb
316
+ - spec/lib/appsignal/check_in_spec.rb
315
317
  - spec/lib/appsignal/cli/demo_spec.rb
316
318
  - spec/lib/appsignal/cli/diagnose/paths_spec.rb
317
319
  - spec/lib/appsignal/cli/diagnose/utils_spec.rb
@@ -336,7 +338,6 @@ files:
336
338
  - spec/lib/appsignal/extension_install_failure_spec.rb
337
339
  - spec/lib/appsignal/extension_spec.rb
338
340
  - spec/lib/appsignal/garbage_collection_spec.rb
339
- - spec/lib/appsignal/heartbeat_spec.rb
340
341
  - spec/lib/appsignal/hooks/action_cable_spec.rb
341
342
  - spec/lib/appsignal/hooks/action_mailer_spec.rb
342
343
  - spec/lib/appsignal/hooks/active_support_notifications/finish_with_state_shared_examples.rb
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Appsignal
4
- class Heartbeat
5
- class << self
6
- # @api private
7
- def transmitter
8
- @transmitter ||= Appsignal::Transmitter.new(
9
- "#{Appsignal.config[:logging_endpoint]}/heartbeats/json"
10
- )
11
- end
12
- end
13
-
14
- attr_reader :name, :id
15
-
16
- def initialize(name:)
17
- @name = name
18
- @id = SecureRandom.hex(8)
19
- end
20
-
21
- def start
22
- transmit_event("start")
23
- end
24
-
25
- def finish
26
- transmit_event("finish")
27
- end
28
-
29
- private
30
-
31
- def event(kind)
32
- {
33
- :name => name,
34
- :id => @id,
35
- :kind => kind,
36
- :timestamp => Time.now.utc.to_i
37
- }
38
- end
39
-
40
- def transmit_event(kind)
41
- unless Appsignal.active?
42
- Appsignal.internal_logger.debug("AppSignal not active, not transmitting heartbeat event")
43
- return
44
- end
45
-
46
- response = self.class.transmitter.transmit(event(kind))
47
-
48
- if response.code.to_i >= 200 && response.code.to_i < 300
49
- Appsignal.internal_logger.debug("Transmitted heartbeat `#{name}` (#{id}) #{kind} event")
50
- else
51
- Appsignal.internal_logger.error(
52
- "Failed to transmit heartbeat event: status code was #{response.code}"
53
- )
54
- end
55
- rescue => e
56
- Appsignal.internal_logger.error("Failed to transmit heartbeat event: #{e}")
57
- end
58
- end
59
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Appsignal
4
- module Helpers
5
- module Heartbeats
6
- # Track heartbeats
7
- #
8
- # Track the execution of certain processes by sending a hearbeat.
9
- #
10
- # To track the duration of a piece of code, pass a block to {.heartbeat}
11
- # to report both when the process starts, and when it finishes.
12
- #
13
- # If an exception is raised within the block, the finish event will not
14
- # be reported, triggering a notification about the missing heartbeat. The
15
- # exception will bubble outside of the heartbeat block.
16
- #
17
- # @example Send a heartbeat
18
- # Appsignal.heartbeat("send_invoices")
19
- #
20
- # @example Send a heartbeat with duration
21
- # Appsignal.heartbeat("send_invoices") do
22
- # # your code
23
- # end
24
- #
25
- # @param name [String] name of the heartbeat to report.
26
- # @yield the block to monitor.
27
- # @return [void]
28
- # @since 3.7.0
29
- # @see https://docs.appsignal.com/heartbeats
30
- def heartbeat(name)
31
- heartbeat = Appsignal::Heartbeat.new(:name => name)
32
- output = nil
33
-
34
- if block_given?
35
- heartbeat.start
36
- output = yield
37
- end
38
-
39
- heartbeat.finish
40
- output
41
- end
42
- end
43
- end
44
- end
@@ -1,127 +0,0 @@
1
- describe Appsignal::Heartbeat do
2
- let(:config) { project_fixture_config }
3
- let(:heartbeat) { described_class.new(:name => "heartbeat-name") }
4
- let(:transmitter) { Appsignal::Transmitter.new("http://heartbeats/", config) }
5
-
6
- before(:each) do
7
- allow(Appsignal).to receive(:active?).and_return(true)
8
- config.logger = Logger.new(StringIO.new)
9
- allow(Appsignal::Heartbeat).to receive(:transmitter).and_return(transmitter)
10
- end
11
-
12
- describe "when Appsignal is not active" do
13
- it "should not transmit any events" do
14
- allow(Appsignal).to receive(:active?).and_return(false)
15
- expect(transmitter).not_to receive(:transmit)
16
-
17
- heartbeat.start
18
- heartbeat.finish
19
- end
20
- end
21
-
22
- describe "#start" do
23
- it "should send a heartbeat start" do
24
- expect(transmitter).to receive(:transmit).with(hash_including(
25
- :name => "heartbeat-name",
26
- :kind => "start"
27
- )).and_return(Net::HTTPResponse.new(nil, "200", nil))
28
-
29
- expect(Appsignal.internal_logger).to receive(:debug).with(
30
- "Transmitted heartbeat `heartbeat-name` (#{heartbeat.id}) start event"
31
- )
32
- expect(Appsignal.internal_logger).not_to receive(:error)
33
-
34
- heartbeat.start
35
- end
36
-
37
- it "should log an error if it fails" do
38
- expect(transmitter).to receive(:transmit).with(hash_including(
39
- :name => "heartbeat-name",
40
- :kind => "start"
41
- )).and_return(Net::HTTPResponse.new(nil, "499", nil))
42
-
43
- expect(Appsignal.internal_logger).not_to receive(:debug)
44
- expect(Appsignal.internal_logger).to receive(:error).with(
45
- "Failed to transmit heartbeat event: status code was 499"
46
- )
47
-
48
- heartbeat.start
49
- end
50
- end
51
-
52
- describe "#finish" do
53
- it "should send a heartbeat finish" do
54
- expect(transmitter).to receive(:transmit).with(hash_including(
55
- :name => "heartbeat-name",
56
- :kind => "finish"
57
- )).and_return(Net::HTTPResponse.new(nil, "200", nil))
58
-
59
- expect(Appsignal.internal_logger).to receive(:debug).with(
60
- "Transmitted heartbeat `heartbeat-name` (#{heartbeat.id}) finish event"
61
- )
62
- expect(Appsignal.internal_logger).not_to receive(:error)
63
-
64
- heartbeat.finish
65
- end
66
-
67
- it "should log an error if it fails" do
68
- expect(transmitter).to receive(:transmit).with(hash_including(
69
- :name => "heartbeat-name",
70
- :kind => "finish"
71
- )).and_return(Net::HTTPResponse.new(nil, "499", nil))
72
-
73
- expect(Appsignal.internal_logger).not_to receive(:debug)
74
- expect(Appsignal.internal_logger).to receive(:error).with(
75
- "Failed to transmit heartbeat event: status code was 499"
76
- )
77
-
78
- heartbeat.finish
79
- end
80
- end
81
-
82
- describe ".heartbeat" do
83
- describe "when a block is given" do
84
- it "should send a heartbeat start and finish and return the block output" do
85
- expect(transmitter).to receive(:transmit).with(hash_including(
86
- :kind => "start",
87
- :name => "heartbeat-with-block"
88
- )).and_return(nil)
89
-
90
- expect(transmitter).to receive(:transmit).with(hash_including(
91
- :kind => "finish",
92
- :name => "heartbeat-with-block"
93
- )).and_return(nil)
94
-
95
- output = Appsignal.heartbeat("heartbeat-with-block") { "output" }
96
- expect(output).to eq("output")
97
- end
98
-
99
- it "should not send a heartbeat finish event when an error is raised" do
100
- expect(transmitter).to receive(:transmit).with(hash_including(
101
- :kind => "start",
102
- :name => "heartbeat-with-block"
103
- )).and_return(nil)
104
-
105
- expect(transmitter).not_to receive(:transmit).with(hash_including(
106
- :kind => "finish",
107
- :name => "heartbeat-with-block"
108
- ))
109
-
110
- expect do
111
- Appsignal.heartbeat("heartbeat-with-block") { raise "error" }
112
- end.to raise_error(RuntimeError, "error")
113
- end
114
- end
115
-
116
- describe "when no block is given" do
117
- it "should only send a heartbeat finish event" do
118
- expect(transmitter).to receive(:transmit).with(hash_including(
119
- :kind => "finish",
120
- :name => "heartbeat-without-block"
121
- )).and_return(nil)
122
-
123
- Appsignal.heartbeat("heartbeat-without-block")
124
- end
125
- end
126
- end
127
- end