mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-10-14 18:18:35 +02:00
Six server-rendered pages (overview plus volume server, filer, S3, master and worker detail) built from shared chartCard and statCard components, following the existing Bootstrap card and table conventions. Charts are inline SVG, so no chart library is pulled in. Pages show a 'no metrics yet' notice until the first scrapes land.
101 lines
2.0 KiB
Go
101 lines
2.0 KiB
Go
package app
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// diskUsageWarnPct is where disk-usage charts draw their reference line.
|
|
const diskUsageWarnPct = 85.0
|
|
|
|
// diskThreshold returns the disk-usage reference line for chart options.
|
|
func diskThreshold() *float64 {
|
|
v := diskUsageWarnPct
|
|
return &v
|
|
}
|
|
|
|
// formatBytes converts bytes to human readable format
|
|
func formatBytes(bytes int64) string {
|
|
if bytes == 0 {
|
|
return "0 B"
|
|
}
|
|
|
|
units := []string{"B", "KB", "MB", "GB", "TB", "PB"}
|
|
var i int
|
|
value := float64(bytes)
|
|
|
|
for value >= 1024 && i < len(units)-1 {
|
|
value /= 1024
|
|
i++
|
|
}
|
|
|
|
if i == 0 {
|
|
return fmt.Sprintf("%.0f %s", value, units[i])
|
|
}
|
|
return fmt.Sprintf("%.1f %s", value, units[i])
|
|
}
|
|
|
|
// formatNumber formats large numbers with commas
|
|
func formatNumber(num int64) string {
|
|
if num == 0 {
|
|
return "0"
|
|
}
|
|
|
|
str := strconv.FormatInt(num, 10)
|
|
result := ""
|
|
|
|
for i, char := range str {
|
|
if i > 0 && (len(str)-i)%3 == 0 {
|
|
result += ","
|
|
}
|
|
result += string(char)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// calculatePercent calculates percentage for progress bars
|
|
func calculatePercent(current, max int) int {
|
|
if max == 0 {
|
|
return 0
|
|
}
|
|
return (current * 100) / max
|
|
}
|
|
|
|
func pluginLaneDisplayName(lane string) string {
|
|
normalized := strings.TrimSpace(strings.ToLower(lane))
|
|
if normalized == "" || normalized == "default" {
|
|
return "Default"
|
|
}
|
|
|
|
parts := strings.Fields(strings.ReplaceAll(normalized, "_", " "))
|
|
if len(parts) == 0 {
|
|
return "Default"
|
|
}
|
|
|
|
for i, part := range parts {
|
|
if part == "" {
|
|
continue
|
|
}
|
|
parts[i] = strings.ToUpper(part[:1]) + part[1:]
|
|
}
|
|
|
|
return strings.Join(parts, " ")
|
|
}
|
|
|
|
func pluginLaneTitle(lane string) string {
|
|
return pluginLaneDisplayName(lane) + " Workers"
|
|
}
|
|
|
|
func pluginLaneDescription(lane string) string {
|
|
switch strings.TrimSpace(strings.ToLower(lane)) {
|
|
case "iceberg":
|
|
return "Iceberg maintenance workers, scheduler state, queue, and execution flows."
|
|
case "lifecycle":
|
|
return "Lifecycle workers, scheduler state, queue, and execution flows."
|
|
default:
|
|
return "Default workers, scheduler state, queue, and execution flows."
|
|
}
|
|
}
|