Report rabbitmq_node measurement and return on gather error (#6819)
This commit is contained in:
parent
7e498ede6d
commit
0cf94cfe54
plugins/inputs/rabbitmq
|
@ -448,134 +448,112 @@ func gatherOverview(r *RabbitMQ, acc telegraf.Accumulator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func gatherNodes(r *RabbitMQ, acc telegraf.Accumulator) {
|
func gatherNodes(r *RabbitMQ, acc telegraf.Accumulator) {
|
||||||
allNodes := make([]Node, 0)
|
allNodes := make([]*Node, 0)
|
||||||
// Gather information about nodes
|
|
||||||
err := r.requestJSON("/api/nodes", &allNodes)
|
err := r.requestJSON("/api/nodes", &allNodes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
acc.AddError(err)
|
acc.AddError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
nodes := make(map[string]Node)
|
nodes := allNodes[:0]
|
||||||
for _, node := range allNodes {
|
for _, node := range allNodes {
|
||||||
if r.shouldGatherNode(node) {
|
if r.shouldGatherNode(node) {
|
||||||
nodes[node.Name] = node
|
nodes = append(nodes, node)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
numberNodes := len(nodes)
|
var wg sync.WaitGroup
|
||||||
if numberNodes == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
type NodeCheck struct {
|
|
||||||
NodeName string
|
|
||||||
HealthCheck HealthCheck
|
|
||||||
Memory *Memory
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeChecksChannel := make(chan NodeCheck, numberNodes)
|
|
||||||
|
|
||||||
for _, node := range nodes {
|
for _, node := range nodes {
|
||||||
go func(nodeName string, healthChecksChannel chan NodeCheck) {
|
wg.Add(1)
|
||||||
var healthCheck HealthCheck
|
go func(node *Node) {
|
||||||
var memoryresponse MemoryResponse
|
defer wg.Done()
|
||||||
|
|
||||||
err := r.requestJSON("/api/healthchecks/node/"+nodeName, &healthCheck)
|
tags := map[string]string{"url": r.URL}
|
||||||
nodeCheck := NodeCheck{
|
tags["node"] = node.Name
|
||||||
NodeName: nodeName,
|
|
||||||
HealthCheck: healthCheck,
|
fields := map[string]interface{}{
|
||||||
|
"disk_free": node.DiskFree,
|
||||||
|
"disk_free_limit": node.DiskFreeLimit,
|
||||||
|
"disk_free_alarm": boolToInt(node.DiskFreeAlarm),
|
||||||
|
"fd_total": node.FdTotal,
|
||||||
|
"fd_used": node.FdUsed,
|
||||||
|
"mem_limit": node.MemLimit,
|
||||||
|
"mem_used": node.MemUsed,
|
||||||
|
"mem_alarm": boolToInt(node.MemAlarm),
|
||||||
|
"proc_total": node.ProcTotal,
|
||||||
|
"proc_used": node.ProcUsed,
|
||||||
|
"run_queue": node.RunQueue,
|
||||||
|
"sockets_total": node.SocketsTotal,
|
||||||
|
"sockets_used": node.SocketsUsed,
|
||||||
|
"uptime": node.Uptime,
|
||||||
|
"mnesia_disk_tx_count": node.MnesiaDiskTxCount,
|
||||||
|
"mnesia_disk_tx_count_rate": node.MnesiaDiskTxCountDetails.Rate,
|
||||||
|
"mnesia_ram_tx_count": node.MnesiaRamTxCount,
|
||||||
|
"mnesia_ram_tx_count_rate": node.MnesiaRamTxCountDetails.Rate,
|
||||||
|
"gc_num": node.GcNum,
|
||||||
|
"gc_num_rate": node.GcNumDetails.Rate,
|
||||||
|
"gc_bytes_reclaimed": node.GcBytesReclaimed,
|
||||||
|
"gc_bytes_reclaimed_rate": node.GcBytesReclaimedDetails.Rate,
|
||||||
|
"io_read_avg_time": node.IoReadAvgTime,
|
||||||
|
"io_read_avg_time_rate": node.IoReadAvgTimeDetails.Rate,
|
||||||
|
"io_read_bytes": node.IoReadBytes,
|
||||||
|
"io_read_bytes_rate": node.IoReadBytesDetails.Rate,
|
||||||
|
"io_write_avg_time": node.IoWriteAvgTime,
|
||||||
|
"io_write_avg_time_rate": node.IoWriteAvgTimeDetails.Rate,
|
||||||
|
"io_write_bytes": node.IoWriteBytes,
|
||||||
|
"io_write_bytes_rate": node.IoWriteBytesDetails.Rate,
|
||||||
|
"running": boolToInt(node.Running),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var health HealthCheck
|
||||||
|
err := r.requestJSON("/api/healthchecks/node/"+node.Name, &health)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
acc.AddError(err)
|
acc.AddError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = r.requestJSON("/api/nodes/"+nodeName+"/memory", &memoryresponse)
|
if health.Status == "ok" {
|
||||||
nodeCheck.Memory = memoryresponse.Memory
|
fields["health_check_status"] = int64(1)
|
||||||
|
} else {
|
||||||
|
fields["health_check_status"] = int64(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
var memory MemoryResponse
|
||||||
|
err = r.requestJSON("/api/nodes/"+node.Name+"/memory", &memory)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
acc.AddError(err)
|
acc.AddError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeChecksChannel <- nodeCheck
|
if memory.Memory != nil {
|
||||||
}(node.Name, nodeChecksChannel)
|
fields["mem_connection_readers"] = memory.Memory.ConnectionReaders
|
||||||
|
fields["mem_connection_writers"] = memory.Memory.ConnectionWriters
|
||||||
|
fields["mem_connection_channels"] = memory.Memory.ConnectionChannels
|
||||||
|
fields["mem_connection_other"] = memory.Memory.ConnectionOther
|
||||||
|
fields["mem_queue_procs"] = memory.Memory.QueueProcs
|
||||||
|
fields["mem_queue_slave_procs"] = memory.Memory.QueueSlaveProcs
|
||||||
|
fields["mem_plugins"] = memory.Memory.Plugins
|
||||||
|
fields["mem_other_proc"] = memory.Memory.OtherProc
|
||||||
|
fields["mem_metrics"] = memory.Memory.Metrics
|
||||||
|
fields["mem_mgmt_db"] = memory.Memory.MgmtDb
|
||||||
|
fields["mem_mnesia"] = memory.Memory.Mnesia
|
||||||
|
fields["mem_other_ets"] = memory.Memory.OtherEts
|
||||||
|
fields["mem_binary"] = memory.Memory.Binary
|
||||||
|
fields["mem_msg_index"] = memory.Memory.MsgIndex
|
||||||
|
fields["mem_code"] = memory.Memory.Code
|
||||||
|
fields["mem_atom"] = memory.Memory.Atom
|
||||||
|
fields["mem_other_system"] = memory.Memory.OtherSystem
|
||||||
|
fields["mem_allocated_unused"] = memory.Memory.AllocatedUnused
|
||||||
|
fields["mem_reserved_unallocated"] = memory.Memory.ReservedUnallocated
|
||||||
|
fields["mem_total"] = memory.Memory.Total
|
||||||
|
}
|
||||||
|
|
||||||
|
acc.AddFields("rabbitmq_node", fields, tags)
|
||||||
|
}(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
now := time.Now()
|
wg.Wait()
|
||||||
|
|
||||||
for i := 0; i < len(nodes); i++ {
|
|
||||||
nodeCheck := <-nodeChecksChannel
|
|
||||||
|
|
||||||
var healthCheckStatus int64 = 0
|
|
||||||
|
|
||||||
if nodeCheck.HealthCheck.Status == "ok" {
|
|
||||||
healthCheckStatus = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
node := nodes[nodeCheck.NodeName]
|
|
||||||
|
|
||||||
tags := map[string]string{"url": r.URL}
|
|
||||||
tags["node"] = node.Name
|
|
||||||
|
|
||||||
fields := map[string]interface{}{
|
|
||||||
"disk_free": node.DiskFree,
|
|
||||||
"disk_free_limit": node.DiskFreeLimit,
|
|
||||||
"disk_free_alarm": boolToInt(node.DiskFreeAlarm),
|
|
||||||
"fd_total": node.FdTotal,
|
|
||||||
"fd_used": node.FdUsed,
|
|
||||||
"mem_limit": node.MemLimit,
|
|
||||||
"mem_used": node.MemUsed,
|
|
||||||
"mem_alarm": boolToInt(node.MemAlarm),
|
|
||||||
"proc_total": node.ProcTotal,
|
|
||||||
"proc_used": node.ProcUsed,
|
|
||||||
"run_queue": node.RunQueue,
|
|
||||||
"sockets_total": node.SocketsTotal,
|
|
||||||
"sockets_used": node.SocketsUsed,
|
|
||||||
"uptime": node.Uptime,
|
|
||||||
"mnesia_disk_tx_count": node.MnesiaDiskTxCount,
|
|
||||||
"mnesia_disk_tx_count_rate": node.MnesiaDiskTxCountDetails.Rate,
|
|
||||||
"mnesia_ram_tx_count": node.MnesiaRamTxCount,
|
|
||||||
"mnesia_ram_tx_count_rate": node.MnesiaRamTxCountDetails.Rate,
|
|
||||||
"gc_num": node.GcNum,
|
|
||||||
"gc_num_rate": node.GcNumDetails.Rate,
|
|
||||||
"gc_bytes_reclaimed": node.GcBytesReclaimed,
|
|
||||||
"gc_bytes_reclaimed_rate": node.GcBytesReclaimedDetails.Rate,
|
|
||||||
"io_read_avg_time": node.IoReadAvgTime,
|
|
||||||
"io_read_avg_time_rate": node.IoReadAvgTimeDetails.Rate,
|
|
||||||
"io_read_bytes": node.IoReadBytes,
|
|
||||||
"io_read_bytes_rate": node.IoReadBytesDetails.Rate,
|
|
||||||
"io_write_avg_time": node.IoWriteAvgTime,
|
|
||||||
"io_write_avg_time_rate": node.IoWriteAvgTimeDetails.Rate,
|
|
||||||
"io_write_bytes": node.IoWriteBytes,
|
|
||||||
"io_write_bytes_rate": node.IoWriteBytesDetails.Rate,
|
|
||||||
"running": boolToInt(node.Running),
|
|
||||||
"health_check_status": healthCheckStatus,
|
|
||||||
}
|
|
||||||
if nodeCheck.Memory != nil {
|
|
||||||
fields["mem_connection_readers"] = nodeCheck.Memory.ConnectionReaders
|
|
||||||
fields["mem_connection_writers"] = nodeCheck.Memory.ConnectionWriters
|
|
||||||
fields["mem_connection_channels"] = nodeCheck.Memory.ConnectionChannels
|
|
||||||
fields["mem_connection_other"] = nodeCheck.Memory.ConnectionOther
|
|
||||||
fields["mem_queue_procs"] = nodeCheck.Memory.QueueProcs
|
|
||||||
fields["mem_queue_slave_procs"] = nodeCheck.Memory.QueueSlaveProcs
|
|
||||||
fields["mem_plugins"] = nodeCheck.Memory.Plugins
|
|
||||||
fields["mem_other_proc"] = nodeCheck.Memory.OtherProc
|
|
||||||
fields["mem_metrics"] = nodeCheck.Memory.Metrics
|
|
||||||
fields["mem_mgmt_db"] = nodeCheck.Memory.MgmtDb
|
|
||||||
fields["mem_mnesia"] = nodeCheck.Memory.Mnesia
|
|
||||||
fields["mem_other_ets"] = nodeCheck.Memory.OtherEts
|
|
||||||
fields["mem_binary"] = nodeCheck.Memory.Binary
|
|
||||||
fields["mem_msg_index"] = nodeCheck.Memory.MsgIndex
|
|
||||||
fields["mem_code"] = nodeCheck.Memory.Code
|
|
||||||
fields["mem_atom"] = nodeCheck.Memory.Atom
|
|
||||||
fields["mem_other_system"] = nodeCheck.Memory.OtherSystem
|
|
||||||
fields["mem_allocated_unused"] = nodeCheck.Memory.AllocatedUnused
|
|
||||||
fields["mem_reserved_unallocated"] = nodeCheck.Memory.ReservedUnallocated
|
|
||||||
fields["mem_total"] = nodeCheck.Memory.Total
|
|
||||||
}
|
|
||||||
acc.AddFields("rabbitmq_node", fields, tags, now)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func gatherQueues(r *RabbitMQ, acc telegraf.Accumulator) {
|
func gatherQueues(r *RabbitMQ, acc telegraf.Accumulator) {
|
||||||
|
@ -718,7 +696,7 @@ func gatherFederationLinks(r *RabbitMQ, acc telegraf.Accumulator) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RabbitMQ) shouldGatherNode(node Node) bool {
|
func (r *RabbitMQ) shouldGatherNode(node *Node) bool {
|
||||||
if len(r.Nodes) == 0 {
|
if len(r.Nodes) == 0 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue