Skip to main content

Overview

PyqDeck uses a three-layer observability stack: Sentry for error tracking and profiling, Better Stack (Logtail) for structured logging, and Better Uptime for availability monitoring.

Error Tracking: Sentry

Packages: @sentry/node v10, @sentry/profiling-node v10

Initialization

Sentry is initialized in the backend entry point (backend/src/index.js):

What’s Captured

Error Handler Middleware

All server errors flow through the error handler (backend/src/middlewares/errorHandler.js):
Sentry also sets up Express error handling via Sentry.setupExpressErrorHandler(app) in app.js.

Logging: Winston + Better Stack

Packages: winston, @logtail/node, @logtail/winston

Three Transport Layers

The logger (backend/src/utils/logger/index.js) sends logs to three destinations:

Logtail Configuration

Logtail is enabled when LOGTAIL_SOURCE_TOKEN is set:
On startup, the system logs: "System initialized and connected to Better Stack!"

HTTP Request Logging

Morgan middleware logs all HTTP requests in 'dev' format:

Availability Monitoring: Better Uptime

URL: pyqdeck.betteruptime.com Better Uptime monitors the health endpoint:
If the endpoint is unreachable or returns a non-200 status, Better Uptime sends alerts to the team.

Rate Limiting

File: backend/src/middlewares/rateLimiter.middleware.js
  • Store: In-memory TTL (not Redis)
  • Default: 100 requests per 15-minute window
  • Configurable via RATE_LIMIT_WINDOW_MS and RATE_LIMIT_MAX env vars
Rate limit exceeded responses include standard headers:

Health Endpoints

Debugging Production Issues

Step 1: Check Better Uptime

If the service is down, Better Uptime will show the outage and when it started.

Step 2: Check Sentry

For application errors:
  1. Open the Sentry dashboard
  2. Filter by environment (production)
  3. Check the error’s transaction trace for the full request lifecycle
  4. View the attached CPU profile to identify performance bottlenecks

Step 3: Check Better Stack

For structured log analysis:
  1. Open the Better Stack dashboard
  2. Search logs by user ID, request path, or error message
  3. Correlate with Sentry events using timestamps

Step 4: Check Render Logs

For deployment and infrastructure issues:
  1. Open the Render dashboard
  2. View the service logs for startup errors, crash loops, or deployment failures

Security Considerations

  • Stack traces are stripped in production for 500-level errors
  • CLERK_SECRET_KEY is never logged or exposed
  • Rate limiting prevents abuse
  • Non-root Docker user limits container escape risk

Next Steps