appsignal 3.1.6 → 3.2.0

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: 7a3a10bbc00539eeb5809a449c341151d7fdd87bdeb81c85e9a7778ef4b49857
4
- data.tar.gz: a5e646a6124dd3a9173d3a30ec19463076a50b96e8b4320ef54c909fdc2aad22
3
+ metadata.gz: cd715e8a61874a51afc35e53277017a58e5a378020fbabeb741bd50d671a2e0c
4
+ data.tar.gz: ab9233cb944b2f35eaf7639a918306ceac42c4de57a337295eeb72d3249043dc
5
5
  SHA512:
6
- metadata.gz: f0038a47accbfd1d2f69bb7c9b1db650bb974d416674285afddf2570e9ea19bd9958dfeb3b24d8f950f058af0a9d63ba212920e632ea5dbb5a2ece55b237e1fe
7
- data.tar.gz: 3761cf3f55137ac16e63a740d917e0f83a75d8d72ad93cbd52aa1de09a61bd3631dc8e6f537ada82d36c7e8a0395b1e05f5d76084508dd00169a2ef67c77a83d
6
+ metadata.gz: 66208a0db24d831de032425ea1b536b33d9b3d6739f908193a6c0366e80c13aec303a5af90b6d214eeb007e3ee3ffbaf002d23493d87cc1d77eacd7d6c7a0bc2
7
+ data.tar.gz: 64477a38482899aed37b742fa3b8d76b9c562edb46973881bb2881a2eaa3d469ea390516d3ab90f02e2675d27df492b0b516d5679feec9690f167d6b6a983c7f
@@ -570,6 +570,24 @@ blocks:
570
570
  value: latest
571
571
  commands:
572
572
  - "./support/bundler_wrapper exec rake test"
573
+ - name: Ruby 2.6.9 for http5
574
+ env_vars:
575
+ - *2
576
+ - *3
577
+ - *4
578
+ - *5
579
+ - name: RUBY_VERSION
580
+ value: 2.6.9
581
+ - name: GEMSET
582
+ value: http5
583
+ - name: BUNDLE_GEMFILE
584
+ value: gemfiles/http5.gemfile
585
+ - name: _RUBYGEMS_VERSION
586
+ value: latest
587
+ - name: _BUNDLER_VERSION
588
+ value: latest
589
+ commands:
590
+ - "./support/bundler_wrapper exec rake test"
573
591
  - name: Ruby 2.6.9 for padrino
574
592
  env_vars:
575
593
  - *2
@@ -923,6 +941,24 @@ blocks:
923
941
  value: latest
924
942
  commands:
925
943
  - "./support/bundler_wrapper exec rake test"
944
+ - name: Ruby 2.7.5 for http5
945
+ env_vars:
946
+ - *2
947
+ - *3
948
+ - *4
949
+ - *5
950
+ - name: RUBY_VERSION
951
+ value: 2.7.5
952
+ - name: GEMSET
953
+ value: http5
954
+ - name: BUNDLE_GEMFILE
955
+ value: gemfiles/http5.gemfile
956
+ - name: _RUBYGEMS_VERSION
957
+ value: latest
958
+ - name: _BUNDLER_VERSION
959
+ value: latest
960
+ commands:
961
+ - "./support/bundler_wrapper exec rake test"
926
962
  - name: Ruby 2.7.5 for padrino
927
963
  env_vars:
928
964
  - *2
@@ -1294,6 +1330,24 @@ blocks:
1294
1330
  value: latest
1295
1331
  commands:
1296
1332
  - "./support/bundler_wrapper exec rake test"
1333
+ - name: Ruby 3.0.3 for http5
1334
+ env_vars:
1335
+ - *2
1336
+ - *3
1337
+ - *4
1338
+ - *5
1339
+ - name: RUBY_VERSION
1340
+ value: 3.0.3
1341
+ - name: GEMSET
1342
+ value: http5
1343
+ - name: BUNDLE_GEMFILE
1344
+ value: gemfiles/http5.gemfile
1345
+ - name: _RUBYGEMS_VERSION
1346
+ value: latest
1347
+ - name: _BUNDLER_VERSION
1348
+ value: latest
1349
+ commands:
1350
+ - "./support/bundler_wrapper exec rake test"
1297
1351
  - name: Ruby 3.0.3 for padrino
1298
1352
  env_vars:
1299
1353
  - *2
@@ -1611,6 +1665,24 @@ blocks:
1611
1665
  value: latest
1612
1666
  commands:
1613
1667
  - "./support/bundler_wrapper exec rake test"
1668
+ - name: Ruby 3.1.1 for http5
1669
+ env_vars:
1670
+ - *2
1671
+ - *3
1672
+ - *4
1673
+ - *5
1674
+ - name: RUBY_VERSION
1675
+ value: 3.1.1
1676
+ - name: GEMSET
1677
+ value: http5
1678
+ - name: BUNDLE_GEMFILE
1679
+ value: gemfiles/http5.gemfile
1680
+ - name: _RUBYGEMS_VERSION
1681
+ value: latest
1682
+ - name: _BUNDLER_VERSION
1683
+ value: latest
1684
+ commands:
1685
+ - "./support/bundler_wrapper exec rake test"
1614
1686
  - name: Ruby 3.1.1 for padrino
1615
1687
  env_vars:
1616
1688
  - *2
@@ -1910,6 +1982,24 @@ blocks:
1910
1982
  value: latest
1911
1983
  commands:
1912
1984
  - "./support/bundler_wrapper exec rake test"
1985
+ - name: Ruby 3.2.0-preview1 for http5
1986
+ env_vars:
1987
+ - *2
1988
+ - *3
1989
+ - *4
1990
+ - *5
1991
+ - name: RUBY_VERSION
1992
+ value: 3.2.0-preview1
1993
+ - name: GEMSET
1994
+ value: http5
1995
+ - name: BUNDLE_GEMFILE
1996
+ value: gemfiles/http5.gemfile
1997
+ - name: _RUBYGEMS_VERSION
1998
+ value: latest
1999
+ - name: _BUNDLER_VERSION
2000
+ value: latest
2001
+ commands:
2002
+ - "./support/bundler_wrapper exec rake test"
1913
2003
  - name: Ruby 3.2.0-preview1 for padrino
1914
2004
  env_vars:
1915
2005
  - *2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # AppSignal for Ruby gem Changelog
2
2
 
