Skip to main content

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

FieldDescription
started_atServer start time (metrics reset on restart)
providers.*.callsVLM API calls per provider
providers.*.errorsAPI errors per provider
jobs.createdTotal jobs started
jobs.completedJobs that finished successfully
jobs.failedJobs that failed with errors
frames.capturedTotal frames captured from streams
frames.skipped_prefilterFrames filtered by motion detection
webhooks.sentSuccessful webhook deliveries
webhooks.failedFailed 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

level
string
Filter by log level: DEBUG, INFO, WARNING, ERROR
limit
integer
default:"100"
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..."
    }
  ]
}

Log Format

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

  1. Job not triggering? Check INFO logs for “Analysis result: triggered=false”
  2. High frame skip rate? This is normal - pre-filter is working
  3. VLM errors? Check ERROR logs for rate limit or API key issues
  4. Webhook failures? Look for “webhooks_failed” in metrics