Feat: add prometheus compatible endpoint, seed fallback store and add env.example
This commit is contained in:
@@ -47,39 +47,65 @@ Your task is to extract the high-throughput ticket purchasing component and exte
|
||||
- Docker and Docker Compose
|
||||
- Git
|
||||
|
||||
### Environment Variables
|
||||
|
||||
The following environment variables can be configured in your `.env` file:
|
||||
|
||||
| Variable | Default | Description |
|
||||
| --------------------------- | ------------------------ | ---------------------------------------- |
|
||||
| `PORT` | `3049` | Server port number |
|
||||
| `NODE_ENV` | `development` | Environment mode |
|
||||
| `REDIS_URL` | `redis://localhost:6379` | Redis connection string |
|
||||
| `LOG_LEVEL` | `info` | Logging level (error, warn, info, debug) |
|
||||
| `LOG_FILE` | `logs/app.log` | Log file path |
|
||||
| `PDF_OUTPUT_DIR` | `tickets` | Directory for generated PDF tickets |
|
||||
| `PDF_CLEANUP_MAX_AGE_HOURS` | `24` | Maximum age for PDF cleanup |
|
||||
| `TEST_URL` | `http://localhost:3049` | Base URL for load testing |
|
||||
|
||||
### Quick Start
|
||||
|
||||
1. **Clone the repository**
|
||||
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd module4_backend_project
|
||||
```
|
||||
|
||||
2. **Install dependencies**
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
3. **Set up environment**
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
cp env.example .env
|
||||
# Edit .env file if needed
|
||||
```
|
||||
|
||||
> **Note**: The `env.example` file contains default configuration values. Copy it to `.env` and modify as needed for your environment.
|
||||
|
||||
> **Important**: Create the `logs` directory if you want to use file logging: `mkdir logs`
|
||||
|
||||
4. **Start with Docker (Recommended)**
|
||||
|
||||
```bash
|
||||
# Start core services (Redis + App)
|
||||
docker-compose up -d
|
||||
|
||||
|
||||
# Or start with monitoring (Prometheus + Grafana)
|
||||
docker-compose --profile monitoring up -d
|
||||
```
|
||||
|
||||
> **Note**: For Docker deployment, you can also set environment variables directly in `docker-compose.yml` or use the `.env` file for local development.
|
||||
|
||||
5. **Seed the database**
|
||||
|
||||
```bash
|
||||
# Seed 5 events with 10,000 tickets each
|
||||
npm run seed
|
||||
|
||||
|
||||
# Custom seeding: 3 events with 5,000 tickets each
|
||||
npm run seed 3 5000
|
||||
```
|
||||
@@ -88,12 +114,19 @@ Your task is to extract the high-throughput ticket purchasing component and exte
|
||||
|
||||
If you prefer to run components separately:
|
||||
|
||||
1. **Start Redis**
|
||||
1. **Create necessary directories**
|
||||
|
||||
```bash
|
||||
mkdir -p logs tickets
|
||||
```
|
||||
|
||||
2. **Start Redis**
|
||||
|
||||
```bash
|
||||
docker-compose up -d redis
|
||||
```
|
||||
|
||||
2. **Start the application**
|
||||
3. **Start the application**
|
||||
```bash
|
||||
npm run dev # Development with auto-reload
|
||||
# or
|
||||
@@ -104,22 +137,23 @@ If you prefer to run components separately:
|
||||
|
||||
Once running, the following endpoints are available:
|
||||
|
||||
| Method | Endpoint | Description |
|
||||
|--------|----------|-------------|
|
||||
| GET | `/health` | System health check |
|
||||
| GET | `/events` | List all events with statistics |
|
||||
| GET | `/events/:eventId` | Get specific event details |
|
||||
| POST | `/buy/:eventId` | Purchase a ticket for an event |
|
||||
| GET | `/tickets/:purchaseId` | Download ticket PDF |
|
||||
| GET | `/metrics` | Real-time system metrics |
|
||||
| GET | `/admin/pdf-stats` | PDF management statistics |
|
||||
| POST | `/admin/cleanup-tickets` | Cleanup old ticket files |
|
||||
| Method | Endpoint | Description |
|
||||
| ------ | ------------------------ | --------------------------------------- |
|
||||
| GET | `/health` | System health check |
|
||||
| GET | `/events` | List all events with statistics |
|
||||
| GET | `/events/:eventId` | Get specific event details |
|
||||
| POST | `/buy/:eventId` | Purchase a ticket for an event |
|
||||
| GET | `/tickets/:purchaseId` | Download ticket PDF |
|
||||
| GET | `/metrics` | Real-time system metrics |
|
||||
| GET | `/admin/pdf-stats` | PDF management statistics |
|
||||
| POST | `/admin/cleanup-tickets` | Cleanup old ticket files |
|
||||
| POST | `/admin/seed-fallback` | Manually seed fallback store from Redis |
|
||||
|
||||
### Load Testing
|
||||
|
||||
The system includes a comprehensive load testing framework:
|
||||
|
||||
```bash
|
||||
````bash
|
||||
# Run full test suite (5000+ concurrent connections)
|
||||
npm run test:load -- --full
|
||||
|
||||
@@ -131,7 +165,9 @@ npm run test:load -- --multi --events 1,2,3 --connections 6000
|
||||
|
||||
# Custom load test
|
||||
node tests/load-test.js --event 2 --connections 1000 --duration 10
|
||||
```
|
||||
|
||||
# Test fallback store functionality
|
||||
npm run test:fallback
|
||||
|
||||
### Monitoring & Metrics
|
||||
|
||||
@@ -146,6 +182,22 @@ Grafana dashboard: http://localhost:3000
|
||||
- Username: `admin`
|
||||
- Password: `admin`
|
||||
|
||||
### Fallback Store Management
|
||||
|
||||
The system includes a robust fallback mechanism that automatically activates when Redis is unavailable:
|
||||
|
||||
- **Automatic Seeding**: The fallback store is automatically seeded during server startup and when activated
|
||||
- **Data Synchronization**: When Redis becomes available again, the fallback store can be manually synced
|
||||
- **Manual Seeding**: Use `/admin/seed-fallback` to manually populate the fallback store from Redis data
|
||||
|
||||
```bash
|
||||
# Manually seed fallback store from Redis
|
||||
curl -X POST http://localhost:3049/admin/seed-fallback
|
||||
|
||||
# Check fallback store status
|
||||
curl http://localhost:3049/health
|
||||
````
|
||||
|
||||
### Docker Commands
|
||||
|
||||
```bash
|
||||
@@ -174,6 +226,42 @@ docker-compose up -d --build
|
||||
- **Logging & Metrics:** Proper logging of operations and a functional metrics endpoint suitable for Prometheus scraping.
|
||||
- **Design Rationale:** The design document (`design.md`) should clearly articulate your architectural decisions, potential bottlenecks, and design solutions.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **Redis Connection Failed**
|
||||
|
||||
- Ensure Redis is running: `docker-compose up -d redis`
|
||||
- Check Redis URL in `.env` file
|
||||
- Verify Redis port (default: 6379) is not blocked
|
||||
|
||||
2. **Port Already in Use**
|
||||
|
||||
- Change `PORT` in `.env` file
|
||||
- Kill process using the port: `lsof -ti:3049 | xargs kill -9`
|
||||
|
||||
3. **Missing Dependencies**
|
||||
|
||||
- Run `npm install` to install all dependencies
|
||||
- Ensure Node.js version is 18+ (check with `node --version`)
|
||||
|
||||
4. **Permission Denied for Logs/Tickets**
|
||||
|
||||
- Create directories with proper permissions: `mkdir -p logs tickets`
|
||||
- Check file permissions: `chmod 755 logs tickets`
|
||||
|
||||
5. **Fallback Store Not Working**
|
||||
- Ensure Redis is seeded: `npm run seed`
|
||||
- Check fallback store status: `npm run test:fallback`
|
||||
- Manually seed fallback: `curl -X POST http://localhost:3049/admin/seed-fallback`
|
||||
|
||||
### Getting Help
|
||||
|
||||
- Check application logs in the `logs` directory
|
||||
- Verify Redis connection: `curl http://localhost:3049/health`
|
||||
- Test fallback store: `npm run test:fallback`
|
||||
|
||||
## Final Challenges
|
||||
|
||||
- Enhance your docker-compose setup to include a Prometheus container for live monitoring.
|
||||
|
||||
Reference in New Issue
Block a user