1111
1212from strands .telemetry .tracer import JSONEncoder , Tracer , get_tracer , serialize
1313from strands .types .content import ContentBlock
14- from strands .types .streaming import StopReason , Usage
14+ from strands .types .streaming import Metrics , StopReason , Usage
1515
1616
1717@pytest .fixture (autouse = True )
@@ -205,9 +205,10 @@ def test_end_model_invoke_span(mock_span):
205205 tracer = Tracer ()
206206 message = {"role" : "assistant" , "content" : [{"text" : "Response" }]}
207207 usage = Usage (inputTokens = 10 , outputTokens = 20 , totalTokens = 30 )
208+ metrics = Metrics (latencyMs = 20 , timeToFirstByteMs = 10 )
208209 stop_reason : StopReason = "end_turn"
209210
210- tracer .end_model_invoke_span (mock_span , message , usage , stop_reason )
211+ tracer .end_model_invoke_span (mock_span , message , usage , metrics , stop_reason )
211212
212213 mock_span .set_attribute .assert_any_call ("gen_ai.usage.prompt_tokens" , 10 )
213214 mock_span .set_attribute .assert_any_call ("gen_ai.usage.input_tokens" , 10 )
@@ -216,6 +217,8 @@ def test_end_model_invoke_span(mock_span):
216217 mock_span .set_attribute .assert_any_call ("gen_ai.usage.total_tokens" , 30 )
217218 mock_span .set_attribute .assert_any_call ("gen_ai.usage.cache_read_input_tokens" , 0 )
218219 mock_span .set_attribute .assert_any_call ("gen_ai.usage.cache_write_input_tokens" , 0 )
220+ mock_span .set_attribute .assert_any_call ("gen_ai.server.request.duration" , 20 )
221+ mock_span .set_attribute .assert_any_call ("gen_ai.server.time_to_first_token" , 10 )
219222 mock_span .add_event .assert_called_with (
220223 "gen_ai.choice" ,
221224 attributes = {"message" : json .dumps (message ["content" ]), "finish_reason" : "end_turn" },
@@ -231,9 +234,10 @@ def test_end_model_invoke_span_latest_conventions(mock_span):
231234 tracer .use_latest_genai_conventions = True
232235 message = {"role" : "assistant" , "content" : [{"text" : "Response" }]}
233236 usage = Usage (inputTokens = 10 , outputTokens = 20 , totalTokens = 30 )
237+ metrics = Metrics (latencyMs = 20 , timeToFirstByteMs = 10 )
234238 stop_reason : StopReason = "end_turn"
235239
236- tracer .end_model_invoke_span (mock_span , message , usage , stop_reason )
240+ tracer .end_model_invoke_span (mock_span , message , usage , metrics , stop_reason )
237241
238242 mock_span .set_attribute .assert_any_call ("gen_ai.usage.prompt_tokens" , 10 )
239243 mock_span .set_attribute .assert_any_call ("gen_ai.usage.input_tokens" , 10 )
@@ -242,6 +246,8 @@ def test_end_model_invoke_span_latest_conventions(mock_span):
242246 mock_span .set_attribute .assert_any_call ("gen_ai.usage.total_tokens" , 30 )
243247 mock_span .set_attribute .assert_any_call ("gen_ai.usage.cache_read_input_tokens" , 0 )
244248 mock_span .set_attribute .assert_any_call ("gen_ai.usage.cache_write_input_tokens" , 0 )
249+ mock_span .set_attribute .assert_any_call ("gen_ai.server.time_to_first_token" , 10 )
250+ mock_span .set_attribute .assert_any_call ("gen_ai.server.request.duration" , 20 )
245251 mock_span .add_event .assert_called_with (
246252 "gen_ai.client.inference.operation.details" ,
247253 attributes = {
@@ -766,8 +772,9 @@ def test_end_model_invoke_span_with_cache_metrics(mock_span):
766772 cacheWriteInputTokens = 3 ,
767773 )
768774 stop_reason : StopReason = "end_turn"
775+ metrics = Metrics (latencyMs = 10 , timeToFirstByteMs = 5 )
769776
770- tracer .end_model_invoke_span (mock_span , message , usage , stop_reason )
777+ tracer .end_model_invoke_span (mock_span , message , usage , metrics , stop_reason )
771778
772779 mock_span .set_attribute .assert_any_call ("gen_ai.usage.prompt_tokens" , 10 )
773780 mock_span .set_attribute .assert_any_call ("gen_ai.usage.input_tokens" , 10 )
@@ -776,6 +783,8 @@ def test_end_model_invoke_span_with_cache_metrics(mock_span):
776783 mock_span .set_attribute .assert_any_call ("gen_ai.usage.total_tokens" , 30 )
777784 mock_span .set_attribute .assert_any_call ("gen_ai.usage.cache_read_input_tokens" , 5 )
778785 mock_span .set_attribute .assert_any_call ("gen_ai.usage.cache_write_input_tokens" , 3 )
786+ mock_span .set_attribute .assert_any_call ("gen_ai.server.request.duration" , 10 )
787+ mock_span .set_attribute .assert_any_call ("gen_ai.server.time_to_first_token" , 5 )
779788 mock_span .set_status .assert_called_once_with (StatusCode .OK )
780789 mock_span .end .assert_called_once ()
781790
0 commit comments