debugbundle 2.0.0 → 2.0.1
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 +4 -4
- data/README.md +6 -0
- data/lib/debugbundle/acknowledgement.rb +6 -2
- data/lib/debugbundle/client.rb +14 -8
- data/lib/debugbundle/transport.rb +6 -2
- data/lib/debugbundle/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: de914935eb26ac5a4a4c7a21e91e13f92fcdef0949c8a19cc9566adf70fa7b5d
|
|
4
|
+
data.tar.gz: ff2d61415de5d618556d00f4918e4d3a29af38ae7be2bddafc088304a7b11e2b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7655a43d83ce82e3d7cd6febebc560a2c6c31dde18df9b3a579897fa236c1094c36bc170aa203f1a412caca0ff86c1d6bf529745e9b69e48d55c88799ba84531
|
|
7
|
+
data.tar.gz: 06b7e321fe0bae17dfe91bd4ffecd4288f84c0151a9909def3d18c02fc1e5f4e262171b7318a2bed337876a0ed7740c9d1d31d0ab518b187a05f72e0db0fcf49
|
data/README.md
CHANGED
|
@@ -368,3 +368,9 @@ The repository ships a GitHub Actions release workflow at `.github/workflows/rel
|
|
|
368
368
|
## License
|
|
369
369
|
|
|
370
370
|
Apache-2.0. See LICENSE.
|
|
371
|
+
|
|
372
|
+
## Delivery acknowledgement and retry limits
|
|
373
|
+
|
|
374
|
+
The built-in HTTP transport requires the canonical ingestion acknowledgement (`accepted`, `rejected`, and `errors`). Empty responses, unrelated JSON, malformed counts, or invalid rejection indices retain the full batch with backoff. Valid acknowledgements remove accepted and terminally rejected events and retry only the indexed retryable rejections; an all-rejected batch does not advance `lastEventAt`.
|
|
375
|
+
|
|
376
|
+
File transports and explicitly supplied custom/legacy transports retain their documented bodyless success fallback. A custom transport that returns acknowledgement fields must return the complete canonical shape. Retry hints (delay seconds or HTTP dates) are bounded to five minutes and measured from response receipt, including partial/protocol acknowledgements and retryable server failures. Without a server hint, existing retry timing is preserved. Failures remain contained within the SDK's existing delivery path.
|
|
@@ -11,8 +11,8 @@ module DebugBundle
|
|
|
11
11
|
|
|
12
12
|
module_function
|
|
13
13
|
|
|
14
|
-
def decide(body, batch_length)
|
|
15
|
-
return
|
|
14
|
+
def decide(body, batch_length, required: false)
|
|
15
|
+
return missing_acknowledgement(required) unless body.is_a?(Hash) && FIELDS.any? { |field| body.key?(field) }
|
|
16
16
|
return protocol_failure unless FIELDS.all? { |field| body.key?(field) }
|
|
17
17
|
|
|
18
18
|
accepted = body['accepted']
|
|
@@ -55,5 +55,9 @@ module DebugBundle
|
|
|
55
55
|
def protocol_failure
|
|
56
56
|
{ kind: :protocol_failure }
|
|
57
57
|
end
|
|
58
|
+
|
|
59
|
+
def missing_acknowledgement(required)
|
|
60
|
+
required ? protocol_failure : { kind: :legacy }
|
|
61
|
+
end
|
|
58
62
|
end
|
|
59
63
|
end
|
data/lib/debugbundle/client.rb
CHANGED
|
@@ -443,10 +443,10 @@ module DebugBundle
|
|
|
443
443
|
case result.status_code
|
|
444
444
|
when 200..299
|
|
445
445
|
handle_successful_result(result, batch)
|
|
446
|
-
when 429
|
|
446
|
+
when 429, 500..599
|
|
447
447
|
@consecutive_failures += 1
|
|
448
|
-
retry_after_seconds = (result.retry_after_seconds
|
|
449
|
-
@retry_at = now + retry_after_seconds
|
|
448
|
+
retry_after_seconds = bounded_retry_hint(result.retry_after_seconds)
|
|
449
|
+
@retry_at = now + retry_after_seconds if result.status_code == 429 || !result.retry_after_seconds.nil?
|
|
450
450
|
false
|
|
451
451
|
when 400..499
|
|
452
452
|
remove_buffered_events(batch)
|
|
@@ -515,9 +515,15 @@ module DebugBundle
|
|
|
515
515
|
|
|
516
516
|
private
|
|
517
517
|
|
|
518
|
+
def bounded_retry_hint(value)
|
|
519
|
+
return 1 unless value.is_a?(Numeric) && value.real? && value.finite?
|
|
520
|
+
|
|
521
|
+
value.clamp(1, RETRY_AFTER_CAP_SECONDS)
|
|
522
|
+
end
|
|
523
|
+
|
|
518
524
|
def handle_successful_result(result, batch)
|
|
519
|
-
decision = Acknowledgement.decide(result.body, batch.length)
|
|
520
|
-
return handle_protocol_failure if decision[:kind] == :protocol_failure
|
|
525
|
+
decision = Acknowledgement.decide(result.body, batch.length, required: @transport.is_a?(Transport::HttpTransport))
|
|
526
|
+
return handle_protocol_failure(result.retry_after_seconds) if decision[:kind] == :protocol_failure
|
|
521
527
|
|
|
522
528
|
if decision[:kind] == :legacy
|
|
523
529
|
remove_buffered_events(batch)
|
|
@@ -532,7 +538,7 @@ module DebugBundle
|
|
|
532
538
|
|
|
533
539
|
if retryable_events.any?
|
|
534
540
|
@consecutive_failures += 1
|
|
535
|
-
@retry_at = now +
|
|
541
|
+
@retry_at = now + bounded_retry_hint(result.retry_after_seconds)
|
|
536
542
|
@acknowledgement_state = :degraded
|
|
537
543
|
false
|
|
538
544
|
else
|
|
@@ -543,9 +549,9 @@ module DebugBundle
|
|
|
543
549
|
end
|
|
544
550
|
end
|
|
545
551
|
|
|
546
|
-
def handle_protocol_failure
|
|
552
|
+
def handle_protocol_failure(retry_hint)
|
|
547
553
|
@consecutive_failures += 1
|
|
548
|
-
@retry_at = now +
|
|
554
|
+
@retry_at = now + bounded_retry_hint(retry_hint)
|
|
549
555
|
@acknowledgement_state = :degraded
|
|
550
556
|
false
|
|
551
557
|
end
|
|
@@ -4,6 +4,7 @@ require 'json'
|
|
|
4
4
|
require 'net/http'
|
|
5
5
|
require 'securerandom'
|
|
6
6
|
require 'uri'
|
|
7
|
+
require 'time'
|
|
7
8
|
require 'fileutils'
|
|
8
9
|
|
|
9
10
|
module DebugBundle
|
|
@@ -83,8 +84,11 @@ module DebugBundle
|
|
|
83
84
|
def parse_retry_after(value)
|
|
84
85
|
return nil if value.nil? || value.strip.empty?
|
|
85
86
|
|
|
86
|
-
seconds =
|
|
87
|
-
seconds.
|
|
87
|
+
seconds = Float(value, exception: false)
|
|
88
|
+
seconds = Time.httpdate(value) - Time.now if seconds.nil?
|
|
89
|
+
return nil unless seconds.finite?
|
|
90
|
+
|
|
91
|
+
seconds.clamp(0, RETRY_AFTER_CAP_SECONDS).to_i
|
|
88
92
|
rescue ArgumentError, TypeError
|
|
89
93
|
nil
|
|
90
94
|
end
|
data/lib/debugbundle/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: debugbundle
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- DebugBundle
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2026-09-
|
|
10
|
+
date: 2026-09-26 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: base64
|