@@ -168,7 +168,11 @@ class EventLoopMetrics:
168168 tool_metrics : Dict [str , ToolMetrics ] = field (default_factory = dict )
169169 cycle_durations : List [float ] = field (default_factory = list )
170170 traces : List [Trace ] = field (default_factory = list )
171- accumulated_usage : Usage = field (default_factory = lambda : Usage (inputTokens = 0 , outputTokens = 0 , totalTokens = 0 ))
171+ accumulated_usage : Usage = field (
172+ default_factory = lambda : Usage (
173+ inputTokens = 0 , outputTokens = 0 , totalTokens = 0 , cacheReadInputTokens = 0 , cacheWriteInputTokens = 0
174+ )
175+ )
172176 accumulated_metrics : Metrics = field (default_factory = lambda : Metrics (latencyMs = 0 ))
173177
174178 @property
@@ -263,6 +267,8 @@ def update_usage(self, usage: Usage) -> None:
263267 self .accumulated_usage ["inputTokens" ] += usage ["inputTokens" ]
264268 self .accumulated_usage ["outputTokens" ] += usage ["outputTokens" ]
265269 self .accumulated_usage ["totalTokens" ] += usage ["totalTokens" ]
270+ self .accumulated_usage ["cacheReadInputTokens" ] += usage .get ("cacheReadInputTokens" , 0 )
271+ self .accumulated_usage ["cacheWriteInputTokens" ] += usage .get ("cacheWriteInputTokens" , 0 )
266272
267273 def update_metrics (self , metrics : Metrics ) -> None :
268274 """Update the accumulated performance metrics with new metrics data.
@@ -320,15 +326,18 @@ def _metrics_summary_to_lines(event_loop_metrics: EventLoopMetrics, allowed_name
320326 An iterable of formatted text lines representing the metrics.
321327 """
322328 summary = event_loop_metrics .get_summary ()
329+ accumulated_usage = summary ["accumulated_usage" ]
323330 yield "Event Loop Metrics Summary:"
324331 yield (
325332 f"├─ Cycles: total={ summary ['total_cycles' ]} , avg_time={ summary ['average_cycle_time' ]:.3f} s, "
326333 f"total_time={ summary ['total_duration' ]:.3f} s"
327334 )
328335 yield (
329- f"├─ Tokens: in={ summary ['accumulated_usage' ]['inputTokens' ]} , "
330- f"out={ summary ['accumulated_usage' ]['outputTokens' ]} , "
331- f"total={ summary ['accumulated_usage' ]['totalTokens' ]} "
336+ f"├─ Tokens: in={ accumulated_usage ['inputTokens' ]} "
337+ f" (cache_write={ accumulated_usage .get ('cacheWriteInputTokens' , 0 )} ), "
338+ f"out={ accumulated_usage ['outputTokens' ]} , "
339+ f"total={ accumulated_usage ['totalTokens' ]} "
340+ f" (cache_read={ accumulated_usage .get ('cacheReadInputTokens' , 0 )} )"
332341 )
333342 yield f"├─ Bedrock Latency: { summary ['accumulated_metrics' ]['latencyMs' ]} ms"
334343
@@ -421,6 +430,8 @@ class MetricsClient:
421430 event_loop_latency : Histogram
422431 event_loop_input_tokens : Histogram
423432 event_loop_output_tokens : Histogram
433+ event_loop_input_tokens_cache_read : Histogram
434+ event_loop_input_tokens_cache_write : Histogram
424435
425436 tool_call_count : Counter
426437 tool_success_count : Counter
@@ -474,3 +485,9 @@ def create_instruments(self) -> None:
474485 self .event_loop_output_tokens = self .meter .create_histogram (
475486 name = constants .STRANDS_EVENT_LOOP_OUTPUT_TOKENS , unit = "token"
476487 )
488+ self .event_loop_input_tokens_cache_read = self .meter .create_histogram (
489+ name = constants .STRANDS_EVENT_LOOP_INPUT_TOKEN_CACHE_READ , unit = "token"
490+ )
491+ self .event_loop_input_tokens_cache_write = self .meter .create_histogram (
492+ name = constants .STRANDS_EVENT_LOOP_INPUT_TOKENS_CACHE_WRITE , unit = "token"
493+ )
0 commit comments