Skip to content

Commit 0a46646

Browse files
author
Workshop Participant
committed
Reports cache token usage as metric
1 parent e5908c0 commit 0a46646

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

src/strands/telemetry/metrics.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
)

src/strands/telemetry/metrics_constants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@
1313
STRANDS_EVENT_LOOP_CYCLE_DURATION = "strands.event_loop.cycle_duration"
1414
STRANDS_EVENT_LOOP_INPUT_TOKENS = "strands.event_loop.input.tokens"
1515
STRANDS_EVENT_LOOP_OUTPUT_TOKENS = "strands.event_loop.output.tokens"
16+
STRANDS_EVENT_LOOP_INPUT_TOKEN_CACHE_READ = "strands.event_loop.input.tokens.cache.read"
17+
STRANDS_EVENT_LOOP_INPUT_TOKENS_CACHE_WRITE = "strands.event_loop.input.tokens.cache.write"

0 commit comments

Comments
 (0)