feat(db): implement PostgreSQL monitoring and maintenance features
CI / changes (push) Successful in 9s
CI / commitlint (push) Has been skipped
CI / openapi (push) Successful in 26s
CI / web (push) Successful in 33s
CI / go (push) Successful in 2m11s
CI / bird2 (push) Successful in 16s
CI / release (push) Successful in 3m27s
CI / changes (push) Successful in 9s
CI / commitlint (push) Has been skipped
CI / openapi (push) Successful in 26s
CI / web (push) Successful in 33s
CI / go (push) Successful in 2m11s
CI / bird2 (push) Successful in 16s
CI / release (push) Successful in 3m27s
Added PostgreSQL monitoring and maintenance capabilities to the API, including new endpoints for instance-level metrics, maintenance operations, and job scheduling. Updated the HTTP API to support PostgreSQL monitoring routes and integrated a background scheduler for metrics collection. Enhanced the CLI with database commands for maintenance tasks. Updated documentation to reflect these changes.
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
package pgmonitor
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
)
|
||||
|
||||
// StartScheduler runs periodic PostgreSQL analyzer snapshots until ctx is cancelled.
|
||||
func StartScheduler(ctx context.Context, pool *pgxpool.Pool) {
|
||||
if pool == nil {
|
||||
return
|
||||
}
|
||||
go func() {
|
||||
t5 := time.NewTicker(5 * time.Minute)
|
||||
t15 := time.NewTicker(15 * time.Minute)
|
||||
defer t5.Stop()
|
||||
defer t15.Stop()
|
||||
s := NewService(pool)
|
||||
runLight := func() {
|
||||
c, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
|
||||
defer cancel()
|
||||
if err := s.RefreshMetricsSnapshot(c); err != nil {
|
||||
log.Printf("pgmonitor: metrics refresh: %v", err)
|
||||
}
|
||||
if err := s.DetectAutovacuumLag(c); err != nil {
|
||||
log.Printf("pgmonitor: autovacuum lag: %v", err)
|
||||
}
|
||||
}
|
||||
runHeavy := func() {
|
||||
c, cancel := context.WithTimeout(context.Background(), 3*time.Minute)
|
||||
defer cancel()
|
||||
if err := s.AggregateSlowQueries(c, 30); err != nil {
|
||||
log.Printf("pgmonitor: slow queries: %v", err)
|
||||
}
|
||||
if err := s.EstimateTableBloat(c); err != nil {
|
||||
log.Printf("pgmonitor: bloat: %v", err)
|
||||
}
|
||||
if err := s.AnalyzeIndexUsage(c); err != nil {
|
||||
log.Printf("pgmonitor: index usage: %v", err)
|
||||
}
|
||||
}
|
||||
runLight()
|
||||
runHeavy()
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case <-t5.C:
|
||||
runLight()
|
||||
case <-t15.C:
|
||||
runHeavy()
|
||||
}
|
||||
}
|
||||
}()
|
||||
log.Printf("pgmonitor: scheduler started (5m light / 15m heavy)")
|
||||
}
|
||||
Reference in New Issue
Block a user