func (ps *PinbaSender) Send(req *pinba.Request) error { cli := ps.GetClient() if cli == nil { return nil } req.Hostname = ps.ServiceName req.ServerName = ps.InstanceName err := cli.SendRequest(req) ps.clientPool.Put(cli) // this might be a frequent operation, save on defer return err }
func (server *Server) sendToPinba(req *pinba.Request, script_name string, duration time.Duration) { if server.pinbaSender == nil { return } req.ScriptName = script_name req.RequestCount = 1 req.RequestTime = duration err := server.pinbaSender.Send(req) if err != nil { // this is pretty unlikely, therefore don't care about performance inside this 'if' shouldLog := func() bool { opErr, ok := err.(*net.OpError) if !ok { return true } syscallErr, ok := opErr.Err.(*os.SyscallError) if !ok { return true } errno, ok := syscallErr.Err.(syscall.Errno) if !ok { return true } if errno == syscall.ECONNREFUSED { // NOTE(antoxa): see CT-2394 // just ignore connection refused errors, those happen when pinba is unavailable, but configured (since we use UDP) // we kinda lose on error reporting that nothing is logged to pinba, but in practice the message is just annoying return false } return true }() if shouldLog { log.Warnf("sendToPinba() failed: %v", err) } } }