pro-bing 在 Windows 上必须 SetPrivileged(true) 走原始套接字,普通账号 没有权限会直接失败。按平台拆分实现:unix 继续走 pro-bing,windows 调 系统 ping 并以 TTL= 作为跨语言锚点解析输出;同时校验 target 防止被 ping.exe 当作 flag 解析。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
38 lines
826 B
Go
38 lines
826 B
Go
//go:build !windows
|
||
|
||
package collector
|
||
|
||
import (
|
||
"time"
|
||
|
||
probing "github.com/prometheus-community/pro-bing"
|
||
)
|
||
|
||
func pingHost(target string, count, timeoutSec int) (*pingStats, error) {
|
||
pinger, err := probing.NewPinger(target)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
pinger.Count = count
|
||
pinger.Timeout = time.Duration(timeoutSec) * time.Second
|
||
pinger.Interval = 100 * time.Millisecond
|
||
pinger.SetPrivileged(false)
|
||
|
||
if err := pinger.Run(); err != nil {
|
||
// 非特权 UDP ICMP 不可用时回退到 raw socket(需要 root / CAP_NET_RAW)
|
||
pinger.SetPrivileged(true)
|
||
if err := pinger.Run(); err != nil {
|
||
return nil, err
|
||
}
|
||
}
|
||
|
||
s := pinger.Statistics()
|
||
return &pingStats{
|
||
PacketsSent: s.PacketsSent,
|
||
PacketsRecv: s.PacketsRecv,
|
||
AvgRttMs: s.AvgRtt.Milliseconds(),
|
||
PacketLoss: s.PacketLoss,
|
||
}, nil
|
||
}
|