- 小弟最近使用夜鶯監控系統v2版本時候,有一臺服務器9200埠報警,上報資料為0,但是小弟我上服務器一看,發現已經監聽了,而且telnet和python socket都可以連接,這就納悶了,這是為什么呢?最后經過給官方提交issue,官方已經在v3版本修復了這個問題了,但是還在用v2版本的朋友們因為缺少一些模塊,不太實用,所以就想著自己去修改一下原始碼

- 查看collector原始碼,發現埠監控部分的代碼標紅部分需要修改
func PortCollect(p *model.PortCollect) {
value := 0
if isListening(p.Port) {
value = https://www.cnblogs.com/opsdemo/p/1
}item := core.GaugeValue("proc.port.listen", value, p.Tags)
item.Step = int64(p.Step)
item.Timestamp = time.Now().Unix()
item.Endpoint = identity.Identity
core.Push([]*dataobj.MetricValue{item})
}func isListening(port int) bool {
tcpAddress, err := net.ResolveTCPAddr("tcp4", fmt.Sprintf(":%v", port))
if err != nil {
logger.Errorf("net.ResolveTCPAddr(tcp4, :%v) fail: %v", port, err)
return false
}listener, err := net.ListenTCP("tcp", tcpAddress)
if err != nil {
logger.Debugf("cannot listen :%v(%v), so we think :%v is already listening", port, err, port)
return true
}
listener.Close()return false
}func isListen(port, timeout int, ip string) bool {
var conn net.Conn
var err error
addr := fmt.Sprintf("%s:%d", ip, port)
if timeout <= 0 {
// default timeout 3 second
timeout = 3
}
conn, err = net.DialTimeout("tcp", addr, time.Duration(timeout)*time.Second)
if err != nil {
return false
}
conn.Close()
return true
} -
用isListen函式去檢測埠存活
func GetLocalIp() (result string) {
addrs, err := net.InterfaceAddrs()
result="127.0.0.1"
if err != nil{
fmt.Println(err)
return result
}
for _, value := range addrs{
if ipnet, ok := value.(*net.IPNet); ok && !ipnet.IP.IsLoopback(){
if ipnet.IP.To4() != nil{
result=ipnet.IP.String()
return result
}
}
}
return result
}
func PortCollect(p *model.PortCollect) {
value := 0
local_ip := GetLocalIp()
if isListen(p.Port, 1, "127.0.0.1") {
value = https://www.cnblogs.com/opsdemo/p/1
} else if isListen(p.Port, 1, local_ip) {
value = https://www.cnblogs.com/opsdemo/p/1
} else if isListen(p.Port, 1, "::1") {
value = https://www.cnblogs.com/opsdemo/p/1
}item := core.GaugeValue("proc.port.listen", value, p.Tags)
item.Step = int64(p.Step)
item.Timestamp = time.Now().Unix()
item.Endpoint = identity.Identity
core.Push([]*dataobj.MetricValue{item})
} - 去linux服務器編譯一下./control build collector, 發現好使了
在此還是要感謝滴滴的大佬們的解惑!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/242242.html
標籤:其他
上一篇:2020 — 危難與機遇
下一篇:秋招面經總結(Java后端開發)
