Replace all occurrences of zai-proxy.mcp.svc.cluster.local with zai-proxy.devpod.svc.cluster.local in documentation files. Verification: - No old namespace references remain (grep verified) - DefaultConfig pattern is correct (shared parsing in config package) - Dashboard rate tests pass - Comma-splitting verified working Fixed files: - dashboard/README.md - DEVELOPMENT.md - docs/notes/CANARY_PROMOTION_CHECKLIST.md - docs/notes/CANARY_PROMOTION_PROCEDURE.md - docs/notes/CANARY_ROLLBACK_PROCEDURE.md - docs/notes/DASHBOARD_API_REFERENCE.md - docs/notes/DEPLOYMENT.md - docs/notes/metrics.md - docs/notes/TROUBLESHOOTING.md Co-Authored-By: Claude <noreply@anthropic.com>
85 lines
2.5 KiB
Go
85 lines
2.5 KiB
Go
// Package config provides shared configuration constants and helpers for the dashboard.
|
|
package config
|
|
|
|
import (
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
// DefaultScrapeTarget is the default Prometheus metrics endpoint to scrape.
|
|
const DefaultScrapeTarget = "http://zai-proxy.devpod.svc.cluster.local:8080/metrics"
|
|
|
|
// DefaultScrapeInterval is the default interval between scrapes.
|
|
const DefaultScrapeInterval = 5 * time.Second
|
|
|
|
// DefaultScrapeTimeout is the default HTTP timeout for each scrape.
|
|
const DefaultScrapeTimeout = 3 * time.Second
|
|
|
|
// DefaultListenAddr is the default HTTP listen address for the dashboard API.
|
|
const DefaultListenAddr = ":8080"
|
|
|
|
// GetEnvOrDefault retrieves an environment variable or returns a default value.
|
|
func GetEnvOrDefault(key, defaultValue string) string {
|
|
if value := os.Getenv(key); value != "" {
|
|
return value
|
|
}
|
|
return defaultValue
|
|
}
|
|
|
|
// ParseDurationOrDefault parses a duration from an env var or returns a default.
|
|
func ParseDurationOrDefault(key string, defaultValue time.Duration) time.Duration {
|
|
if value := os.Getenv(key); value != "" {
|
|
if parsed, err := time.ParseDuration(value); err == nil {
|
|
return parsed
|
|
}
|
|
}
|
|
return defaultValue
|
|
}
|
|
|
|
// SplitTargets splits a comma-separated list of scrape targets.
|
|
// Empty strings between commas are skipped.
|
|
func SplitTargets(s string) []string {
|
|
var result []string
|
|
var current string
|
|
for _, c := range s {
|
|
if c == ',' {
|
|
if current != "" {
|
|
result = append(result, current)
|
|
current = ""
|
|
}
|
|
} else {
|
|
current += string(c)
|
|
}
|
|
}
|
|
if current != "" {
|
|
result = append(result, current)
|
|
}
|
|
return result
|
|
}
|
|
|
|
// GetScrapeTargets returns the list of scrape targets from SCRAPE_TARGETS env var,
|
|
// or the default target if not set.
|
|
func GetScrapeTargets() []string {
|
|
if value := os.Getenv("SCRAPE_TARGETS"); value != "" {
|
|
return SplitTargets(value)
|
|
}
|
|
return []string{DefaultScrapeTarget}
|
|
}
|
|
|
|
// GetScrapeInterval returns the scrape interval from SCRAPE_INTERVAL env var,
|
|
// or the default interval if not set/invalid.
|
|
func GetScrapeInterval() time.Duration {
|
|
return ParseDurationOrDefault("SCRAPE_INTERVAL", DefaultScrapeInterval)
|
|
}
|
|
|
|
// GetScrapeTimeout returns the scrape timeout from SCRAPE_TIMEOUT env var,
|
|
// or the default timeout if not set/invalid.
|
|
func GetScrapeTimeout() time.Duration {
|
|
return ParseDurationOrDefault("SCRAPE_TIMEOUT", DefaultScrapeTimeout)
|
|
}
|
|
|
|
// GetListenAddr returns the HTTP listen address from LISTEN_ADDR env var,
|
|
// or the default address if not set.
|
|
func GetListenAddr() string {
|
|
return GetEnvOrDefault("LISTEN_ADDR", DefaultListenAddr)
|
|
}
|