CI / changes (push) Successful in 8s
CI / commitlint (push) Has been skipped
CI / openapi (push) Has been skipped
CI / web (push) Successful in 30s
CI / go (push) Failing after 24s
CI / bird2 (push) Has been skipped
CI / release (push) Has been skipped
Updated the PostgreSQL monitoring service to improve handling of `pg_stat_statements` availability. Introduced a new method to check if the extension is queryable and updated the response structure to include availability status and hints. Enhanced the documentation to clarify the requirements for enabling `pg_stat_statements`. Adjusted related components to reflect these changes, ensuring better user feedback in the monitoring interface.
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
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 snapshot: %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)")
|
|
}
|