package storage import ( "context" "errors" "os" ) type DatabaseStats struct { AllocatedBytes int64 WALBytes int64 Connections int InUse int Waits int64 } // Read allocation metadata, not global row counts, so that scrapes remain independent of index size. func (s *SQLite) DatabaseStats(ctx context.Context) (DatabaseStats, error) { var pages, size int64 if err := s.conn.QueryRowContext(ctx, "PRAGMA page_count").Scan(&pages); err != nil { return DatabaseStats{}, err } if err := s.conn.QueryRowContext(ctx, "PRAGMA page_size").Scan(&size); err != nil { return DatabaseStats{}, err } pool := s.conn.Stats() stats := DatabaseStats{AllocatedBytes: pages * size, Connections: pool.OpenConnections, InUse: pool.InUse, Waits: pool.WaitCount} file, err := os.Stat(s.path + "-wal") if err != nil && !errors.Is(err, os.ErrNotExist) { return DatabaseStats{}, err } if err == nil { stats.WALBytes = file.Size() } return stats, nil }