Metrics#
Request metrics collector with Prometheus export. Tracks request count, duration, errors, and in-flight requests.
typescript
import { Metrics, metricsEndpoint, metricsMiddleware } from "@buntok/core/metrics";Setup#
typescript
import { Buntok } from "@buntok/core";
import { Metrics, metricsEndpoint, metricsMiddleware } from "@buntok/core/metrics";
const app = new Buntok();
const metrics = new Metrics();
// Add middleware to record all requests
app.use(metricsMiddleware(metrics));
// Register /metrics endpoint for Prometheus scraping
metricsEndpoint(metrics, "/metrics"); // default: "/metrics"
app.listen(1212);Read Metrics#
typescript
const snapshot = metrics.read();
console.log(snapshot.requests); // total requests
console.log(snapshot.errors); // total errors
console.log(snapshot.inFlight); // currently in-flight
console.log(snapshot.totalDurationMs); // total duration across all requests
// Per-route breakdown
console.log(snapshot.byRoute);
// {
// "GET /users": { count: 150, avgDurationMs: 12.5, p99Ms: 45.2 },
// "POST /users": { count: 30, avgDurationMs: 25.1, p99Ms: 89.3 },
// }
// Per-status-class breakdown
console.log(snapshot.byStatusClass);
// { "2xx": 150, "4xx": 12, "5xx": 3 }Prometheus Export#
typescript
// Export in Prometheus text format
const prometheus = metrics.toPrometheus();
// # HELP http_requests_total Total HTTP requests
// # TYPE http_requests_total counter
// http_requests_total{method="GET",path="/users",status="200"} 150
// ...Manual Recording#
If you need to record requests outside of the middleware (e.g., custom handlers):
typescript
app.get("/custom", (ctx) => {
const end = metrics.start("GET /custom");
// ... do work ...
end(200); // record with status code
return ctx.json({ ok: true });
});API Reference#
Metrics Class#
| Method | Description |
|---|---|
| metrics.record(route, statusCode, durationMs) | Record a completed request |
| metrics.start(route) | Start timing a request (returns end function) |
| metrics.read() | Get current MetricSnapshot |
| metrics.toPrometheus() | Export in Prometheus text format |
Helper Functions#
| Function | Description |
|---|---|
| metricsMiddleware(metrics, route?) | Middleware that auto-records requests |
| metricsEndpoint(metrics, path?) | Register /metrics endpoint |
MetricSnapshot#
typescript
interface MetricSnapshot {
requests: number; // total request count
errors: number; // total error count (status >= 500)
inFlight: number; // currently in-flight requests
totalDurationMs: number; // total duration across all requests
byRoute: Record<string, {
count: number;
avgDurationMs: number;
p99Ms: number;
}>;
byStatusClass: Record<string, number>; // { "2xx": N, "4xx": N, "5xx": N }
}