diff --git a/agent/probe.go b/agent/probe.go index 6ebfc57d..f6165444 100644 --- a/agent/probe.go +++ b/agent/probe.go @@ -8,8 +8,9 @@ import ( "sync" "time" - "github.com/henrygd/beszel/internal/entities/probe" "log/slog" + + "github.com/henrygd/beszel/internal/entities/probe" ) // ProbeManager manages network probe tasks. @@ -33,7 +34,7 @@ type probeSample struct { func newProbeManager() *ProbeManager { return &ProbeManager{ - probes: make(map[string]*probeTask), + probes: make(map[string]*probeTask), httpClient: &http.Client{Timeout: 10 * time.Second}, } } @@ -145,8 +146,7 @@ func (pm *ProbeManager) runProbe(task *probeTask) { if interval < time.Second { interval = 10 * time.Second } - ticker := time.NewTicker(interval) - defer ticker.Stop() + ticker := time.Tick(interval) // Run immediately on start pm.executeProbe(task) @@ -155,7 +155,7 @@ func (pm *ProbeManager) runProbe(task *probeTask) { select { case <-task.cancel: return - case <-ticker.C: + case <-ticker: pm.executeProbe(task) } } @@ -185,8 +185,8 @@ func (pm *ProbeManager) executeProbe(task *probeTask) { // Trim old samples beyond 120s to bound memory cutoff := time.Now().Add(-120 * time.Second) start := 0 - for i, s := range task.samples { - if s.timestamp.After(cutoff) { + for i := range task.samples { + if task.samples[i].timestamp.After(cutoff) { start = i break } @@ -195,7 +195,8 @@ func (pm *ProbeManager) executeProbe(task *probeTask) { } } if start > 0 { - task.samples = task.samples[start:] + size := copy(task.samples, task.samples[start:]) + task.samples = task.samples[:size] } task.samples = append(task.samples, sample) task.mu.Unlock() diff --git a/agent/probe_ping.go b/agent/probe_ping.go index ad73a4bc..06a620b8 100644 --- a/agent/probe_ping.go +++ b/agent/probe_ping.go @@ -24,10 +24,10 @@ var pingTimeRegex = regexp.MustCompile(`time[=<]([\d.]+)\s*ms`) type icmpMethod int const ( - icmpUntried icmpMethod = iota // haven't tried yet - icmpRaw // privileged raw socket (ip4:icmp) - icmpDatagram // unprivileged datagram socket (udp4) - icmpExecFallback // shell out to system ping command + icmpUntried icmpMethod = iota // haven't tried yet + icmpRaw // privileged raw socket (ip4:icmp) + icmpDatagram // unprivileged datagram socket (udp4) + icmpExecFallback // shell out to system ping command ) var ( diff --git a/internal/site/src/components/routes/system/probe-dialog.tsx b/internal/site/src/components/routes/system/probe-dialog.tsx index 8c8915ee..c944875b 100644 --- a/internal/site/src/components/routes/system/probe-dialog.tsx +++ b/internal/site/src/components/routes/system/probe-dialog.tsx @@ -17,13 +17,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@ import { PlusIcon } from "lucide-react" import { useToast } from "@/components/ui/use-toast" -export function AddProbeDialog({ - systemId, - onCreated, -}: { - systemId: string - onCreated: () => void -}) { +export function AddProbeDialog({ systemId, onCreated }: { systemId: string; onCreated: () => void }) { const [open, setOpen] = useState(false) const [protocol, setProtocol] = useState("icmp") const [target, setTarget] = useState("") @@ -60,8 +54,8 @@ export function AddProbeDialog({ resetForm() setOpen(false) onCreated() - } catch (err: any) { - toast({ variant: "destructive", title: t`Error`, description: err?.message }) + } catch (err: unknown) { + toast({ variant: "destructive", title: t`Error`, description: (err as Error)?.message }) } finally { setLoading(false) } @@ -85,6 +79,17 @@ export function AddProbeDialog({
+
+ + setTarget(e.target.value)} + placeholder={protocol === "http" ? "https://example.com" : "1.1.1.1"} + required + /> +
-
- - setTarget(e.target.value)} - placeholder={protocol === "http" ? "https://example.com" : "1.1.1.1"} - required - /> -
{protocol === "tcp" && (