滴滴夜莺nightingale v2版本 监控端口存活上报数据一直为0修复

    1. 小弟最近使用夜莺监控系统v2版本时候,有一台服务器9200端口报警,上报数据为0,可是小弟我上服务器一看,发现已经监听了,并且telnet和python socket均可以链接,这就纳闷了,这是为何呢?最后通过给官方提交issue,官方已经在v3版本修复了这个问题了,可是还在用v2版本的朋友们由于缺乏一些模块,不太实用,因此就想着本身去修改一下源码

       

       

       

       

    2. 查看collector源码,发现端口监控部分的代码标红部分须要修改

      func PortCollect(p *model.PortCollect) {
      value := 0
      if isListening(p.Port) {
      value = 1
      }python

      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

      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()socket

      return false
      }tcp

      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
      }ide

    3. 用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 = 1
      } else if isListen(p.Port, 1, local_ip) {
      value = 1
      } else if isListen(p.Port, 1, "::1") {
      value = 1
      }oop

      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})
      }ui

    4. 去linux服务器编译一下./control build collector, 发现好使了

       

       在此仍是要感谢滴滴的大佬们的解惑!spa

相关文章
相关标签/搜索