bitfab 0.12.4 → 0.14.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 +4 -4
- data/lib/bitfab/client.rb +5 -3
- data/lib/bitfab/http_client.rb +4 -2
- data/lib/bitfab/replay.rb +39 -5
- 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: d6264d16b3fdf093418d97c43141db5a83e890d0b5e8993f255498c01548c31b
|
|
4
|
+
data.tar.gz: 158be7664defce737b4b6e3a1db39f6bf13fee37aee9f9948fb63f7b2dd2a254
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cb6a19c8fcfd500c58e0bbf7a1332fb27b6701282cc859bf2590477bae8fd4aaf871e37e15fc9eb0f70cbe7c121b5550f1d7ce536d771992282e0484eb545d1e
|
|
7
|
+
data.tar.gz: b6ab4f9aa78b82b8a14d993e1357ae9db9fd09447a16ea8e5ff301998504548f7d54339923f238e4065661fcc61e8ae3db2171a8b4c00f30b1695d20f87d7546
|
data/lib/bitfab/client.rb
CHANGED
|
@@ -39,8 +39,10 @@ module Bitfab
|
|
|
39
39
|
# @param receiver [Object, Class] an instance for instance methods, or a Class for class methods
|
|
40
40
|
# @param method_name [Symbol] the method to replay
|
|
41
41
|
# @param trace_function_key [String] the trace function key for this method
|
|
42
|
-
# @param limit [Integer] maximum number of traces to replay (default: 5)
|
|
43
|
-
#
|
|
42
|
+
# @param limit [Integer, nil] maximum number of traces to replay (default: 5).
|
|
43
|
+
# Mutually exclusive with trace_ids: an explicit ID list already
|
|
44
|
+
# determines how many traces replay, so passing both raises.
|
|
45
|
+
# @param trace_ids [Array<String>, nil] optional list of trace IDs to replay (max 100)
|
|
44
46
|
# @param max_concurrency [Integer, nil] max threads for parallel replay (default: 10)
|
|
45
47
|
# @param code_change_description [String, nil] optional rationale for the
|
|
46
48
|
# code change being tested in this replay (stored on the experiment)
|
|
@@ -52,7 +54,7 @@ module Bitfab
|
|
|
52
54
|
# "all", or "marked". "all" mocks every child span; "marked" only mocks
|
|
53
55
|
# spans declared with mock_on_replay: true.
|
|
54
56
|
# @return [Hash] with :items, :test_run_id, :test_run_url
|
|
55
|
-
def replay(receiver, method_name, trace_function_key:, limit:
|
|
57
|
+
def replay(receiver, method_name, trace_function_key:, limit: nil, trace_ids: nil, max_concurrency: 10,
|
|
56
58
|
code_change_description: nil, code_change_files: nil, experiment_group_id: nil, mock: "none")
|
|
57
59
|
Replay.run(
|
|
58
60
|
self, receiver, method_name,
|
data/lib/bitfab/http_client.rb
CHANGED
|
@@ -108,9 +108,11 @@ module Bitfab
|
|
|
108
108
|
def start_replay(trace_function_key, limit, trace_ids: nil, code_change_description: nil,
|
|
109
109
|
code_change_files: nil, experiment_group_id: nil)
|
|
110
110
|
payload = {
|
|
111
|
-
"traceFunctionKey" => trace_function_key
|
|
112
|
-
"limit" => limit
|
|
111
|
+
"traceFunctionKey" => trace_function_key
|
|
113
112
|
}
|
|
113
|
+
# limit is only meaningful without trace_ids (an explicit ID list
|
|
114
|
+
# already determines the count), so it's omitted when nil.
|
|
115
|
+
payload["limit"] = limit unless limit.nil?
|
|
114
116
|
payload["traceIds"] = trace_ids if trace_ids
|
|
115
117
|
payload["codeChangeDescription"] = code_change_description unless code_change_description.nil?
|
|
116
118
|
payload["codeChangeFiles"] = normalize_code_change_files(code_change_files) unless code_change_files.nil?
|
data/lib/bitfab/replay.rb
CHANGED
|
@@ -56,8 +56,10 @@ module Bitfab
|
|
|
56
56
|
# @param receiver [Object, Class] an instance for instance methods, or a Class for class methods
|
|
57
57
|
# @param method_name [Symbol] the method to replay
|
|
58
58
|
# @param trace_function_key [String] the trace function key for this method
|
|
59
|
-
# @param limit [Integer] maximum number of traces to replay (default: 5)
|
|
60
|
-
#
|
|
59
|
+
# @param limit [Integer, nil] maximum number of traces to replay (default: 5).
|
|
60
|
+
# Mutually exclusive with trace_ids: an explicit ID list already
|
|
61
|
+
# determines how many traces replay, so passing both raises.
|
|
62
|
+
# @param trace_ids [Array<String>, nil] optional list of trace IDs to replay (max 100)
|
|
61
63
|
# @param max_concurrency [Integer, nil] max threads for parallel replay (default: 10)
|
|
62
64
|
# @param code_change_description [String, nil] optional rationale for the
|
|
63
65
|
# code change being tested in this replay (stored on the experiment)
|
|
@@ -69,17 +71,31 @@ module Bitfab
|
|
|
69
71
|
# "all", or "marked". "all" mocks every child span; "marked" only mocks
|
|
70
72
|
# spans declared with mock_on_replay: true.
|
|
71
73
|
# @return [Hash] with :items, :test_run_id, :test_run_url
|
|
72
|
-
def run(client, receiver, method_name, trace_function_key:, limit:
|
|
74
|
+
def run(client, receiver, method_name, trace_function_key:, limit: nil, trace_ids: nil, max_concurrency: 10,
|
|
73
75
|
code_change_description: nil, code_change_files: nil, experiment_group_id: nil, mock: "none")
|
|
74
76
|
unless MOCK_STRATEGIES.include?(mock.to_s)
|
|
75
77
|
raise ArgumentError, "Invalid mock strategy '#{mock}'. Must be one of: #{MOCK_STRATEGIES.join(", ")}"
|
|
76
78
|
end
|
|
79
|
+
if trace_ids
|
|
80
|
+
raise ArgumentError, "trace_ids must contain at least one trace ID." if trace_ids.empty?
|
|
81
|
+
if trace_ids.length > 100
|
|
82
|
+
raise ArgumentError, "trace_ids supports at most 100 trace IDs per replay (got #{trace_ids.length})."
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
if limit && trace_ids
|
|
86
|
+
raise ArgumentError,
|
|
87
|
+
"Pass either limit or trace_ids, not both: an explicit trace ID list already determines how many traces replay."
|
|
88
|
+
end
|
|
77
89
|
|
|
78
90
|
http_client = client.instance_variable_get(:@http_client)
|
|
79
91
|
|
|
92
|
+
# limit is meaningless with explicit trace_ids (the ID list determines
|
|
93
|
+
# the count), so it's omitted from the request entirely.
|
|
94
|
+
effective_limit = trace_ids ? nil : (limit || 5)
|
|
95
|
+
|
|
80
96
|
replay_data = http_client.start_replay(
|
|
81
97
|
trace_function_key,
|
|
82
|
-
|
|
98
|
+
effective_limit,
|
|
83
99
|
trace_ids:,
|
|
84
100
|
code_change_description:,
|
|
85
101
|
code_change_files:,
|
|
@@ -147,10 +163,16 @@ module Bitfab
|
|
|
147
163
|
end
|
|
148
164
|
|
|
149
165
|
# Fetch span data and execute a single replay item.
|
|
166
|
+
#
|
|
167
|
+
# Any error while fetching the span, building the mock tree, or
|
|
168
|
+
# deserializing inputs is captured on the returned item's :error rather
|
|
169
|
+
# than propagated, so one bad trace never aborts the whole replay run
|
|
170
|
+
# (mirrors the TypeScript and Python SDKs' per-item rescue).
|
|
150
171
|
def process_single_item(http_client, server_item, receiver, method_name, test_run_id, mock_strategy)
|
|
172
|
+
metrics = extract_server_item_metrics(server_item)
|
|
173
|
+
|
|
151
174
|
span = http_client.get_external_span(server_item["externalSpanId"])
|
|
152
175
|
item_data = extract_span_data(span)
|
|
153
|
-
metrics = extract_server_item_metrics(server_item)
|
|
154
176
|
|
|
155
177
|
mock_tree = nil
|
|
156
178
|
if mock_strategy == "all" || mock_strategy == "marked"
|
|
@@ -169,6 +191,18 @@ module Bitfab
|
|
|
169
191
|
mock_strategy:,
|
|
170
192
|
mock_tree:
|
|
171
193
|
)
|
|
194
|
+
rescue => e
|
|
195
|
+
warn "Bitfab: replay item for span #{server_item["externalSpanId"]} failed before execution: #{e.message}"
|
|
196
|
+
{
|
|
197
|
+
input: [],
|
|
198
|
+
result: nil,
|
|
199
|
+
original_output: nil,
|
|
200
|
+
error: e.message,
|
|
201
|
+
duration_ms: metrics&.dig(:duration_ms),
|
|
202
|
+
tokens: metrics&.dig(:tokens),
|
|
203
|
+
model: metrics&.dig(:model),
|
|
204
|
+
trace_id: nil
|
|
205
|
+
}
|
|
172
206
|
end
|
|
173
207
|
|
|
174
208
|
# Walk the children of a root span tree node depth-first and build a
|
data/lib/bitfab/version.rb
CHANGED