loggability 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 657ddfb25b87eccec0c814690fcc32056a5f0864d8e662f313b50a98cc44342e
4
- data.tar.gz: 0653afb117c71ef19153a1f4f2440436ad427c6b74c64d1d7d1d0edb2cde5b0b
3
+ metadata.gz: 5c0f3a12e9663d82cb709b0bf7f5aea24f9a49dba2435f5c63e289b7c731aa3e
4
+ data.tar.gz: cf7da9a50c5890505b96d2c1609f487a6ddb8c73c7deed602eb7508174613de2
5
5
  SHA512:
6
- metadata.gz: 10c6bc903e01021b38fcdabe55081e09c693ce54ebe388aef44752a17fec3e4e86a34d1bc40e7ae4c634f3d2a2ebf8c1be8e1813bdf9236b6eb29a6b5d50405e
7
- data.tar.gz: 642857455ee0f09e90278308c9fe3da3c19e07dbe0e9a9a4ad30671075d71bfdc292a23df2dc2cc2a2c22f0cc452283216f14beac16deb4fe8ee76a95938df80
6
+ metadata.gz: e18c0c2891d2b0094dafa8b50b9b7d7ed8ba655e3f2f88105a279a655319041e39231417d0041eed2b29bed8b7fa956097f4d5f330a3a62122efd4de5d8d5435
7
+ data.tar.gz: b9a3fc6f3181e3e63d00d85709598601c3e266e19f471fb0456f7169c2acc2ea350235e480ce8adbbb16b713e234acfe6f9f76d951c4231e3847a48f6149419f
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,6 +1,16 @@
1
1
  = Release History for loggability
2
2
 
3
3
  ---
4
+ == v0.18.0 [2020-12-24] Michael Granger <ged@faeriemud.org>
5
+
6
+ Improvements:
7
+
8
+ - Add memory management to the http log device
9
+ - Add a dead-simple log server example
10
+ - Update for Ruby 3, add my updated gem cert
11
+
12
+ Thanks again to Mahmood Khan <mkhan1484@gmail.com> for the patch.
13
+
4
14
 
5
15
  == v0.17.0 [2020-02-27] Michael Granger <ged@faeriemud.org>
6
16
 
data/Rakefile CHANGED
@@ -3,7 +3,7 @@
3
3
  require 'rake/deveiate'
4
4
 
5
5
  Rake::DevEiate.setup( 'loggability' ) do |project|
6
- project.required_ruby_version = '~> 2.5'
6
+ project.required_ruby_version = ['~> 2.5', '~> 3.0']
7
7
  project.publish_to = 'deveiate:/usr/local/www/public/code'
8
8
  end
9
9
 
@@ -9,7 +9,7 @@ require 'date'
9
9
  module Loggability
10
10
 
11
11
  # Package version constant
12
- VERSION = '0.17.0'
12
+ VERSION = '0.18.0'
13
13
 
14
14
  # The key for the global logger (Loggability's own logger)
15
15
  GLOBAL_KEY = :__global__
@@ -38,9 +38,9 @@ class Loggability::LogDevice
38
38
  ### * "data_dog_api_key" is the argument that will be passed onto the datadog
39
39
  ### log device's constructor
40
40
  def self::parse_device_spec( target_spec )
41
- targets = target_spec.split( ':' ).compact
41
+ targets = target_spec.split( ';' ).compact
42
42
  return targets.map do |t|
43
- target_subclass = t[ DEVICE_TARGET_REGEX, 1 ]&.strip().to_sym
43
+ target_subclass = t[ DEVICE_TARGET_REGEX, 1 ]&.strip.to_sym
44
44
  target_subclass_args = t[ DEVICE_TARGET_REGEX, 2 ]
45
45
 
46
46
  self.create( target_subclass, target_subclass_args )
@@ -33,6 +33,9 @@ class Loggability::LogDevice::Http < Loggability::LogDevice
33
33
  # The default Executor class to use for asynchronous tasks
34
34
  DEFAULT_EXECUTOR_CLASS = Concurrent::SingleThreadExecutor
35
35
 
36
+ # The default for the maximum bytesize of the queue (1 GB)
37
+ DEFAULT_MAX_QUEUE_BYTESIZE = ( 2 ** 10 ) * ( 2 ** 10 ) * ( 2 ** 10 )
38
+
36
39
  # The default options for new instances
