This is fork of go-agentx library with traps support.
A library with a pure Go implementation of the AgentX-Protocol. The library is not yet feature-complete, but should be far enough to used in a production environment.
The AgentX-Protocol can be used to extend a snmp-daemon such that it dispatches the requests to an OID-subtree to your Go application. Those requests are than handled by this library and can be replied with metrics about your applications state.
The library implements all variable types (Integer, OctetString, Null, ObjectIdentifier, IPAddress, Counter32, Gauge32, TimeTicks, Opaque, Counter64, NoSuchObject, NoSuchInstance, EndOfMIBView), and some of the requests (Get, GetNext, GetBulk, Notify, TestSet, CommitSet, UndoSet, CleanupSet, Open, Close).
In order to provided metrics, your have to implement the agentx.Handler
interface. For convenience, you can use the agentx.ListHandler
implementation, which takes a list of OIDs and values and serves them if requested. An example is listed below.
package main
import (
"log"
"net"
"time"
"gopkg.in/errgo.v1"
"github.com/rsfreitas/go-agentx"
"github.com/rsfreitas/go-agentx/pdu"
"github.com/rsfreitas/go-agentx/value"
)
func main() {
client := &agentx.Client{
Net: "tcp",
Address: "localhost:705",
Timeout: 1 * time.Minute,
ReconnectInterval: 1 * time.Second,
}
if err := client.Open(); err != nil {
log.Fatalf(errgo.Details(err))
}
session, err := client.Session()
if err != nil {
log.Fatalf(errgo.Details(err))
}
listHandler := &agentx.ListHandler{}
item := listHandler.Add("1.3.6.1.4.1.45995.3.1")
item.Type = pdu.VariableTypeInteger
item.Value = int32(-123)
item = listHandler.Add("1.3.6.1.4.1.45995.3.2")
item.Type = pdu.VariableTypeOctetString
item.Value = "echo test"
item = listHandler.Add("1.3.6.1.4.1.45995.3.3")
item.Type = pdu.VariableTypeNull
item.Value = nil
item = listHandler.Add("1.3.6.1.4.1.45995.3.4")
item.Type = pdu.VariableTypeObjectIdentifier
item.Value = "1.3.6.1.4.1.45995.1.5"
item = listHandler.Add("1.3.6.1.4.1.45995.3.5")
item.Type = pdu.VariableTypeIPAddress
item.Value = net.IP{10, 10, 10, 10}
item = listHandler.Add("1.3.6.1.4.1.45995.3.6")
item.Type = pdu.VariableTypeCounter32
item.Value = uint32(123)
item = listHandler.Add("1.3.6.1.4.1.45995.3.7")
item.Type = pdu.VariableTypeGauge32
item.Value = uint32(123)
item = listHandler.Add("1.3.6.1.4.1.45995.3.8")
item.Type = pdu.VariableTypeTimeTicks
item.Value = 123 * time.Second
item = listHandler.Add("1.3.6.1.4.1.45995.3.9")
item.Type = pdu.VariableTypeOpaque
item.Value = []byte{1, 2, 3}
item = listHandler.Add("1.3.6.1.4.1.45995.3.10")
item.Type = pdu.VariableTypeCounter64
item.Value = uint64(12345678901234567890)
session.Handler = listHandler
if err := session.Register(127, value.MustParseOID("1.3.6.1.4.1.45995.3")); err != nil {
log.Fatalf(errgo.Details(err))
}
var payload pdu.Variables
TrapOID := "1.3.6.1.4.1.45995.3"
payload.Add(value.MustParseOID("1.3.6.1.2.1.1.3.0"), pdu.VariableTypeTimeTicks, time.Since(startTime)) // uptime
payload.Add(value.MustParseOID("1.3.6.1.6.3.1.1.4.1.0"), pdu.VariableTypeObjectIdentifier, "1.3.6.1.6.3.1.1.4.3.0."+TrapOID) // SNMPTRAP -> ENTERPRISE.OID
payload.Add(value.MustParseOID(TrapOID+".11), pdu.VariableTypeInteger, int32(42))
if err := session.Notify(payload); err != nil {
log.Fatalf(errgo.Details(err))
}
for {
time.Sleep(100 * time.Millisecond)
}
}
If the connection to the snmp-daemon is lost, the client tries to reconnect. Therefore the property ReconnectInterval
has be set. It specifies a duration that is waited before a re-connect is tried.
If the client has open session or registrations, the client try to re-establish both on a successful re-connect.
Unmarshalling of response variables is not working properly and temporarily disabled
The implementation was provided by simia.tech GbR.
The project is licensed under LGPLv2 (see LICENSE file).