bitfab 0.33.0 → 0.33.2
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/lib/bitfab/http_client.rb +22 -4
- data/lib/bitfab/replay.rb +18 -8
- data/lib/bitfab/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f3dd02ac43d3ed65f11a6dcf52aa0d0d3a331fa428fb568a74147f5007fc9e22
|
|
4
|
+
data.tar.gz: 94b0cc1645fc42ce929a4fd1363de7ededc908f20dd411d3e7f8fd68d3bed0f8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b3a07fecf4731278963e8db381a0bfc6b4677d17bd2464f36f1d5ccfd455a8d3f066273502674158c3ac3b99a180f3017b0c5185f8e6ff3795c87b7fd2c612cb
|
|
7
|
+
data.tar.gz: 38e33c8a2dc6ab7e2e6a4c416bea15828a81724eb8ffe4b0fb440088e3b05fea53abaded2fa46bf2e852f7fd307cd5216d149b296b321a5399861861b08bd8d1
|
data/lib/bitfab/http_client.rb
CHANGED
|
@@ -11,6 +11,9 @@ require_relative "warn_once"
|
|
|
11
11
|
|
|
12
12
|
module Bitfab
|
|
13
13
|
class HttpClient
|
|
14
|
+
REPLAY_DB_BRANCH_REQUEST_TIMEOUT_SECONDS = 300
|
|
15
|
+
private_constant :REPLAY_DB_BRANCH_REQUEST_TIMEOUT_SECONDS
|
|
16
|
+
|
|
14
17
|
attr_reader :service_url
|
|
15
18
|
|
|
16
19
|
def initialize(api_key:, service_url: nil, timeout: 120)
|
|
@@ -131,15 +134,20 @@ module Bitfab
|
|
|
131
134
|
payload["codeChangeFiles"] = normalize_code_change_files(code_change_files) unless code_change_files.nil?
|
|
132
135
|
payload["experimentGroupId"] = experiment_group_id unless experiment_group_id.nil?
|
|
133
136
|
payload["includeDbBranchLease"] = true if include_db_branch_lease
|
|
137
|
+
payload["lazyDbBranchLease"] = true if include_db_branch_lease
|
|
134
138
|
payload["datasetId"] = dataset_id unless dataset_id.nil?
|
|
135
139
|
payload["graderIds"] = grader_ids unless grader_ids.nil?
|
|
136
140
|
payload["dbBranchSettings"] = db_branch_settings unless db_branch_settings.nil?
|
|
137
141
|
|
|
138
142
|
# When DB branching is on, the server resolves a Neon preview branch per
|
|
139
|
-
# item (snapshot + restore + poll), which can run several seconds each
|
|
140
|
-
#
|
|
141
|
-
# server
|
|
142
|
-
|
|
143
|
+
# item (snapshot + restore + poll), which can run several seconds each,
|
|
144
|
+
# and runs any warm-up SQL against each branch on a 240s budget of its
|
|
145
|
+
# own. The server gives up at 280s and answers, so this is a backstop for
|
|
146
|
+
# a reply that never comes rather than the thing that normally fires; it
|
|
147
|
+
# sits above the server's own ceiling so the server's error is the one
|
|
148
|
+
# callers see. Net::HTTP would otherwise default to 60s here, which the
|
|
149
|
+
# branch creation alone can outlast.
|
|
150
|
+
timeout = include_db_branch_lease ? REPLAY_DB_BRANCH_REQUEST_TIMEOUT_SECONDS : 30
|
|
143
151
|
request("/api/sdk/replay/start", payload, timeout:)
|
|
144
152
|
end
|
|
145
153
|
|
|
@@ -190,6 +198,16 @@ module Bitfab
|
|
|
190
198
|
request("/api/sdk/replay/releaseDbBranchLease", {"neonBranchId" => neon_branch_id}, timeout: 30)
|
|
191
199
|
end
|
|
192
200
|
|
|
201
|
+
def resolve_db_branch_lease(test_run_id, trace_id, db_branch_settings = nil)
|
|
202
|
+
payload = {"testRunId" => test_run_id, "traceId" => trace_id}
|
|
203
|
+
payload["dbBranchSettings"] = db_branch_settings unless db_branch_settings.nil?
|
|
204
|
+
request(
|
|
205
|
+
"/api/sdk/replay/resolveDbBranchLease",
|
|
206
|
+
payload,
|
|
207
|
+
timeout: REPLAY_DB_BRANCH_REQUEST_TIMEOUT_SECONDS
|
|
208
|
+
)
|
|
209
|
+
end
|
|
210
|
+
|
|
193
211
|
# Send an external trace (fire-and-forget in background thread).
|
|
194
212
|
def send_external_trace(payload)
|
|
195
213
|
merged = payload.merge("sdkVersion" => VERSION)
|
data/lib/bitfab/replay.rb
CHANGED
|
@@ -200,6 +200,7 @@ module Bitfab
|
|
|
200
200
|
end
|
|
201
201
|
end
|
|
202
202
|
|
|
203
|
+
resolved_db_branch_settings = db_branch_settings(db_branch)
|
|
203
204
|
replay_data = http_client.start_replay(
|
|
204
205
|
trace_function_key,
|
|
205
206
|
effective_limit,
|
|
@@ -211,7 +212,7 @@ module Bitfab
|
|
|
211
212
|
include_db_branch_lease:,
|
|
212
213
|
dataset_id:,
|
|
213
214
|
grader_ids:,
|
|
214
|
-
db_branch_settings:
|
|
215
|
+
db_branch_settings: resolved_db_branch_settings
|
|
215
216
|
)
|
|
216
217
|
test_run_id = replay_data["testRunId"]
|
|
217
218
|
test_run_url = replay_data["testRunUrl"]
|
|
@@ -219,7 +220,8 @@ module Bitfab
|
|
|
219
220
|
|
|
220
221
|
result_items = if server_items.any?
|
|
221
222
|
process_items(http_client, server_items, receiver, method_name, test_run_id, max_concurrency, mock.to_s,
|
|
222
|
-
adapt_inputs, include_db_branch_lease, on_progress:,
|
|
223
|
+
adapt_inputs, include_db_branch_lease, resolved_db_branch_settings, on_progress:,
|
|
224
|
+
mock_overrides: resolved_overrides)
|
|
223
225
|
else
|
|
224
226
|
[]
|
|
225
227
|
end
|
|
@@ -528,7 +530,8 @@ module Bitfab
|
|
|
528
530
|
|
|
529
531
|
# Process all replay items, optionally in parallel using threads.
|
|
530
532
|
def process_items(http_client, server_items, receiver, method_name, test_run_id, max_concurrency, mock_strategy,
|
|
531
|
-
adapt_inputs = nil, include_db_branch_lease = false,
|
|
533
|
+
adapt_inputs = nil, include_db_branch_lease = false, db_branch_settings = nil, on_progress: nil,
|
|
534
|
+
mock_overrides: [])
|
|
532
535
|
concurrency = max_concurrency || server_items.length
|
|
533
536
|
|
|
534
537
|
# Reports running totals once per item as it settles. In the parallel
|
|
@@ -584,7 +587,7 @@ module Bitfab
|
|
|
584
587
|
if concurrency <= 1
|
|
585
588
|
server_items.map do |item|
|
|
586
589
|
result = process_single_item(http_client, item, receiver, method_name, test_run_id, mock_strategy,
|
|
587
|
-
adapt_inputs, include_db_branch_lease, mock_overrides:)
|
|
590
|
+
adapt_inputs, include_db_branch_lease, db_branch_settings, mock_overrides:)
|
|
588
591
|
report.call(result, original_trace_id_of(item), original_span_id_of(item), test_run_id)
|
|
589
592
|
result
|
|
590
593
|
end
|
|
@@ -601,7 +604,7 @@ module Bitfab
|
|
|
601
604
|
break unless item
|
|
602
605
|
|
|
603
606
|
result = process_single_item(http_client, item, receiver, method_name, test_run_id, mock_strategy,
|
|
604
|
-
adapt_inputs, include_db_branch_lease, mock_overrides:)
|
|
607
|
+
adapt_inputs, include_db_branch_lease, db_branch_settings, mock_overrides:)
|
|
605
608
|
results_mutex.synchronize { results[idx] = result }
|
|
606
609
|
report.call(result, original_trace_id_of(item), original_span_id_of(item), test_run_id)
|
|
607
610
|
end
|
|
@@ -620,7 +623,7 @@ module Bitfab
|
|
|
620
623
|
# than propagated, so one bad trace never aborts the whole replay run
|
|
621
624
|
# (mirrors the TypeScript and Python SDKs' per-item rescue).
|
|
622
625
|
def process_single_item(http_client, server_item, receiver, method_name, test_run_id, mock_strategy,
|
|
623
|
-
adapt_inputs = nil, include_db_branch_lease = false, mock_overrides: [])
|
|
626
|
+
adapt_inputs = nil, include_db_branch_lease = false, db_branch_settings = nil, mock_overrides: [])
|
|
624
627
|
metrics = extract_server_item_metrics(server_item)
|
|
625
628
|
# The ORIGINAL (historical) trace/span this item replays. Canonical
|
|
626
629
|
# keys are originalTraceId/originalSpanId; older servers send them under
|
|
@@ -638,6 +641,13 @@ module Bitfab
|
|
|
638
641
|
# for a branch, so running their method against live data would produce a
|
|
639
642
|
# result that looks valid and is not. Fail the item instead, loudly.
|
|
640
643
|
lease_error = include_db_branch_lease ? server_item["dbBranchLeaseError"] : nil
|
|
644
|
+
db_snapshot_ref = server_item["dbSnapshotRef"]
|
|
645
|
+
if include_db_branch_lease && lease.nil? && lease_error.nil?
|
|
646
|
+
resolved = http_client.resolve_db_branch_lease(test_run_id, original_trace_id, db_branch_settings)
|
|
647
|
+
lease = resolved["lease"]
|
|
648
|
+
lease_error = resolved["leaseError"]
|
|
649
|
+
db_snapshot_ref = resolved["dbSnapshotRef"] || db_snapshot_ref
|
|
650
|
+
end
|
|
641
651
|
if lease_error
|
|
642
652
|
raise "Replay requested a database branch for trace #{original_trace_id} but it " \
|
|
643
653
|
"could not be resolved (#{lease_error["code"]}): #{lease_error["message"]}. " \
|
|
@@ -709,7 +719,7 @@ module Bitfab
|
|
|
709
719
|
adapt_ctx:,
|
|
710
720
|
db_branch_lease: lease,
|
|
711
721
|
source_bitfab_trace_id: original_trace_id,
|
|
712
|
-
db_snapshot_ref:
|
|
722
|
+
db_snapshot_ref:
|
|
713
723
|
)
|
|
714
724
|
rescue => e
|
|
715
725
|
warn "Bitfab: replay item for span #{original_span_id} failed before execution: #{e.message}"
|
|
@@ -727,7 +737,7 @@ module Bitfab
|
|
|
727
737
|
# Deprecated aliases for original_trace_id/original_span_id.
|
|
728
738
|
source_trace_id: original_trace_id,
|
|
729
739
|
source_span_id: original_span_id,
|
|
730
|
-
db_snapshot_ref:
|
|
740
|
+
db_snapshot_ref:
|
|
731
741
|
}
|
|
732
742
|
ensure
|
|
733
743
|
release_db_branch_lease(http_client, lease) if lease
|
data/lib/bitfab/version.rb
CHANGED