Skip to content

Commit ac5b07b

Browse files
committed
align bedrock with spec
1 parent 305483c commit ac5b07b

File tree

2 files changed

+28
-62
lines changed

2 files changed

+28
-62
lines changed

lib/server/ai/config_tracker.rb

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def track_duration(duration)
7474
# @yield The block to measure
7575
# @return The result of the block
7676
#
77-
def track_duration_of
77+
def track_duration_of(&block)
7878
start_time = Time.now
7979
yield
8080
ensure
@@ -207,21 +207,17 @@ def track_openai_metrics(&block)
207207
# Track AWS Bedrock conversation operations.
208208
# This method tracks the duration, token usage, and success/error status.
209209
#
210-
# @param res [Hash] Response hash from Bedrock.
210+
# @yield The block to track.
211211
# @return [Hash] The original response hash.
212212
#
213-
def track_bedrock_converse_metrics(res)
214-
status_code = res.dig(:'$metadata', :httpStatusCode) || 0
215-
if status_code == 200
216-
track_success
217-
elsif status_code >= 400
218-
track_error
219-
end
220-
221-
track_duration(res[:metrics][:latency_ms]) if res.dig(:metrics, :latency_ms)
222-
track_tokens(bedrock_to_token_usage(res[:usage])) if res[:usage]
223-
224-
res
213+
def track_bedrock_converse_metrics(&block)
214+
result = track_duration_of(&block)
215+
track_success
216+
track_tokens(bedrock_to_token_usage(result[:usage])) if result[:usage]
217+
result
218+
rescue StandardError
219+
track_error
220+
raise
225221
end
226222

227223
private def flag_data

spec/server/ai/config_tracker_spec.rb

Lines changed: 18 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -122,19 +122,17 @@
122122
end
123123

124124
describe '#track_bedrock_metrics' do
125-
it 'tracks duration and tokens' do
126-
# TODO: Verify the $metadata field in bedrock result. I don't see anything like this in the docs.
127-
bedrock_result = {
128-
'$metadata': { httpStatusCode: 200 },
125+
let(:bedrock_result) do
126+
{
129127
usage: {
130128
total_tokens: 300,
131129
input_tokens: 200,
132130
output_tokens: 100,
133131
},
134-
metrics: {
135-
latency_ms: 50,
136-
},
137132
}
133+
end
134+
135+
it 'tracks duration and tokens' do
138136
expect(ld_client).to receive(:track).with(
139137
'$ld:ai:generation',
140138
context,
@@ -172,30 +170,19 @@
172170
100
173171
)
174172

175-
result = tracker.track_bedrock_converse_metrics(bedrock_result)
173+
result = tracker.track_bedrock_converse_metrics { bedrock_result }
176174
expect(result).to eq(bedrock_result)
177175
expect(tracker.summary).to be_a(LaunchDarkly::Server::AI::MetricSummary)
178176
expect(tracker.summary.usage).to be_a(LaunchDarkly::Server::AI::TokenUsage)
179177
expect(tracker.summary.usage.total).to eq(300)
180178
expect(tracker.summary.usage.input).to eq(200)
181179
expect(tracker.summary.usage.output).to eq(100)
182-
expect(tracker.summary.duration).to eq(50)
180+
expect(tracker.summary.duration).to be_a(Integer)
181+
expect(tracker.summary.duration).to be >= 0
183182
expect(tracker.summary.success).to be true
184183
end
185184

186-
it 'tracks duration and tokens with error' do
187-
# Verify the $metadata field in bedrock result. I don't see anything like this in the docs.
188-
bedrock_result = {
189-
'$metadata': { httpStatusCode: 400 },
190-
usage: {
191-
total_tokens: 300,
192-
input_tokens: 200,
193-
output_tokens: 100,
194-
},
195-
metrics: {
196-
latency_ms: 50,
197-
},
198-
}
185+
it 'tracks error for failed operation' do
199186
expect(ld_client).to receive(:track).with(
200187
'$ld:ai:generation',
201188
context,
@@ -214,33 +201,11 @@
214201
tracker_flag_data,
215202
kind_of(Integer)
216203
)
217-
expect(ld_client).to receive(:track).with(
218-
'$ld:ai:tokens:total',
219-
context,
220-
tracker_flag_data,
221-
300
222-
)
223-
expect(ld_client).to receive(:track).with(
224-
'$ld:ai:tokens:input',
225-
context,
226-
tracker_flag_data,
227-
200
228-
)
229-
expect(ld_client).to receive(:track).with(
230-
'$ld:ai:tokens:output',
231-
context,
232-
tracker_flag_data,
233-
100
234-
)
235204

236-
result = tracker.track_bedrock_converse_metrics(bedrock_result)
237-
expect(result).to eq(bedrock_result)
238-
expect(tracker.summary).to be_a(LaunchDarkly::Server::AI::MetricSummary)
239-
expect(tracker.summary.usage).to be_a(LaunchDarkly::Server::AI::TokenUsage)
240-
expect(tracker.summary.usage.total).to eq(300)
241-
expect(tracker.summary.usage.input).to eq(200)
242-
expect(tracker.summary.usage.output).to eq(100)
243-
expect(tracker.summary.duration).to eq(50)
205+
expect { tracker.track_bedrock_converse_metrics { raise 'test error' } }.to raise_error('test error')
206+
expect(tracker.summary.usage).to be_nil
207+
expect(tracker.summary.duration).to be_a(Integer)
208+
expect(tracker.summary.duration).to be >= 0
244209
expect(tracker.summary.success).to be false
245210
end
246211
end
@@ -299,6 +264,8 @@
299264
expect(tracker.summary.usage.total).to eq(300)
300265
expect(tracker.summary.usage.input).to eq(200)
301266
expect(tracker.summary.usage.output).to eq(100)
267+
expect(tracker.summary.duration).to be_a(Integer)
268+
expect(tracker.summary.duration).to be >= 0
302269
expect(tracker.summary.success).to be true
303270
end
304271

@@ -324,6 +291,9 @@
324291

325292
expect { tracker.track_openai_metrics { raise 'test error' } }.to raise_error('test error')
326293
expect(tracker.summary.usage).to be_nil
294+
expect(tracker.summary.duration).to be_a(Integer)
295+
expect(tracker.summary.duration).to be >= 0
296+
expect(tracker.summary.success).to be false
327297
end
328298
end
329299

0 commit comments

Comments
 (0)