The Flights Service manages the core inventory of the application. It handles the creation and retrieval of flights, airplanes, airports, and cities. This service is instrumented with Prometheus metrics for comprehensive monitoring and observability.
Create a .env file in this directory:
PORT=3500
# Database Connection (MySQL)
DATABASE_URL="mysql://root:password@localhost:3306/flights_booking"Note: The service runs on port 3500 (not 3000) to avoid conflicts with the frontend. This port is configured in Prometheus for metrics scraping.
Base URL: /api/v1
POST /airplane- Create a new airplane.GET /airplane- Get all airplanes.GET /airplane/:id- Get airplane details.DELETE /airplane/:id- Delete an airplane.PATCH /airplane/:id- Update an airplane.
POST /city- Create a new city.GET /city- List all cities.DELETE /city/:id- Delete a city.PATCH /city/:id- Update city details.
POST /airport- Create a new airport.GET /airport- List all airports.GET /airport/:id- Get airport details.DELETE /airport/:id- Delete airport.PATCH /airport/:id- Update airport details.
POST /flight- Create a new flight (Schedule a flight).GET /flight- Search/List flights (supports query params).- Query Parameters:
trips:{departureCode}-{arrivalCode}(e.g.,DEL-BOM)tripdate:YYYY-MM-DDformatprice:{min}-{max}(e.g.,1000-5000)travellers: Number of seats requiredsort:{field}_{order}(e.g.,price_asc,departureTime_desc)
- Query Parameters:
GET /flight/:id- Get flight details.PATCH /flight/:id/seats- Update remaining seats (Internal/System use).
GET /ping- Health check endpoint.
GET /metrics- Prometheus metrics endpoint (exposes all collected metrics).
The Flights Service is fully instrumented with Prometheus metrics for monitoring application performance, request patterns, and business metrics.
The service exposes metrics at:
http://localhost:3500/metrics
| Metric Name | Type | Description | Labels |
|---|---|---|---|
http_requests_total |
Counter | Total number of HTTP requests received | method, route, status_code |
http_request_duration_ms |
Histogram | Duration of HTTP requests in milliseconds | method, route, status_code |
active_requests |
Gauge | Number of currently active (in-flight) requests | - |
Histogram Buckets: [50, 100, 200, 500, 1000, 2000, 3000, 5000] milliseconds
| Metric Name | Type | Description | Labels |
|---|---|---|---|
flight_search_total |
Counter | Total number of flight searches performed | has_price, has_date, has_trips |
flight_search_results_count |
Histogram | Number of flight results returned per search | - |
Search Metric Labels:
has_price:"true"or"false"- Whether price filter was usedhas_date:"true"or"false"- Whether date filter was usedhas_trips:"true"or"false"- Whether route filter was used
Results Histogram Buckets: [0, 1, 5, 10, 20, 50, 100] results
Prometheus client automatically collects Node.js process metrics:
process_cpu_user_seconds_total- CPU time spent in user modeprocess_cpu_system_seconds_total- CPU time spent in system modeprocess_resident_memory_bytes- Resident memory sizenodejs_heap_size_total_bytes- Total heap sizenodejs_heap_size_used_bytes- Used heap sizenodejs_eventloop_lag_seconds- Event loop lag- And more...
All routes are instrumented with metricsMiddleware that automatically:
- Increments
active_requestsgauge at request start - Records request duration in
http_request_duration_mshistogram - Increments
http_requests_totalcounter with labels - Decrements
active_requestsgauge at request completion
Add this to your prometheus.yml:
scrape_configs:
- job_name: "flight-service"
static_configs:
- targets: ["localhost:3500"] # Or your server IP
scrape_interval: 2sRecommended Grafana panels:
- Request Rate:
rate(http_requests_total[5m]) - Request Duration (p95):
histogram_quantile(0.95, http_request_duration_ms_bucket) - Error Rate:
rate(http_requests_total{status_code=~"5.."}[5m]) - Active Requests:
active_requests - Flight Search Trends:
rate(flight_search_total[5m]) - Search Results Distribution:
histogram_quantile(0.95, flight_search_results_count_bucket) - Memory Usage:
process_resident_memory_bytes - CPU Usage:
rate(process_cpu_user_seconds_total[5m])
The service uses Winston for structured logging with daily log rotation:
- Log files:
logs/YYYY-MM-DD-app.log - Log levels:
error,warn,info,debug - Includes correlation IDs for request tracing
Database: flights_booking
Tables:
Cities- City informationAirport- Airport details (linked to Cities)Airplane- Airplane models and capacityFlight- Flight schedules (linked to Airplanes and Airports)Seat- Seat configurations per airplaneuser- User information (legacy, managed by API Gateway)
Relationships:
Cities(1) → (Many)AirportAirport(1) → (Many)Flight(departure)Airport(1) → (Many)Flight(arrival)Airplane(1) → (Many)FlightAirplane(1) → (Many)Seat
See root README.md for detailed database design.
Client Request
↓
API Gateway (Port 5000)
↓
Flights Service (Port 3500)
↓
Metrics Middleware (collects metrics)
↓
Route Handler
↓
Service Layer
↓
Repository Layer
↓
Prisma ORM → MySQL Database
npm install
npm run devThe service will start on http://localhost:3500
npm install
npm run build
npm startcurl http://localhost:3500/api/v1/pingcurl http://localhost:3500/metricsexpress(v5.1.0) - Web framework@prisma/client(v7.1.0) - Database ORMprom-client(v15.1.3) - Prometheus metrics clientwinston(v3.17.0) - Loggingzod(v3.25.76) - Schema validationcors(v2.8.5) - CORS middleware
typescript(v5.9.3)ts-node(v10.9.2)nodemon(v3.1.9)prisma(v7.1.0)