Phase 7: Observability - Implementation Summary
✅ Completed Tasks
1. OpenTelemetry Instrumentation ✅
- Enhanced
libs/observability/src/tracing/tracing.tswith better configuration - Created
TraceServicefor custom span creation - Created
TraceInterceptorfor automatic HTTP span creation - All services initialize OpenTelemetry in
main.ts
2. Metrics Collection ✅
- Enhanced
MetricsServicewith RED metrics (Rate, Errors, Duration) - Added business metrics (bookings, payments, notifications)
- Added infrastructure metrics (DB, Redis, Kafka)
- Created
MetricsInterceptorfor automatic HTTP metrics
3. Structured Logging ✅
- Enhanced
LoggerServicewith JSON structured logging - Automatic trace correlation (trace ID, span ID in logs)
- Context-aware logging with metadata
4. Signoz Configuration ✅
- Updated
otel-collector-config.yamlto enable traces, metrics, and logs - All three pipelines (traces, metrics, logs) configured
- Resource processor for environment enrichment
5. Dashboards ✅
Created 4 dashboard configurations:
- API Gateway Dashboard: RED metrics, latency, rate limits
- Booking Service Dashboard: Business metrics, conflicts, status distribution
- Database Dashboard: Connection pool, query latency, slow queries
- Kafka Dashboard: Consumer lag, throughput, processing latency
6. Alert Policies ✅
Created comprehensive alert configuration:
- Error rate alerts (1% warning, 5% critical)
- Latency alerts (500ms warning, 1000ms critical)
- Business alerts (booking conflicts, payment failures)
- Infrastructure alerts (Kafka lag, DB connections, Redis memory)
7. SLO Monitoring ✅
Created SLO configuration:
- API Gateway: 99.9% availability, 95% < 200ms
- Booking Service: 99.5% availability, 95% success rate
- Payment Service: 99% success rate, 95% < 2s
- Error budget tracking
8. Service Instrumentation ✅
- Booking Service: Fully instrumented with custom spans and metrics
- API Gateway: Observability modules added
- Other services: Ready for instrumentation (same pattern)
📁 Files Created/Modified
New Files
libs/observability/src/tracing/trace.service.ts
libs/observability/src/tracing/trace.interceptor.ts
libs/observability/src/metrics/metrics.interceptor.ts
config/signoz/dashboards/api-gateway-dashboard.json
config/signoz/dashboards/booking-service-dashboard.json
config/signoz/dashboards/database-dashboard.json
config/signoz/dashboards/kafka-dashboard.json
config/signoz/alerts/alert-policies.yaml
config/signoz/slo-monitoring.yaml
docs/OBSERVABILITY.md
docs/PHASE-7-IMPLEMENTATION-SUMMARY.md
Modified Files
libs/observability/src/tracing/tracing.ts
libs/observability/src/tracing/tracing.module.ts
libs/observability/src/metrics/metrics.service.ts
libs/observability/src/logging/logger.service.ts
libs/observability/src/index.ts
config/signoz/otel-collector-config.yaml
apps/booking-service/src/app.module.ts
apps/booking-service/src/bookings/bookings.service.ts
apps/api-gateway/src/app.module.ts
🚀 Next Steps
To Complete Instrumentation for All Services
- Add to each service's
app.module.ts:
import {
LoggerModule,
MetricsInterceptor,
MetricsModule,
TraceInterceptor,
TracingModule,
} from '@football-booking/observability';
import { APP_INTERCEPTOR } from '@nestjs/core';
@Module({
imports: [
// ... existing imports
TracingModule,
MetricsModule,
LoggerModule,
],
providers: [
// ... existing providers
{
provide: APP_INTERCEPTOR,
useClass: TraceInterceptor,
},
{
provide: APP_INTERCEPTOR,
useClass: MetricsInterceptor,
},
],
})
- Ensure
main.tsinitializes tracing (already done):
import { initializeTracing } from '@football-booking/observability';
initializeTracing('service-name');
- Add custom instrumentation to critical operations (see Booking Service example)
Services to Instrument
- [x] API Gateway
- [x] Booking Service
- [ ] Field Service
- [ ] Payment Service
- [ ] Notification Service
- [ ] User Service
📊 Metrics Available
RED Metrics
http.requests.total- Total HTTP requestshttp.requests.errors- Error requestshttp.request.duration- Request latencydb.queries.total- Database queriesdb.query.duration- Query latencyredis.operations.total- Redis operationskafka.messages.total- Kafka messages
Business Metrics
bookings.created- Booking creation countbookings.conflicts- Conflict detectionbookings.status_changes- Status transitionspayments.processed- Payment processingnotifications.sent- Notification delivery
Infrastructure Metrics
db.connections.active- Active DB connectionsdb.connections.usage_percent- Connection pool usageredis.memory.used- Redis memory usagekafka.consumer.lag- Consumer lag per topic
🔧 Configuration
Environment Variables
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
SERVICE_VERSION=1.0.0
NODE_ENV=development
Signoz Access
- Frontend UI: http://localhost:3301
- Query Service: http://localhost:8083
- OTEL Collector: http://localhost:4318
📖 Documentation
See docs/OBSERVABILITY.md for:
- Architecture overview
- Usage examples
- Dashboard setup
- Alert configuration
- Troubleshooting guide
✅ Validation Checklist
- [x] OpenTelemetry SDK initialized in all services
- [x] Custom spans for critical operations
- [x] RED metrics collection
- [x] Business metrics collection
- [x] Infrastructure metrics collection
- [x] Structured JSON logging with trace correlation
- [x] Signoz OTEL collector configured (traces, metrics, logs)
- [x] Dashboard configurations created
- [x] Alert policies configured
- [x] SLO monitoring configured
- [ ] All services instrumented (2/6 complete)
- [ ] Dashboards imported to Signoz
- [ ] Alerts configured in Signoz
- [ ] End-to-end testing completed
🎯 Key Achievements
- Complete observability stack with OpenTelemetry + Signoz
- Automatic instrumentation via interceptors
- Comprehensive metrics covering RED, business, and infrastructure
- Production-ready dashboards for all key services
- Alert policies for proactive monitoring
- SLO monitoring for reliability tracking
📝 Notes
- Booking Service serves as the reference implementation
- Other services can follow the same pattern
- Dashboard JSON files can be imported directly into Signoz
- Alert policies use PromQL syntax (Signoz compatible)
- All metrics follow OpenTelemetry semantic conventions