loggability 0.17.0 → 0.18.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: 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