Skip to content

chore(observability): align AI service log format with web/worker logs (#51) - #56

Merged
Fluory merged 3 commits into
mainfrom
claude/chore-ai-log-format-51
Sep 24, 2026
Merged

Fluory merged 3 commits into
mainfrom
claude/chore-ai-log-format-51

Conversation

@Fluory

@Fluory Fluory commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

Warum

Fixes #51 · Der KI-Dienst schrieb Logs mit anderen Schlüsseln (ts, level: "WARNING", logger) als Web und Worker (pino: time, level: "warn", event). Eine gemeinsame Auswertung über alle drei Dienste war dadurch umständlich.

Arbeitsstand

  • Ziel: Eine Logzeile des KI-Dienstes hat dieselben Schlüssel, Level-Namen und dieselbe kompakte Form wie die TS-Logs.
  • Nicht-Ziele: jobId/companyId im KI-Dienst – er bekommt sie nie (zustandslos, ADR-0001 D8); das bräuchte eine Vertragsänderung.
  • Erledigt: jsonlog.py, Tests, operations.md („Shared log format“), CHANGELOG, frischer Review eingearbeitet (kompaktes JSON, logger nur bei Bibliotheken, Exception-Test), CI grün.
  • Offen: Review/Merge durch den Orchestrator.
  • Annahmen: –
  • Nächster kleinster Schritt: Review und Merge durch den Orchestrator.

Was ist passiert (Klartext)

Alle drei Teile des Systems (Webseite, Hintergrund-Worker, KI-Dienst) schreiben ihre Protokolle jetzt im gleichen Format: gleiche Feldnamen, gleiche Bezeichnungen für Warnungen und Fehler. So kann man eine Anfrage über ihre requestId durch alle drei Protokolle verfolgen, ohne umzurechnen. Meldet eine eingebaute Bibliothek (z. B. die Dokumentenerkennung) etwas, steht dabei, von wem es kommt. Inhaltlich wird nichts Neues geloggt – weiterhin nur IDs und Codes, keine Mail-Inhalte; bei Fehlern nur deren Art, nie deren Text.

Plan-Pflicht (SYSTEM.md §4)

  • Kein Auslöser – keine Modulgrenze, öffentliche API, Migration, Auth/Rechte, kein Zahlungs-/Daten-/Infrapfad, höchstens zwei Module, keine Architekturvarianten, umkehrbar
  • Auslöser zutreffend – Impact Manifest ausgefüllt (Plan vor Code)

Geändert

  • services/ai/src/requestflow_ai/jsonlog.py: Schlüssel level/time/event/requestId/documentId, pino-Level-Namen, kompaktes JSON, logger nur für Bibliotheks-Einträge
  • services/ai/tests/test_jsonlog.py: gemeinsamer Schlüsselsatz, Level-Namen, kompakte Form, Exception nur als Typ, Bibliotheksquelle
  • docs/technical/operations.md, CHANGELOG.md

Nachweis (SYSTEM.md §11)

Doku-Entscheidung (genau eine)

  • Keine langlebige Doku betroffen – Begründung: –
  • Doku betroffen und im selben PR aktualisiert:
    • Produktdoku (P0: README): –
    • Technische Doku: docs/technical/operations.md
    • Architekturkarte: –
    • ADR: –
    • CHANGELOG [Unreleased] (sichtbares Feature oder Verhalten – im selben PR, nie „später")

Entferntes oder Umbenanntes: docs/ + README gegrept, Treffer bereinigt: nichts entfernt

Dateigrößen und neue Bausteine (SYSTEM.md §7)

Dateien über 500 Zeilen im Diff (Ausnahmen: generierter Code, Lockfiles, Fixtures, Migrationen, Schemas, Ressourcen, Doku, Konfiguration):

  • keine
  • bewusst belassen – Begründung: –
  • im selben PR nach fachlicher Verantwortung geteilt
  • Folge-Issue –

Über 800 Zeilen mit neuer Fachlogik oder über 1000 Zeilen (P1/P2): nicht betroffen

Neue Shared-Komponente, Utility-Datei, Adapter oder fachlicher Service:

  • nein
  • ja – gesucht nach: –

Subagent-Einsätze

  • Umsetzungs-Subagent (Worktree) – Umsetzung und Tests.
  • Frischer Review-Subagent (read-only) – nichts blockierend, 1 should + 3 nit, alle behoben.

Risiken / offene Punkte

  • Wer die alten Schlüssel (ts) in einer Auswertung nutzt, muss umstellen – bisher gibt es keine.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1

#51)

The AI service JSON formatter now emits the pino key set used by web and
worker: `level` (lower-case pino label, WARNING -> warn, CRITICAL -> fatal),
`time` (UTC ISO 8601 with milliseconds and `Z`, like Date.toISOString) and
`event`, plus the allow-listed IDs/extras as before. `ts` and `logger` are
gone. jobId/companyId are not known to the AI service (it only receives
X-Request-Id), so they stay web/worker-only. Documented once in
operations.md; test pins the exact key set and level labels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
… tests (#51 review)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1

Fluory commented Sep 24, 2026

Copy link
Copy Markdown
Owner Author

Frischer Review (read-only Subagent) – Ergebnis und Umgang

Nichts blockierend. Belegt: Schlüssel und Level-Namen entsprechen src/features/observability/log.ts; beide neuen Tests scheitern mit jsonlog.py von main; die Allow-List ist unverändert, eine Exception liefert nur ihren Typ.

Befund Umgang
should – ohne logger ist bei Warnungen von docling/httpx die Quelle unklar behoben in 0f223c4: logger nur bei Bibliotheks-Einträgen (Name nicht unter requestflow_ai); eigene Zeilen bleiben pino-gleich; Test
nit – json.dumps mit ", "/": " statt kompakt wie pino behoben: separators=(",", ":"); Test
nit – excType undokumentiert, kein Test für den Exception-Pfad behoben: in operations.md beschrieben; Test prüft, dass nur der Typ, nie die Meldung (synthetische Firmen-/Mail-Daten) im Log landet
nit – Test setzt propagate = False ohne Zurücksetzen behoben

Nach der Änderung: ruff/format/pyright sauber, pytest 428 passed / 2 skipped, doku-check grün.


Generated by Claude Code

@Fluory
Fluory marked this pull request as ready for review September 24, 2026 11:20
@Fluory
Fluory merged commit 15d9033 into main Sep 24, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore(observability): align the AI service log format with the web/worker logs

2 participants