commit
3c6a95ec4f
81
zabbix.go
81
zabbix.go
@ -7,7 +7,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -72,50 +71,75 @@ func (s *Sender) getHeader() []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Method Sender class, resolve uri by name:port.
|
// 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
|
// format: hostname:port
|
||||||
addr := fmt.Sprintf("%s:%d", s.Host, s.Port)
|
addr := fmt.Sprintf("%s:%d", s.Host, s.Port)
|
||||||
|
|
||||||
// Resolve hostname:port to ip:port
|
// Resolve hostname:port to ip:port
|
||||||
iaddr, err := net.ResolveTCPAddr("tcp", addr)
|
iaddr, err = net.ResolveTCPAddr("tcp", addr)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Connection failed: %s", err.Error())
|
err = fmt.Errorf("Connection failed: %s", err.Error())
|
||||||
os.Exit(1)
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
return iaddr
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Sender class, make connection to uri.
|
// Method Sender class, make connection to uri.
|
||||||
func (s *Sender) connect() *net.TCPConn {
|
func (s *Sender) connect() (conn *net.TCPConn, err error) {
|
||||||
// Open connection to zabbix host
|
|
||||||
iaddr := s.getTCPAddr()
|
|
||||||
conn, err := net.DialTCP("tcp", nil, iaddr)
|
|
||||||
|
|
||||||
if err != nil {
|
type DialResp struct {
|
||||||
fmt.Printf("Connection failed: %s", err.Error())
|
Conn *net.TCPConn
|
||||||
os.Exit(1)
|
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.
|
// Method Sender class, read data from connection.
|
||||||
func (s *Sender) read(conn *net.TCPConn) []byte {
|
func (s *Sender) read(conn *net.TCPConn) (res []byte, err error) {
|
||||||
res := make([]byte, 1024)
|
res = make([]byte, 1024)
|
||||||
res, err := ioutil.ReadAll(conn)
|
res, err = ioutil.ReadAll(conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Error whule receiving the data: %s", err.Error())
|
err = fmt.Errorf("Error whule receiving the data: %s", err.Error())
|
||||||
os.Exit(1)
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Sender class, send packet to zabbix.
|
// Method Sender class, send packet to zabbix.
|
||||||
func (s *Sender) Send(packet *Packet) []byte {
|
func (s *Sender) Send(packet *Packet) (res []byte, err error) {
|
||||||
conn := s.connect()
|
conn, err := s.connect()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
dataPacket, _ := json.Marshal(packet)
|
dataPacket, _ := json.Marshal(packet)
|
||||||
@ -131,15 +155,16 @@ func (s *Sender) Send(packet *Packet) []byte {
|
|||||||
buffer = append(buffer, dataPacket...)
|
buffer = append(buffer, dataPacket...)
|
||||||
|
|
||||||
// Sent packet to zabbix
|
// Sent packet to zabbix
|
||||||
_, err := conn.Write(buffer)
|
_, err = conn.Write(buffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Error while sending the data: %s", err.Error())
|
err = fmt.Errorf("Error while sending the data: %s", err.Error())
|
||||||
os.Exit(1)
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
res := s.read(conn)
|
res, err = s.read(conn)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
fmt.Printf("RESPONSE: %s\n", string(res))
|
fmt.Printf("RESPONSE: %s\n", string(res))
|
||||||
*/
|
*/
|
||||||
return res
|
return
|
||||||
}
|
}
|
||||||
|
22
zabbix_test.go
Normal file
22
zabbix_test.go
Normal file
@ -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())
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user