From 0b1c5a07d0cd926b3abb6a87bb9bea2a509b3789 Mon Sep 17 00:00:00 2001 From: komkom Date: Wed, 11 Jan 2017 11:50:26 +0100 Subject: [PATCH 1/2] error handling added --- zabbix.go | 81 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 28 deletions(-) diff --git a/zabbix.go b/zabbix.go index 962e3e0..052d103 100644 --- a/zabbix.go +++ b/zabbix.go @@ -7,7 +7,6 @@ import ( "fmt" "io/ioutil" "net" - "os" "time" ) @@ -72,50 +71,75 @@ func (s *Sender) getHeader() []byte { } // Method Sender class, resolve uri by name:port. -func (s *Sender) getTCPAddr() *net.TCPAddr { +func (s *Sender) getTCPAddr() (iaddr *net.TCPAddr, err error) { // format: hostname:port addr := fmt.Sprintf("%s:%d", s.Host, s.Port) // Resolve hostname:port to ip:port - iaddr, err := net.ResolveTCPAddr("tcp", addr) - + iaddr, err = net.ResolveTCPAddr("tcp", addr) if err != nil { - fmt.Printf("Connection failed: %s", err.Error()) - os.Exit(1) + err = fmt.Errorf("Connection failed: %s", err.Error()) + return } - return iaddr + return } // Method Sender class, make connection to uri. -func (s *Sender) connect() *net.TCPConn { - // Open connection to zabbix host - iaddr := s.getTCPAddr() - conn, err := net.DialTCP("tcp", nil, iaddr) +func (s *Sender) connect() (conn *net.TCPConn, err error) { - if err != nil { - fmt.Printf("Connection failed: %s", err.Error()) - os.Exit(1) + type DialResp struct { + Conn *net.TCPConn + Error error } - return conn + // Open connection to zabbix host + iaddr, err := s.getTCPAddr() + if err != nil { + return + } + + // dial tcp and handle timeouts + ch := make(chan DialResp) + + go func() { + conn, err = net.DialTCP("tcp", nil, iaddr) + ch <- DialResp{Conn: conn, Error: err} + }() + + select { + case <-time.After(5 * time.Second): + err = fmt.Errorf("Connection Timeout") + case resp := <-ch: + if resp.Error != nil { + err = resp.Error + break + } + + conn = resp.Conn + } + + return } // Method Sender class, read data from connection. -func (s *Sender) read(conn *net.TCPConn) []byte { - res := make([]byte, 1024) - res, err := ioutil.ReadAll(conn) +func (s *Sender) read(conn *net.TCPConn) (res []byte, err error) { + res = make([]byte, 1024) + res, err = ioutil.ReadAll(conn) if err != nil { - fmt.Printf("Error whule receiving the data: %s", err.Error()) - os.Exit(1) + err = fmt.Errorf("Error whule receiving the data: %s", err.Error()) + return } - return res + return } // Method Sender class, send packet to zabbix. -func (s *Sender) Send(packet *Packet) []byte { - conn := s.connect() +func (s *Sender) Send(packet *Packet) (res []byte, err error) { + conn, err := s.connect() + if err != nil { + return + } defer conn.Close() dataPacket, _ := json.Marshal(packet) @@ -131,15 +155,16 @@ func (s *Sender) Send(packet *Packet) []byte { buffer = append(buffer, dataPacket...) // Sent packet to zabbix - _, err := conn.Write(buffer) + _, err = conn.Write(buffer) if err != nil { - fmt.Printf("Error while sending the data: %s", err.Error()) - os.Exit(1) + err = fmt.Errorf("Error while sending the data: %s", err.Error()) + return } - res := s.read(conn) + res, err = s.read(conn) + /* fmt.Printf("RESPONSE: %s\n", string(res)) */ - return res + return } From cbd8b1e36bfd8274d88a04b273f61a7356389bd5 Mon Sep 17 00:00:00 2001 From: komkom Date: Wed, 11 Jan 2017 11:50:42 +0100 Subject: [PATCH 2/2] a test added --- zabbix_test.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 zabbix_test.go diff --git a/zabbix_test.go b/zabbix_test.go new file mode 100644 index 0000000..183af2d --- /dev/null +++ b/zabbix_test.go @@ -0,0 +1,22 @@ +package zabbix + +import "testing" + +const ( + hostname = `somehost.com` + zabbixhost = `172.30.30.30` + zabbixport = 1234 +) + +func TestSend(t *testing.T) { + sender := NewSender(zabbixhost, zabbixport) + + metrics := []*Metric{NewMetric(hostname, `key`, `value`)} + _, err := sender.Send(NewPacket(metrics)) + + if err == nil { + t.Error("sending should have failed") + } + + t.Logf("error: %v", err.Error()) +}