diff --git a/README.md b/README.md index 4eb57ee..a8da26a 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,9 @@ at least one host is required, other params are optional # Set your TiKV PD addresses (required) export TIKV_PD_ADDRS="127.0.0.1:2379" +# Optional: slow down backend metrics scraping to reduce network traffic +export TIKV_UI_METRICS_SCRAPE_INTERVAL="30s" + # Run the server ./bin/tikv-ui diff --git a/cmd/main.go b/cmd/main.go index 147f720..ea7d41f 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -6,6 +6,7 @@ import ( "net/http" "os" "os/signal" + "strings" "syscall" "time" @@ -23,6 +24,8 @@ func main() { if pdAddrsEnv == "" { log.Fatal("TIKV_PD_ADDRS env var is required (comma-separated PD addresses)") } + metricsScrapeInterval := getDurationEnv("TIKV_UI_METRICS_SCRAPE_INTERVAL", 5*time.Second) + clusters := utils.GetClusters(pdAddrsEnv) if len(clusters) == 0 { log.Fatal("no clusters found") @@ -54,7 +57,7 @@ func main() { } return result }, - 5*time.Second, + metricsScrapeInterval, cache, ) metrics.Start(ctx) @@ -136,7 +139,23 @@ func main() { log.Println("TiKV explorer API listening on :" + port) log.Println("Cluster management: POST /api/clusters/connect, GET /api/clusters, POST /api/clusters/switch") + log.Printf("Metrics scrape interval: %s", metricsScrapeInterval) if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("server error: %v", err) } } + +func getDurationEnv(key string, fallback time.Duration) time.Duration { + value := strings.TrimSpace(os.Getenv(key)) + if value == "" { + return fallback + } + + duration, err := time.ParseDuration(value) + if err != nil || duration <= 0 { + log.Printf("invalid %s=%q, using default %s", key, value, fallback) + return fallback + } + + return duration +} diff --git a/pkg/services/metrics.go b/pkg/services/metrics.go index 09f262b..f366bcc 100644 --- a/pkg/services/metrics.go +++ b/pkg/services/metrics.go @@ -50,7 +50,8 @@ func (m *Monitor) Start(ctx context.Context) { case <-ctx.Done(): return case <-ticker.C: - go m.pollAllClusters(ctx) + // Run scrapes serially so slow polls do not stack up. + m.pollAllClusters(ctx) } } }()