diff --git a/agent/docker.go b/agent/docker.go index 2949b4ea..27ad2374 100644 --- a/agent/docker.go +++ b/agent/docker.go @@ -25,6 +25,16 @@ const ( dockerTimeoutMs = 2100 // Maximum realistic network speed (5 GB/s) to detect bad deltas maxNetworkSpeedBps uint64 = 5e9 + // Container and health constants + composeProjectLabel = "com.docker.compose.project" + healthStatusNone = "none" + containerStateRunning = "running" + containerStateUnknown = "unknown" + volumeTypeVolume = "volume" + diskOpRead = "read" + diskOpReadCap = "Read" + diskOpWrite = "write" + diskOpWriteCap = "Write" // Maximum conceivable memory usage of a container (100TB) to detect bad memory stats maxMemoryUsage uint64 = 100 * 1024 * 1024 * 1024 * 1024 ) @@ -42,6 +52,8 @@ type dockerManager struct { buf *bytes.Buffer // Buffer to store and read response bodies decoder *json.Decoder // Reusable JSON decoder that reads from buf apiStats *container.ApiStats // Reusable API stats object + volumeSizeCache map[string]float64 // Cached volume sizes (name -> size in MB) + volumeSizeUpdated time.Time // Last time volume sizes were updated // Cache-time-aware tracking for CPU stats (similar to cpu.go) // Maps cache time intervals to container-specific CPU usage tracking @@ -53,6 +65,11 @@ type dockerManager struct { // cacheTimeMs -> DeltaTracker for network bytes sent/received networkSentTrackers map[uint16]*deltatracker.DeltaTracker[string, uint64] networkRecvTrackers map[uint16]*deltatracker.DeltaTracker[string, uint64] + + // Disk I/O delta trackers - one per cache time to avoid interference + // cacheTimeMs -> DeltaTracker for disk bytes read/written + diskReadTrackers map[uint16]*deltatracker.DeltaTracker[string, uint64] + diskWriteTrackers map[uint16]*deltatracker.DeltaTracker[string, uint64] } // userAgentRoundTripper is a custom http.RoundTripper that adds a User-Agent header to all requests @@ -159,8 +176,9 @@ func (dm *dockerManager) getDockerStats(cacheTimeMs uint16) ([]*container.Stats, } } - // prepare network trackers for next interval for this cache time + // prepare network and disk trackers for next interval for this cache time dm.cycleNetworkDeltasForCacheTime(cacheTimeMs) + dm.cycleDiskDeltasForCacheTime(cacheTimeMs) return stats, nil } @@ -239,6 +257,32 @@ func (dm *dockerManager) cycleNetworkDeltasForCacheTime(cacheTimeMs uint16) { } } +// getDiskTracker returns the DeltaTracker for disk I/O for a specific cache time, creating it if needed +func (dm *dockerManager) getDiskTracker(cacheTimeMs uint16, isRead bool) *deltatracker.DeltaTracker[string, uint64] { + var trackers map[uint16]*deltatracker.DeltaTracker[string, uint64] + if isRead { + trackers = dm.diskReadTrackers + } else { + trackers = dm.diskWriteTrackers + } + + if trackers[cacheTimeMs] == nil { + trackers[cacheTimeMs] = deltatracker.NewDeltaTracker[string, uint64]() + } + + return trackers[cacheTimeMs] +} + +// cycleDiskDeltasForCacheTime cycles the disk delta trackers for a specific cache time +func (dm *dockerManager) cycleDiskDeltasForCacheTime(cacheTimeMs uint16) { + if dm.diskReadTrackers[cacheTimeMs] != nil { + dm.diskReadTrackers[cacheTimeMs].Cycle() + } + if dm.diskWriteTrackers[cacheTimeMs] != nil { + dm.diskWriteTrackers[cacheTimeMs].Cycle() + } +} + // calculateNetworkStats calculates network sent/receive deltas using DeltaTracker func (dm *dockerManager) calculateNetworkStats(ctr *container.ApiInfo, apiStats *container.ApiStats, stats *container.Stats, initialized bool, name string, cacheTimeMs uint16) (uint64, uint64) { var total_sent, total_recv uint64 @@ -284,6 +328,50 @@ func (dm *dockerManager) calculateNetworkStats(ctr *container.ApiInfo, apiStats return sent_delta, recv_delta } +// calculateDiskStats calculates disk read/write deltas using DeltaTracker +func (dm *dockerManager) calculateDiskStats(ctr *container.ApiInfo, apiStats *container.ApiStats, stats *container.Stats, initialized bool, cacheTimeMs uint16) (uint64, uint64) { + var total_read, total_write uint64 + for _, entry := range apiStats.BlkioStats.IoServiceBytesRecursive { + switch entry.Op { + case diskOpRead, diskOpReadCap: + total_read += entry.Value + case diskOpWrite, diskOpWriteCap: + total_write += entry.Value + } + } + + // Get the DeltaTracker for this specific cache time + readTracker := dm.getDiskTracker(cacheTimeMs, true) + writeTracker := dm.getDiskTracker(cacheTimeMs, false) + + // Set current values in the cache-time-specific DeltaTracker + readTracker.Set(ctr.IdShort, total_read) + writeTracker.Set(ctr.IdShort, total_write) + + // Get deltas (bytes since last measurement) + read_delta_raw := readTracker.Delta(ctr.IdShort) + write_delta_raw := writeTracker.Delta(ctr.IdShort) + + // Calculate bytes per second if we have previous data + var read_delta, write_delta uint64 + if initialized { + millisecondsElapsed := uint64(time.Since(stats.PrevReadTime).Milliseconds()) + if millisecondsElapsed > 0 { + if read_delta_raw > 0 { + read_delta = read_delta_raw * 1000 / millisecondsElapsed + } + if write_delta_raw > 0 { + write_delta = write_delta_raw * 1000 / millisecondsElapsed + } + } + } + + // Store current disk values for legacy compatibility + stats.PrevDisk.Read, stats.PrevDisk.Write = total_read, total_write + + return read_delta, write_delta +} + // validateCpuPercentage checks if CPU percentage is within valid range func validateCpuPercentage(cpuPct float64, containerName string) error { if cpuPct > 100 { @@ -293,11 +381,13 @@ func validateCpuPercentage(cpuPct float64, containerName string) error { } // updateContainerStatsValues updates the final stats values -func updateContainerStatsValues(stats *container.Stats, cpuPct float64, usedMemory uint64, sent_delta, recv_delta uint64, readTime time.Time) { +func updateContainerStatsValues(stats *container.Stats, cpuPct float64, usedMemory uint64, sent_delta, recv_delta, read_delta, write_delta uint64, readTime time.Time) { stats.Cpu = twoDecimals(cpuPct) stats.Mem = bytesToMegabytes(float64(usedMemory)) stats.NetworkSent = bytesToMegabytes(float64(sent_delta)) stats.NetworkRecv = bytesToMegabytes(float64(recv_delta)) + stats.DiskRead = bytesToMegabytes(float64(read_delta)) + stats.DiskWrite = bytesToMegabytes(float64(write_delta)) stats.PrevReadTime = readTime } @@ -320,11 +410,64 @@ func (dm *dockerManager) updateContainerStats(ctr *container.ApiInfo, cacheTimeM dm.containerStatsMap[ctr.IdShort] = stats } + // Update name in case it changed + stats.Name = name + + // Set container metadata + stats.IdShort = ctr.IdShort + stats.Status = ctr.State + if stats.Status == "" { + stats.Status = containerStateUnknown + } + + // Set health status + stats.Health = healthStatusNone + if ctr.Health != "" { + stats.Health = ctr.Health + } + + // Set Docker Compose project name + if ctr.Labels != nil { + if projectName, exists := ctr.Labels[composeProjectLabel]; exists { + stats.Project = projectName + } + } + + // Calculate uptime for running containers + if ctr.StartedAt > 0 && stats.Status == containerStateRunning { + startedTime := time.Unix(ctr.StartedAt, 0) + stats.Uptime = twoDecimals(time.Since(startedTime).Seconds()) + } else { + stats.Uptime = 0 + } + + // Collect volume information and fetch sizes + volumeCount := 0 + for _, mount := range ctr.Mounts { + if mount.Type == volumeTypeVolume && mount.Name != "" { + volumeCount++ + } + } + if volumeCount > 0 { + stats.Volumes = make(map[string]float64, volumeCount) + for _, mount := range ctr.Mounts { + if mount.Type == volumeTypeVolume && mount.Name != "" { + // Fetch volume size using Docker system df API + size := dm.getVolumeSize(mount.Name) + stats.Volumes[mount.Name] = size + } + } + } else { + stats.Volumes = nil + } + // reset current stats stats.Cpu = 0 stats.Mem = 0 stats.NetworkSent = 0 stats.NetworkRecv = 0 + stats.DiskRead = 0 + stats.DiskWrite = 0 res := dm.apiStats res.Networks = nil @@ -374,8 +517,11 @@ func (dm *dockerManager) updateContainerStats(ctr *container.ApiInfo, cacheTimeM } stats.PrevNet.Sent, stats.PrevNet.Recv = total_sent, total_recv + // Calculate disk I/O stats using DeltaTracker + read_delta, write_delta := dm.calculateDiskStats(ctr, res, stats, initialized, cacheTimeMs) + // Update final stats values - updateContainerStatsValues(stats, cpuPct, usedMemory, sent_delta, recv_delta, res.Read) + updateContainerStatsValues(stats, cpuPct, usedMemory, sent_delta, recv_delta, read_delta, write_delta, res.Read) // store per-cache-time read time for Windows CPU percent calc dm.lastCpuReadTime[cacheTimeMs][ctr.IdShort] = res.Read @@ -460,6 +606,7 @@ func newDockerManager(a *Agent) *dockerManager { sem: make(chan struct{}, 5), apiContainerList: []*container.ApiInfo{}, apiStats: &container.ApiStats{}, + volumeSizeCache: make(map[string]float64), // Initialize cache-time-aware tracking structures lastCpuContainer: make(map[uint16]map[string]uint64), @@ -467,6 +614,8 @@ func newDockerManager(a *Agent) *dockerManager { lastCpuReadTime: make(map[uint16]map[string]time.Time), networkSentTrackers: make(map[uint16]*deltatracker.DeltaTracker[string, uint64]), networkRecvTrackers: make(map[uint16]*deltatracker.DeltaTracker[string, uint64]), + diskReadTrackers: make(map[uint16]*deltatracker.DeltaTracker[string, uint64]), + diskWriteTrackers: make(map[uint16]*deltatracker.DeltaTracker[string, uint64]), } // If using podman, return client @@ -521,6 +670,49 @@ func (dm *dockerManager) checkDockerVersion() { } } +// getVolumeSize returns the cached size of a Docker volume +// Refreshes the cache every 5 minutes using the system df API +// Returns size in MB (megabytes) +func (dm *dockerManager) getVolumeSize(volumeName string) float64 { + // Refresh cache if older than 5 minutes + if time.Since(dm.volumeSizeUpdated) > 5*time.Minute { + dm.refreshVolumeSizes() + } + + return dm.volumeSizeCache[volumeName] +} + +// refreshVolumeSizes fetches all volume sizes from Docker and updates the cache +func (dm *dockerManager) refreshVolumeSizes() { + type volumeInfo struct { + Name string + UsageData struct { + Size int64 + } + } + type systemDfResponse struct { + Volumes []volumeInfo + } + + resp, err := dm.client.Get("http://localhost/system/df") + if err != nil { + return + } + + var dfData systemDfResponse + if err := dm.decode(resp, &dfData); err != nil { + return + } + + // Update all volume sizes in cache + for _, vol := range dfData.Volumes { + // Convert bytes to MB (megabytes) + dm.volumeSizeCache[vol.Name] = float64(vol.UsageData.Size) / 1_000_000 + } + + dm.volumeSizeUpdated = time.Now() +} + // Decodes Docker API JSON response using a reusable buffer and decoder. Not thread safe. func (dm *dockerManager) decode(resp *http.Response, d any) error { if dm.buf == nil { diff --git a/internal/entities/container/container.go b/internal/entities/container/container.go index c6b6c4bb..0357d85b 100644 --- a/internal/entities/container/container.go +++ b/internal/entities/container/container.go @@ -4,25 +4,29 @@ import "time" // Docker container info from /containers/json type ApiInfo struct { - Id string - IdShort string - Names []string - Status string + Id string + IdShort string + Names []string + Status string + Health string `json:"Health,omitempty"` // Container health status + Created int64 `json:"Created,omitempty"` // Container creation timestamp + StartedAt int64 `json:"StartedAt,omitempty"` // Container start timestamp + FinishedAt int64 `json:"FinishedAt,omitempty"` // Container finish timestamp + State string `json:"State,omitempty"` // Container state (running, stopped, etc.) // Image string // ImageID string // Command string - // Created int64 // Ports []Port // SizeRw int64 `json:",omitempty"` // SizeRootFs int64 `json:",omitempty"` - // Labels map[string]string + Labels map[string]string // State string // HostConfig struct { // NetworkMode string `json:",omitempty"` // Annotations map[string]string `json:",omitempty"` // } // NetworkSettings *SummaryNetworkSettings - // Mounts []MountPoint + Mounts []MountPoint } // Docker container resources from /containers/{id}/stats @@ -32,6 +36,7 @@ type ApiStats struct { Networks map[string]NetworkStats CPUStats CPUStats `json:"cpu_stats"` MemoryStats MemoryStats `json:"memory_stats"` + BlkioStats BlkioStats `json:"blkio_stats"` } func (s *ApiStats) CalculateCpuPercentLinux(prevCpuContainer uint64, prevCpuSystem uint64) float64 { @@ -98,21 +103,58 @@ type NetworkStats struct { TxBytes uint64 `json:"tx_bytes"` } +type BlkioStats struct { + IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive"` + IoServicedRecursive []BlkioStatEntry `json:"io_serviced_recursive"` +} + +type BlkioStatEntry struct { + Major uint64 `json:"major"` + Minor uint64 `json:"minor"` + Op string `json:"op"` + Value uint64 `json:"value"` +} + type prevNetStats struct { Sent uint64 Recv uint64 } +type prevDiskStats struct { + Read uint64 + Write uint64 +} + // Docker container stats type Stats struct { - Name string `json:"n" cbor:"0,keyasint"` - Cpu float64 `json:"c" cbor:"1,keyasint"` - Mem float64 `json:"m" cbor:"2,keyasint"` - NetworkSent float64 `json:"ns" cbor:"3,keyasint"` - NetworkRecv float64 `json:"nr" cbor:"4,keyasint"` - // PrevCpu [2]uint64 `json:"-"` - CpuSystem uint64 `json:"-"` - CpuContainer uint64 `json:"-"` - PrevNet prevNetStats `json:"-"` - PrevReadTime time.Time `json:"-"` + Name string `json:"n" cbor:"0,keyasint"` + Cpu float64 `json:"c" cbor:"1,keyasint"` + Mem float64 `json:"m" cbor:"2,keyasint"` + NetworkSent float64 `json:"ns" cbor:"3,keyasint"` + NetworkRecv float64 `json:"nr" cbor:"4,keyasint"` + DiskRead float64 `json:"dr" cbor:"5,keyasint"` // Disk read rate in MB/s + DiskWrite float64 `json:"dw" cbor:"6,keyasint"` // Disk write rate in MB/s + Volumes map[string]float64 `json:"v,omitempty" cbor:"7,keyasint"` // Volume name to size mapping + Health string `json:"h,omitempty" cbor:"8,keyasint"` // Container health status + Status string `json:"s,omitempty" cbor:"9,keyasint"` // Container status (running, stopped, etc.) + Uptime float64 `json:"u,omitempty" cbor:"10,keyasint"` // Container uptime in seconds + Project string `json:"p,omitempty" cbor:"11,keyasint"` // Docker Compose project name + IdShort string `json:"idShort,omitempty" cbor:"12,keyasint"` // Container short ID for frontend + CpuSystem uint64 `json:"-"` + CpuContainer uint64 `json:"-"` + PrevNet prevNetStats `json:"-"` + PrevDisk prevDiskStats `json:"-"` + PrevReadTime time.Time `json:"-"` +} + +// MountPoint represents a mount point in a container +type MountPoint struct { + Type string `json:"Type"` + Name string `json:"Name"` + Source string `json:"Source"` + Destination string `json:"Destination"` + Driver string `json:"Driver,omitempty"` + Mode string `json:"Mode"` + RW bool `json:"RW"` + Propagation string `json:"Propagation"` } diff --git a/internal/records/records.go b/internal/records/records.go index 7c53aed3..cf2cf40e 100644 --- a/internal/records/records.go +++ b/internal/records/records.go @@ -414,6 +414,8 @@ func (rm *RecordManager) AverageContainerStats(db dbx.Builder, records RecordIds sums[stat.Name].Mem += stat.Mem sums[stat.Name].NetworkSent += stat.NetworkSent sums[stat.Name].NetworkRecv += stat.NetworkRecv + sums[stat.Name].DiskRead += stat.DiskRead + sums[stat.Name].DiskWrite += stat.DiskWrite } } @@ -425,6 +427,8 @@ func (rm *RecordManager) AverageContainerStats(db dbx.Builder, records RecordIds Mem: twoDecimals(value.Mem / count), NetworkSent: twoDecimals(value.NetworkSent / count), NetworkRecv: twoDecimals(value.NetworkRecv / count), + DiskRead: twoDecimals(value.DiskRead / count), + DiskWrite: twoDecimals(value.DiskWrite / count), }) } return result diff --git a/internal/site/package-lock.json b/internal/site/package-lock.json index 6e921c04..ac557198 100644 --- a/internal/site/package-lock.json +++ b/internal/site/package-lock.json @@ -69,7 +69,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -83,7 +83,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", @@ -98,7 +98,7 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -108,7 +108,7 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -139,7 +139,7 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.28.3", @@ -156,7 +156,7 @@ "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.2", @@ -173,7 +173,7 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -183,7 +183,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -197,7 +197,7 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", @@ -215,7 +215,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -225,7 +225,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -235,7 +235,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -245,7 +245,7 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", @@ -259,7 +259,7 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/types": "^7.28.2" @@ -287,7 +287,7 @@ "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -302,7 +302,7 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -321,7 +321,7 @@ "version": "7.28.2", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1020,7 +1020,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -1033,7 +1033,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", @@ -1051,7 +1051,7 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1073,7 +1073,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1083,14 +1083,14 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.30", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1111,7 +1111,7 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-lingui-macro/-/babel-plugin-lingui-macro-5.4.1.tgz", "integrity": "sha512-9IO+PDvdneY8OCI8zvI1oDXpzryTMtyRv7uq9O0U1mFCvIPVd5dWQKQDu/CpgpYAc2+JG/izn5PNl9xzPc6ckw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/core": "^7.20.12", @@ -1331,7 +1331,7 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-5.4.1.tgz", "integrity": "sha512-aDkj/bMSr/mCL8Nr1TS52v0GLCuVa4YqtRz+WvUCFZw/ovVInX0hKq1TClx/bSlhu60FzB/CbclxFMBw8aLVUg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", @@ -2750,7 +2750,7 @@ "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@swc/core": { @@ -3420,14 +3420,14 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" @@ -3437,7 +3437,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" @@ -3447,7 +3447,7 @@ "version": "24.3.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~7.10.0" @@ -3457,7 +3457,7 @@ "version": "19.1.11", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.11.tgz", "integrity": "sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -3467,7 +3467,7 @@ "version": "19.1.7", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz", "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.0.0" @@ -3477,7 +3477,7 @@ "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -3487,7 +3487,7 @@ "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@vitejs/plugin-react-swc": { @@ -3524,7 +3524,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3567,7 +3567,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, + "devOptional": true, "license": "Python-2.0" }, "node_modules/aria-hidden": { @@ -3662,7 +3662,7 @@ "version": "4.25.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "dev": true, + "devOptional": true, "funding": [ { "type": "opencollective", @@ -3733,7 +3733,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -3743,7 +3743,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -3756,7 +3756,7 @@ "version": "1.0.30001727", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", - "dev": true, + "devOptional": true, "funding": [ { "type": "opencollective", @@ -3777,7 +3777,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3889,7 +3889,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3902,7 +3902,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/colors": { @@ -3919,14 +3919,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", @@ -4106,7 +4106,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4176,7 +4176,7 @@ "version": "1.5.182", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.182.tgz", "integrity": "sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/emoji-regex": { @@ -4204,7 +4204,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -4273,7 +4273,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -4361,7 +4361,7 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -4387,7 +4387,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -4418,7 +4418,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -4461,7 +4461,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/is-binary-path": { @@ -4554,7 +4554,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4564,7 +4564,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -4582,7 +4582,7 @@ "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -4604,7 +4604,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -4617,7 +4617,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -4630,14 +4630,14 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -4650,7 +4650,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -4899,7 +4899,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/lodash": { @@ -4948,7 +4948,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -5059,7 +5059,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/nanoid": { @@ -5100,7 +5100,7 @@ "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/normalize-path": { @@ -5196,7 +5196,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -5209,7 +5209,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -5238,7 +5238,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -5248,7 +5248,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/picomatch": { @@ -5310,7 +5310,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", @@ -5325,7 +5325,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -5571,7 +5571,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=4" @@ -5669,7 +5669,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5852,7 +5852,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -5986,7 +5986,7 @@ "version": "5.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -6000,14 +6000,14 @@ "version": "7.10.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, + "devOptional": true, "funding": [ { "type": "opencollective", @@ -6339,7 +6339,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, + "devOptional": true, "license": "ISC" } } diff --git a/internal/site/src/components/charts/container-chart.tsx b/internal/site/src/components/charts/container-chart.tsx index e330529f..845247e0 100644 --- a/internal/site/src/components/charts/container-chart.tsx +++ b/internal/site/src/components/charts/container-chart.tsx @@ -1,20 +1,32 @@ // import Spinner from '../spinner' import { useStore } from "@nanostores/react" import { memo, useMemo } from "react" -import { Area, AreaChart, CartesianGrid, YAxis } from "recharts" +import React from "react" +import { Area, AreaChart, CartesianGrid, Line, LineChart, YAxis } from "recharts" +import { Badge } from "@/components/ui/badge" import { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart" +import { Separator } from "@/components/ui/separator" import { ChartType, Unit } from "@/lib/enums" -import { $containerFilter, $userSettings } from "@/lib/stores" -import { chartMargin, cn, decimalString, formatBytes, formatShortDate, toFixedFloat } from "@/lib/utils" +import { $containerColors, $containerFilter, $stackFilter, $userSettings } from "@/lib/stores" +import { + chartMargin, + cn, + decimalString, + formatBytes, + formatShortDate, + generateFallbackColor, + getSizeAndUnit, + toFixedFloat, + toFixedWithoutTrailingZeros, +} from "@/lib/utils" import type { ChartData } from "@/types" -import { Separator } from "../ui/separator" import { useYAxisWidth } from "./hooks" export default memo(function ContainerChart({ dataKey, chartData, chartType, - chartConfig, + chartConfig: propChartConfig, unit = "%", }: { dataKey: string @@ -23,13 +35,168 @@ export default memo(function ContainerChart({ chartConfig: ChartConfig unit?: string }) { - const filter = useStore($containerFilter) + const containerFilter = useStore($containerFilter) + const stackFilter = useStore($stackFilter) + const containerColors = useStore($containerColors) const userSettings = useStore($userSettings) const { yAxisWidth, updateYAxisWidth } = useYAxisWidth() const { containerData } = chartData const isNetChart = chartType === ChartType.Network + const isVolumeChart = chartType === ChartType.Volume + const isHealthChart = chartType === ChartType.Health + const isUptimeChart = chartType === ChartType.Uptime + const isHealthUptimeChart = chartType === ChartType.HealthUptime + const isDiskIOChart = chartType === ChartType.DiskIO + + // Centralized data processing for all chart types + const chartDatasets = useMemo(() => { + const volumeChartData = { data: [], colors: {} } as { + data: Record[] + colors: Record + } + const healthChartData = { data: [], colors: {} } as { + data: Record[] + colors: Record + } + const uptimeChartData = { data: [], colors: {} } as { + data: Record[] + colors: Record + } + const healthUptimeChartData = { data: [], colors: {} } as { + data: Record[] + colors: Record + } + const containerChartConfig = {} as Record + + const volumeSums: Record = {} + const volumeContainers: Record = {} + const allContainerNames = new Set() + const healthUptimeContainerNames = new Set() + + for (const containerStats of containerData) { + if (!containerStats.created) { + // For gaps in data + volumeChartData.data.push({ created: "" }) + healthChartData.data.push({ created: "" }) + uptimeChartData.data.push({ created: "" }) + healthUptimeChartData.data.push({ created: "" }) + continue + } + + const volumeData = { created: containerStats.created } as Record + const healthData = { created: containerStats.created } as Record + const uptimeData = { created: containerStats.created } as Record + const healthUptimeData = { created: containerStats.created } as Record + + for (const [containerName, containerDataObj] of Object.entries(containerStats)) { + if (containerName === "created") continue + + // Apply container filter + if (containerFilter.length > 0 && !containerFilter.includes(containerName)) { + continue + } + + // Apply stack filter + if (stackFilter.length > 0 && typeof containerDataObj === "object" && containerDataObj) { + const stackName = (containerDataObj as any).p || "—" + if (!stackFilter.includes(stackName)) { + continue + } + } + + allContainerNames.add(containerName) + + if (typeof containerDataObj === "object" && containerDataObj) { + // Volume + if ("v" in containerDataObj && containerDataObj.v) { + for (const [volumeName, volumeSize] of Object.entries(containerDataObj.v)) { + if (typeof volumeSize === "number" && volumeSize > 0) { + volumeData[volumeName] = ((volumeData[volumeName] as number) || 0) + volumeSize + volumeSums[volumeName] = (volumeSums[volumeName] ?? 0) + volumeSize + if (!volumeContainers[volumeName]) volumeContainers[volumeName] = [] + if (!volumeContainers[volumeName].includes(containerName)) + volumeContainers[volumeName].push(containerName) + } + } + } + // Health + if ("h" in containerDataObj) { + const healthStatus = ((containerDataObj.h as string) || "").toLowerCase() + let healthValue = 0 + switch (healthStatus) { + case "healthy": + healthValue = 3 + break + case "starting": + healthValue = 2 + break + case "unhealthy": + healthValue = 1 + break + default: + healthValue = 0 + } + healthData[containerName] = healthValue + // Health+Uptime + healthUptimeData[`${containerName}_health`] = healthValue + healthUptimeContainerNames.add(containerName) + } + // Uptime + if ("u" in containerDataObj && containerDataObj.u) { + uptimeData[containerName] = (containerDataObj.u as number) / 3600 + // Health+Uptime + healthUptimeData[`${containerName}_uptime`] = (containerDataObj.u as number) / 3600 + healthUptimeContainerNames.add(containerName) + } + } + } + volumeChartData.data.push(volumeData) + healthChartData.data.push(healthData) + uptimeChartData.data.push(uptimeData) + healthUptimeChartData.data.push(healthUptimeData) + } + + // Only process volumes attached to containers + const volumeKeys = Object.keys(volumeSums) + .filter((key) => (volumeContainers[key] || []).length > 0) + .sort((a, b) => volumeSums[b] - volumeSums[a]) + for (const key of volumeKeys) { + const containers = volumeContainers[key] || [] + const firstContainer = containers[0] + volumeChartData.colors[key] = + containerColors[firstContainer] || generateFallbackColor(firstContainer) + } + const healthKeys = Object.keys(healthChartData.data[0] || {}).filter((key) => key !== "created") + for (const key of healthKeys) { + healthChartData.colors[key] = containerColors[key] || generateFallbackColor(key) + } + const uptimeKeys = Object.keys(uptimeChartData.data[0] || {}).filter((key) => key !== "created") + for (const key of uptimeKeys) { + uptimeChartData.colors[key] = containerColors[key] || generateFallbackColor(key) + } + for (const containerName of healthUptimeContainerNames) { + const color = containerColors[containerName] || generateFallbackColor(containerName) + healthUptimeChartData.colors[`${containerName}_uptime`] = color + healthUptimeChartData.colors[`${containerName}_health`] = color + } + for (const containerName of allContainerNames) { + const color = containerColors[containerName] || generateFallbackColor(containerName) + containerChartConfig[containerName] = { label: containerName, color } + } + + return { + volumeChartData, + healthChartData, + uptimeChartData, + healthUptimeChartData, + containerChartConfig, + } + }, [containerData, containerColors, containerFilter, stackFilter]) + + const { volumeChartData, healthChartData, uptimeChartData, healthUptimeChartData, containerChartConfig } = + chartDatasets // biome-ignore lint/correctness/useExhaustiveDependencies: not necessary const { toolTipFormatter, dataFunction, tickFormatter } = useMemo(() => { @@ -41,9 +208,40 @@ export default memo(function ContainerChart({ // tick formatter if (chartType === ChartType.CPU) { obj.tickFormatter = (value) => { - const val = toFixedFloat(value, 2) + unit + const val = `${toFixedWithoutTrailingZeros(value, 2)}${unit}` return updateYAxisWidth(val) } + } else if (isHealthChart) { + obj.tickFormatter = (value) => { + let healthLabel = "Unknown" + switch (value) { + case 3: + healthLabel = "Healthy" + break + case 2: + healthLabel = "Starting" + break + case 1: + healthLabel = "Unhealthy" + break + case 0: + healthLabel = "None" + break + } + return updateYAxisWidth(healthLabel) + } + } else if (isUptimeChart) { + obj.tickFormatter = (value) => { + const hours = Math.floor(value) + const minutes = Math.floor((value - hours) * 60) + const label = `${hours}h ${minutes}m` + return updateYAxisWidth(label) + } + } else if (isVolumeChart || isDiskIOChart) { + obj.tickFormatter = (value) => { + const { v, u } = getSizeAndUnit(value, false) + return updateYAxisWidth(`${toFixedFloat(v, 2)}${u}${isDiskIOChart ? "/s" : ""}`) + } } else { const chartUnit = isNetChart ? userSettings.unitNet : Unit.Bytes obj.tickFormatter = (val) => { @@ -57,7 +255,12 @@ export default memo(function ContainerChart({ try { const sent = item?.payload?.[key]?.ns ?? 0 const received = item?.payload?.[key]?.nr ?? 0 - const { value: receivedValue, unit: receivedUnit } = formatBytes(received, true, userSettings.unitNet, true) + const { value: receivedValue, unit: receivedUnit } = formatBytes( + received, + true, + userSettings.unitNet, + true + ) const { value: sentValue, unit: sentUnit } = formatBytes(sent, true, userSettings.unitNet, true) return ( @@ -72,17 +275,74 @@ export default memo(function ContainerChart({ return null } } + } else if (isDiskIOChart) { + obj.toolTipFormatter = (item: any, key: string) => { + try { + const read = item?.payload?.[key]?.dr ?? 0 + const write = item?.payload?.[key]?.dw ?? 0 + return ( + + {decimalString(read)} MB/s + read + + {decimalString(write)} MB/s + write + + ) + } catch (e) { + return null + } + } } else if (chartType === ChartType.Memory) { obj.toolTipFormatter = (item: any) => { const { value, unit } = formatBytes(item.value, false, Unit.Bytes, true) return `${decimalString(value)} ${unit}` } + } else if (isVolumeChart) { + obj.toolTipFormatter = (item: any) => { + const { v, u } = getSizeAndUnit(item.value, false) + return `${decimalString(v, 2)}${u}` + } + } else if (isHealthChart) { + obj.toolTipFormatter = (item: any) => { + let healthLabel = "Unknown" + switch (item.value) { + case 3: + healthLabel = "Healthy" + break + case 2: + healthLabel = "Starting" + break + case 1: + healthLabel = "Unhealthy" + break + case 0: + healthLabel = "None" + break + } + return healthLabel + } + } else if (isUptimeChart) { + obj.toolTipFormatter = (item: any) => { + const hours = Math.floor(item.value) + const minutes = Math.floor((item.value - hours) * 60) + const days = Math.floor(hours / 24) + const remainingHours = hours % 24 + + if (days > 0) { + return `${days}d ${remainingHours}h ${minutes}m` + } + return `${hours}h ${minutes}m` + } } else { obj.toolTipFormatter = (item: any) => `${decimalString(item.value)} ${unit}` } // data function if (isNetChart) { obj.dataFunction = (key: string, data: any) => (data[key] ? data[key].nr + data[key].ns : null) + } else if (isDiskIOChart) { + obj.dataFunction = (key: string, data: any) => + data[key] ? (data[key].dr || 0) + (data[key].dw || 0) : null } else { obj.dataFunction = (key: string, data: any) => data[key]?.[dataKey] ?? null } @@ -91,12 +351,11 @@ export default memo(function ContainerChart({ // Filter with set lookup const filteredKeys = useMemo(() => { - if (!filter) { + if (!containerFilter || containerFilter.length === 0) { return new Set() } - const filterLower = filter.toLowerCase() - return new Set(Object.keys(chartConfig).filter((key) => !key.toLowerCase().includes(filterLower))) - }, [chartConfig, filter]) + return new Set(Object.keys(containerChartConfig).filter((key) => !containerFilter.includes(key))) + }, [containerChartConfig, containerFilter]) // console.log('rendered at', new Date()) @@ -104,8 +363,228 @@ export default memo(function ContainerChart({ return null } + // For volume charts, check if we have volume data + if (isVolumeChart) { + if (!volumeChartData || Object.keys(volumeChartData.colors).length === 0) { + return null + } + } + + // For health charts, check if we have health data + if (isHealthChart) { + if (!healthChartData || Object.keys(healthChartData.colors).length === 0) { + return null + } + } + + // For uptime charts, check if we have uptime data + if (isUptimeChart) { + if (!uptimeChartData || Object.keys(uptimeChartData.colors).length === 0) { + return null + } + } + + // For combined health+uptime chart + if (isHealthUptimeChart) { + if (!healthUptimeChartData || healthUptimeChartData.data.length === 0) return null + return ( + + ) + } + + // Only show selected containers, or all if none selected + const filterableKeys = isVolumeChart + ? Object.keys(containerChartConfig) + : Object.keys(containerChartConfig).filter( + (key) => + !( + containerChartConfig[key] && + containerChartConfig[key].label && + containerChartConfig[key].label.startsWith("(orphaned volume)") + ) + ) + + // Render volume chart + if (isVolumeChart) { + const colors = Object.keys(volumeChartData!.colors) + return ( +
+ + + + { + const { v, u } = getSizeAndUnit(value, false) + return updateYAxisWidth(`${toFixedFloat(v, 2)}${u}`) + }} + tickLine={false} + axisLine={false} + /> + {xAxis(chartData)} + b.value - a.value} + content={ + formatShortDate(data[0].payload.created)} + contentFormatter={toolTipFormatter} + /> + } + /> + {colors.map((key) => ( + + ))} + + +
+ ) + } + + // Render health chart + if (isHealthChart) { + const colors = Object.keys(healthChartData!.colors) + return ( +
+ + + + + {xAxis(chartData)} + b.value - a.value} + content={ + formatShortDate(data[0].payload.created)} + contentFormatter={toolTipFormatter} + /> + } + /> + {colors.map((key) => ( + + ))} + + +
+ ) + } + + // Render uptime chart + if (isUptimeChart) { + const colors = Object.keys(uptimeChartData!.colors) + return ( +
+ + + + + {xAxis(chartData)} + b.value - a.value} + content={ + formatShortDate(data[0].payload.created)} + contentFormatter={toolTipFormatter} + /> + } + /> + {colors.map((key) => ( + + ))} + + +
+ ) + } + + // Render regular container chart (Area chart) return ( -
+
formatShortDate(data[0].payload.created)} // @ts-expect-error itemSorter={(a, b) => b.value - a.value} - content={} + content={ + 0 ? containerFilter.join(",") : undefined} + contentFormatter={toolTipFormatter} + /> + } /> - {Object.keys(chartConfig).map((key) => { + {filterableKeys.map((key) => { const filtered = filteredKeys.has(key) const fillOpacity = filtered ? 0.05 : 0.4 const strokeOpacity = filtered ? 0.1 : 1 @@ -149,11 +633,11 @@ export default memo(function ContainerChart({ dataKey={dataFunction.bind(null, key)} name={key} type="monotoneX" - fill={chartConfig[key].color} + fill={containerChartConfig[key].color} fillOpacity={fillOpacity} - stroke={chartConfig[key].color} + stroke={containerChartConfig[key].color} strokeOpacity={strokeOpacity} - activeDot={{ opacity: filtered ? 0 : 1 }} + activeDot={{ opacity: 1 }} stackId="a" /> ) @@ -163,3 +647,358 @@ export default memo(function ContainerChart({
) }) + +// Extracted HealthUptimeTable component +const HealthUptimeTable = React.memo(function HealthUptimeTable({ + containerData, + healthUptimeChartData, + containerColors, + filter, +}: { + containerData: any[] + healthUptimeChartData: { data: any[]; colors: Record } + containerColors: Record + filter: string[] +}) { + const stackFilter = useStore($stackFilter) + // Get the latest data point for table display + const latestData = healthUptimeChartData.data[healthUptimeChartData.data.length - 1] + if (!latestData) return null + + // Extract container data for table + const containerTableData = React.useMemo(() => { + const containerNames = new Set() + for (const key of Object.keys(latestData)) { + if (key === "created") continue + const containerName = key.replace(/_uptime$/, "").replace(/_health$/, "") + // Skip orphaned volumes + if (containerName.startsWith("(orphaned volume)")) continue + containerNames.add(containerName) + } + const tableData = [] + for (const containerName of containerNames) { + const uptimeKey = `${containerName}_uptime` + const healthKey = `${containerName}_health` + const uptimeHours = latestData[uptimeKey] + const healthValue = latestData[healthKey] || 0 + let healthStatus = "Unknown" + switch (healthValue) { + case 3: + healthStatus = "Healthy" + break + case 2: + healthStatus = "Starting" + break + case 1: + healthStatus = "Unhealthy" + break + case 0: + healthStatus = "None" + break + } + let uptimeDisplay = "N/A" + if (typeof uptimeHours === "number" && !Number.isNaN(uptimeHours)) { + const hours = Math.floor(uptimeHours) + const minutes = Math.floor((uptimeHours - hours) * 60) + const days = Math.floor(hours / 24) + const remainingHours = hours % 24 + if (days > 0) { + uptimeDisplay = `${days}d ${remainingHours}h ${minutes}m` + } else { + uptimeDisplay = `${hours}h ${minutes}m` + } + } + let stackName = "—" + let statusInfo = "—" + let idShort = "" + for (let i = containerData.length - 1; i >= 0; i--) { + const containerStats = containerData[i] + if (containerStats.created && containerStats[containerName]) { + const containerDataObj = containerStats[containerName] + if (typeof containerDataObj === "object" && containerDataObj) { + if ("p" in containerDataObj) { + stackName = containerDataObj.p as string + } + if ("s" in containerDataObj) { + statusInfo = containerDataObj.s as string + } + if ("idShort" in containerDataObj) { + idShort = containerDataObj.idShort as string + } + break + } + } + } + tableData.push({ + name: containerName, + idShort, + health: healthStatus, + status: statusInfo, + uptime: uptimeDisplay, + uptimeHours: uptimeHours, + healthValue: healthValue, + stack: stackName, + color: containerColors[containerName] || generateFallbackColor(containerName), + }) + } + return tableData + }, [containerData, latestData, containerColors]) + + // Sort and filter state + const [sortField, setSortField] = React.useState<"name" | "idShort" | "stack" | "health" | "status" | "uptime">( + "uptime" + ) + const [sortDirection, setSortDirection] = React.useState<"asc" | "desc">("desc") + const [currentPage, setCurrentPage] = React.useState(1) + const containersPerPage = 4 + + // Filtered data + const filteredContainerData = React.useMemo(() => { + let filtered = containerTableData + + // Apply container filter + if (Array.isArray(filter) && filter.length > 0) { + filtered = filtered.filter((container) => filter.includes(container.name)) + } + + // Apply stack filter + if (Array.isArray(stackFilter) && stackFilter.length > 0) { + filtered = filtered.filter((container) => stackFilter.includes(container.stack)) + } + + return filtered + }, [containerTableData, filter, stackFilter]) + + // Sorted data + const sortedContainerData = React.useMemo(() => { + return [...filteredContainerData].sort((a, b) => { + let aValue: string | number + let bValue: string | number + switch (sortField) { + case "name": + aValue = a.name?.toLowerCase?.() || "" + bValue = b.name?.toLowerCase?.() || "" + break + case "idShort": + aValue = a.idShort || "" + bValue = b.idShort || "" + break + case "stack": + aValue = a.stack?.toLowerCase?.() || "" + bValue = b.stack?.toLowerCase?.() || "" + break + case "health": + aValue = typeof a.healthValue === "number" ? a.healthValue : 0 + bValue = typeof b.healthValue === "number" ? b.healthValue : 0 + break + case "status": + aValue = a.status?.toLowerCase?.() || "" + bValue = b.status?.toLowerCase?.() || "" + break + case "uptime": + aValue = typeof a.uptimeHours === "number" ? a.uptimeHours : 0 + bValue = typeof b.uptimeHours === "number" ? b.uptimeHours : 0 + break + default: + return 0 + } + if (aValue < bValue) return sortDirection === "asc" ? -1 : 1 + if (aValue > bValue) return sortDirection === "asc" ? 1 : -1 + return 0 + }) + }, [filteredContainerData, sortField, sortDirection]) + + // Pagination + const totalPages = Math.ceil(sortedContainerData.length / containersPerPage) + const startIndex = (currentPage - 1) * containersPerPage + const endIndex = startIndex + containersPerPage + const currentContainers = sortedContainerData.slice(startIndex, endIndex) + + // Handlers + const handleSort = (field: "name" | "idShort" | "stack" | "health" | "status" | "uptime") => { + if (sortField === field) { + setSortDirection(sortDirection === "asc" ? "desc" : "asc") + } else { + setSortField(field) + setSortDirection("asc") + } + } + const getSortIcon = (field: "name" | "idShort" | "stack" | "health" | "status" | "uptime") => { + if (sortField !== field) return "↑↓" + return sortDirection === "asc" ? "↑" : "↓" + } + + React.useEffect(() => { + setCurrentPage(1) + }, [filteredContainerData, sortField, sortDirection]) + + return ( +
+
+
+ + + + + + + + + + + + + {currentContainers.map((container) => ( + + + + + + + + + ))} + +
handleSort("idShort")} + > +
+ ID + {getSortIcon("idShort")} +
+
handleSort("name")} + > +
+ Container + {getSortIcon("name")} +
+
handleSort("stack")} + > +
+ Stack + {getSortIcon("stack")} +
+
handleSort("health")} + > +
+ Health + {getSortIcon("health")} +
+
handleSort("status")} + > +
+ Status + {getSortIcon("status")} +
+
handleSort("uptime")} + > +
+ Uptime + {getSortIcon("uptime")} +
+
+ {container.idShort} + +
+
+ {container.name} +
+
+ + {container.stack} + + + + {container.health} + + + + {container.status} + + {container.uptime}
+
+
+ {/* Pagination Controls */} + {totalPages > 1 && ( +
+
+ Showing {startIndex + 1}-{Math.min(endIndex, sortedContainerData.length)} of{" "} + {sortedContainerData.length} containers +
+
+ + {Array.from({ length: totalPages }, (_, i) => i + 1).map((page) => ( + + ))} + +
+
+ )} +
+ ) +}) diff --git a/internal/site/src/components/charts/container-health-table.tsx b/internal/site/src/components/charts/container-health-table.tsx new file mode 100644 index 00000000..c649cab2 --- /dev/null +++ b/internal/site/src/components/charts/container-health-table.tsx @@ -0,0 +1,257 @@ +"use client" + +import * as React from "react" +import { + ColumnDef, + flexRender, + getCoreRowModel, + getPaginationRowModel, + getSortedRowModel, + SortingState, + useReactTable, + VisibilityState, +} from "@tanstack/react-table" +import { ArrowUpDown } from "lucide-react" + +import { Button } from "@/components/ui/button" +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table" +import { Badge } from "@/components/ui/badge" +import { cn } from "@/lib/utils" + +export type DockerHealthRow = { + id: string + name: string + stack: string + health: string + healthValue: number + status: string + uptime: string + color: string +} + +type Props = { + data: DockerHealthRow[] +} + +export function ContainerHealthTable({ data }: Props) { + const [sorting, setSorting] = React.useState([]) + const [columnVisibility, setColumnVisibility] = React.useState({}) + const [rowSelection, setRowSelection] = React.useState({}) + + const columns = React.useMemo[]>(() => [ + { + accessorKey: "id", + header: ({ column }) => ( + + ), + cell: ({ row }) => ( + {row.original.id} + ), + }, + { + accessorKey: "name", + header: ({ column }) => ( + + ), + cell: ({ row }) => ( +
+
+ {row.original.name} +
+ ), + }, + { + accessorKey: "stack", + header: ({ column }) => ( + + ), + cell: ({ row }) => ( + {row.original.stack} + ), + }, + { + accessorKey: "health", + header: ({ column }) => ( + + ), + cell: ({ row }) => ( + {row.original.health} + ), + }, + { + accessorKey: "status", + header: ({ column }) => ( + + ), + cell: ({ row }) => ( + {row.original.status} + ), + }, + { + accessorKey: "uptime", + header: ({ column }) => ( + + ), + cell: ({ row }) => ( + {row.original.uptime} + ), + }, + ], []) + + const table = useReactTable({ + data, + columns, + onSortingChange: setSorting, + getCoreRowModel: getCoreRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), + onColumnVisibilityChange: setColumnVisibility, + onRowSelectionChange: setRowSelection, + state: { + sorting, + columnVisibility, + rowSelection, + }, + }) + + React.useEffect(() => { + table.setPageSize(5) + }, [table]) + + return ( +
+
+ + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => { + return ( + + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext() + )} + + ) + })} + + ))} + + + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender( + cell.column.columnDef.cell, + cell.getContext() + )} + + ))} + + )) + ) : ( + + + No results. + + + )} + +
+
+
+
+ + +
+
+
+ ) +} \ No newline at end of file diff --git a/internal/site/src/components/routes/system.tsx b/internal/site/src/components/routes/system.tsx index 61db64e3..143a0a0a 100644 --- a/internal/site/src/components/routes/system.tsx +++ b/internal/site/src/components/routes/system.tsx @@ -6,10 +6,12 @@ import { timeTicks } from "d3-time" import { ChevronRightSquareIcon, ClockArrowUp, + Container as ContainerIcon, CpuIcon, GlobeIcon, LayoutGridIcon, MonitorIcon, + Server as ServerIcon, XIcon, } from "lucide-react" import { subscribeKeys } from "nanostores" @@ -30,9 +32,11 @@ import { $allSystemsById, $allSystemsByName, $chartTime, + $containerColors, $containerFilter, $direction, $maxValues, + $stackFilter, $systems, $temperatureFilter, $userSettings, @@ -69,6 +73,7 @@ import { AppleIcon, ChartAverage, ChartMax, FreeBsdIcon, Rows, TuxIcon, WebSocke import { Input } from "../ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../ui/select" import { Separator } from "../ui/separator" +import { Tabs, TabsContent, TabsList, TabsTrigger } from "../ui/tabs" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../ui/tooltip" import NetworkSheet from "./system/network-sheet" import LineChartDefault from "../charts/line-chart" @@ -396,17 +401,74 @@ export default memo(function SystemDetail({ id }: { id: string }) { }, [system, t]) /** Space for tooltip if more than 12 containers */ + // biome-ignore lint/correctness/useExhaustiveDependencies: filters accessed via .get() useEffect(() => { - if (!netCardRef.current || !containerData.length) { - setBottomSpacing(0) - return + const calculateSpacing = () => { + if (!netCardRef.current || !containerData.length) { + setBottomSpacing(0) + return + } + + // Count visible containers after applying filters + const containerFilter = $containerFilter.get() + const stackFilter = $stackFilter.get() + let visibleCount = 0 + + if (containerData[0]) { + for (const [key, value] of Object.entries(containerData[0])) { + if (key === "created") continue + + // Apply container filter + if (containerFilter.length > 0 && !containerFilter.includes(key)) { + continue + } + + // Apply stack filter + if (stackFilter.length > 0 && typeof value === "object" && value) { + const stackName = (value as any).p || "—" + if (!stackFilter.includes(stackName)) { + continue + } + } + + visibleCount++ + } + } + + // Only add spacing if there are more than 12 visible containers + if (visibleCount > 12) { + const tooltipHeight = (visibleCount - 11) * 17.8 - 40 + const wrapperEl = chartWrapRef.current as HTMLDivElement + const wrapperRect = wrapperEl.getBoundingClientRect() + const chartRect = netCardRef.current.getBoundingClientRect() + const distanceToBottom = wrapperRect.bottom - chartRect.bottom + const spacing = Math.max(0, tooltipHeight - distanceToBottom) + setBottomSpacing(spacing) + } else { + setBottomSpacing(0) + } + } + + // Initial calculation + calculateSpacing() + + // Subscribe to filter changes to recalculate + // Use requestAnimationFrame to wait for chart re-render, then add small delay for layout + const unsubContainer = $containerFilter.subscribe(() => { + requestAnimationFrame(() => { + setTimeout(calculateSpacing, 100) + }) + }) + const unsubStack = $stackFilter.subscribe(() => { + requestAnimationFrame(() => { + setTimeout(calculateSpacing, 100) + }) + }) + + return () => { + unsubContainer() + unsubStack() } - const tooltipHeight = (Object.keys(containerData[0]).length - 11) * 17.8 - 40 - const wrapperEl = chartWrapRef.current as HTMLDivElement - const wrapperRect = wrapperEl.getBoundingClientRect() - const chartRect = netCardRef.current.getBoundingClientRect() - const distanceToBottom = wrapperRect.bottom - chartRect.bottom - setBottomSpacing(tooltipHeight - distanceToBottom) }, [containerData]) // keyboard navigation between systems @@ -454,7 +516,14 @@ export default memo(function SystemDetail({ id }: { id: string }) { const maxValSelect = isLongerChart ? : null const showMax = maxValues && isLongerChart - const containerFilterBar = containerData.length ? : null + const containerFilterBar = containerData.length ? : null + const stackFilterBar = containerData.length ? : null + const combinedFilterBar = containerData.length ? ( +
+ + +
+ ) : null const dataEmpty = !chartLoading && chartData.systemStats.length === 0 const lastGpuVals = Object.values(systemStats.at(-1)?.stats.g ?? {}) @@ -569,6 +638,22 @@ export default memo(function SystemDetail({ id }: { id: string }) {
+ + {/* Tabbed interface for system and Docker stats */} + + + + + {t`System Stats`} + + + + {dockerOrPodman(t`Docker Stats`, system)} + + + + {/* System Stats Tab */} + {/* main charts */}
- {containerFilterBar && ( - - - - )} - - {containerFilterBar && ( - - - - )} - @@ -740,29 +791,6 @@ export default memo(function SystemDetail({ id }: { id: string }) { /> - {containerFilterBar && containerData.length > 0 && ( -
- - - -
- )} - {/* Swap chart */} {(systemStats.at(-1)?.stats.su ?? 0) > 0 && ( )} + + + {/* Docker Stats Tab */} + + {/* Centralized filter bar for all Docker charts */} + {combinedFilterBar && ( +
+ {combinedFilterBar} +
+ )} +
+ {containerFilterBar && ( + + + + )} + + {containerFilterBar && ( + + + + )} + + {containerFilterBar && containerData.length > 0 && ( +
+ + + +
+ )} + + {/* Docker Disk I/O chart */} + {containerFilterBar && ( + + + + )} + + {/* Docker Volumes chart */} + {containerFilterBar && ( + + + + )} + + {/* Docker Health & Uptime chart */} + {containerFilterBar && ( + + + + )} +
+
+
{/* add space for tooltip if more than 12 containers */} @@ -1017,38 +1164,121 @@ function GpuEnginesChart({ chartData }: { chartData: ChartData }) { ) } -function FilterBar({ store = $containerFilter }: { store?: typeof $containerFilter }) { - const containerFilter = useStore(store) +function FilterBar({ + store = $containerFilter, + containerData, + mode = "container" +}: { + store?: typeof $containerFilter + containerData?: ChartData["containerData"] + mode?: "container" | "stack" +}) { + const selected = useStore(store) const { t } = useLingui() + const [open, setOpen] = useState(false) - const debouncedStoreSet = useMemo(() => debounce((value: string) => store.set(value), 80), [store]) + // Extract all unique container names or stack names from current data + const availableItems = useMemo(() => { + const items = new Set() + if (containerData) { + for (const dataPoint of containerData) { + if (dataPoint.created) { + for (const [key, value] of Object.entries(dataPoint)) { + if (key !== "created") { + if (mode === "stack" && typeof value === "object" && value) { + // Extract stack/project name + const stackName = (value as any).p || "—" + items.add(stackName) + } else if (mode === "container") { + // Add container name + items.add(key) + } + } + } + } + } + } + return Array.from(items).sort() + }, [containerData, mode]) - const handleChange = useCallback( - (e: React.ChangeEvent) => debouncedStoreSet(e.target.value), - [debouncedStoreSet] - ) + const toggleItem = useCallback((item: string) => { + const current = store.get() + if (current.includes(item)) { + store.set(current.filter(i => i !== item)) + } else { + store.set([...current, item]) + } + }, [store]) + + const clearAll = useCallback(() => { + store.set([]) + setOpen(false) + }, [store]) + + // Close dropdown when clicking outside + useEffect(() => { + if (!open) return + const handleClickOutside = (e: MouseEvent) => { + const target = e.target as HTMLElement + if (!target.closest('[data-filter-dropdown]')) { + setOpen(false) + } + } + document.addEventListener('mousedown', handleClickOutside) + return () => document.removeEventListener('mousedown', handleClickOutside) + }, [open]) return ( - <> - - {containerFilter && ( - +
+ + {open && ( +
+
+ {availableItems.length === 0 ? ( +
+ {t`No items available`} +
+ ) : ( + availableItems.map((item) => ( +
toggleItem(item)} + > + {}} + className="h-4 w-4" + /> + {item} +
+ )) + )} +
+ {selected.length > 0 && ( +
+ +
+ )} +
)} - +
) } diff --git a/internal/site/src/components/ui/chart.tsx b/internal/site/src/components/ui/chart.tsx index 10cd64ed..c4b19006 100644 --- a/internal/site/src/components/ui/chart.tsx +++ b/internal/site/src/components/ui/chart.tsx @@ -97,7 +97,7 @@ const ChartTooltipContent = React.forwardRef< nameKey?: string labelKey?: string unit?: string - filter?: string + filter?: string | string[] contentFormatter?: (item: any, key: string) => React.ReactNode | string truncate?: boolean } @@ -129,13 +129,19 @@ const ChartTooltipContent = React.forwardRef< React.useMemo(() => { if (filter) { - payload = payload?.filter((item) => (item.name as string)?.toLowerCase().includes(filter.toLowerCase())) + if (Array.isArray(filter)) { + // Array filter: only show items that are in the filter array + payload = payload?.filter((item) => filter.includes(item.name as string)) + } else { + // String filter: show items that match the string (backward compatibility) + payload = payload?.filter((item) => (item.name as string)?.toLowerCase().includes(filter.toLowerCase())) + } } if (itemSorter) { // @ts-expect-error payload?.sort(itemSorter) } - }, [itemSorter, payload]) + }, [itemSorter, payload, filter]) const tooltipLabel = React.useMemo(() => { if (hideLabel || !payload?.length) { diff --git a/internal/site/src/lib/enums.ts b/internal/site/src/lib/enums.ts index a2b514f4..c03ce9fc 100644 --- a/internal/site/src/lib/enums.ts +++ b/internal/site/src/lib/enums.ts @@ -12,6 +12,11 @@ export enum ChartType { Disk, Network, CPU, + Volume, + Health, + Uptime, + HealthUptime, + DiskIO, } /** Unit of measurement */ diff --git a/internal/site/src/lib/stores.ts b/internal/site/src/lib/stores.ts index 9cc564b4..403aa458 100644 --- a/internal/site/src/lib/stores.ts +++ b/internal/site/src/lib/stores.ts @@ -53,7 +53,13 @@ export const $userSettings = map({ listenKeys($userSettings, ["chartTime"], ({ chartTime }) => $chartTime.set(chartTime)) /** Container chart filter */ -export const $containerFilter = atom("") +export const $containerFilter = atom([]) + +/** Stack chart filter */ +export const $stackFilter = atom([]) + +/** Container color mapping for consistent colors across charts */ +export const $containerColors = atom>({}) /** Temperature chart filter */ export const $temperatureFilter = atom("") diff --git a/internal/site/src/lib/utils.ts b/internal/site/src/lib/utils.ts index 720650d8..8ae1aa7b 100644 --- a/internal/site/src/lib/utils.ts +++ b/internal/site/src/lib/utils.ts @@ -290,6 +290,45 @@ export function formatBytes( export const chartMargin = { top: 12 } +export function toFixedWithoutTrailingZeros(num: number, decimals: number): string { + const str = num.toFixed(decimals) + return str.replace(/\.?0+$/, "") +} + +export const getSizeAndUnit = (n: number, isGigabytes = true) => { + const sizeInGB = isGigabytes ? n : n / 1_000 + + if (sizeInGB >= 1_000) { + return { v: sizeInGB / 1_000, u: " TB" } + } + if (sizeInGB >= 1) { + return { v: sizeInGB, u: " GB" } + } + return { v: isGigabytes ? sizeInGB * 1_000 : n, u: " MB" } +} + +/** + * Generate a consistent fallback color for containers without assigned colors + * @param name Container name or identifier + * @returns HSL color string + */ +export function generateFallbackColor(name: string): string { + // Use a simple hash of the name to generate consistent colors + let hash = 0 + for (let i = 0; i < name.length; i++) { + const char = name.charCodeAt(i) + hash = (hash << 5) - hash + char + hash = hash & hash // Convert to 32-bit integer + } + + // Generate hue, saturation, and lightness from the hash + const hue = Math.abs(hash) % 360 + const saturation = 65 + (Math.abs(hash) % 3) * 10 // 65%, 75%, 85% + const lightness = 50 + (Math.abs(hash) % 3) * 10 // 50%, 60%, 70% + + return `hsl(${hue}, ${saturation}%, ${lightness}%)` +} + /** * Retuns value of system host, truncating full path if socket. * @example diff --git a/internal/site/src/locales/ar/ar.po b/internal/site/src/locales/ar/ar.po index a7011411..75c128e8 100644 --- a/internal/site/src/locales/ar/ar.po +++ b/internal/site/src/locales/ar/ar.po @@ -267,6 +267,10 @@ msgstr "تحقق من السجلات لمزيد من التفاصيل." msgid "Check your notification service" msgstr "تحقق من خدمة الإشعارات الخاصة بك" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "انقر على نظام لعرض مزيد من المعلومات." @@ -293,6 +297,10 @@ msgstr "تأكيد كلمة المرور" msgid "Connection is down" msgstr "الاتصال مقطوع" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "القرص" msgid "Disk I/O" msgstr "إدخال/إخراج القرص" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "وحدة القرص" @@ -433,6 +445,14 @@ msgstr "استخدام القرص لـ {extraFsName}" msgid "Docker CPU Usage" msgstr "استخدام المعالج للدوكر" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "استخدام الذاكرة للدوكر" @@ -441,6 +461,14 @@ msgstr "استخدام الذاكرة للدوكر" msgid "Docker Network I/O" msgstr "إدخال/إخراج الشبكة للدوكر" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "التوثيق" @@ -549,8 +577,15 @@ msgstr "فشل في إرسال إشعار الاختبار" msgid "Failed to update alert" msgstr "فشل في تحديث التنبيه" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "تصفية..." @@ -727,6 +762,10 @@ msgstr "حركة مرور الشبكة للواجهات العامة" msgid "Network unit" msgstr "وحدة الشبكة" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "لم يتم العثور على نتائج." @@ -991,6 +1030,10 @@ msgstr "النظام" msgid "System load averages over time" msgstr "متوسط تحميل النظام مع مرور الوقت" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "الأنظمة" @@ -1203,6 +1246,10 @@ msgstr "عرض أحدث 200 تنبيه." msgid "Visible Fields" msgstr "الأعمدة الظاهرة" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "في انتظار وجود سجلات كافية للعرض" diff --git a/internal/site/src/locales/bg/bg.po b/internal/site/src/locales/bg/bg.po index 6984f6ba..da0e73c6 100644 --- a/internal/site/src/locales/bg/bg.po +++ b/internal/site/src/locales/bg/bg.po @@ -267,6 +267,10 @@ msgstr "Провери log-овете за повече информация." msgid "Check your notification service" msgstr "Провери услугата си за удостоверяване" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Кликнете върху система, за да видите повече информация." @@ -293,6 +297,10 @@ msgstr "Потвърди парола" msgid "Connection is down" msgstr "Връзката е прекъсната" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Диск" msgid "Disk I/O" msgstr "Диск I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Единица за диск" @@ -433,6 +445,14 @@ msgstr "Изполване на диск от {extraFsName}" msgid "Docker CPU Usage" msgstr "Използване на процесор от docker" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Изполване на памет от docker" @@ -441,6 +461,14 @@ msgstr "Изполване на памет от docker" msgid "Docker Network I/O" msgstr "Мрежов I/O използван от docker" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Документация" @@ -549,8 +577,15 @@ msgstr "Неуспешно изпрати тестова нотификация" msgid "Failed to update alert" msgstr "Неуспешно обнови тревога" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Филтрирай..." @@ -727,6 +762,10 @@ msgstr "Мрежов трафик на публични интерфейси" msgid "Network unit" msgstr "Единица за измерване на скорост" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Няма намерени резултати." @@ -991,6 +1030,10 @@ msgstr "Система" msgid "System load averages over time" msgstr "Средно натоварване на системата във времето" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Системи" @@ -1203,6 +1246,10 @@ msgstr "Прегледайте последните си 200 сигнала." msgid "Visible Fields" msgstr "Видими полета" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Изчаква се за достатъчно записи за показване" diff --git a/internal/site/src/locales/cs/cs.po b/internal/site/src/locales/cs/cs.po index fd081dbf..158251e3 100644 --- a/internal/site/src/locales/cs/cs.po +++ b/internal/site/src/locales/cs/cs.po @@ -267,6 +267,10 @@ msgstr "Pro více informací zkontrolujte logy." msgid "Check your notification service" msgstr "Zkontrolujte službu upozornění" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Klikněte na systém pro zobrazení více informací." @@ -293,6 +297,10 @@ msgstr "Potvrdit heslo" msgid "Connection is down" msgstr "Připojení je nedostupné" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Disk" msgid "Disk I/O" msgstr "Disk I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Disková jednotka" @@ -433,6 +445,14 @@ msgstr "Využití disku {extraFsName}" msgid "Docker CPU Usage" msgstr "Využití CPU Dockeru" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Využití paměti Dockeru" @@ -441,6 +461,14 @@ msgstr "Využití paměti Dockeru" msgid "Docker Network I/O" msgstr "Síťové I/O Dockeru" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Dokumentace" @@ -549,8 +577,15 @@ msgstr "Nepodařilo se odeslat testovací oznámení" msgid "Failed to update alert" msgstr "Nepodařilo se aktualizovat upozornění" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filtr..." @@ -727,6 +762,10 @@ msgstr "Síťový provoz veřejných rozhraní" msgid "Network unit" msgstr "Síťová jednotka" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Nenalezeny žádné výskyty." @@ -991,6 +1030,10 @@ msgstr "Systém" msgid "System load averages over time" msgstr "Průměry zatížení systému v průběhu času" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Systémy" @@ -1203,6 +1246,10 @@ msgstr "Zobrazit vašich 200 nejnovějších upozornění." msgid "Visible Fields" msgstr "Viditelné sloupce" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Čeká se na dostatek záznamů k zobrazení" diff --git a/internal/site/src/locales/da/da.po b/internal/site/src/locales/da/da.po index e53b38e9..4e5d824a 100644 --- a/internal/site/src/locales/da/da.po +++ b/internal/site/src/locales/da/da.po @@ -267,6 +267,10 @@ msgstr "Tjek logfiler for flere detaljer." msgid "Check your notification service" msgstr "Tjek din notifikationstjeneste" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "" @@ -293,6 +297,10 @@ msgstr "Bekræft adgangskode" msgid "Connection is down" msgstr "" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Disk" msgid "Disk I/O" msgstr "Disk I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "" @@ -433,6 +445,14 @@ msgstr "Diskforbrug af {extraFsName}" msgid "Docker CPU Usage" msgstr "Docker CPU forbrug" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker Hukommelsesforbrug" @@ -441,6 +461,14 @@ msgstr "Docker Hukommelsesforbrug" msgid "Docker Network I/O" msgstr "Docker Netværk I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Dokumentation" @@ -549,8 +577,15 @@ msgstr "Afsendelse af testnotifikation mislykkedes" msgid "Failed to update alert" msgstr "Kunne ikke opdatere alarm" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filter..." @@ -727,6 +762,10 @@ msgstr "Netværkstrafik af offentlige grænseflader" msgid "Network unit" msgstr "" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Ingen resultater fundet." @@ -991,6 +1030,10 @@ msgstr "System" msgid "System load averages over time" msgstr "" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Systemer" @@ -1203,6 +1246,10 @@ msgstr "" msgid "Visible Fields" msgstr "Synlige felter" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Venter på nok posteringer til at vise" diff --git a/internal/site/src/locales/de/de.po b/internal/site/src/locales/de/de.po index 31ec37c3..a286606b 100644 --- a/internal/site/src/locales/de/de.po +++ b/internal/site/src/locales/de/de.po @@ -267,6 +267,10 @@ msgstr "Überprüfe die Protokolle für weitere Details." msgid "Check your notification service" msgstr "Überprüfe deinen Benachrichtigungsdienst" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Klicke auf ein System, um weitere Informationen zu sehen." @@ -293,6 +297,10 @@ msgstr "Passwort bestätigen" msgid "Connection is down" msgstr "Verbindung unterbrochen" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Festplatte" msgid "Disk I/O" msgstr "Festplatten-I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Festplatteneinheit" @@ -433,6 +445,14 @@ msgstr "Festplattennutzung von {extraFsName}" msgid "Docker CPU Usage" msgstr "Docker-CPU-Auslastung" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker-Arbeitsspeichernutzung" @@ -441,6 +461,14 @@ msgstr "Docker-Arbeitsspeichernutzung" msgid "Docker Network I/O" msgstr "Docker-Netzwerk-I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Dokumentation" @@ -549,8 +577,15 @@ msgstr "Testbenachrichtigung konnte nicht gesendet werden" msgid "Failed to update alert" msgstr "Warnung konnte nicht aktualisiert werden" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filter..." @@ -727,6 +762,10 @@ msgstr "Netzwerkverkehr der öffentlichen Schnittstellen" msgid "Network unit" msgstr "Netzwerkeinheit" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Keine Ergebnisse gefunden." @@ -991,6 +1030,10 @@ msgstr "System" msgid "System load averages over time" msgstr "Systemlastdurchschnitt im Zeitverlauf" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Systeme" @@ -1203,6 +1246,10 @@ msgstr "Sieh dir die neusten 200 Alarme an." msgid "Visible Fields" msgstr "Sichtbare Spalten" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Warten auf genügend Datensätze zur Anzeige" diff --git a/internal/site/src/locales/en/en.po b/internal/site/src/locales/en/en.po index 8b139eae..b537ad5c 100644 --- a/internal/site/src/locales/en/en.po +++ b/internal/site/src/locales/en/en.po @@ -262,6 +262,10 @@ msgstr "Check logs for more details." msgid "Check your notification service" msgstr "Check your notification service" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "Clear all" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Click on a system to view more information." @@ -288,6 +292,10 @@ msgstr "Confirm password" msgid "Connection is down" msgstr "Connection is down" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "Container health status and uptime" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -410,6 +418,10 @@ msgstr "Disk" msgid "Disk I/O" msgstr "Disk I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "Disk read/write rates of docker containers" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Disk unit" @@ -428,6 +440,14 @@ msgstr "Disk usage of {extraFsName}" msgid "Docker CPU Usage" msgstr "Docker CPU Usage" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "Docker Disk I/O" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "Docker Health & Uptime" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker Memory Usage" @@ -436,6 +456,14 @@ msgstr "Docker Memory Usage" msgid "Docker Network I/O" msgstr "Docker Network I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "Docker Stats" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "Docker Volumes" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Documentation" @@ -544,8 +572,15 @@ msgstr "Failed to send test notification" msgid "Failed to update alert" msgstr "Failed to update alert" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "Filter containers..." + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "Filter stacks..." + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filter..." @@ -722,6 +757,10 @@ msgstr "Network traffic of public interfaces" msgid "Network unit" msgstr "Network unit" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "No items available" + #: src/components/command-palette.tsx msgid "No results found." msgstr "No results found." @@ -986,6 +1025,10 @@ msgstr "System" msgid "System load averages over time" msgstr "System load averages over time" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "System Stats" + #: src/components/navbar.tsx msgid "Systems" msgstr "Systems" @@ -1198,6 +1241,10 @@ msgstr "View your 200 most recent alerts." msgid "Visible Fields" msgstr "Visible Fields" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "Volume usage of docker containers" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Waiting for enough records to display" diff --git a/internal/site/src/locales/es/es.po b/internal/site/src/locales/es/es.po index 7a1d7b0b..580c015b 100644 --- a/internal/site/src/locales/es/es.po +++ b/internal/site/src/locales/es/es.po @@ -267,6 +267,10 @@ msgstr "Revise los registros para más detalles." msgid "Check your notification service" msgstr "Verifique su servicio de notificaciones" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Haga clic en un sistema para ver más información." @@ -293,6 +297,10 @@ msgstr "Confirmar contraseña" msgid "Connection is down" msgstr "La conexión está caída" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Disco" msgid "Disk I/O" msgstr "E/S de Disco" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Unidad de disco" @@ -433,6 +445,14 @@ msgstr "Uso de disco de {extraFsName}" msgid "Docker CPU Usage" msgstr "Uso de CPU de Docker" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Uso de Memoria de Docker" @@ -441,6 +461,14 @@ msgstr "Uso de Memoria de Docker" msgid "Docker Network I/O" msgstr "E/S de Red de Docker" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Documentación" @@ -549,8 +577,15 @@ msgstr "Error al enviar la notificación de prueba" msgid "Failed to update alert" msgstr "Error al actualizar la alerta" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filtrar..." @@ -727,6 +762,10 @@ msgstr "Tráfico de red de interfaces públicas" msgid "Network unit" msgstr "Unidad de red" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "No se encontraron resultados." @@ -991,6 +1030,10 @@ msgstr "Sistema" msgid "System load averages over time" msgstr "Promedios de carga del sistema a lo largo del tiempo" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Sistemas" @@ -1203,6 +1246,10 @@ msgstr "Ver sus 200 alertas más recientes." msgid "Visible Fields" msgstr "Columnas visibles" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Esperando suficientes registros para mostrar" diff --git a/internal/site/src/locales/fa/fa.po b/internal/site/src/locales/fa/fa.po index dc883657..1d11da80 100644 --- a/internal/site/src/locales/fa/fa.po +++ b/internal/site/src/locales/fa/fa.po @@ -267,6 +267,10 @@ msgstr "برای جزئیات بیشتر، لاگ‌ها را بررسی کنی msgid "Check your notification service" msgstr "سرویس اطلاع‌رسانی خود را بررسی کنید" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "برای مشاهده اطلاعات بیشتر روی یک سیستم کلیک کنید." @@ -293,6 +297,10 @@ msgstr "تأیید رمز عبور" msgid "Connection is down" msgstr "اتصال قطع است" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "دیسک" msgid "Disk I/O" msgstr "ورودی/خروجی دیسک" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "واحد دیسک" @@ -433,6 +445,14 @@ msgstr "میزان استفاده از دیسک {extraFsName}" msgid "Docker CPU Usage" msgstr "میزان استفاده از CPU داکر" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "میزان استفاده از حافظه داکر" @@ -441,6 +461,14 @@ msgstr "میزان استفاده از حافظه داکر" msgid "Docker Network I/O" msgstr "ورودی/خروجی شبکه داکر" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "مستندات" @@ -549,8 +577,15 @@ msgstr "ارسال اعلان آزمایشی ناموفق بود" msgid "Failed to update alert" msgstr "به‌روزرسانی هشدار ناموفق بود" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "فیلتر..." @@ -727,6 +762,10 @@ msgstr "ترافیک شبکه رابط‌های عمومی" msgid "Network unit" msgstr "واحد شبکه" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "هیچ نتیجه‌ای یافت نشد." @@ -991,6 +1030,10 @@ msgstr "سیستم" msgid "System load averages over time" msgstr "میانگین بار سیستم در طول زمان" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "سیستم‌ها" @@ -1203,6 +1246,10 @@ msgstr "۲۰۰ هشدار اخیر خود را مشاهده کنید." msgid "Visible Fields" msgstr "فیلدهای قابل مشاهده" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "در انتظار رکوردهای کافی برای نمایش" diff --git a/internal/site/src/locales/fr/fr.po b/internal/site/src/locales/fr/fr.po index 1b32271d..655562f1 100644 --- a/internal/site/src/locales/fr/fr.po +++ b/internal/site/src/locales/fr/fr.po @@ -267,6 +267,10 @@ msgstr "Vérifiez les journaux pour plus de détails." msgid "Check your notification service" msgstr "Vérifiez votre service de notification" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "" @@ -293,6 +297,10 @@ msgstr "Confirmer le mot de passe" msgid "Connection is down" msgstr "" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Disque" msgid "Disk I/O" msgstr "Entrée/Sortie disque" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "" @@ -433,6 +445,14 @@ msgstr "Utilisation du disque de {extraFsName}" msgid "Docker CPU Usage" msgstr "Utilisation du CPU Docker" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Utilisation de la mémoire Docker" @@ -441,6 +461,14 @@ msgstr "Utilisation de la mémoire Docker" msgid "Docker Network I/O" msgstr "Entrée/Sortie réseau Docker" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Documentation" @@ -549,8 +577,15 @@ msgstr "Échec de l'envoi de la notification de test" msgid "Failed to update alert" msgstr "Échec de la mise à jour de l'alerte" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filtrer..." @@ -727,6 +762,10 @@ msgstr "Trafic réseau des interfaces publiques" msgid "Network unit" msgstr "" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Aucun résultat trouvé." @@ -991,6 +1030,10 @@ msgstr "Système" msgid "System load averages over time" msgstr "" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Systèmes" @@ -1203,6 +1246,10 @@ msgstr "" msgid "Visible Fields" msgstr "Colonnes visibles" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "En attente de suffisamment d'enregistrements à afficher" diff --git a/internal/site/src/locales/hr/hr.po b/internal/site/src/locales/hr/hr.po index e6c42bb3..94246181 100644 --- a/internal/site/src/locales/hr/hr.po +++ b/internal/site/src/locales/hr/hr.po @@ -267,6 +267,10 @@ msgstr "Provjerite logove za više detalja." msgid "Check your notification service" msgstr "Provjerite Vaš servis notifikacija" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "" @@ -293,6 +297,10 @@ msgstr "Potvrdite lozinku" msgid "Connection is down" msgstr "" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Disk" msgid "Disk I/O" msgstr "Disk I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "" @@ -433,6 +445,14 @@ msgstr "Iskorištenost diska od {extraFsName}" msgid "Docker CPU Usage" msgstr "Iskorištenost Docker Procesora" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Iskorištenost Docker Memorije" @@ -441,6 +461,14 @@ msgstr "Iskorištenost Docker Memorije" msgid "Docker Network I/O" msgstr "Docker Mrežni I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Dokumentacija" @@ -549,8 +577,15 @@ msgstr "Neuspješno slanje testne notifikacije" msgid "Failed to update alert" msgstr "Ažuriranje upozorenja nije uspjelo" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filtriraj..." @@ -727,6 +762,10 @@ msgstr "Mrežni promet javnih sučelja" msgid "Network unit" msgstr "" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Nema rezultata." @@ -991,6 +1030,10 @@ msgstr "Sistem" msgid "System load averages over time" msgstr "" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Sistemi" @@ -1203,6 +1246,10 @@ msgstr "" msgid "Visible Fields" msgstr "Vidljiva polja" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Čeka se na više podataka prije prikaza" diff --git a/internal/site/src/locales/hu/hu.po b/internal/site/src/locales/hu/hu.po index 42dcbf4a..d062cbc9 100644 --- a/internal/site/src/locales/hu/hu.po +++ b/internal/site/src/locales/hu/hu.po @@ -267,6 +267,10 @@ msgstr "Ellenőrizd a naplót a további részletekért." msgid "Check your notification service" msgstr "Ellenőrizd az értesítési szolgáltatásodat" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "" @@ -293,6 +297,10 @@ msgstr "Jelszó megerősítése" msgid "Connection is down" msgstr "" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Lemez" msgid "Disk I/O" msgstr "Lemez I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "" @@ -433,6 +445,14 @@ msgstr "Lemezhasználat a {extraFsName}" msgid "Docker CPU Usage" msgstr "Docker CPU használat" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker memória használat" @@ -441,6 +461,14 @@ msgstr "Docker memória használat" msgid "Docker Network I/O" msgstr "Docker hálózat I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Dokumentáció" @@ -549,8 +577,15 @@ msgstr "Teszt értesítés elküldése sikertelen" msgid "Failed to update alert" msgstr "Nem sikerült frissíteni a riasztást" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Szűrő..." @@ -727,6 +762,10 @@ msgstr "Nyilvános interfészek hálózati forgalma" msgid "Network unit" msgstr "" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Nincs találat." @@ -991,6 +1030,10 @@ msgstr "Rendszer" msgid "System load averages over time" msgstr "" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Rendszer" @@ -1203,6 +1246,10 @@ msgstr "" msgid "Visible Fields" msgstr "Látható mezők" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Elegendő rekordra várva a megjelenítéshez" diff --git a/internal/site/src/locales/is/is.po b/internal/site/src/locales/is/is.po index e85fdd41..2ad030d3 100644 --- a/internal/site/src/locales/is/is.po +++ b/internal/site/src/locales/is/is.po @@ -267,6 +267,10 @@ msgstr "Skoðaðu logga til að sjá meiri upplýsingar." msgid "Check your notification service" msgstr "Athugaðu tilkynningaþjónustuna þína" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "" @@ -293,6 +297,10 @@ msgstr "Staðfestu lykilorð" msgid "Connection is down" msgstr "" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Diskur" msgid "Disk I/O" msgstr "" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "" @@ -433,6 +445,14 @@ msgstr "Diska notkun af {extraFsName}" msgid "Docker CPU Usage" msgstr "Docker CPU notkun" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Minnisnotkun Docker" @@ -441,6 +461,14 @@ msgstr "Minnisnotkun Docker" msgid "Docker Network I/O" msgstr "" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Skjal" @@ -549,8 +577,15 @@ msgstr "Villa í sendingu prufu skilaboða" msgid "Failed to update alert" msgstr "Mistókst að uppfæra tilkynningu" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Sía..." @@ -727,6 +762,10 @@ msgstr "" msgid "Network unit" msgstr "" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Engar niðurstöður fundust." @@ -991,6 +1030,10 @@ msgstr "Kerfi" msgid "System load averages over time" msgstr "" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Kerfi" @@ -1203,6 +1246,10 @@ msgstr "" msgid "Visible Fields" msgstr "Sjáanlegir reitir" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Bíður eftir nægum upplýsingum til að sýna" diff --git a/internal/site/src/locales/it/it.po b/internal/site/src/locales/it/it.po index 6946088f..335f9b79 100644 --- a/internal/site/src/locales/it/it.po +++ b/internal/site/src/locales/it/it.po @@ -267,6 +267,10 @@ msgstr "Controlla i log per maggiori dettagli." msgid "Check your notification service" msgstr "Controlla il tuo servizio di notifica" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Clicca su un sistema per visualizzare più informazioni." @@ -293,6 +297,10 @@ msgstr "Conferma password" msgid "Connection is down" msgstr "La connessione è interrotta" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Disco" msgid "Disk I/O" msgstr "I/O Disco" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Unità disco" @@ -433,6 +445,14 @@ msgstr "Utilizzo del disco di {extraFsName}" msgid "Docker CPU Usage" msgstr "Utilizzo CPU Docker" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Utilizzo Memoria Docker" @@ -441,6 +461,14 @@ msgstr "Utilizzo Memoria Docker" msgid "Docker Network I/O" msgstr "I/O di Rete Docker" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Documentazione" @@ -549,8 +577,15 @@ msgstr "Invio della notifica di test fallito" msgid "Failed to update alert" msgstr "Aggiornamento dell'avviso fallito" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filtra..." @@ -727,6 +762,10 @@ msgstr "Traffico di rete delle interfacce pubbliche" msgid "Network unit" msgstr "Unità rete" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Nessun risultato trovato." @@ -991,6 +1030,10 @@ msgstr "Sistema" msgid "System load averages over time" msgstr "Medie di carico del sistema nel tempo" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Sistemi" @@ -1203,6 +1246,10 @@ msgstr "Visualizza i tuoi 200 avvisi più recenti." msgid "Visible Fields" msgstr "Colonne visibili" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "In attesa di abbastanza record da visualizzare" diff --git a/internal/site/src/locales/ja/ja.po b/internal/site/src/locales/ja/ja.po index b1fc9cf6..2effcfc7 100644 --- a/internal/site/src/locales/ja/ja.po +++ b/internal/site/src/locales/ja/ja.po @@ -267,6 +267,10 @@ msgstr "詳細についてはログを確認してください。" msgid "Check your notification service" msgstr "通知サービスを確認してください" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "システムをクリックして詳細を表示します。" @@ -293,6 +297,10 @@ msgstr "パスワードを確認" msgid "Connection is down" msgstr "接続が切断されました" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "ディスク" msgid "Disk I/O" msgstr "ディスクI/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "ディスク単位" @@ -433,6 +445,14 @@ msgstr "{extraFsName}のディスク使用率" msgid "Docker CPU Usage" msgstr "Docker CPU使用率" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Dockerメモリ使用率" @@ -441,6 +461,14 @@ msgstr "Dockerメモリ使用率" msgid "Docker Network I/O" msgstr "DockerネットワークI/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "ドキュメント" @@ -549,8 +577,15 @@ msgstr "テスト通知の送信に失敗しました" msgid "Failed to update alert" msgstr "アラートの更新に失敗しました" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "フィルター..." @@ -727,6 +762,10 @@ msgstr "パブリックインターフェースのネットワークトラフィ msgid "Network unit" msgstr "ネットワーク単位" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "結果が見つかりませんでした。" @@ -991,6 +1030,10 @@ msgstr "システム" msgid "System load averages over time" msgstr "システムの負荷平均の推移" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "システム" @@ -1203,6 +1246,10 @@ msgstr "直近200件のアラートを表示します。" msgid "Visible Fields" msgstr "表示列" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "表示するのに十分なレコードを待っています" diff --git a/internal/site/src/locales/ko/ko.po b/internal/site/src/locales/ko/ko.po index 3752a4e0..f18fb5fa 100644 --- a/internal/site/src/locales/ko/ko.po +++ b/internal/site/src/locales/ko/ko.po @@ -267,6 +267,10 @@ msgstr "자세한 내용은 로그를 확인하세요." msgid "Check your notification service" msgstr "알림 서비스를 확인하세요." +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "더 많은 정보를 보려면 시스템을 클릭하세요." @@ -293,6 +297,10 @@ msgstr "비밀번호 확인" msgid "Connection is down" msgstr "연결이 끊겼습니다" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "디스크" msgid "Disk I/O" msgstr "디스크 I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "디스크 단위" @@ -433,6 +445,14 @@ msgstr "{extraFsName}의 디스크 사용량" msgid "Docker CPU Usage" msgstr "Docker CPU 사용량" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker 메모리 사용량" @@ -441,6 +461,14 @@ msgstr "Docker 메모리 사용량" msgid "Docker Network I/O" msgstr "Docker 네트워크 I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "문서" @@ -549,8 +577,15 @@ msgstr "테스트 알림 전송 실패" msgid "Failed to update alert" msgstr "알림 수정 실패" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "필터..." @@ -727,6 +762,10 @@ msgstr "공용 인터페이스의 네트워크 트래픽" msgid "Network unit" msgstr "네트워크 단위" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "결과가 없습니다." @@ -991,6 +1030,10 @@ msgstr "시스템" msgid "System load averages over time" msgstr "시간에 따른 시스템 부하 평균" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "시스템" @@ -1203,6 +1246,10 @@ msgstr "최근 200개의 알림을 봅니다." msgid "Visible Fields" msgstr "표시할 열" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "표시할 충분한 기록을 기다리는 중" diff --git a/internal/site/src/locales/nl/nl.po b/internal/site/src/locales/nl/nl.po index 3ab3c072..4c0338da 100644 --- a/internal/site/src/locales/nl/nl.po +++ b/internal/site/src/locales/nl/nl.po @@ -267,6 +267,10 @@ msgstr "Controleer de logs voor meer details." msgid "Check your notification service" msgstr "Controleer je meldingsservice" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Klik op een systeem om meer informatie te bekijken." @@ -293,6 +297,10 @@ msgstr "Bevestig wachtwoord" msgid "Connection is down" msgstr "Verbinding is niet actief" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Schijf" msgid "Disk I/O" msgstr "Schijf I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Schijf eenheid" @@ -433,6 +445,14 @@ msgstr "Schijfgebruik van {extraFsName}" msgid "Docker CPU Usage" msgstr "Docker CPU-gebruik" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker geheugengebruik" @@ -441,6 +461,14 @@ msgstr "Docker geheugengebruik" msgid "Docker Network I/O" msgstr "Docker netwerk I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Documentatie" @@ -549,8 +577,15 @@ msgstr "Versturen test notificatie mislukt" msgid "Failed to update alert" msgstr "Bijwerken waarschuwing mislukt" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filter..." @@ -727,6 +762,10 @@ msgstr "Netwerkverkeer van publieke interfaces" msgid "Network unit" msgstr "Netwerk eenheid" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Geen resultaten gevonden." @@ -991,6 +1030,10 @@ msgstr "Systeem" msgid "System load averages over time" msgstr "Gemiddelde systeembelasting na verloop van tijd" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Systemen" @@ -1203,6 +1246,10 @@ msgstr "Bekijk je 200 meest recente meldingen." msgid "Visible Fields" msgstr "Zichtbare kolommen" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Wachtend op genoeg records om weer te geven" diff --git a/internal/site/src/locales/no/no.po b/internal/site/src/locales/no/no.po index 28d56edd..4a0607e5 100644 --- a/internal/site/src/locales/no/no.po +++ b/internal/site/src/locales/no/no.po @@ -267,6 +267,10 @@ msgstr "Sjekk loggene for flere detaljer." msgid "Check your notification service" msgstr "Sjekk din meldingstjeneste" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "" @@ -293,6 +297,10 @@ msgstr "Bekreft passord" msgid "Connection is down" msgstr "" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Disk" msgid "Disk I/O" msgstr "Disk I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "" @@ -433,6 +445,14 @@ msgstr "Diskbruk av {extraFsName}" msgid "Docker CPU Usage" msgstr "Docker CPU-bruk" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker Minnebruk" @@ -441,6 +461,14 @@ msgstr "Docker Minnebruk" msgid "Docker Network I/O" msgstr "Docker Nettverks-I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Dokumentasjon" @@ -549,8 +577,15 @@ msgstr "Kunne ikke sende test-varsling" msgid "Failed to update alert" msgstr "Kunne ikke oppdatere alarm" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filter..." @@ -727,6 +762,10 @@ msgstr "Nettverkstrafikk av eksterne nettverksgrensesnitt" msgid "Network unit" msgstr "" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Ingen resultater funnet." @@ -991,6 +1030,10 @@ msgstr "System" msgid "System load averages over time" msgstr "Systembelastning gjennomsnitt over tid" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Systemer" @@ -1203,6 +1246,10 @@ msgstr "Vis de 200 siste varslene." msgid "Visible Fields" msgstr "Synlige Felter" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Venter på nok registreringer til å vise" diff --git a/internal/site/src/locales/pl/pl.po b/internal/site/src/locales/pl/pl.po index f3b3aa4b..0f07bb83 100644 --- a/internal/site/src/locales/pl/pl.po +++ b/internal/site/src/locales/pl/pl.po @@ -267,6 +267,10 @@ msgstr "Sprawdź logi, aby uzyskać więcej informacji." msgid "Check your notification service" msgstr "Sprawdź swój serwis powiadomień" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Kliknij na system, aby zobaczyć więcej informacji." @@ -293,6 +297,10 @@ msgstr "Potwierdź hasło" msgid "Connection is down" msgstr "Brak połączenia" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Dysk" msgid "Disk I/O" msgstr "Dysk I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Jednostka dysku" @@ -433,6 +445,14 @@ msgstr "Wykorzystanie dysku {extraFsName}" msgid "Docker CPU Usage" msgstr "Wykorzystanie procesora przez Docker" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Wykorzystanie pamięci przez Docker" @@ -441,6 +461,14 @@ msgstr "Wykorzystanie pamięci przez Docker" msgid "Docker Network I/O" msgstr "Sieć Docker I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Dokumentacja" @@ -549,8 +577,15 @@ msgstr "Nie udało się wysłać testowego powiadomienia" msgid "Failed to update alert" msgstr "Nie udało się zaktualizować powiadomienia" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filtruj..." @@ -727,6 +762,10 @@ msgstr "Ruch sieciowy interfejsów publicznych" msgid "Network unit" msgstr "Jednostka sieciowa" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Brak wyników." @@ -991,6 +1030,10 @@ msgstr "System" msgid "System load averages over time" msgstr "Średnie obciążenie systemu w czasie" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Systemy" @@ -1203,6 +1246,10 @@ msgstr "Wyświetl 200 ostatnich alertów." msgid "Visible Fields" msgstr "Widoczne kolumny" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Oczekiwanie na wystarczającą liczbę rekordów do wyświetlenia" diff --git a/internal/site/src/locales/pt/pt.po b/internal/site/src/locales/pt/pt.po index 55381771..aea7c994 100644 --- a/internal/site/src/locales/pt/pt.po +++ b/internal/site/src/locales/pt/pt.po @@ -267,6 +267,10 @@ msgstr "Verifique os logs para mais detalhes." msgid "Check your notification service" msgstr "Verifique seu serviço de notificação" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Clique em um sistema para ver mais informações." @@ -293,6 +297,10 @@ msgstr "Confirmar senha" msgid "Connection is down" msgstr "A conexão está inativa" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Disco" msgid "Disk I/O" msgstr "E/S de Disco" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Unidade de disco" @@ -433,6 +445,14 @@ msgstr "Uso de disco de {extraFsName}" msgid "Docker CPU Usage" msgstr "Uso de CPU do Docker" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Uso de Memória do Docker" @@ -441,6 +461,14 @@ msgstr "Uso de Memória do Docker" msgid "Docker Network I/O" msgstr "E/S de Rede do Docker" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Documentação" @@ -549,8 +577,15 @@ msgstr "Falha ao enviar notificação de teste" msgid "Failed to update alert" msgstr "Falha ao atualizar alerta" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filtrar..." @@ -727,6 +762,10 @@ msgstr "Tráfego de rede das interfaces públicas" msgid "Network unit" msgstr "Unidade de rede" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Nenhum resultado encontrado." @@ -991,6 +1030,10 @@ msgstr "Sistema" msgid "System load averages over time" msgstr "Médias de carga do sistema ao longo do tempo" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Sistemas" @@ -1203,6 +1246,10 @@ msgstr "Veja os seus 200 alertas mais recentes." msgid "Visible Fields" msgstr "Campos Visíveis" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Aguardando registros suficientes para exibir" diff --git a/internal/site/src/locales/ru/ru.po b/internal/site/src/locales/ru/ru.po index 9785571b..a9fb78ae 100644 --- a/internal/site/src/locales/ru/ru.po +++ b/internal/site/src/locales/ru/ru.po @@ -267,6 +267,10 @@ msgstr "Проверьте журналы для получения более msgid "Check your notification service" msgstr "Проверьте ваш сервис уведомлений" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Нажмите на систему для просмотра дополнительной информации." @@ -293,6 +297,10 @@ msgstr "Подтвердите пароль" msgid "Connection is down" msgstr "Нет соединения" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Диск" msgid "Disk I/O" msgstr "Дисковый ввод/вывод" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Единицы измерения температуры" @@ -433,6 +445,14 @@ msgstr "Использование диска {extraFsName}" msgid "Docker CPU Usage" msgstr "Использование CPU Docker" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Использование памяти Docker" @@ -441,6 +461,14 @@ msgstr "Использование памяти Docker" msgid "Docker Network I/O" msgstr "Сетевой ввод/вывод Docker" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Документация" @@ -549,8 +577,15 @@ msgstr "Не удалось отправить тестовое уведомле msgid "Failed to update alert" msgstr "Не удалось обновить оповещение" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Фильтр..." @@ -727,6 +762,10 @@ msgstr "Сетевой трафик публичных интерфейсов" msgid "Network unit" msgstr "Единицы измерения скорости сети" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Результаты не найдены." @@ -991,6 +1030,10 @@ msgstr "Система" msgid "System load averages over time" msgstr "Средняя загрузка системы за время" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Системы" @@ -1203,6 +1246,10 @@ msgstr "Просмотреть 200 последних оповещений." msgid "Visible Fields" msgstr "Видимые столбцы" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Ожидание достаточного количества записей для отображения" diff --git a/internal/site/src/locales/sl/sl.po b/internal/site/src/locales/sl/sl.po index bcfccaa2..1ec1dc6c 100644 --- a/internal/site/src/locales/sl/sl.po +++ b/internal/site/src/locales/sl/sl.po @@ -267,6 +267,10 @@ msgstr "Za več podrobnosti preverite dnevnike." msgid "Check your notification service" msgstr "Preverite storitev obveščanja" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "" @@ -293,6 +297,10 @@ msgstr "Potrdite geslo" msgid "Connection is down" msgstr "" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Disk" msgid "Disk I/O" msgstr "Disk I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "" @@ -433,6 +445,14 @@ msgstr "Poraba diska za {extraFsName}" msgid "Docker CPU Usage" msgstr "Docker CPU poraba" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker poraba spomina" @@ -441,6 +461,14 @@ msgstr "Docker poraba spomina" msgid "Docker Network I/O" msgstr "Docker I/O mreže" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Dokumentacija" @@ -549,8 +577,15 @@ msgstr "Pošiljanje testnega obvestila ni uspelo" msgid "Failed to update alert" msgstr "Opozorila ni bilo mogoče posodobiti" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filter..." @@ -727,6 +762,10 @@ msgstr "Omrežni promet javnih vmesnikov" msgid "Network unit" msgstr "" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Ni rezultatov." @@ -991,6 +1030,10 @@ msgstr "Sistemsko" msgid "System load averages over time" msgstr "" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Sistemi" @@ -1203,6 +1246,10 @@ msgstr "" msgid "Visible Fields" msgstr "Vidna polja" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Čakam na dovolj zapisov za prikaz" diff --git a/internal/site/src/locales/sv/sv.po b/internal/site/src/locales/sv/sv.po index bf9c78e7..a70457c2 100644 --- a/internal/site/src/locales/sv/sv.po +++ b/internal/site/src/locales/sv/sv.po @@ -267,6 +267,10 @@ msgstr "Kontrollera loggarna för mer information." msgid "Check your notification service" msgstr "Kontrollera din aviseringstjänst" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "" @@ -293,6 +297,10 @@ msgstr "Bekräfta lösenord" msgid "Connection is down" msgstr "Ej ansluten" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Disk" msgid "Disk I/O" msgstr "Disk I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "" @@ -433,6 +445,14 @@ msgstr "Diskanvändning av {extraFsName}" msgid "Docker CPU Usage" msgstr "Docker CPU-användning" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker Minnesanvändning" @@ -441,6 +461,14 @@ msgstr "Docker Minnesanvändning" msgid "Docker Network I/O" msgstr "Docker Nätverks-I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Dokumentation" @@ -549,8 +577,15 @@ msgstr "Kunde inte skicka testavisering" msgid "Failed to update alert" msgstr "Kunde inte uppdatera larm" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filtrera..." @@ -727,6 +762,10 @@ msgstr "Nätverkstrafik för publika gränssnitt" msgid "Network unit" msgstr "" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Inga resultat hittades." @@ -991,6 +1030,10 @@ msgstr "System" msgid "System load averages over time" msgstr "" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "System" @@ -1203,6 +1246,10 @@ msgstr "" msgid "Visible Fields" msgstr "Synliga fält" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Väntar på tillräckligt med poster att visa" diff --git a/internal/site/src/locales/tr/tr.po b/internal/site/src/locales/tr/tr.po index c3707f9c..64ba7a3f 100644 --- a/internal/site/src/locales/tr/tr.po +++ b/internal/site/src/locales/tr/tr.po @@ -267,6 +267,10 @@ msgstr "Daha fazla ayrıntı için günlükleri kontrol edin." msgid "Check your notification service" msgstr "Bildirim hizmetinizi kontrol edin" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Daha fazla bilgi görmek için bir sisteme tıklayın." @@ -293,6 +297,10 @@ msgstr "Şifreyi onayla" msgid "Connection is down" msgstr "Bağlantı kesildi" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Disk" msgid "Disk I/O" msgstr "Disk G/Ç" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Disk birimi" @@ -433,6 +445,14 @@ msgstr "{extraFsName} disk kullanımı" msgid "Docker CPU Usage" msgstr "Docker CPU Kullanımı" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker Bellek Kullanımı" @@ -441,6 +461,14 @@ msgstr "Docker Bellek Kullanımı" msgid "Docker Network I/O" msgstr "Docker Ağ G/Ç" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Dokümantasyon" @@ -549,8 +577,15 @@ msgstr "Test bildirimi gönderilemedi" msgid "Failed to update alert" msgstr "Uyarı güncellenemedi" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Filtrele..." @@ -727,6 +762,10 @@ msgstr "Genel arayüzlerin ağ trafiği" msgid "Network unit" msgstr "Ağ birimi" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Sonuç bulunamadı." @@ -991,6 +1030,10 @@ msgstr "Sistem" msgid "System load averages over time" msgstr "Zaman içindeki sistem yükü ortalamaları" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Sistemler" @@ -1203,6 +1246,10 @@ msgstr "En son 200 uyarınızı görüntüleyin." msgid "Visible Fields" msgstr "Görünür Alanlar" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Görüntülemek için yeterli kayıt bekleniyor" diff --git a/internal/site/src/locales/uk/uk.po b/internal/site/src/locales/uk/uk.po index 6431128d..0127bda7 100644 --- a/internal/site/src/locales/uk/uk.po +++ b/internal/site/src/locales/uk/uk.po @@ -267,6 +267,10 @@ msgstr "Перевірте журнали для отримання додатк msgid "Check your notification service" msgstr "Перевірте свій сервіс сповіщень" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Натисніть на систему, щоб переглянути більше інформації." @@ -293,6 +297,10 @@ msgstr "Підтвердьте пароль" msgid "Connection is down" msgstr "З'єднання розірвано" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Диск" msgid "Disk I/O" msgstr "Дисковий ввід/вивід" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Одиниця виміру диска" @@ -433,6 +445,14 @@ msgstr "Використання диска {extraFsName}" msgid "Docker CPU Usage" msgstr "Використання ЦП Docker" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Використання пам'яті Docker" @@ -441,6 +461,14 @@ msgstr "Використання пам'яті Docker" msgid "Docker Network I/O" msgstr "Мережевий ввід/вивід Docker" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Документація" @@ -549,8 +577,15 @@ msgstr "Не вдалося надіслати тестове сповіщенн msgid "Failed to update alert" msgstr "Не вдалося оновити сповіщення" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Фільтр..." @@ -727,6 +762,10 @@ msgstr "Мережевий трафік публічних інтерфейсі msgid "Network unit" msgstr "Одиниця виміру мережі" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Результатів не знайдено." @@ -991,6 +1030,10 @@ msgstr "Система" msgid "System load averages over time" msgstr "Середнє навантаження системи з часом" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Системи" @@ -1203,6 +1246,10 @@ msgstr "Переглянути 200 останніх сповіщень." msgid "Visible Fields" msgstr "Видимі стовпці" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Очікування достатньої кількості записів для відображення" diff --git a/internal/site/src/locales/vi/vi.po b/internal/site/src/locales/vi/vi.po index 78e8efac..85fd164b 100644 --- a/internal/site/src/locales/vi/vi.po +++ b/internal/site/src/locales/vi/vi.po @@ -267,6 +267,10 @@ msgstr "Kiểm tra nhật ký để biết thêm chi tiết." msgid "Check your notification service" msgstr "Kiểm tra dịch vụ thông báo của bạn" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "Nhấp vào hệ thống để xem thêm thông tin." @@ -293,6 +297,10 @@ msgstr "Xác nhận mật khẩu" msgid "Connection is down" msgstr "Mất kết nối" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "Đĩa" msgid "Disk I/O" msgstr "Đĩa I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "Đơn vị đĩa" @@ -433,6 +445,14 @@ msgstr "Sử dụng đĩa của {extraFsName}" msgid "Docker CPU Usage" msgstr "Sử dụng CPU Docker" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Sử dụng Bộ nhớ Docker" @@ -441,6 +461,14 @@ msgstr "Sử dụng Bộ nhớ Docker" msgid "Docker Network I/O" msgstr "Mạng I/O Docker" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "Tài liệu" @@ -549,8 +577,15 @@ msgstr "Gửi thông báo thử nghiệm thất bại" msgid "Failed to update alert" msgstr "Cập nhật cảnh báo thất bại" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "Lọc..." @@ -727,6 +762,10 @@ msgstr "Lưu lượng mạng của các giao diện công cộng" msgid "Network unit" msgstr "Đơn vị mạng" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "Không tìm thấy kết quả." @@ -991,6 +1030,10 @@ msgstr "Hệ thống" msgid "System load averages over time" msgstr "Tải trung bình của hệ thống theo thời gian" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "Các hệ thống" @@ -1203,6 +1246,10 @@ msgstr "Xem 200 cảnh báo gần đây nhất của bạn." msgid "Visible Fields" msgstr "Các cột hiển thị" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "Đang chờ đủ bản ghi để hiển thị" diff --git a/internal/site/src/locales/zh-CN/zh-CN.po b/internal/site/src/locales/zh-CN/zh-CN.po index 48053541..b81e33c9 100644 --- a/internal/site/src/locales/zh-CN/zh-CN.po +++ b/internal/site/src/locales/zh-CN/zh-CN.po @@ -267,6 +267,10 @@ msgstr "检查日志以获取更多详细信息。" msgid "Check your notification service" msgstr "检查您的通知服务" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "点击系统查看更多信息。" @@ -293,6 +297,10 @@ msgstr "确认密码" msgid "Connection is down" msgstr "连接已断开" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "磁盘" msgid "Disk I/O" msgstr "磁盘 I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "磁盘单位" @@ -433,6 +445,14 @@ msgstr "{extraFsName}的磁盘使用" msgid "Docker CPU Usage" msgstr "Docker CPU 使用" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker 内存使用" @@ -441,6 +461,14 @@ msgstr "Docker 内存使用" msgid "Docker Network I/O" msgstr "Docker 网络 I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "文档" @@ -549,8 +577,15 @@ msgstr "发送测试通知失败" msgid "Failed to update alert" msgstr "更新警报失败" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "过滤..." @@ -727,6 +762,10 @@ msgstr "公共接口的网络流量" msgid "Network unit" msgstr "网络单位" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "未找到结果。" @@ -991,6 +1030,10 @@ msgstr "系统" msgid "System load averages over time" msgstr "系统负载平均值随时间变化" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "系统" @@ -1203,6 +1246,10 @@ msgstr "查看您最近的200个警报。" msgid "Visible Fields" msgstr "可见列" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "正在收集足够的数据来显示" diff --git a/internal/site/src/locales/zh-HK/zh-HK.po b/internal/site/src/locales/zh-HK/zh-HK.po index a6494fd4..0bc4b457 100644 --- a/internal/site/src/locales/zh-HK/zh-HK.po +++ b/internal/site/src/locales/zh-HK/zh-HK.po @@ -267,6 +267,10 @@ msgstr "檢查日誌以取得更多資訊。" msgid "Check your notification service" msgstr "檢查您的通知服務" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "點擊系統以查看更多資訊。" @@ -293,6 +297,10 @@ msgstr "確認密碼" msgid "Connection is down" msgstr "連線中斷" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "磁碟" msgid "Disk I/O" msgstr "磁碟 I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "磁碟單位" @@ -433,6 +445,14 @@ msgstr "{extraFsName} 的磁碟使用量" msgid "Docker CPU Usage" msgstr "Docker CPU 使用率" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker 記憶體使用率" @@ -441,6 +461,14 @@ msgstr "Docker 記憶體使用率" msgid "Docker Network I/O" msgstr "Docker 網絡 I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "文件" @@ -549,8 +577,15 @@ msgstr "發送測試通知失敗" msgid "Failed to update alert" msgstr "更新警報失敗" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "篩選..." @@ -727,6 +762,10 @@ msgstr "公共接口的網絡流量" msgid "Network unit" msgstr "網路單位" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "未找到結果。" @@ -991,6 +1030,10 @@ msgstr "系統" msgid "System load averages over time" msgstr "系統平均負載隨時間變化" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "系統" @@ -1203,6 +1246,10 @@ msgstr "檢視最近 200 則警報。" msgid "Visible Fields" msgstr "可見欄位" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "等待足夠的記錄以顯示" diff --git a/internal/site/src/locales/zh/zh.po b/internal/site/src/locales/zh/zh.po index 354a2071..e43e07c5 100644 --- a/internal/site/src/locales/zh/zh.po +++ b/internal/site/src/locales/zh/zh.po @@ -267,6 +267,10 @@ msgstr "檢查系統記錄以取得更多資訊。" msgid "Check your notification service" msgstr "檢查您的通知服務" +#: src/components/routes/system.tsx +msgid "Clear all" +msgstr "" + #: src/components/systems-table/systems-table.tsx msgid "Click on a system to view more information." msgstr "點擊系統以查看更多資訊。" @@ -293,6 +297,10 @@ msgstr "確認密碼" msgid "Connection is down" msgstr "連線中斷" +#: src/components/routes/system.tsx +msgid "Container health status and uptime" +msgstr "" + #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table-columns.tsx msgid "Continue" @@ -415,6 +423,10 @@ msgstr "磁碟" msgid "Disk I/O" msgstr "磁碟 I/O" +#: src/components/routes/system.tsx +msgid "Disk read/write rates of docker containers" +msgstr "" + #: src/components/routes/settings/general.tsx msgid "Disk unit" msgstr "磁碟單位" @@ -433,6 +445,14 @@ msgstr "{extraFsName}的磁碟使用量" msgid "Docker CPU Usage" msgstr "Docker CPU 使用率" +#: src/components/routes/system.tsx +msgid "Docker Disk I/O" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Health & Uptime" +msgstr "" + #: src/components/routes/system.tsx msgid "Docker Memory Usage" msgstr "Docker 記憶體使用率" @@ -441,6 +461,14 @@ msgstr "Docker 記憶體使用率" msgid "Docker Network I/O" msgstr "Docker 網路 I/O" +#: src/components/routes/system.tsx +msgid "Docker Stats" +msgstr "" + +#: src/components/routes/system.tsx +msgid "Docker Volumes" +msgstr "" + #: src/components/command-palette.tsx msgid "Documentation" msgstr "文件" @@ -549,8 +577,15 @@ msgstr "發送測試通知失敗" msgid "Failed to update alert" msgstr "更新警報失敗" -#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/system.tsx +msgid "Filter containers..." +msgstr "" + +#: src/components/routes/system.tsx +msgid "Filter stacks..." +msgstr "" + +#: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/systems-table/systems-table.tsx msgid "Filter..." msgstr "篩選..." @@ -727,6 +762,10 @@ msgstr "公開介面的網路流量" msgid "Network unit" msgstr "網路單位" +#: src/components/routes/system.tsx +msgid "No items available" +msgstr "" + #: src/components/command-palette.tsx msgid "No results found." msgstr "找不到結果。" @@ -991,6 +1030,10 @@ msgstr "系統" msgid "System load averages over time" msgstr "系統平均負載隨時間變化" +#: src/components/routes/system.tsx +msgid "System Stats" +msgstr "" + #: src/components/navbar.tsx msgid "Systems" msgstr "系統" @@ -1203,6 +1246,10 @@ msgstr "檢視最近 200 則警報。" msgid "Visible Fields" msgstr "顯示欄位" +#: src/components/routes/system.tsx +msgid "Volume usage of docker containers" +msgstr "" + #: src/components/routes/system.tsx msgid "Waiting for enough records to display" msgstr "等待足夠的記錄以顯示" diff --git a/internal/site/src/types.d.ts b/internal/site/src/types.d.ts index 66527407..9664c6ba 100644 --- a/internal/site/src/types.d.ts +++ b/internal/site/src/types.d.ts @@ -168,6 +168,13 @@ export interface GPUData { e?: Record } +export interface VolumeData { + /** name */ + n: string + /** size (mb) */ + s: number +} + export interface ExtraFsStats { /** disk size (gb) */ d: number @@ -208,6 +215,18 @@ interface ContainerStats { ns: number // network received (mb) nr: number + // volumes (volume name to size in MB) + v?: Record + // health status + h?: string + // status (running, stopped, etc.) + s?: string + // uptime in seconds + u?: number + // project name + p?: string + // container short id + idShort?: string } export interface SystemStatsRecord extends RecordModel {