diff --git a/internal/api/admin_handler.go b/internal/api/admin_handler.go index d1d769b..c904c33 100644 --- a/internal/api/admin_handler.go +++ b/internal/api/admin_handler.go @@ -44,6 +44,7 @@ type BucketResponse struct { UsedSize int64 `json:"used_size"` AvailableSize int64 `json:"available_size"` UsagePercent float64 `json:"usage_percent"` + ObjectCount int64 `json:"object_count"` Weight int `json:"weight"` Enabled bool `json:"enabled"` Available bool `json:"available"` @@ -59,18 +60,18 @@ type BucketResponse struct { // BucketsListResponse 存储桶列表响应结构 type BucketsListResponse struct { - Total int `json:"total"` - Buckets []BucketResponse `json:"buckets"` + Total int `json:"total"` + Buckets []BucketResponse `json:"buckets"` } // HealthResponse 健康状态响应结构 type HealthResponse struct { - Status string `json:"status"` - Timestamp time.Time `json:"timestamp"` - LoadBalancer string `json:"load_balancer_strategy"` - TotalBuckets int `json:"total_buckets"` - AvailableBuckets int `json:"available_buckets"` - Database string `json:"database_type"` + Status string `json:"status"` + Timestamp time.Time `json:"timestamp"` + LoadBalancer string `json:"load_balancer_strategy"` + TotalBuckets int `json:"total_buckets"` + AvailableBuckets int `json:"available_buckets"` + Database string `json:"database_type"` } // RegisterRoutes 注册管理API路由 @@ -205,6 +206,7 @@ func (h *AdminHandler) convertBucketInfo(b *bucket.BucketInfo) BucketResponse { MaxSize: b.Config.MaxSize, MaxSizeBytes: b.Config.MaxSizeBytes, UsedSize: b.UsedSize, + ObjectCount: b.GetObjectCount(), Weight: b.Config.Weight, Enabled: b.Config.Enabled, Available: b.Available, diff --git a/internal/bucket/manager.go b/internal/bucket/manager.go index 7afeef5..39bb827 100644 --- a/internal/bucket/manager.go +++ b/internal/bucket/manager.go @@ -32,6 +32,7 @@ type BucketInfo struct { Config config.BucketConfig Client *s3.Client UsedSize int64 // 已使用容量(字节) + ObjectCount int64 // 对象数量 Available bool // 是否可用(由health监控更新) LastChecked time.Time // 最后检查时间(由health监控更新) mu sync.RWMutex @@ -320,6 +321,13 @@ func (b *BucketInfo) GetUsedSize() int64 { return b.UsedSize } +// GetObjectCount 获取对象数量 +func (b *BucketInfo) GetObjectCount() int64 { + b.mu.RLock() + defer b.mu.RUnlock() + return b.ObjectCount +} + // UpdateUsedSize 更新已使用容量 func (b *BucketInfo) UpdateUsedSize(delta int64) { b.mu.Lock() diff --git a/internal/bucket/reporter.go b/internal/bucket/reporter.go index a5bd3cb..cc90a24 100644 --- a/internal/bucket/reporter.go +++ b/internal/bucket/reporter.go @@ -60,6 +60,7 @@ func (r *MetricsReporter) ReportStats(stats *health.Stats) { if exists { bucket.mu.Lock() bucket.UsedSize = stats.UsedSize + bucket.ObjectCount = stats.ObjectCount bucket.mu.Unlock() // 更新 Prometheus 指标