01 · Problem
Wofür braucht man das?
Menschenlesbare Metrics-Exposition muss für Analyse oder Transformation strukturiert und ohne stille Teilakzeptanz geparst werden.
02 · Denkmodell
Das mentale Modell
HELP und TYPE gehören zu einer benannten Familie; Sample-Zeilen besitzen eigenen Namen, quote-aware Labels, Wert und optional weitere Felder.
Parst Metrikfamilien, Metadaten, escapte Labels und vollständige Zahlenwerte. Der Parser unterstützt Prometheus-Text-Exposition, nicht sämtliche OpenMetrics-Erweiterungen.
03 · Kontrollfluss
Was passiert in welcher Reihenfolge?
- Eingabe zeilenweise lesen und Leerzeilen überspringen.
- HELP- und TYPE-Direktiven nach Familienname speichern.
- Samplekopf mit einem quote- und escape-aware Lexer zerlegen.
- Sample seiner Familie zuordnen und vollständigen Zahlenwert validieren.
04 · Bauteile
Die entscheidenden Verträge
parsePrometheusMetrics(text)Liest Metadaten und Samples in getrennte Familien.parseSample / parseLabelsValidiert Zahlentokens und escapte Labelwerte.05 · Selbst bauen
Selbst implementieren
Unterstütze zunächst einen klar begrenzten Subset und lehne alles außerhalb davon sichtbar ab.
- Direktiven vor Samples erkennen und pro Familienname zwischenspeichern.
- Sample-Zeilen am Value-Feld trennen und den Kopf separat lexen.
- Labels zeichenweise innerhalb von Quotes und Escape-Sequenzen lesen.
type Sample = { name: string; value: number };
function parseSimpleSample(line: string): Sample {
const split = line.lastIndexOf(" ");
if (split < 1) throw new Error("Incomplete sample");
const head = line.slice(0, split).trim();
const raw = line.slice(split + 1).trim();
const value = Number(raw);
if (Number.isNaN(value)) throw new Error("Invalid value");
const brace = head.indexOf("{");
const name = head.slice(0, brace < 0 ? head.length : brace);
if (!name) throw new Error("Missing metric name");
return { name, value };
}06 · Verifizieren
Was solltest du testen?
- Mehrere Familien behalten eigene HELP-, TYPE- und Sample-Daten.
- Escaped Quotes, Kommas und Gleichheitszeichen in Labelwerten werden korrekt gelesen.
- NaN, +Inf, -Inf, Timestamp und ungültige Restzeichen folgen dem dokumentierten Subset.
Selbst ausprobieren
Formuliere die erste Prüfaussage als fehlschlagenden Test, implementiere die kleinste Korrektur und ergänze einen Grenzfall.
Mehrere Familien behalten eigene HELP-, TYPE- und Sample-Daten.
Ansatz vergleichen
Dein Test sollte beim gezielten Verletzen der Invariante fehlschlagen und nach der Korrektur wieder bestehen. Halte den Aufbau deterministisch und prüfe ein beobachtbares Ergebnis.
07 · Grenzen
Kompromisse und Stolperfallen
- Split-basierter Code ist kurz, akzeptiert aber komplexe Labelsyntax falsch.
- Ein Lexer ist robuster, muss dafür präzise Zustände und Fehlerspannen pflegen.
- Vollständige OpenMetrics-Unterstützung ist wesentlich größer als ein einfacher Prometheus-Subset.
Der Parser unterstützt Prometheus-Text-Exposition, nicht sämtliche OpenMetrics-Erweiterungen.
08 · Weiterdenken
Quellcode und verwandte Ideen
yarn tsx packages/prom-metrics-parser/examples/basic.ts