Implement Prometheus metrics endpoint (P2.16)
Add comprehensive metrics collection for production monitoring: - src/lib/metrics.ts: prom-client based metrics library with custom counters, gauges, and histograms for Garmin sync, email, and decision engine - GET /api/metrics: Prometheus-format endpoint for scraping - Integration into garmin-sync cron: sync duration, success/failure counts, active users gauge - Integration into email.ts: daily and warning email counters - Integration into decision-engine.ts: decision type counters Custom metrics implemented: - phaseflow_garmin_sync_total (counter with status label) - phaseflow_garmin_sync_duration_seconds (histogram) - phaseflow_email_sent_total (counter with type label) - phaseflow_decision_engine_calls_total (counter with decision label) - phaseflow_active_users (gauge) 33 new tests (18 library + 15 route), bringing total to 586 tests. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
// ABOUTME: Sends daily training notifications and period confirmation emails.
|
||||
import { Resend } from "resend";
|
||||
|
||||
import { emailSentTotal } from "@/lib/metrics";
|
||||
|
||||
const resend = new Resend(process.env.RESEND_API_KEY);
|
||||
|
||||
const EMAIL_FROM = process.env.EMAIL_FROM || "phaseflow@example.com";
|
||||
@@ -57,6 +59,8 @@ Auto-generated by PhaseFlow`;
|
||||
subject,
|
||||
text: body,
|
||||
});
|
||||
|
||||
emailSentTotal.inc({ type: "daily" });
|
||||
}
|
||||
|
||||
export async function sendPeriodConfirmationEmail(
|
||||
@@ -114,4 +118,6 @@ Auto-generated by PhaseFlow`;
|
||||
subject,
|
||||
text: body,
|
||||
});
|
||||
|
||||
emailSentTotal.inc({ type: "warning" });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user