refactor(metrics): Interface-basierte Metriken-Konfiguration #258

Closed
opened 2026-01-25 10:41:24 +00:00 by jack · 0 comments
Owner

Beschreibung

Die Prometheus-Metriken werden aktuell inline in packages/backend/src/metrics/index.ts definiert. Für bessere Wartbarkeit und Konsistenz sollte eine Interface-basierte Struktur verwendet werden.

Aktueller Stand

export const httpRequestDuration = new Histogram({
  name: 'claude_mem_http_request_duration_ms',
  help: 'HTTP request duration in milliseconds',
  labelNames: ['method', 'path', 'status'] as const,
  buckets: [10, 50, 100, 200, 500, 1000, 2000, 5000],
  registers: [registry],
});

Vorgeschlagene Struktur

// types/metrics.ts
interface BaseMetricConfig {
  name: string;
  help: string;
  labelNames?: readonly string[];
}

interface HistogramConfig extends BaseMetricConfig {
  type: 'histogram';
  buckets: number[];
}

interface CounterConfig extends BaseMetricConfig {
  type: 'counter';
}

interface GaugeConfig extends BaseMetricConfig {
  type: 'gauge';
}

type MetricConfig = HistogramConfig | CounterConfig | GaugeConfig;

// metrics/config.ts
export const METRICS_CONFIG = {
  httpRequestDuration: {
    type: 'histogram',
    name: 'claude_mem_http_request_duration_ms',
    help: 'HTTP request duration in milliseconds',
    labelNames: ['method', 'path', 'status'],
    buckets: [10, 50, 100, 200, 500, 1000, 2000, 5000],
  },
  // ...
} as const satisfies Record<string, MetricConfig>;

// metrics/index.ts
function createMetrics(config: typeof METRICS_CONFIG) {
  // Factory-Funktion die aus Config die prom-client Instanzen erstellt
}

Vorteile

  • Zentrale Konfiguration aller Metriken
  • Wiederverwendbar in Tests (Mock-Registry)
  • Einfacher neue Metriken hinzuzufügen
  • Typsicherheit für Metrik-Namen und Labels
  • Config kann auch für Dokumentation/Dashboards exportiert werden

Aufgaben

  • Metric-Interfaces in packages/types definieren
  • Config-Objekt mit allen Metriken erstellen
  • Factory-Funktion zum Erstellen der prom-client Instanzen
  • Bestehende Metriken migrieren
  • Tests anpassen
## Beschreibung Die Prometheus-Metriken werden aktuell inline in `packages/backend/src/metrics/index.ts` definiert. Für bessere Wartbarkeit und Konsistenz sollte eine Interface-basierte Struktur verwendet werden. ## Aktueller Stand ```typescript export const httpRequestDuration = new Histogram({ name: 'claude_mem_http_request_duration_ms', help: 'HTTP request duration in milliseconds', labelNames: ['method', 'path', 'status'] as const, buckets: [10, 50, 100, 200, 500, 1000, 2000, 5000], registers: [registry], }); ``` ## Vorgeschlagene Struktur ```typescript // types/metrics.ts interface BaseMetricConfig { name: string; help: string; labelNames?: readonly string[]; } interface HistogramConfig extends BaseMetricConfig { type: 'histogram'; buckets: number[]; } interface CounterConfig extends BaseMetricConfig { type: 'counter'; } interface GaugeConfig extends BaseMetricConfig { type: 'gauge'; } type MetricConfig = HistogramConfig | CounterConfig | GaugeConfig; // metrics/config.ts export const METRICS_CONFIG = { httpRequestDuration: { type: 'histogram', name: 'claude_mem_http_request_duration_ms', help: 'HTTP request duration in milliseconds', labelNames: ['method', 'path', 'status'], buckets: [10, 50, 100, 200, 500, 1000, 2000, 5000], }, // ... } as const satisfies Record<string, MetricConfig>; // metrics/index.ts function createMetrics(config: typeof METRICS_CONFIG) { // Factory-Funktion die aus Config die prom-client Instanzen erstellt } ``` ## Vorteile - [ ] Zentrale Konfiguration aller Metriken - [ ] Wiederverwendbar in Tests (Mock-Registry) - [ ] Einfacher neue Metriken hinzuzufügen - [ ] Typsicherheit für Metrik-Namen und Labels - [ ] Config kann auch für Dokumentation/Dashboards exportiert werden ## Aufgaben - [ ] Metric-Interfaces in `packages/types` definieren - [ ] Config-Objekt mit allen Metriken erstellen - [ ] Factory-Funktion zum Erstellen der prom-client Instanzen - [ ] Bestehende Metriken migrieren - [ ] Tests anpassen
jack 2026-01-25 10:41:27 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
customable/claude-mem#258
No description provided.