For serious monitoring, you need metrics. Alepha integrates with Prometheus out of the box.
1import { Alepha } from "alepha";2import { AlephaServerMetrics } from "alepha/server-metrics";3 4const alepha = Alepha.create()5 .with(AlephaServerMetrics);6 7// GET /metrics -> prometheus format
The metrics endpoint exposes:
Example output:
# HELP http_requests_total Total number of HTTP requests
# TYPE http_requests_total counter
http_requests_total{method="GET",path="/api/users",status="200"} 1523
http_requests_total{method="POST",path="/api/users",status="201"} 42
http_requests_total{method="GET",path="/api/users",status="500"} 3
# HELP http_request_duration_seconds HTTP request duration in seconds
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{method="GET",path="/api/users",le="0.1"} 1400
http_request_duration_seconds_bucket{method="GET",path="/api/users",le="0.5"} 1510
http_request_duration_seconds_bucket{method="GET",path="/api/users",le="1"} 1520
http_request_duration_seconds_bucket{method="GET",path="/api/users",le="+Inf"} 1523
# HELP nodejs_heap_size_total_bytes Process heap size in bytes
# TYPE nodejs_heap_size_total_bytes gauge
nodejs_heap_size_total_bytes 52428800
Add Alepha to your Prometheus scrape config:
1# prometheus.yml2scrape_configs:3 - job_name: 'alepha-app'4 static_configs:5 - targets: ['localhost:3000']6 metrics_path: /metrics7 scrape_interval: 15s
Once Prometheus is scraping your metrics, create dashboards in Grafana:
Request Rate:
rate(http_requests_total[5m])
Error Rate:
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
P95 Latency:
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
Memory Usage:
nodejs_heap_size_used_bytes / nodejs_heap_size_total_bytes
Need application-specific metrics? Use the metrics provider directly:
1import { $inject } from "alepha"; 2import { MetricsProvider } from "alepha/server-metrics"; 3 4class OrderService { 5 metrics = $inject(MetricsProvider); 6 7 private orderCounter = this.metrics.counter({ 8 name: "orders_total", 9 help: "Total number of orders",10 labelNames: ["status"],11 });12 13 private orderValue = this.metrics.histogram({14 name: "order_value_dollars",15 help: "Order value in dollars",16 buckets: [10, 50, 100, 500, 1000],17 });18 19 async createOrder(order: Order) {20 // ... create order logic ...21 22 this.orderCounter.inc({ status: "created" });23 this.orderValue.observe(order.total);24 }25}
Set up alerts in Prometheus or Grafana:
1# prometheus/alerts.yml 2groups: 3 - name: alepha 4 rules: 5 - alert: HighErrorRate 6 expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.05 7 for: 5m 8 labels: 9 severity: critical10 annotations:11 summary: "High error rate detected"12 description: "Error rate is {{ $value | humanizePercentage }}"13 14 - alert: SlowResponses15 expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 116 for: 5m17 labels:18 severity: warning19 annotations:20 summary: "Slow response times"21 description: "P95 latency is {{ $value }}s"