GET /metrics
Get API usage statistics. Useful for monitoring costs and performance.
curl https://vibestream-production-64f3.up.railway.app/metrics
{
"started_at": "2024-01-26T10:00:00Z",
"providers": {
"gemini": {
"calls": 156,
"errors": 2
},
"openai": {
"calls": 12,
"errors": 0
},
"anthropic": {
"calls": 8,
"errors": 0
}
},
"jobs": {
"created": 15,
"completed": 3,
"failed": 2
},
"frames": {
"captured": 450,
"skipped_prefilter": 312
},
"webhooks": {
"sent": 28,
"failed": 1
}
}
Metrics Fields
| Field | Description |
|---|
started_at | Server start time (metrics reset on restart) |
providers.*.calls | VLM API calls per provider |
providers.*.errors | API errors per provider |
jobs.created | Total jobs started |
jobs.completed | Jobs that finished successfully |
jobs.failed | Jobs that failed with errors |
frames.captured | Total frames captured from streams |
frames.skipped_prefilter | Frames filtered by motion detection |
webhooks.sent | Successful webhook deliveries |
webhooks.failed | Failed webhook deliveries |
Cost savings: Calculate your pre-filter savings with skipped_prefilter / (captured + skipped_prefilter) * 100%. Higher is better.
GET /logs
Get recent server logs for debugging. Last 500 entries are stored in memory.
Query Parameters
Filter by log level: DEBUG, INFO, WARNING, ERROR
Maximum number of logs to return.
curl "https://vibestream-production-64f3.up.railway.app/logs?limit=50"
{
"total_in_buffer": 127,
"returned": 5,
"logs": [
{
"time": "2024-01-26 10:30:00,123",
"level": "INFO",
"message": "[JOB:a1b2c3d4] Starting live monitor job for https://youtube.com/watch?v=..."
},
{
"time": "2024-01-26 10:30:01,456",
"level": "INFO",
"message": "[JOB:a1b2c3d4] Sent 'started' webhook"
},
{
"time": "2024-01-26 10:30:15,789",
"level": "INFO",
"message": "[JOB:a1b2c3d4] Analyzing frame with gemini-2.5-flash..."
},
{
"time": "2024-01-26 10:30:17,012",
"level": "INFO",
"message": "[JOB:a1b2c3d4] Analysis result: triggered=true, explanation=Yes, several..."
},
{
"time": "2024-01-26 10:30:17,345",
"level": "INFO",
"message": "[JOB:a1b2c3d4] TRIGGER FIRED! Sending webhook..."
}
]
}
Logs include a job ID prefix for easy filtering:
[JOB:a1b2c3d4] Starting live monitor job for https://youtube.com/watch?v=...
[JOB:a1b2c3d4] Frame skipped by prefilter (total skipped: 15)
[JOB:a1b2c3d4] Analyzing frame with gemini-2.5-flash...
[JOB:a1b2c3d4] TRIGGER FIRED! Sending webhook...
Logs are stored in memory and cleared on server restart. The first 8
characters of the job ID are shown for brevity.
Debugging Tips
- Job not triggering? Check INFO logs for “Analysis result: triggered=false”
- High frame skip rate? This is normal - pre-filter is working
- VLM errors? Check ERROR logs for rate limit or API key issues
- Webhook failures? Look for “webhooks_failed” in metrics