Skip to content

Commit

Permalink
Merge pull request #5 from tutti-ch/master
Browse files Browse the repository at this point in the history
Error Handling
  • Loading branch information
adubkov committed Jan 18, 2017
2 parents 60d3dea + cbd8b1e commit 3c6a95e
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 27 deletions.
79 changes: 52 additions & 27 deletions zabbix.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"fmt"
"io/ioutil"
"net"
"os"
"time"
)

Expand Down Expand Up @@ -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) {

type DialResp struct {
Conn *net.TCPConn
Error error
}

// Open connection to zabbix host
iaddr, err := s.getTCPAddr()
if err != nil {
fmt.Printf("Connection failed: %s", err.Error())
os.Exit(1)
return
}

return conn
// 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)
Expand All @@ -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
}
22 changes: 22 additions & 0 deletions zabbix_test.go
Original file line number Diff line number Diff line change
@@ -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())
}

0 comments on commit 3c6a95e

Please sign in to comment.