Add audio duration and processing factor per minute to dashboard statistics

This commit is contained in:
Dominic Ballenthin
2026-01-29 02:27:20 +01:00
parent 9529a284c8
commit 9aa911ac45
2 changed files with 41 additions and 3 deletions

View File

@@ -76,6 +76,26 @@ async def get_usage_stats(db: Session, days: int = 30):
UsageLog.status == "success" UsageLog.status == "success"
).scalar() or 0 ).scalar() or 0
# Average audio duration
avg_duration = db.query(func.avg(UsageLog.duration_seconds)).filter(
UsageLog.created_at >= since,
UsageLog.status == "success",
UsageLog.duration_seconds.isnot(None)
).scalar() or 0
# Processing factor (seconds processing time per minute of audio)
# Formula: (processing_time_ms / 1000) / duration_seconds * 60
processing_factor = db.query(
func.avg(
(UsageLog.processing_time_ms / 1000.0) / UsageLog.duration_seconds * 60
)
).filter(
UsageLog.created_at >= since,
UsageLog.status == "success",
UsageLog.duration_seconds.isnot(None),
UsageLog.duration_seconds > 0
).scalar() or 0
# Daily stats for chart # Daily stats for chart
daily_stats = db.query( daily_stats = db.query(
func.date(UsageLog.created_at).label("date"), func.date(UsageLog.created_at).label("date"),
@@ -96,6 +116,8 @@ async def get_usage_stats(db: Session, days: int = 30):
"total_requests": total_requests, "total_requests": total_requests,
"success_rate": round(success_rate, 2), "success_rate": round(success_rate, 2),
"avg_processing_time_ms": round(avg_time, 2), "avg_processing_time_ms": round(avg_time, 2),
"avg_duration_seconds": round(avg_duration, 2),
"processing_factor": round(processing_factor, 2),
"daily_stats": [ "daily_stats": [
{"date": str(stat.date), "count": stat.count, "avg_time": round(stat.avg_time or 0, 2)} {"date": str(stat.date), "count": stat.count, "avg_time": round(stat.avg_time or 0, 2)}
for stat in daily_stats for stat in daily_stats

View File

@@ -27,6 +27,14 @@
<div class="stat-value">{{ "%.2f"|format(stats.avg_processing_time_ms / 1000) }}s</div> <div class="stat-value">{{ "%.2f"|format(stats.avg_processing_time_ms / 1000) }}s</div>
<div class="stat-label">Ø Processing Time</div> <div class="stat-label">Ø Processing Time</div>
</div> </div>
<div class="stat-card">
<div class="stat-value">{{ "%.2f"|format(stats.avg_duration_seconds) }}s</div>
<div class="stat-label">Ø Audio Duration</div>
</div>
<div class="stat-card">
<div class="stat-value">{{ stats.processing_factor }}s</div>
<div class="stat-label">Ø Processing/min</div>
</div>
<div class="stat-card"> <div class="stat-card">
<div class="stat-value">{{ model }}</div> <div class="stat-value">{{ model }}</div>
<div class="stat-label">Model</div> <div class="stat-label">Model</div>
@@ -78,9 +86,10 @@
<tr> <tr>
<th>Time</th> <th>Time</th>
<th>Endpoint</th> <th>Endpoint</th>
<th>Duration</th> <th>Audio Duration</th>
<th>Processing Time</th>
<th>Factor (s/min)</th>
<th>Status</th> <th>Status</th>
<th>Processing</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -95,12 +104,19 @@
- -
{% endif %} {% endif %}
</td> </td>
<td>{{ "%.2f"|format(log.processing_time_ms / 1000) }}s</td>
<td>
{% if log.duration_seconds and log.duration_seconds > 0 %}
{{ "%.2f"|format((log.processing_time_ms / 1000) / log.duration_seconds * 60) }}s
{% else %}
-
{% endif %}
</td>
<td> <td>
<span class="badge badge-{{ 'success' if log.status == 'success' else 'danger' }}"> <span class="badge badge-{{ 'success' if log.status == 'success' else 'danger' }}">
{{ log.status }} {{ log.status }}
</span> </span>
</td> </td>
<td>{{ "%.2f"|format(log.processing_time_ms / 1000) }}s</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>