alepha@docs:~/docs/guides/observability$
cat 3-metrics.md
1 min read
Last commit:

#Metrics

For serious monitoring, you need metrics. Alepha integrates with Prometheus out of the box.

#Setup

typescript
1import { Alepha } from "alepha";2import { AlephaServerMetrics } from "alepha/server-metrics";3 4const alepha = Alepha.create()5  .with(AlephaServerMetrics);6 7// GET /metrics -> prometheus format

#What You Get

The metrics endpoint exposes:

  • HTTP request count - Total requests by method, path, status
  • HTTP request duration - Histogram of response times
  • Active connections - Current open connections
  • Node.js metrics - Memory, CPU, event loop lag

Example output:

prometheus
# 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

#Prometheus Configuration

Add Alepha to your Prometheus scrape config:

yaml
1# prometheus.yml2scrape_configs:3  - job_name: 'alepha-app'4    static_configs:5      - targets: ['localhost:3000']6    metrics_path: /metrics7    scrape_interval: 15s

#Grafana Dashboard

Once Prometheus is scraping your metrics, create dashboards in Grafana:

Request Rate:

promql
rate(http_requests_total[5m])

Error Rate:

promql
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))

P95 Latency:

promql
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))

Memory Usage:

promql
nodejs_heap_size_used_bytes / nodejs_heap_size_total_bytes

#Custom Metrics

Need application-specific metrics? Use the metrics provider directly:

typescript
 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}

#Alerting

Set up alerts in Prometheus or Grafana:

yaml
 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"

#Best Practices

  1. Don't over-label - High cardinality labels (user IDs, request IDs) will blow up your storage
  2. Use histograms for latency - They give you percentiles without pre-aggregation
  3. Set meaningful buckets - Match your SLOs (e.g., buckets at 100ms, 500ms, 1s)
  4. Monitor the four golden signals - Latency, traffic, errors, saturation
  5. Scrape frequently enough - 15s is standard, 5s for critical services
On This Page
No headings found...
ready
mainTypeScript
UTF-8guides_observability_metrics.md