Add metrics for real servers to ipvs (#4929)
This commit is contained in:
committed by
Daniel Nelson
parent
7fa4db0795
commit
1ec6c8e333
@@ -5,6 +5,7 @@ package ipvs
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"math/bits"
|
||||
"strconv"
|
||||
"syscall"
|
||||
@@ -57,6 +58,36 @@ func (i *IPVS) Gather(acc telegraf.Accumulator) error {
|
||||
"cps": s.Stats.CPS,
|
||||
}
|
||||
acc.AddGauge("ipvs_virtual_server", fields, serviceTags(s))
|
||||
|
||||
destinations, err := i.handle.GetDestinations(s)
|
||||
if err != nil {
|
||||
log.Println("E! Failed to list destinations for a virtual server")
|
||||
continue // move on to the next virtual server
|
||||
}
|
||||
|
||||
for _, d := range destinations {
|
||||
fields := map[string]interface{}{
|
||||
"active_connections": d.ActiveConnections,
|
||||
"inactive_connections": d.InactiveConnections,
|
||||
"connections": d.Stats.Connections,
|
||||
"pkts_in": d.Stats.PacketsIn,
|
||||
"pkts_out": d.Stats.PacketsOut,
|
||||
"bytes_in": d.Stats.BytesIn,
|
||||
"bytes_out": d.Stats.BytesOut,
|
||||
"pps_in": d.Stats.PPSIn,
|
||||
"pps_out": d.Stats.PPSOut,
|
||||
"cps": d.Stats.CPS,
|
||||
}
|
||||
destTags := destinationTags(d)
|
||||
if s.FWMark > 0 {
|
||||
destTags["virtual_fwmark"] = strconv.Itoa(int(s.FWMark))
|
||||
} else {
|
||||
destTags["virtual_protocol"] = protocolToString(s.Protocol)
|
||||
destTags["virtual_address"] = s.Address.String()
|
||||
destTags["virtual_port"] = strconv.Itoa(int(s.Port))
|
||||
}
|
||||
acc.AddGauge("ipvs_real_server", fields, destTags)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -66,7 +97,7 @@ func (i *IPVS) Gather(acc telegraf.Accumulator) error {
|
||||
func serviceTags(s *ipvs.Service) map[string]string {
|
||||
ret := map[string]string{
|
||||
"sched": s.SchedName,
|
||||
"netmask": fmt.Sprintf("%d", bits.OnesCount32(s.Netmask)),
|
||||
"netmask": strconv.Itoa(bits.OnesCount32(s.Netmask)),
|
||||
"address_family": addressFamilyToString(s.AddressFamily),
|
||||
}
|
||||
// Per the ipvsadm man page, a virtual service is defined "based on
|
||||
@@ -81,6 +112,15 @@ func serviceTags(s *ipvs.Service) map[string]string {
|
||||
return ret
|
||||
}
|
||||
|
||||
// helper: given a Destination, return tags that identify it
|
||||
func destinationTags(d *ipvs.Destination) map[string]string {
|
||||
return map[string]string{
|
||||
"address": d.Address.String(),
|
||||
"port": strconv.Itoa(int(d.Port)),
|
||||
"address_family": addressFamilyToString(d.AddressFamily),
|
||||
}
|
||||
}
|
||||
|
||||
// helper: convert protocol uint16 to human readable string (if possible)
|
||||
func protocolToString(p uint16) string {
|
||||
switch p {
|
||||
|
||||
Reference in New Issue
Block a user