A minimal microservices application for demonstrating monitoring, logging, and troubleshooting scenarios with Grafana, Prometheus, and Loki.
It's a bit bugged on purpose. Below there are 3 scenarios with bugs in the app, which Grafana dashboards help to identify.
Frontend (Port 3003) → Product Service (Port 3001) ← → Order Service (Port 3002)
↓ ↓
PostgreSQL DB PostgreSQL DB
(Port 5432) (Port 5433)
- Product Service (Port 3001) - Product catalog and inventory
- Order Service (Port 3002) - Orders, cart, and user auth
- Frontend Service (Port 3003) - React web interface
- Health Monitor (Port 5001) - Service health dashboard
- Grafana (Port 3000) - Monitoring dashboards
- Prometheus (Port 9090) - Metrics collection
- Loki (Port 3100) - Log aggregation
- Random Service (Port 5002) - Random Test service. Can be e.g. safely stopped to see changes in monitoring.
# Start all services
docker-compose up -d
# Start with rebuild
docker-compose up --build -d
# View logs
docker-compose logs -f
# Stop services
docker-compose down- Frontend: http://localhost:3003
- Health Monitor: http://localhost:5001
- Grafana: http://localhost:3000
- Random Unnecessary Service For Testing: http://localhost:5002
Test users for Frontend:
[email protected]/customer123[email protected]/demo123
In order tab you can set up delay with which Product DB will be updated with an order. It simulates a slow connection to the Product DB.
Example: You have quantity 25 of some item, 1 customer buys 25, another 24.
Both orders will succeed if you do them fast enough (if you set up slider to 10sec, you have 10sec to click both orders to be created).
To simulate that, login from 2 tabs, e.g.
- [email protected] / customer123
- [email protected] / demo123
You can track that bug in Grafana dashboard (Order DB and Product DB values should match):
Let's add some products to Order cart, and then stop our Product DB:
docker compose down product-db
Create an order. It creates successfully:
But even after starting Product DB again
docker compose up product-db -d
It isn't updated and still shows 25 quantity available, just like before creating the order.

You can track that bug in Grafana dashboard:
Let's add some products to Order cart, and then stop our Order DB:
docker compose down order-db
Create an order. It creates successfully:
But even after starting Order DB again
docker compose up order-db -d
No information about order is propagated to the DB, and it also disappears from Frontend.

User might be under wrong impression that the order was created, when in fact it wasn't.
You can track that bug in Grafana dashboard (Frontend and Order DB values should match):





