Prometheus-Exporter
Der Prometheus-Exporter verwandelt die In-Process-
Metriken-Registry in das Prometheus-Textformat, das
Prometheus / Grafana / Thanos von /metrics scrapen.
import { ActorSystem, MetricsExtensionId, exportPrometheus } from 'actor-ts';
const system = ActorSystem.create('my-app');const metrics = system.extension(MetricsExtensionId);
// In einem HTTP-Handler:get(async () => { const text = exportPrometheus(metrics.registry); return { status: 200, body: text, contentType: 'text/plain; version=0.0.4' };});Gibt einen einzelnen String im Prometheus-0.0.4-Exposition-Format zurück:
# HELP http_requests_total Total HTTP requests# TYPE http_requests_total counterhttp_requests_total{route="/orders"} 1234http_requests_total{route="/users"} 567
# HELP sessions_active Currently active sessions# TYPE sessions_active gaugesessions_active 123
# HELP http_request_duration_ms HTTP request latency# TYPE http_request_duration_ms histogramhttp_request_duration_ms_bucket{route="/orders",le="10"} 100http_request_duration_ms_bucket{route="/orders",le="50"} 250http_request_duration_ms_bucket{route="/orders",le="+Inf"} 300http_request_duration_ms_count{route="/orders"} 300http_request_duration_ms_sum{route="/orders"} 12450Über den Management-Endpunkt
Abschnitt betitelt „Über den Management-Endpunkt“Der einfachste Weg führt über den HttpManagement- Helper:
import { HttpManagement } from 'actor-ts';
await HttpManagement.start(system, { port: 8558, enableMetricsEndpoint: true, // ← exponiert GET /metrics});Prometheus-Scrape-Config:
scrape_configs: - job_name: 'actor-ts' static_configs: - targets: ['my-app:8558']Der Management-Server läuft auf einem separaten Port vom Haupt-HTTP-Server deiner App. Typisches Muster: App auf 8080 (öffentlich), Management auf 8558 (nur intern).
Manuelles Verdrahten
Abschnitt betitelt „Manuelles Verdrahten“Wenn du HttpManagement nicht nutzt, route GET /metrics
selbst:
import { path, get } from 'actor-ts/http';import { exportPrometheus } from 'actor-ts';
const routes = path('metrics', get(async () => ({ status: 200, body: exportPrometheus(metrics.registry), contentType: 'text/plain; version=0.0.4', headers: {}, })),);Binde wenn möglich an einen dedizierten Port — Prometheus’ Scrapes sind periodisch und sollten den App-Port nicht teilen.
Namenskonventionen
Abschnitt betitelt „Namenskonventionen“http_requests_total # Counter — Suffix `_total`sessions_active # Gauge — kein Suffixhttp_request_duration_seconds # Histogram — _bucket / _count / _sumprocess_cpu_seconds_total # Counter — Prometheus-NamensgebungPrometheus hat Konventionen (Naming-Guide):
- Counter enden auf
_total(oder beschreiben, was gezählt wird). - Histogramme / Timer enthalten die Einheit im Namen
(
_seconds,_ms,_bytes). _count/_sumsind vom Framework angehängte Suffixe für Histogramme.- Labels sind snake_case-Strings.
Das Framework erzwingt diese nicht — aber Prometheus-Tooling erwartet sie.
Scrape-Frequenz vs Gauge-Update-Rate
Abschnitt betitelt „Scrape-Frequenz vs Gauge-Update-Rate“- Scrape alle 15-30 Sekunden — Prometheus-Default.
- Gauges in beliebiger Kadenz aktualisieren — Prometheus sieht nur den Wert zur Scrape-Zeit.
- Counter können in beliebiger Rate inkrementiert werden; Prometheus berechnet die Rate aus aufeinanderfolgenden Scrapes.
Für sehr schnell ändernde Werte (Speichernutzung, Mailbox-Tiefe) kann der Gauge zur Scrape-Zeit veraltet sein. Das ist okay — Prometheus ist mit seinen Samples eventually consistent.
Details zum Exposition-Format
Abschnitt betitelt „Details zum Exposition-Format“| Serie | Format |
|---|---|
| Counter | Eine Zeile pro Serie. metric_name{labels} value |
| Gauge | Gleich wie Counter. |
| Histogram | Eine _bucket{le=N}-Zeile pro Bucket + _count + _sum. |
Der Exporter übernimmt die Formatierung; du baust sie nicht manuell.
Wo es weitergeht
Abschnitt betitelt „Wo es weitergeht“- Observability — Überblick — das größere Bild.
- Core-Metriken — die vier Primitive.
- Management — Überblick —
der einfache Weg,
/metricszu exponieren. - Stock-Metriken — die automatisch aufgezeichneten Metriken des Frameworks, die hier erscheinen.
Die exportPrometheus-
Funktion-Referenz deckt die volle API ab.