Implement observability
Add logging, metrics, and tracing to monitor application health.
Logging
Frontend logging
Use structured logging:
import { logger } from "@/lib/logger";
logger.info("Dataset fetched", { datasetId, userId });
logger.error("Fetch failed", { error, context });
Backend logging
Use SLF4J with Quarkus:
@Inject
Logger log;
public Dataset findById(Long id) {
log.info("Fetching dataset {}", id);
Dataset dataset = repository.findById(id);
log.debug("Found dataset: {}", dataset);
return dataset;
}
Metrics
Quarkus metrics
Enable Micrometer metrics in application.properties:
quarkus.micrometer.enabled=true
quarkus.micrometer.export.prometheus.enabled=true
Access metrics at /q/metrics.
Custom metrics
Track business metrics:
@Inject
MeterRegistry registry;
public void recordDatasetCreation() {
registry.counter("datasets.created").increment();
}
Distributed tracing
Enable OpenTelemetry for request tracing across services:
quarkus.opentelemetry.enabled=true
quarkus.opentelemetry.tracer.exporter.otlp.endpoint=http://jaeger:4317
View traces in Jaeger UI to debug cross-service issues.