Add audio duration and processing factor per minute to dashboard statistics
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user