37
40
  DEFAULT_OPTIONS = {
38
41
  execution_interval: DEFAULT_BATCH_INTERVAL,
@@ -69,6 +72,8 @@ class Loggability::LogDevice::Http < Loggability::LogDevice
69
72
  @endpoint = URI( endpoint ).freeze
70
73
  @logs_queue = Queue.new
71
74
 
75
+ @logs_queue_bytesize = 0
76
+ @max_queue_bytesize = opts[:max_queue_bytesize] || DEFAULT_MAX_QUEUE_BYTESIZE
72
77
  @batch_interval = opts[:batch_interval] || DEFAULT_BATCH_INTERVAL
73
78
  @write_timeout = opts[:write_timeout] || DEFAULT_WRITE_TIMEOUT
74
79
  @max_batch_size = opts[:max_batch_size] || DEFAULT_MAX_BATCH_SIZE
@@ -97,6 +102,14 @@ class Loggability::LogDevice::Http < Loggability::LogDevice
97
102
  # logging service.
98
103
  attr_reader :logs_queue
99
104
 
105
+ ##
106
+ # The max bytesize of the queue. Will not queue more messages if this threshold is hit
107
+ attr_reader :max_queue_bytesize
108
+
109
+ ##
110
+ # The size of +logs_queue+ in bytes
111
+ attr_accessor :logs_queue_bytesize
112
+
100
113
  ##
101
114
  # The monotonic clock time when the last batch of logs were sent
102
115
  attr_accessor :last_send_time
@@ -133,6 +146,13 @@ class Loggability::LogDevice::Http < Loggability::LogDevice
133
146
  ### LogDevice API -- write a message to the HTTP device.
134
147
  def write( message )
135
148
  self.start unless self.running?
149
+ if message.is_a?( Hash )
150
+ message_size = message.to_json.bytesize
151
+ else
152
+ message_size = message.bytesize
153
+ end
154
+ return if ( self.logs_queue_bytesize + message_size ) >= self.max_queue_bytesize
155
+ self.logs_queue_bytesize += message_size
136
156
  self.logs_queue.enq( message )
137
157
  self.send_logs
138
158
  end
@@ -246,7 +266,9 @@ class Loggability::LogDevice::Http < Loggability::LogDevice
246
266
  max_size = self.max_batch_bytesize - self.max_message_bytesize - 2 # for the outer Array
247
267
 
248
268
  while count < self.max_batch_size && bytes < max_size && !self.logs_queue.empty?
249
- formatted_message = self.format_log_message( self.logs_queue.deq )
269
+ message = self.logs_queue.deq
270
+ formatted_message = self.format_log_message( message )
271
+ self.logs_queue_bytesize -= message.bytesize
250
272
 
251
273
  count += 1
252
274
  bytes += formatted_message.bytesize + 3 # comma and delimiters
@@ -166,4 +166,52 @@ describe Loggability::LogDevice::Http do
166
166
  expect( http.verify_mode ).to eq( OpenSSL::SSL::VERIFY_PEER )
167
167
  end
168
168
 
169
+
170
+ it "stops queuing more messages if max queue size is reached" do
171
+ device = described_class.new(
172
+ max_batch_bytesize: 1024,
173
+ batch_interval: 100,
174
+ max_queue_bytesize: 100,
175
+ executor_class: Concurrent::ImmediateExecutor )
176
+ device.instance_variable_set( :@http_client, http_client )
177
+
178
+ expect( device ).to receive( :send_logs ).at_least( :once )
179
+
180
+ msg = "test message"
181
+ device.write(msg)
182
+ expect( device.logs_queue_bytesize == msg.bytesize )
183
+
184
+ hash_msg = { message: "This is a test log message", tags: ["tag1", "tag2"] }
185
+ device.write( hash_msg )
186
+ previous_bytesize = device.logs_queue_bytesize - hash_msg.to_json.bytesize
187
+ expect( device.logs_queue_bytesize ).to eq( hash_msg.to_json.bytesize + previous_bytesize )
188
+
189
+ queue_current_bytesize = device.logs_queue_bytesize
190
+ hash_msg = { message: "This is a test log message", tags: ["tag1", "tag2"] }
191
+ device.write( hash_msg )
192
+ expect( device.logs_queue_bytesize ).to eq( queue_current_bytesize )
193
+ end
194
+
195
+
196
+ it "reduces the queue bytesize once messages are sent" do
197
+ device = described_class.new(
198
+ max_batch_bytesize: 1024,
199
+ batch_interval: 100,
200
+ max_queue_bytesize: 100,
201
+ executor_class: Concurrent::ImmediateExecutor )
202
+ device.instance_variable_set( :@http_client, http_client )
203
+
204
+ expect( device ).to receive( :send_logs ).at_least( :once )
205
+ msg = "test message"
206
+ device.write(msg)
207
+ expect( device.logs_queue_bytesize == msg.bytesize )
208
+
209
+ msg = "this is just a test message"
210
+ device.write( msg )
211
+ previous_bytesize = device.logs_queue_bytesize - msg.bytesize
212
+ expect( device.logs_queue_bytesize ).to eq( msg.bytesize + previous_bytesize )
213
+
214
+ expect { device.get_next_log_payload }.to change { device.logs_queue_bytesize }.to( 0 )
215
+ end
216
+
169
217
  end
metadata CHANGED
@@ -1,18 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loggability
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIENDCCApygAwIBAgIBATANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
14
- REM9RmFlcmllTVVEL0RDPW9yZzAeFw0xOTEwMDkwMDM2NTdaFw0yMDEwMDgwMDM2
15
- NTdaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
13
+ MIID+DCCAmCgAwIBAgIBAzANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
14
+ REM9RmFlcmllTVVEL0RDPW9yZzAeFw0yMDEyMjQyMDU1MjlaFw0yMTEyMjQyMDU1
15
+ MjlaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
16
16
  hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
17
17
  L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
18
18
  M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
@@ -21,20 +21,19 @@ cert_chain:
21
21
  vQ66lts4alKC69TE5cuKasWBm+16A4aEe3XdZBRNmtOu/g81gvwA7fkJHKllJuaI
22
22
  dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
23
23
  ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
24
- N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYD
25
- VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DAcBgNVHREE
26
- FTATgRFnZWRARmFlcmllTVVELm9yZzAcBgNVHRIEFTATgRFnZWRARmFlcmllTVVE
27
- Lm9yZzANBgkqhkiG9w0BAQsFAAOCAYEAFqsr6o0SvQRgjQVmhbQvExRnCMCoW1yb
28
- FJiN7A5RA2Iy2E61OG1Ul5nGmaDmx/PNB/6JIbIV3B9Uq8aTZx4uOjK7r8vMl1/t
29
- ZfY7r6HejJfXlcO2m6JDMbpdyEVv916LncBkzZRz6vnnNCx+31f15FKddxujpAFd
30
- qpn3JRQY+oj7ZkoccL/IUiDpxQWeS3oOoz9qr2kVTp8R50InZimt79FqCl/1m66W
31
- kdOuf+wM3DDx7Rt4IVNHrhGlyfMr7xjKW1Q3gll+pMN1DT6Ajx/t3JDSEg7BnnEW
32
- r7AciSO6J4ApUdqyG+coLFlGdtgFTgRHv7ihbQtDI7Z/LV7A4Spn1j2PK3j0Omri
33
- kSl1hPVigRytfgdVGiLXzvkkrkgj9EknCaj5UHbac7XvVBrljXj9hsnnqTANaKsg
34
- jBZSA+N+xUTgUWpXjjwsLZjzJkhWATJWq+krNXcqpwXo6HsjmdUxoFMt63RBb+sI
35
- XrxOxp8o0uOkU7FdLSGsyqJ2LzsR4obN
24
+ N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
25
+ VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
26
+ 9w0BAQsFAAOCAYEAMYegZanJi8zq7QKPT7wqXefX4C88I5JWeBHR3PvvWK0CwyMV
27
+ peyiu5I13w/lYX+HUZjE4qsSpJMJFXWl4WZCOo+AMprOcf0PxfuJpxCej5D4tavf
28
+ vRfhahSw7XJrcZih/3J+/UgoH7R05MJ+8LTcy3HGrB3a0vTafjm8OY7Xpa0LJDoN
29
+ JDqxK321VIHyTibbKeA1hWSE6ljlQDvFbTqiCj3Ulp1jTv3TOlvRl8fqcfhxUJI0
30
+ +5Q82jJODjEN+GaWs0V+NlrbU94cXwS2PH5dXogftB5YYA5Ex8A0ikZ73xns4Hdo
31
+ XxdLdd92F5ovxA23j/rKe/IDwqr6FpDkU3nPXH/Qp0TVGv9zZnVJc/Z6ChkuWj8z
32
+ pW7JAyyiiHZgKKDReDrA2LA7Zs3o/7KA6UtUH0FHf8LYhcK+pfHk6RtjRe65ffw+
33
+ MCh97sQ/Z/MOusb5+QddBmB+k8EicXyGNl4b5L4XpL7fIQu+Y96TB3JEJlShxFD9
34
+ k9FjI4d9EP54gS/4
36
35
  -----END CERTIFICATE-----
37
- date: 2020-02-27 00:00:00.000000000 Z
36
+ date: 2020-12-24 00:00:00.000000000 Z
38
37
  dependencies:
39
38
  - !ruby/object:Gem::Dependency
40
39
  name: rake-deveiate
@@ -167,8 +166,13 @@ files:
167
166
  homepage: https://hg.sr.ht/~ged/Loggability
168
167
  licenses:
169
168
  - BSD-3-Clause
170
- metadata: {}
171
- post_install_message:
169
+ metadata:
170
+ homepage_uri: https://hg.sr.ht/~ged/Loggability
171
+ documentation_uri: https://deveiate.org/code/loggability
172
+ changelog_uri: https://deveiate.org/code/loggability/History_md.html
173
+ source_uri: https://hg.sr.ht/~ged/Loggability/browse
174
+ bug_tracker_uri: https://todo.sr.ht/~ged/Loggability/browse
175
+ post_install_message:
172
176
  rdoc_options: []
173
177
  require_paths:
174
178
  - lib
@@ -177,14 +181,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
177
181
  - - "~>"
178
182
  - !ruby/object:Gem::Version
179
183
  version: '2.5'
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '3.0'
180
187
  required_rubygems_version: !ruby/object:Gem::Requirement
181
188
  requirements:
182
189
  - - ">="
183
190
  - !ruby/object:Gem::Version
184
191
  version: '0'
185
192
  requirements: []
186
- rubygems_version: 3.1.2
187
- signing_key:
193
+ rubygems_version: 3.2.2
194
+ signing_key:
188
195
  specification_version: 4
189
196
  summary: A composable logging system built on the standard Logger library.
190
197
  test_files: []
metadata.gz.sig CHANGED
Binary file