Add comprehensive data visualization to the runtime detail page:
- Daily token usage stacked area chart and daily cost bar chart
- Model distribution donut chart with cost breakdown
- GitHub-style activity heatmap (13 weeks of daily token usage)
- Hourly task distribution bar chart with new backend endpoint
- Responsive 2-column grid layout for charts on wide screens
Backend: new GET /api/runtimes/{runtimeId}/activity endpoint
returning hourly task counts from agent_task_queue.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
34 lines
1.2 KiB
SQL
34 lines
1.2 KiB
SQL
-- name: UpsertRuntimeUsage :exec
|
|
INSERT INTO runtime_usage (runtime_id, date, provider, model, input_tokens, output_tokens, cache_read_tokens, cache_write_tokens)
|
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
|
ON CONFLICT (runtime_id, date, provider, model)
|
|
DO UPDATE SET
|
|
input_tokens = EXCLUDED.input_tokens,
|
|
output_tokens = EXCLUDED.output_tokens,
|
|
cache_read_tokens = EXCLUDED.cache_read_tokens,
|
|
cache_write_tokens = EXCLUDED.cache_write_tokens,
|
|
updated_at = now();
|
|
|
|
-- name: ListRuntimeUsage :many
|
|
SELECT * FROM runtime_usage
|
|
WHERE runtime_id = $1
|
|
ORDER BY date DESC
|
|
LIMIT $2;
|
|
|
|
-- name: GetRuntimeUsageSummary :many
|
|
SELECT provider, model,
|
|
SUM(input_tokens)::bigint AS total_input_tokens,
|
|
SUM(output_tokens)::bigint AS total_output_tokens,
|
|
SUM(cache_read_tokens)::bigint AS total_cache_read_tokens,
|
|
SUM(cache_write_tokens)::bigint AS total_cache_write_tokens
|
|
FROM runtime_usage
|
|
WHERE runtime_id = $1
|
|
GROUP BY provider, model
|
|
ORDER BY provider, model;
|
|
|
|
-- name: GetRuntimeTaskHourlyActivity :many
|
|
SELECT EXTRACT(HOUR FROM started_at)::int AS hour, COUNT(*)::int AS count
|
|
FROM agent_task_queue
|
|
WHERE runtime_id = $1 AND started_at IS NOT NULL
|
|
GROUP BY hour
|
|
ORDER BY hour;
|