A complete microservices observability stack with Go services, OpenTelemetry instrumentation, and full monitoring capabilities including distributed tracing, metrics, structured logging, and visualization dashboards.
- Microservices: Order Service & Notification Service with HTTP APIs
- Distributed Tracing: Full request flow visibility across services
- Structured Logging: JSON logs with trace correlation in Loki
- Metrics & Monitoring: Custom business metrics in Prometheus
- Database Observability: Query performance tracking with PostgreSQL
- Dashboards: Pre-configured Grafana visualizations
- API Testing: Bruno collection with automated test scripts
βββββββββββββββββββ ββββββββββββββββββββ
β Order Service ββββββNotification Serviceβ
β (Port 8080) β β (Port 8081) β
βββββββββββββββββββ ββββββββββββββββββββ
β β
βββββββββββββ¬ββββββββββββ
β
βββββββββββββΌβββββββββββββ
β OpenTelemetry β
β Collector β
βββ¬ββββββββββ¬ββββββββββ¬βββ
β β β
ββββββββΌβββ ββββββΌβββββ ββββΌββββββ
β Jaeger β βPrometheusβ β Loki β
β(Traces) β β(Metrics) β β (Logs) β
βββββββββββ βββββββββββ ββββββββββ
β
ββββββββΌβββββββ
β Grafana β
β (Dashboard) β
βββββββββββββββ
- Docker & Docker Compose
- Bruno (for API testing)
docker compose up -d- Grafana: http://localhost:3000 (admin/admin)
- Jaeger: http://localhost:16686
- Prometheus: http://localhost:9090
curl -X POST http://localhost:8080/products \
-H "Content-Type: application/json" \
-d '{"name": "Gaming Laptop", "price": 1299.99, "stock": 15}'curl -X POST http://localhost:8080/orders \
-H "Content-Type: application/json" \
-d '{"product_id": "PRODUCT_ID", "quantity": 2}'curl "http://localhost:8080/orders?page=1&page_size=10"- End-to-end visibility: Track requests across all microservices
- Database operations: Automatic query performance monitoring
- HTTP calls: Client-side instrumentation for external API calls
- Error tracking: Automatic error correlation with traces
- JSON format: Machine-readable logs with structured fields
- Trace correlation: Every log includes
trace_idandspan_id - Business context: Logs include
order_id,product_id,request_id - Performance data: Request latencies, database timing, HTTP status codes
- Business metrics: Order counts, product inventory, notification success rates
- System metrics: Database connections, HTTP request rates, error percentages
- Custom dashboards: Pre-built Grafana panels for key KPIs
- Query performance: Automatic timing for all database operations
- Connection pooling: Active connection monitoring
- Error tracking: Failed queries with full context
The repository includes a complete Bruno collection with automated test scripts:
- Variable management: Automatic extraction of IDs between requests
- Complete workflow: Create product β Create order β Get order details
- Validation tests: Response structure and data validation
- Trace correlation: Request IDs for debugging
- Open Bruno and import the collection from
./bruno/ - Run requests in sequence to see the full workflow
- Check Grafana/Jaeger for observability data
# All errors across services
{level="error"}
# Trace-specific logs
{trace_id="YOUR_TRACE_ID"}
# Database operations
{service="order-service"} |= "database"
# Order workflow
{order_id="YOUR_ORDER_ID"}
# Request rate
rate(http_requests_total[5m])
# Error rate
rate(http_requests_total{status=~"5.."}[5m])
# Database query duration
histogram_quantile(0.95, rate(db_query_duration_seconds_bucket[5m]))
All data persists across container restarts:
- Grafana: Dashboards, users, settings
- Prometheus: Metrics history
- PostgreSQL: Application data
- Loki: Log history
LOG_FORMAT: Set to "json" for structured loggingENVIRONMENT: Set to "production" for optimal observabilityOTEL_EXPORTER_OTLP_ENDPOINT: OpenTelemetry collector endpoint
- Order Service: http://localhost:8080
- Notification Service: http://localhost:8081
- PostgreSQL: localhost:5432
Each service exposes health endpoints:
/health- Service health status/ready- Readiness probe for Kubernetes
This demo includes production-ready patterns:
- Graceful shutdown with proper cleanup
- Connection pooling for database efficiency
- Rate limiting and error handling
- Security headers and request validation
- Structured configuration with environment variables
- Check Promtail logs:
docker logs promtail - Verify LOG_FORMAT=json in environment
- Restart Promtail:
docker restart promtail
- Verify OTEL_EXPORTER_OTLP_ENDPOINT is set correctly
- Check OpenTelemetry collector logs
- Ensure services are making HTTP requests
- Check PostgreSQL logs:
docker logs postgres - Verify DB_DSN connection string
- Check database health in service logs
This setup demonstrates enterprise-grade observability practices suitable for production microservices environments.