3
+ ## 3.2.0
4
+
5
+ ### Added
6
+
7
+ - [199d05c0](https://github.com/appsignal/appsignal-ruby/commit/199d05c0f95be7f2496ddcd05613eb816e9ad4e4) minor - Support the http.rb gem. Any outgoing requests will be tracked as events on the incident event timeline. This instrumentation is activated automatically, but can be disable by setting the `instrumentation_http_rb` option to `false`.
8
+ - [9bcd107d](https://github.com/appsignal/appsignal-ruby/commit/9bcd107de955e557744434fc9f953588a9c7bc49) minor - Support log collection from Ruby apps using the new AppSignal Logging feature. Learn more about [AppSignal's Logging on our docs](https://docs.appsignal.com/logging/platforms/integrations/ruby.html).
9
+
3
10
  ## 3.1.6
4
11
 
5
12
  ### Fixed
data/README.md CHANGED
@@ -232,6 +232,7 @@ configurations you need to run the spec suite with a specific Gemfile.
232
232
  BUNDLE_GEMFILE=gemfiles/capistrano2.gemfile bundle exec rspec
233
233
  BUNDLE_GEMFILE=gemfiles/capistrano3.gemfile bundle exec rspec
234
234
  BUNDLE_GEMFILE=gemfiles/grape.gemfile bundle exec rspec
235
+ BUNDLE_GEMFILE=gemfiles/http5.gemfile bundle exec rspec
235
236
  BUNDLE_GEMFILE=gemfiles/no_dependencies.gemfile bundle exec rspec
236
237
  BUNDLE_GEMFILE=gemfiles/padrino.gemfile bundle exec rspec
237
238
  BUNDLE_GEMFILE=gemfiles/que.gemfile bundle exec rspec
data/build_matrix.yml CHANGED
@@ -212,6 +212,7 @@ matrix:
212
212
  - gem: "capistrano2"
213
213
  - gem: "capistrano3"
214
214
  - gem: "grape"
215
+ - gem: "http5"
215
216
  - gem: "padrino"
216
217
  - gem: "psych-3"
217
218
  only:
data/ext/agent.yml CHANGED
@@ -3,99 +3,99 @@
3
3
  # appsignal-agent repository.
4
4
  # Modifications to this file will be overwritten with the next agent release.
5
5
  ---
6
- version: 813a59b
6
+ version: 9b62288
7
7
  mirrors:
8
8
  - https://appsignal-agent-releases.global.ssl.fastly.net
9
9
  - https://d135dj0rjqvssy.cloudfront.net
10
10
  triples:
11
11
  x86_64-darwin:
12
12
  static:
13
- checksum: c8919a19a28950f726221829ea4d2b3312f1595a5e28ea134f8c41ed0814d7cd
13
+ checksum: 5ff2ec4f16f5089e15188670b2c43866c76ab5db2ac07d72878a9816e63171ca
14
14
  filename: appsignal-x86_64-darwin-all-static.tar.gz
15
15
  dynamic:
16
- checksum: 1c10139bc4df56048a71766b64eba76462ee38d3cc814dc230e0fdb3c7e4fba3
16
+ checksum: c7b1ddd0efbd5fb5c48e7124ab13202c7b5fa2624354db66ebc2673d7196ce31
17
17
  filename: appsignal-x86_64-darwin-all-dynamic.tar.gz
18
18
  universal-darwin:
19
19
  static:
20
- checksum: c8919a19a28950f726221829ea4d2b3312f1595a5e28ea134f8c41ed0814d7cd
20
+ checksum: 5ff2ec4f16f5089e15188670b2c43866c76ab5db2ac07d72878a9816e63171ca
21
21
  filename: appsignal-x86_64-darwin-all-static.tar.gz
22
22
  dynamic:
23
- checksum: 1c10139bc4df56048a71766b64eba76462ee38d3cc814dc230e0fdb3c7e4fba3
23
+ checksum: c7b1ddd0efbd5fb5c48e7124ab13202c7b5fa2624354db66ebc2673d7196ce31
24
24
  filename: appsignal-x86_64-darwin-all-dynamic.tar.gz
25
25
  aarch64-darwin:
26
26
  static:
27
- checksum: 40a38896132f418362af9fb2e9796eb4479e13cc0691b61f0f0b81b77e66ded6
27
+ checksum: 9dfdfd6697b3eeeb80a30356fdc1d03a79b8601f18cedd1b2c1442e512d2ed6a
28
28
  filename: appsignal-aarch64-darwin-all-static.tar.gz
29
29
  dynamic:
30
- checksum: 40ec0c7db246cfc9b8eeebc882b07ba625948f376a53d8e24add7148d0f8c067
30
+ checksum: 1fe7a4e2b9e424ccce17c5c7422c84e29531507f672f6cebdd42a3f74feee0b9
31
31
  filename: appsignal-aarch64-darwin-all-dynamic.tar.gz
32
32
  arm64-darwin:
33
33
  static:
34
- checksum: 40a38896132f418362af9fb2e9796eb4479e13cc0691b61f0f0b81b77e66ded6
34
+ checksum: 9dfdfd6697b3eeeb80a30356fdc1d03a79b8601f18cedd1b2c1442e512d2ed6a
35
35
  filename: appsignal-aarch64-darwin-all-static.tar.gz
36
36
  dynamic:
37
- checksum: 40ec0c7db246cfc9b8eeebc882b07ba625948f376a53d8e24add7148d0f8c067
37
+ checksum: 1fe7a4e2b9e424ccce17c5c7422c84e29531507f672f6cebdd42a3f74feee0b9
38
38
  filename: appsignal-aarch64-darwin-all-dynamic.tar.gz
39
39
  arm-darwin:
40
40
  static:
41
- checksum: 40a38896132f418362af9fb2e9796eb4479e13cc0691b61f0f0b81b77e66ded6
41
+ checksum: 9dfdfd6697b3eeeb80a30356fdc1d03a79b8601f18cedd1b2c1442e512d2ed6a
42
42
  filename: appsignal-aarch64-darwin-all-static.tar.gz
43
43
  dynamic:
44
- checksum: 40ec0c7db246cfc9b8eeebc882b07ba625948f376a53d8e24add7148d0f8c067
44
+ checksum: 1fe7a4e2b9e424ccce17c5c7422c84e29531507f672f6cebdd42a3f74feee0b9
45
45
  filename: appsignal-aarch64-darwin-all-dynamic.tar.gz
46
46
  aarch64-linux:
47
47
  static:
48
- checksum: c73b6e9de849a40290a0d90eaad43ea41a9a0293ba4b8bf99f69965c45c85514
48
+ checksum: 0e5d89aeda1e883c912ff069bb76029a1e3cad69f493865d877ffaffa2b45142
49
49
  filename: appsignal-aarch64-linux-all-static.tar.gz
50
50
  dynamic:
51
- checksum: 90226eefe2e2f66833ca3e31c69ce70763ed57916bd0b5c1809bd99d61ff3429
51
+ checksum: 58b09bf6ca7761a4d68cd9de87a0bb45b3465ace90b62a88d9fe77f629c26d7d
52
52
  filename: appsignal-aarch64-linux-all-dynamic.tar.gz
53
53
  i686-linux:
54
54
  static:
55
- checksum: 6741b9a068dc405b3d6d07953fab7fc876c21b4add1cbb2b4c4c4dfdeca5d387
55
+ checksum: ff3cffb1204afd846ba0bb33c50b03f8ada8305527a5908ccfebed6fdcce0e61
56
56
  filename: appsignal-i686-linux-all-static.tar.gz
57
57
  dynamic:
58
- checksum: 1af902b37af378a06251365fb637f86298380d3627c54f2945a85c1b7f075fda
58
+ checksum: '0895a85c3df276864807f7b2572c96ea8c8cd3cc770b7cf02656c6bd01981b59'
59
59
  filename: appsignal-i686-linux-all-dynamic.tar.gz
60
60
  x86-linux:
61
61
  static:
62
- checksum: 6741b9a068dc405b3d6d07953fab7fc876c21b4add1cbb2b4c4c4dfdeca5d387
62
+ checksum: ff3cffb1204afd846ba0bb33c50b03f8ada8305527a5908ccfebed6fdcce0e61
63
63
  filename: appsignal-i686-linux-all-static.tar.gz
64
64
  dynamic:
65
- checksum: 1af902b37af378a06251365fb637f86298380d3627c54f2945a85c1b7f075fda
65
+ checksum: '0895a85c3df276864807f7b2572c96ea8c8cd3cc770b7cf02656c6bd01981b59'
66
66
  filename: appsignal-i686-linux-all-dynamic.tar.gz
67
67
  x86_64-linux:
68
68
  static:
69
- checksum: 8355b017093db606014023cc617d84d6375d503d7ffa54f62c7b3dc56fb64ead
69
+ checksum: 0b6fe4b343461a1a906fc73edb44bc5b12c75214d21fc81ed26d3eb88588003e
70
70
  filename: appsignal-x86_64-linux-all-static.tar.gz
71
71
  dynamic:
72
- checksum: 7c239a7ffe18cb173120bd67fb96563f4a81f0744bbbb47082f077a38ccbe5f1
72
+ checksum: 82117daf3e1c550526f74f4ec66c403bed22aa8600459b749858814589ed688b
73
73
  filename: appsignal-x86_64-linux-all-dynamic.tar.gz
74
74
  x86_64-linux-musl:
75
75
  static:
76
- checksum: e9d98ed23b872dbf1e67a081473918cf88c4af775b1caadbfd93deda2635d9f8
76
+ checksum: b3f52d7a7a1f4ae8095dd5b1207270dc1797766820d925aca0d09133983c9163
77
77
  filename: appsignal-x86_64-linux-musl-all-static.tar.gz
78
78
  dynamic:
79
- checksum: 5538172a95dfca1a4cf8e111ba61eab5e9c16314fa902259711cb9e8e0d2f85e
79
+ checksum: 5de9ddc90fc5beb308eadd5381ac0360692cb32e58dcaf0b0d7ecd3dabf44499
80
80
  filename: appsignal-x86_64-linux-musl-all-dynamic.tar.gz
81
81
  aarch64-linux-musl:
82
82
  static:
83
- checksum: 0fb3eacfb8c8bc01c4acc8916327626720de376bcdd95104be71bb11a4ff9215
83
+ checksum: d306c50cc9f1bc8ea3339b4185b2a60a1c27f17d9067a529b1889d74c6c0a8d6
84
84
  filename: appsignal-aarch64-linux-musl-all-static.tar.gz
85
85
  dynamic:
86
- checksum: b87bcedaa2aa886acf3a93ce6e32762a843f3bee1ca7a8f9e0d17ca32f7a7d39
86
+ checksum: e3015e05a807ef5027ea8929a917873bcdaf714138ab5d6d028e3c855b3a61d3
87
87
  filename: appsignal-aarch64-linux-musl-all-dynamic.tar.gz
88
88
  x86_64-freebsd:
89
89
  static:
90
- checksum: b7d3c244b7068213840f5970df2e318d98f7909eb3b2b4ab42441d064ffb19ee
90
+ checksum: 135d2ff898f30b15721eca36569d1a0a5deaaee7b4787937d0888ed49f25019b
91
91
  filename: appsignal-x86_64-freebsd-all-static.tar.gz
92
92
  dynamic:
93
- checksum: 0a739134f11d50318d14f247df1f8cc0f8aec1fbcb70a8bc48d5e1f22dc4aaba
93
+ checksum: 873aea3c808b7de431881f2f4b4dae686b20b309e76e3eefbb71e399ebea5284
94
94
  filename: appsignal-x86_64-freebsd-all-dynamic.tar.gz
95
95
  amd64-freebsd:
96
96
  static:
97
- checksum: b7d3c244b7068213840f5970df2e318d98f7909eb3b2b4ab42441d064ffb19ee
97
+ checksum: 135d2ff898f30b15721eca36569d1a0a5deaaee7b4787937d0888ed49f25019b
98
98
  filename: appsignal-x86_64-freebsd-all-static.tar.gz
99
99
  dynamic:
100
- checksum: 0a739134f11d50318d14f247df1f8cc0f8aec1fbcb70a8bc48d5e1f22dc4aaba
100
+ checksum: 873aea3c808b7de431881f2f4b4dae686b20b309e76e3eefbb71e399ebea5284
101
101
  filename: appsignal-x86_64-freebsd-all-dynamic.tar.gz
@@ -720,6 +720,26 @@ static VALUE close_span(VALUE self) {
720
720
  return Qnil;
721
721
  }
722
722
 
723
+ static VALUE a_log(VALUE self, VALUE group, VALUE severity, VALUE message, VALUE attributes) {
724
+ appsignal_data_t* attributes_data;
725
+
726
+ Check_Type(group, T_STRING);
727
+ Check_Type(severity, T_FIXNUM);
728
+ Check_Type(message, T_STRING);
729
+ Check_Type(attributes, RUBY_T_DATA);
730
+
731
+ Data_Get_Struct(attributes, appsignal_data_t, attributes_data);
732
+
733
+ appsignal_log(
734
+ make_appsignal_string(group),
735
+ FIX2INT(severity),
736
+ make_appsignal_string(message),
737
+ attributes_data
738
+ );
739
+
740
+ return Qnil;
741
+ }
742
+
723
743
  static VALUE set_gauge(VALUE self, VALUE key, VALUE value, VALUE tags) {
724
744
  appsignal_data_t* tags_data;
725
745
 
@@ -834,6 +854,8 @@ void Init_appsignal_extension(void) {
834
854
  rb_define_singleton_method(Extension, "stop", stop, 0);
835
855
  // Diagnostics
836
856
  rb_define_singleton_method(Extension, "diagnose", diagnose, 0);
857
+ // Logging
858
+ rb_define_singleton_method(Extension, "log", a_log, 4);
837
859
 
838
860
  // Server state
839
861
  rb_define_singleton_method(Extension, "get_server_state", get_server_state, 1);
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'http', '~> 5.0'
4
+
5
+ gemspec :path => '../'
@@ -25,10 +25,12 @@ module Appsignal
25
25
  :ignore_actions => [],
26
26
  :ignore_errors => [],
27
27
  :ignore_namespaces => [],
28
+ :instrument_http_rb => true,
28
29
  :instrument_net_http => true,
29
30
  :instrument_redis => true,
30
31
  :instrument_sequel => true,
31
32
  :log => "file",
33
+ :logging_endpoint => "https://appsignal-endpoint.net",
32
34
  :request_headers => %w[
33
35
  HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING
34
36
  HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_CONNECTION
@@ -42,17 +44,17 @@ module Appsignal
42
44
  }.freeze
43
45
 
44
46
  # @api private
45
- DEFAULT_LOG_LEVEL = Logger::INFO
47
+ DEFAULT_LOG_LEVEL = ::Logger::INFO
46
48
  # Map from the `log_level` config option to Ruby's Logger level value.
47
49
  #
48
50
  # The trace level doesn't exist in the Ruby logger so it's mapped to debug.
49
51
  # @api private
50
52
  LOG_LEVEL_MAP = {
51
- "error" => Logger::ERROR,
52
- "warn" => Logger::WARN,
53
- "info" => Logger::INFO,
54
- "debug" => Logger::DEBUG,
55
- "trace" => Logger::DEBUG
53
+ "error" => ::Logger::ERROR,
54
+ "warn" => ::Logger::WARN,
55
+ "info" => ::Logger::INFO,
56
+ "debug" => ::Logger::DEBUG,
57
+ "trace" => ::Logger::DEBUG
56
58
  }.freeze
57
59
 
58
60
  ENV_TO_KEY_MAPPING = {
@@ -73,12 +75,14 @@ module Appsignal
73
75
  "APPSIGNAL_IGNORE_ACTIONS" => :ignore_actions,
74
76
  "APPSIGNAL_IGNORE_ERRORS" => :ignore_errors,
75
77
  "APPSIGNAL_IGNORE_NAMESPACES" => :ignore_namespaces,
78
+ "APPSIGNAL_INSTRUMENT_HTTP_RB" => :instrument_http_rb,
76
79
  "APPSIGNAL_INSTRUMENT_NET_HTTP" => :instrument_net_http,
77
80
  "APPSIGNAL_INSTRUMENT_REDIS" => :instrument_redis,
78
81
  "APPSIGNAL_INSTRUMENT_SEQUEL" => :instrument_sequel,
79
82
  "APPSIGNAL_LOG" => :log,
80
83
  "APPSIGNAL_LOG_LEVEL" => :log_level,
81
84
  "APPSIGNAL_LOG_PATH" => :log_path,
85
+ "APPSIGNAL_LOGGING_ENDPOINT" => :logging_endpoint,
82
86
  "APPSIGNAL_PUSH_API_ENDPOINT" => :endpoint,
83
87
  "APPSIGNAL_PUSH_API_KEY" => :push_api_key,
84
88
  "APPSIGNAL_REQUEST_HEADERS" => :request_headers,
@@ -101,6 +105,7 @@ module Appsignal
101
105
  APPSIGNAL_LOG
102
106
  APPSIGNAL_LOG_LEVEL
103
107
  APPSIGNAL_LOG_PATH
108
+ APPSIGNAL_LOGGING_ENDPOINT
104
109
  APPSIGNAL_PUSH_API_ENDPOINT
105
110
  APPSIGNAL_PUSH_API_KEY
106
111
  APPSIGNAL_WORKING_DIRECTORY_PATH
@@ -116,6 +121,7 @@ module Appsignal
116
121
  APPSIGNAL_ENABLE_MINUTELY_PROBES
117
122
  APPSIGNAL_ENABLE_STATSD
118
123
  APPSIGNAL_FILES_WORLD_ACCESSIBLE
124
+ APPSIGNAL_INSTRUMENT_HTTP_RB
119
125
  APPSIGNAL_INSTRUMENT_NET_HTTP
120
126
  APPSIGNAL_INSTRUMENT_REDIS
121
127
  APPSIGNAL_INSTRUMENT_SEQUEL
@@ -260,7 +266,7 @@ module Appsignal
260
266
 
261
267
  def log_level
262
268
  if config_hash[:debug] || config_hash[:transaction_debug_mode]
263
- level = Logger::DEBUG
269
+ level = ::Logger::DEBUG
264
270
  end
265
271
  option = config_hash[:log_level]
266
272
  if option
@@ -320,6 +326,7 @@ module Appsignal
320
326
  ENV["_APPSIGNAL_LOG"] = config_hash[:log]
321
327
  ENV["_APPSIGNAL_LOG_LEVEL"] = config_hash[:log_level]
322
328
  ENV["_APPSIGNAL_LOG_FILE_PATH"] = log_file_path.to_s if log_file_path
329
+ ENV["_APPSIGNAL_LOGGING_ENDPOINT"] = config_hash[:logging_endpoint]
323
330
  ENV["_APPSIGNAL_PROCESS_NAME"] = $PROGRAM_NAME
324
331
  ENV["_APPSIGNAL_PUSH_API_ENDPOINT"] = config_hash[:endpoint]
325
332
  ENV["_APPSIGNAL_PUSH_API_KEY"] = config_hash[:push_api_key]
@@ -81,6 +81,11 @@ module Appsignal
81
81
  [:appsignal_string, :double, :pointer],
82
82
  :void
83
83
 
84
+ # Logging methods
85
+ attach_function :appsignal_log,
86
+ [:appsignal_string, :int32, :appsignal_string, :pointer],
87
+ :void
88
+
84
89
  # Transaction methods
85
90
  attach_function :appsignal_free_transaction,
86
91
  [:pointer],
@@ -264,6 +269,15 @@ module Appsignal
264
269
  make_ruby_string state if state[:len] > 0
265
270
  end
266
271
 
272
+ def log(group, level, message, attributes)
273
+ appsignal_log(
274
+ make_appsignal_string(group),
275
+ level,
276
+ make_appsignal_string(message),
277
+ attributes.pointer
278
+ )
279
+ end
280
+
267
281
  def start_transaction(transaction_id, namespace, gc_duration_ms)
268
282
  transaction = appsignal_start_transaction(
269
283
  make_appsignal_string(transaction_id),
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appsignal
4
+ class Hooks
5
+ # @api private
6
+ class HttpHook < Appsignal::Hooks::Hook
7
+ register :http_rb
8
+
9
+ def dependencies_present?
10
+ defined?(HTTP::Client) && Appsignal.config && Appsignal.config[:instrument_http_rb]
11
+ end
12
+
13
+ def install
14
+ require "appsignal/integrations/http"
15
+ HTTP::Client.send(:prepend, Appsignal::Integrations::HttpIntegration)
16
+
17
+ Appsignal::Environment.report_enabled("http_rb")
18
+ end
19
+ end
20
+ end
21
+ end
@@ -94,6 +94,7 @@ require "appsignal/hooks/active_job"
94
94
  require "appsignal/hooks/active_support_notifications"
95
95
  require "appsignal/hooks/celluloid"
96
96
  require "appsignal/hooks/delayed_job"
97
+ require "appsignal/hooks/http"
97
98
  require "appsignal/hooks/mri"
98
99
  require "appsignal/hooks/net_http"
99
100
  require "appsignal/hooks/passenger"
@@ -19,7 +19,7 @@ module Appsignal
19
19
  ENV["PWD"],
20
20
  env,
21
21
  {},
22
- Logger.new(StringIO.new)
22
+ Appsignal::Utils::IntegrationLogger.new(StringIO.new)
23
23
  ).tap do |c|
24
24
  fetch(:appsignal_config, {}).each do |key, value|
25
25
  c[key] = value
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appsignal
4
+ module Integrations
5
+ module HttpIntegration
6
+ def request(verb, uri, opts = {})
7
+ parsed_request_uri = URI.parse(uri)
8
+ request_uri = "#{parsed_request_uri.scheme}://#{parsed_request_uri.host}"
9
+
10
+ begin
11
+ Appsignal.instrument("request.http_rb", "#{verb.upcase} #{request_uri}") do
12
+ super
13
+ end
14
+ rescue Exception => error # rubocop:disable Lint/RescueException
15
+ Appsignal.set_error(error)
16
+ raise error
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -3,20 +3,137 @@
3
3
  require "logger"
4
4
  require "set"
5
5
 
6
- # Subclass of logger with method to only log a warning once
7
- # prevents the log from filling up with repeated messages.
8
6
  module Appsignal
7
+ # Logger that flushes logs to the AppSignal logging service
9
8
  class Logger < ::Logger
10
- def seen_keys
11
- @seen_keys ||= Set.new
9
+ # Create a new logger instance
10
+ #
11
+ # @param group Name of the group for this logger.
12
+ # @param level Log level to filter with
13
+ # @return [void]
14
+ def initialize(group, level = INFO)
15
+ raise TypeError, "group must be a string" unless group.is_a? String
16
+ @group = group
17
+ @level = level
12
18
  end
13
19
 
14
- def warn_once_then_debug(key, message)
15
- if !seen_keys.add?(key).nil?
16
- warn message
17
- else
18
- debug message
20
+ # We support the various methods in the Ruby
21
+ # logger class by supplying this method.
22
+ # @api private
23
+ def add(severity, message = nil, group = nil)
24
+ severity ||= UNKNOWN
25
+ return true if severity < level
26
+ group = @group if group.nil?
27
+ if message.nil?
28
+ if block_given?
29
+ message = yield
30
+ else
31
+ message = progname
32
+ group = @group
33
+ end
19
34
  end
35
+ return if message.nil?
36
+ severity_number = case severity
37
+ when DEBUG
38
+ 2
39
+ when INFO
40
+ 3
41
+ when WARN
42
+ 5
43
+ when ERROR
44
+ 6
45
+ when FATAL
46
+ 7
47
+ else
48
+ 0
49
+ end
50
+ Appsignal::Extension.log(
51
+ group,
52
+ severity_number,
53
+ message,
54
+ Appsignal::Utils::Data.generate({})
55
+ )
56
+ end
57
+ alias log add
58
+
59
+ # Log a debug level message
60
+ # @param message Mesage to log
61
+ # @param attributes Attributes to tag the log with
62
+ # @return [void]
63
+ def debug(message = nil, attributes = {})
64
+ return if DEBUG < level
65
+ message = yield if message.nil? && block_given?
66
+ return if message.nil?
67
+ Appsignal::Extension.log(
68
+ @group,
69
+ 2,
70
+ message,
71
+ Appsignal::Utils::Data.generate(attributes)
72
+ )
73
+ end
74
+
75
+ # Log an info level message
76
+ # @param message Mesage to log
77
+ # @param attributes Attributes to tag the log with
78
+ # @return [void]
79
+ def info(message = nil, attributes = {})
80
+ return if INFO < level
81
+ message = yield if message.nil? && block_given?
82
+ return if message.nil?
83
+ Appsignal::Extension.log(
84
+ @group,
85
+ 3,
86
+ message,
87
+ Appsignal::Utils::Data.generate(attributes)
88
+ )
89
+ end
90
+
91
+ # Log a warn level message
92
+ # @param message Mesage to log
93
+ # @param attributes Attributes to tag the log with
94
+ # @return [void]
95
+ def warn(message = nil, attributes = {})
96
+ return if WARN < level
97
+ message = yield if message.nil? && block_given?
98
+ return if message.nil?
99
+ Appsignal::Extension.log(
100
+ @group,
101
+ 5,
102
+ message,
103
+ Appsignal::Utils::Data.generate(attributes)
104
+ )
105
+ end
106
+
107
+ # Log an error level message
108
+ # @param message Mesage to log
109
+ # @param attributes Attributes to tag the log with
110
+ # @return [void]
111
+ def error(message = nil, attributes = {})
112
+ return if ERROR < level
113
+ message = yield if message.nil? && block_given?
114
+ return if message.nil?
115
+ Appsignal::Extension.log(
116
+ @group,
117
+ 6,
118
+ message,
119
+ Appsignal::Utils::Data.generate(attributes)
120
+ )
121
+ end
122
+
123
+ # Log a fatal level message
124
+ # @param message Mesage to log
125
+ # @param attributes Attributes to tag the log with
126
+ # @return [void]
127
+ def fatal(message = nil, attributes = {})
128
+ return if FATAL < level
129
+ message = yield if message.nil? && block_given?
130
+ return if message.nil?
131
+ Appsignal::Extension.log(
132
+ @group,
133
+ 7,
134
+ message,
135
+ Appsignal::Utils::Data.generate(attributes)
136
+ )
20
137
  end
21
138
  end
22
139
  end
@@ -0,0 +1,19 @@
1
+ module Appsignal
2
+ module Utils
3
+ # Subclass of logger with method to only log a warning once
4
+ # prevents the local log from filling up with repeated messages.
5
+ class IntegrationLogger < ::Logger
6
+ def seen_keys
7
+ @seen_keys ||= Set.new
8
+ end
9
+
10
+ def warn_once_then_debug(key, message)
11
+ if !seen_keys.add?(key).nil?
12
+ warn message
13
+ else
14
+ debug message
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -3,5 +3,6 @@
3
3
  require "appsignal/utils/deprecation_message"
4
4
  require "appsignal/utils/data"
5
5
  require "appsignal/utils/hash_sanitizer"
6
+ require "appsignal/utils/integration_logger"
6
7
  require "appsignal/utils/json"
7
8
  require "appsignal/utils/query_params_sanitizer"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "3.1.6".freeze
4
+ VERSION = "3.2.0".freeze
5
5
  end
data/lib/appsignal.rb CHANGED
@@ -175,8 +175,8 @@ module Appsignal
175
175
  end
176
176
 
177
177
  def logger
178
- @logger ||= Appsignal::Logger.new(in_memory_log).tap do |l|
179
- l.level = Logger::INFO
178
+ @logger ||= Appsignal::Utils::IntegrationLogger.new(in_memory_log).tap do |l|
179
+ l.level = ::Logger::INFO
180
180
  l.formatter = log_formatter("appsignal")
181
181
  end
182
182
  end
@@ -254,12 +254,12 @@ module Appsignal
254
254
  private
255
255
 
256
256
  def start_stdout_logger
257
- @logger = Appsignal::Logger.new($stdout)
257
+ @logger = Appsignal::Utils::IntegrationLogger.new($stdout)
258
258
  logger.formatter = log_formatter("appsignal")
259
259
  end
260
260
 
261
261
  def start_file_logger(path)
262
- @logger = Appsignal::Logger.new(path)
262
+ @logger = Appsignal::Utils::IntegrationLogger.new(path)
263
263
  logger.formatter = log_formatter
264
264
  rescue SystemCallError => error
265
265
  start_stdout_logger
@@ -166,10 +166,12 @@ describe Appsignal::Config do
166
166
  :ignore_actions => [],
167
167
  :ignore_errors => [],
168
168
  :ignore_namespaces => [],
169
+ :instrument_http_rb => true,
169
170
  :instrument_net_http => true,
170
171
  :instrument_redis => true,
171
172
  :instrument_sequel => true,
172
173
  :log => "file",
174
+ :logging_endpoint => "https://appsignal-endpoint.net",
173
175
  :name => "TestApp",
174
176
  :push_api_key => "abc",
175
177
  :request_headers => [],
@@ -536,6 +538,18 @@ describe Appsignal::Config do
536
538
  end
537
539
  end
538
540
  end
541
+
542
+ describe ":logging_endpoint" do
543
+ subject { config[:logging_endpoint] }
544
+
545
+ context "with a non-standard port" do
546
+ let(:config) { project_fixture_config("production", :logging_endpoint => "http://localhost:4567") }
547
+
548
+ it "keeps the port" do
549
+ expect(subject).to eq "http://localhost:4567"
550
+ end
551
+ end
552
+ end
539
553
  end
540
554
 
541
555
  describe "#[]" do
@@ -577,6 +591,7 @@ describe Appsignal::Config do
577
591
  describe "#write_to_environment" do
578
592
  let(:config) { project_fixture_config(:production) }
579
593
  before do
594
+ config[:logging_endpoint] = "http://localhost:123"
580
595
  config[:http_proxy] = "http://localhost"
581
596
  config[:ignore_actions] = %w[action1 action2]
582
597
  config[:ignore_errors] = %w[ExampleStandardError AnotherError]
@@ -600,6 +615,7 @@ describe Appsignal::Config do
600
615
  expect(ENV["_APPSIGNAL_DEBUG_LOGGING"]).to eq "false"
601
616
  expect(ENV["_APPSIGNAL_LOG"]).to eq "stdout"
602
617
  expect(ENV["_APPSIGNAL_LOG_FILE_PATH"]).to end_with("/tmp/appsignal.log")
618
+ expect(ENV["_APPSIGNAL_LOGGING_ENDPOINT"]).to eq "http://localhost:123"
603
619
  expect(ENV["_APPSIGNAL_PUSH_API_ENDPOINT"]).to eq "https://push.appsignal.com"
604
620
  expect(ENV["_APPSIGNAL_PUSH_API_KEY"]).to eq "abc"
605
621
  expect(ENV["_APPSIGNAL_APP_NAME"]).to eq "TestApp"
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe Appsignal::Hooks::HttpHook do
4
+ before :context do
5
+ start_agent
6
+ end
7
+
8
+ if DependencyHelper.http_present?
9
+ context "with instrument_http_rb set to true" do
10
+ describe "#dependencies_present?" do
11
+ subject { described_class.new.dependencies_present? }
12
+
13
+ it { is_expected.to be_truthy }
14
+ end
15
+
16
+ it "installs the HTTP plugin" do
17
+ expect(HTTP::Client.included_modules)
18
+ .to include(Appsignal::Integrations::HttpIntegration)
19
+ end
20
+ end
21
+
22
+ context "with instrument_http_rb set to false" do
23
+ before { Appsignal.config.config_hash[:instrument_http_rb] = false }
24
+ after { Appsignal.config.config_hash[:instrument_http_rb] = true }
25
+
26
+ describe "#dependencies_present?" do
27
+ subject { described_class.new.dependencies_present? }
28
+
29
+ it { is_expected.to be_falsy }
30
+ end
31
+ end
32
+ else
33
+ describe "#dependencies_present?" do
34
+ subject { described_class.new.dependencies_present? }
35
+
36
+ it { is_expected.to be_falsy }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ if DependencyHelper.http_present?
4
+ require "appsignal/integrations/http"
5
+
6
+ describe Appsignal::Integrations::HttpIntegration do
7
+ let(:transaction) { http_request_transaction }
8
+
9
+ around do |example|
10
+ keep_transactions { example.run }
11
+ end
12
+
13
+ before :context do
14
+ start_agent
15
+ end
16
+
17
+ before do
18
+ set_current_transaction(transaction)
19
+ end
20
+
21
+ it "instruments a HTTP request" do
22
+ stub_request(:get, "http://www.google.com")
23
+
24
+ HTTP.get("http://www.google.com")
25
+
26
+ transaction_hash = transaction.to_h
27
+ expect(transaction_hash).to include("namespace" => Appsignal::Transaction::HTTP_REQUEST)
28
+ expect(transaction_hash["events"].first).to include(
29
+ "body" => "",
30
+ "body_format" => Appsignal::EventFormatter::DEFAULT,
31
+ "name" => "request.http_rb",
32
+ "title" => "GET http://www.google.com"
33
+ )
34
+ end
35
+
36
+ it "instruments a HTTPS request" do
37
+ stub_request(:get, "https://www.google.com")
38
+
39
+ HTTP.get("https://www.google.com")
40
+
41
+ transaction_hash = transaction.to_h
42
+ expect(transaction_hash).to include("namespace" => Appsignal::Transaction::HTTP_REQUEST)
43
+ expect(transaction_hash["events"].first).to include(
44
+ "body" => "",
45
+ "body_format" => Appsignal::EventFormatter::DEFAULT,
46
+ "name" => "request.http_rb",
47
+ "title" => "GET https://www.google.com"
48
+ )
49
+ end
50
+
51
+ context "with request parameters" do
52
+ it "does not include the query parameters in the title" do
53
+ stub_request(:get, "https://www.google.com?q=Appsignal")
54
+
55
+ HTTP.get("https://www.google.com", :params => { :q => "Appsignal" })
56
+
57
+ expect(transaction.to_h["events"].first).to include(
58
+ "body" => "",
59
+ "title" => "GET https://www.google.com"
60
+ )
61
+ end
62
+
63
+ it "does not include the request body in the title" do
64
+ stub_request(:post, "https://www.google.com")
65
+ .with(:body => { :q => "Appsignal" }.to_json)
66
+
67
+ HTTP.post("https://www.google.com", :json => { :q => "Appsignal" })
68
+
69
+ expect(transaction.to_h["events"].first).to include(
70
+ "body" => "",
71
+ "title" => "POST https://www.google.com"
72
+ )
73
+ end
74
+ end
75
+
76
+ context "with an HTTP exception" do
77
+ let(:error) { ExampleException.new("oh no!") }
78
+
79
+ it "reports the exception and re-raises it" do
80
+ stub_request(:get, "https://www.google.com").and_raise(error)
81
+
82
+ expect do
83
+ HTTP.get("https://www.google.com")
84
+ end.to raise_error(ExampleException)
85
+
86
+ transaction_hash = transaction.to_h
87
+ expect(transaction_hash).to include("namespace" => Appsignal::Transaction::HTTP_REQUEST)
88
+ expect(transaction_hash["events"].first).to include(
89
+ "body" => "",
90
+ "body_format" => Appsignal::EventFormatter::DEFAULT,
91
+ "name" => "request.http_rb",
92
+ "title" => "GET https://www.google.com"
93
+ )
94
+
95
+ expect(transaction_hash["error"]).to include(
96
+ "backtrace" => kind_of(String),
97
+ "name" => error.class.name,
98
+ "message" => error.message
99
+ )
100
+ end
101
+ end
102
+ end
103
+ end
@@ -1,25 +1,94 @@
1
1
  describe Appsignal::Logger do
2
- let(:log) { std_stream }
3
- let(:logger) do
4
- Appsignal::Logger.new(log).tap do |l|
5
- l.formatter = logger_formatter
6
- end
2
+ let(:level) { ::Logger::DEBUG }
3
+ let(:logger) { Appsignal::Logger.new("group", level) }
4
+
5
+ it "should not create a logger with a nil group" do
6
+ expect do
7
+ Appsignal::Logger.new(nil, level)
8
+ end.to raise_error(TypeError)
7
9
  end
8
10
 
9
- describe "#seen_keys" do
10
- it "returns a Set" do
11
- expect(logger.seen_keys).to be_a(Set)
11
+ describe "#add" do
12
+ it "should log with a level and message" do
13
+ expect(Appsignal::Extension).to receive(:log)
14
+ .with("group", 3, "Log message", instance_of(Appsignal::Extension::Data))
15
+ logger.add(::Logger::INFO, "Log message")
16
+ end
17
+
18
+ it "should log with a block" do
19
+ expect(Appsignal::Extension).to receive(:log)
20
+ .with("group", 3, "Log message", instance_of(Appsignal::Extension::Data))
21
+ logger.add(::Logger::INFO) do
22
+ "Log message"
23
+ end
24
+ end
25
+
26
+ it "should log with a level, message and group" do
27
+ expect(Appsignal::Extension).to receive(:log)
28
+ .with("other_group", 3, "Log message", instance_of(Appsignal::Extension::Data))
29
+ logger.add(::Logger::INFO, "Log message", "other_group")
30
+ end
31
+
32
+ it "should return with a nil message" do
33
+ expect(Appsignal::Extension).not_to receive(:log)
34
+ logger.add(::Logger::INFO, nil)
35
+ end
36
+
37
+ context "with debug log level" do
38
+ let(:level) { ::Logger::INFO }
39
+
40
+ it "should skip logging if the level is too low" do
41
+ expect(Appsignal::Extension).not_to receive(:log)
42
+ logger.add(::Logger::DEBUG, "Log message")
43
+ end
12
44
  end
13
45
  end
14
46
 
15
- describe "#warn_once_then_debug" do
16
- it "only warns once, then uses debug" do
17
- message = "This is a log line"
18
- 3.times { logger.warn_once_then_debug(:key, message) }
47
+ [
48
+ ["debug", 2, ::Logger::INFO],
49
+ ["info", 3, ::Logger::WARN],
50
+ ["warn", 5, ::Logger::ERROR],
51
+ ["error", 6, ::Logger::FATAL],
52
+ ["fatal", 7, nil]
53
+ ].each do |method|
54
+ describe "##{method[0]}" do
55
+ it "should log with a message" do
56
+ expect(Appsignal::Utils::Data).to receive(:generate)
57
+ .with({})
58
+ .and_call_original
59
+ expect(Appsignal::Extension).to receive(:log)
60
+ .with("group", method[1], "Log message", instance_of(Appsignal::Extension::Data))
61
+
62
+ logger.send(method[0], "Log message")
63
+ end
64
+
65
+ it "should log with a block" do
66
+ expect(Appsignal::Utils::Data).to receive(:generate)
67
+ .with({})
68
+ .and_call_original
69
+ expect(Appsignal::Extension).to receive(:log)
70
+ .with("group", method[1], "Log message", instance_of(Appsignal::Extension::Data))
71
+
72
+ logger.send(method[0]) do
73
+ "Log message"
74
+ end
75
+ end
76
+
77
+ it "should return with a nil message" do
78
+ expect(Appsignal::Extension).not_to receive(:log)
79
+ logger.send(method[0])
80
+ end
81
+
82
+ if method[2]
83
+ context "with a lower log level" do
84
+ let(:level) { method[2] }
19
85
 
20
- logs = log_contents(log)
21
- expect(logs.scan(/#{Regexp.escape(log_line(:WARN, message))}/).count).to eql(1)
22
- expect(logs.scan(/#{Regexp.escape(log_line(:DEBUG, message))}/).count).to eql(2)
86
+ it "should skip logging if the level is too low" do
87
+ expect(Appsignal::Extension).not_to receive(:log)
88
+ logger.send(method[0], "Log message")
89
+ end
90
+ end
91
+ end
23
92
  end
24
93
  end
25
94
  end
@@ -0,0 +1,25 @@
1
+ describe Appsignal::Utils::IntegrationLogger do
2
+ let(:log) { std_stream }
3
+ let(:logger) do
4
+ Appsignal::Utils::IntegrationLogger.new(log).tap do |l|
5
+ l.formatter = logger_formatter
6
+ end
7
+ end
8
+
9
+ describe "#seen_keys" do
10
+ it "returns a Set" do
11
+ expect(logger.seen_keys).to be_a(Set)
12
+ end
13
+ end
14
+
15
+ describe "#warn_once_then_debug" do
16
+ it "only warns once, then uses debug" do
17
+ message = "This is a log line"
18
+ 3.times { logger.warn_once_then_debug(:key, message) }
19
+
20
+ logs = log_contents(log)
21
+ expect(logs.scan(/#{Regexp.escape(log_line(:WARN, message))}/).count).to eql(1)
22
+ expect(logs.scan(/#{Regexp.escape(log_line(:DEBUG, message))}/).count).to eql(2)
23
+ end
24
+ end
25
+ end
@@ -1127,7 +1127,7 @@ describe Appsignal do
1127
1127
  Appsignal.start_logger
1128
1128
  Appsignal.logger.error("Log to file")
1129
1129
  end
1130
- expect(Appsignal.logger).to be_a(Appsignal::Logger)
1130
+ expect(Appsignal.logger).to be_a(Appsignal::Utils::IntegrationLogger)
1131
1131
  end
1132
1132
 
1133
1133
  it "logs to file" do
@@ -1150,7 +1150,7 @@ describe Appsignal do
1150
1150
  initialize_config
1151
1151
  Appsignal.start_logger
1152
1152
  Appsignal.logger.error("Log to not writable log file")
1153
- expect(Appsignal.logger).to be_a(Appsignal::Logger)
1153
+ expect(Appsignal.logger).to be_a(Appsignal::Utils::IntegrationLogger)
1154
1154
  end
1155
1155
  end
1156
1156
 
@@ -1181,7 +1181,7 @@ describe Appsignal do
1181
1181
  Appsignal.start_logger
1182
1182
  Appsignal.logger.error("Log to not writable log path")
1183
1183
  end
1184
- expect(Appsignal.logger).to be_a(Appsignal::Logger)
1184
+ expect(Appsignal.logger).to be_a(Appsignal::Utils::IntegrationLogger)
1185
1185
  end
1186
1186
  after do
1187
1187
  FileUtils.chmod 0o755, Appsignal::Config.system_tmp_dir
@@ -1210,7 +1210,7 @@ describe Appsignal do
1210
1210
  Appsignal.start_logger
1211
1211
  Appsignal.logger.error("Log to stdout")
1212
1212
  end
1213
- expect(Appsignal.logger).to be_a(Appsignal::Logger)
1213
+ expect(Appsignal.logger).to be_a(Appsignal::Utils::IntegrationLogger)
1214
1214
  end
1215
1215
  around { |example| recognize_as_heroku { example.run } }
1216
1216
 
@@ -103,6 +103,10 @@ module DependencyHelper
103
103
  Gem.loaded_specs["capistrano"].version >= Gem::Version.new("3.0")
104
104
  end
105
105
 
106
+ def http_present?
107
+ dependency_present? "http"
108
+ end
109
+
106
110
  def que_present?
107
111
  dependency_present? "que"
108
112
  end
@@ -12,7 +12,7 @@ module LogHelpers
12
12
  end
13
13
 
14
14
  def test_logger(log)
15
- Appsignal::Logger.new(log).tap do |logger|
15
+ Appsignal::Utils::IntegrationLogger.new(log).tap do |logger|
16
16
  logger.formatter = logger_formatter
17
17
  end
18
18
  end
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.1.6
4
+ version: 3.2.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: 2022-11-09 00:00:00.000000000 Z
13
+ date: 2022-11-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -161,6 +161,7 @@ files:
161
161
  - gemfiles/capistrano2.gemfile
162
162
  - gemfiles/capistrano3.gemfile
163
163
  - gemfiles/grape.gemfile
164
+ - gemfiles/http5.gemfile
164
165
  - gemfiles/no_dependencies.gemfile
165
166
  - gemfiles/padrino.gemfile
166
167
  - gemfiles/psych-3.gemfile
@@ -216,6 +217,7 @@ files:
216
217
  - lib/appsignal/hooks/data_mapper.rb
217
218
  - lib/appsignal/hooks/delayed_job.rb
218
219
  - lib/appsignal/hooks/excon.rb
220
+ - lib/appsignal/hooks/http.rb
219
221
  - lib/appsignal/hooks/mongo_ruby_driver.rb
220
222
  - lib/appsignal/hooks/mri.rb
221
223
  - lib/appsignal/hooks/net_http.rb
@@ -238,6 +240,7 @@ files:
238
240
  - lib/appsignal/integrations/delayed_job_plugin.rb
239
241
  - lib/appsignal/integrations/excon.rb
240
242
  - lib/appsignal/integrations/grape.rb
243
+ - lib/appsignal/integrations/http.rb
241
244
  - lib/appsignal/integrations/mongo_ruby_driver.rb
242
245
  - lib/appsignal/integrations/net_http.rb
243
246
  - lib/appsignal/integrations/object.rb
@@ -270,6 +273,7 @@ files:
270
273
  - lib/appsignal/utils/data.rb
271
274
  - lib/appsignal/utils/deprecation_message.rb
272
275
  - lib/appsignal/utils/hash_sanitizer.rb
276
+ - lib/appsignal/utils/integration_logger.rb
273
277
  - lib/appsignal/utils/json.rb
274
278
  - lib/appsignal/utils/query_params_sanitizer.rb
275
279
  - lib/appsignal/utils/rails_helper.rb
@@ -317,6 +321,7 @@ files:
317
321
  - spec/lib/appsignal/hooks/data_mapper_spec.rb
318
322
  - spec/lib/appsignal/hooks/delayed_job_spec.rb
319
323
  - spec/lib/appsignal/hooks/excon_spec.rb
324
+ - spec/lib/appsignal/hooks/http_spec.rb
320
325
  - spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb
321
326
  - spec/lib/appsignal/hooks/mri_spec.rb
322
327
  - spec/lib/appsignal/hooks/net_http_spec.rb
@@ -334,6 +339,7 @@ files:
334
339
  - spec/lib/appsignal/hooks_spec.rb
335
340
  - spec/lib/appsignal/integrations/data_mapper_spec.rb
336
341
  - spec/lib/appsignal/integrations/grape_spec.rb
342
+ - spec/lib/appsignal/integrations/http_spec.rb
337
343
  - spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb
338
344
  - spec/lib/appsignal/integrations/object_spec.rb
339
345
  - spec/lib/appsignal/integrations/padrino_spec.rb
@@ -357,6 +363,7 @@ files:
357
363
  - spec/lib/appsignal/transmitter_spec.rb
358
364
  - spec/lib/appsignal/utils/data_spec.rb
359
365
  - spec/lib/appsignal/utils/hash_sanitizer_spec.rb
366
+ - spec/lib/appsignal/utils/integration_logger_spec.rb
360
367
  - spec/lib/appsignal/utils/json_spec.rb
361
368
  - spec/lib/appsignal/utils/query_params_sanitizer_spec.rb
362
369
  - spec/lib/appsignal_spec.rb
@@ -427,7 +434,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
427
434
  - !ruby/object:Gem::Version
428
435
  version: '0'
429
436
  requirements: []
430
- rubygems_version: 3.3.7
437
+ rubygems_version: 3.3.12
431
438
  signing_key:
432
439
  specification_version: 4
433
440
  summary: Logs performance and exception data from your app to appsignal.com
@@ -469,6 +476,7 @@ test_files:
469
476
  - spec/lib/appsignal/hooks/data_mapper_spec.rb
470
477
  - spec/lib/appsignal/hooks/delayed_job_spec.rb
471
478
  - spec/lib/appsignal/hooks/excon_spec.rb
479
+ - spec/lib/appsignal/hooks/http_spec.rb
472
480
  - spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb
473
481
  - spec/lib/appsignal/hooks/mri_spec.rb
474
482
  - spec/lib/appsignal/hooks/net_http_spec.rb
@@ -486,6 +494,7 @@ test_files:
486
494
  - spec/lib/appsignal/hooks_spec.rb
487
495
  - spec/lib/appsignal/integrations/data_mapper_spec.rb
488
496
  - spec/lib/appsignal/integrations/grape_spec.rb
497
+ - spec/lib/appsignal/integrations/http_spec.rb
489
498
  - spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb
490
499
  - spec/lib/appsignal/integrations/object_spec.rb
491
500
  - spec/lib/appsignal/integrations/padrino_spec.rb
@@ -509,6 +518,7 @@ test_files:
509
518
  - spec/lib/appsignal/transmitter_spec.rb
510
519
  - spec/lib/appsignal/utils/data_spec.rb
511
520
  - spec/lib/appsignal/utils/hash_sanitizer_spec.rb
521
+ - spec/lib/appsignal/utils/integration_logger_spec.rb
512
522
  - spec/lib/appsignal/utils/json_spec.rb
513
523
  - spec/lib/appsignal/utils/query_params_sanitizer_spec.rb
514
524
  - spec/lib/appsignal_spec.rb