feat(jobs): add durable PG queue reclaim, slog, and richer metrics

JSON slog в ключевых пакетах; Prometheus path_group, job_audit_depth, upstream breaker; job_audit ClaimQueued/ReclaimStaleRunning + Adopt loop для HA после рестарта.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Denozordec
2026-07-31 12:26:18 +07:00
co-authored by Cursor
parent 13e3d21ce2
commit 8fe74c1d3b
18 changed files with 448 additions and 51 deletions
+10 -9
View File
@@ -14,6 +14,7 @@ import (
"evobgp/internal/config"
"evobgp/internal/dbcli"
"evobgp/internal/httpapi"
"evobgp/internal/logging"
"evobgp/internal/observability"
"evobgp/internal/platform"
"evobgp/internal/version"
@@ -65,13 +66,13 @@ func main() {
}
go func() {
svc := platform.ServiceName("evobgp-api")
log.Printf("%s listening on %s", svc, cfg.HTTPAddr)
log.Printf("bundle signing public key (base64, set on evobgp-node): %s", srv.BundlePublicKeyBase64())
logging.Default().Info("listening", "service", svc, "addr", cfg.HTTPAddr)
logging.Default().Info("bundle signing public key (base64, set on evobgp-node)", "key", srv.BundlePublicKeyBase64())
if opts.SeedDemo {
tid, mCDN, mIP, rev, sp := srv.Store().DemoIDs()
log.Printf("demo tenant=%s module_cdn=%s module_ip_ranges=%s revision=%s speaker=%s", tid, mCDN, mIP, rev, sp)
log.Printf("example: EVOBGP_API_KEYS=op|%s|operator,node|%s|node", tid, tid)
log.Printf("demo auth: Authorization: Bearer dev (operator, demo tenant only)")
logging.Default().Info("demo ids", "tenant", tid, "module_cdn", mCDN, "module_ip_ranges", mIP, "revision", rev, "speaker", sp)
logging.Default().Info("example API keys", "hint", "EVOBGP_API_KEYS=op|"+tid+"|operator,node|"+tid+"|node")
logging.Default().Info("demo auth: Authorization: Bearer dev (operator, demo tenant only)")
}
if err := httpSrv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatal(err)
@@ -83,15 +84,15 @@ func main() {
defer cancel()
n := srv.Jobs().RequestCancelAll()
if n > 0 {
log.Printf("draining %d job(s)…", n)
logging.Default().Info("draining jobs", "count", n)
if err := srv.Jobs().Drain(shutdownCtx); err != nil {
log.Printf("job drain: %v", err)
logging.Default().Warn("job drain", "err", err)
}
}
if err := httpSrv.Shutdown(shutdownCtx); err != nil {
log.Printf("HTTP shutdown: %v", err)
logging.Default().Warn("HTTP shutdown", "err", err)
}
log.Printf("%s stopped", platform.ServiceName("evobgp-api"))
logging.Default().Info("stopped", "service", platform.ServiceName("evobgp-api"))
}
func firstNonEmpty(candidates ...string) string {