Added thread pool information parsing for node ingestion/task stats, fixed some dynamic padding on the transport address
This commit is contained in:
parent
55db2a7a13
commit
80303143ef
65
elastop.go
65
elastop.go
@ -731,7 +731,7 @@ func main() {
|
|||||||
}[clusterStats.Status]
|
}[clusterStats.Status]
|
||||||
|
|
||||||
// Get max lengths after fetching node and index info
|
// Get max lengths after fetching node and index info
|
||||||
maxNodeNameLen, maxIndexNameLen := getMaxLengths(nodesInfo, indicesStats)
|
maxNodeNameLen, maxIndexNameLen, maxTransportLen := getMaxLengths(nodesInfo, indicesStats)
|
||||||
|
|
||||||
// Update header with dynamic padding
|
// Update header with dynamic padding
|
||||||
header.Clear()
|
header.Clear()
|
||||||
@ -740,13 +740,13 @@ func main() {
|
|||||||
if maxNodeNameLen > len(clusterStats.ClusterName) {
|
if maxNodeNameLen > len(clusterStats.ClusterName) {
|
||||||
padding = maxNodeNameLen - len(clusterStats.ClusterName)
|
padding = maxNodeNameLen - len(clusterStats.ClusterName)
|
||||||
}
|
}
|
||||||
fmt.Fprintf(header, "[#00ffff]Cluster:[white] %s [%s]%s[-]%s[#00ffff]Latest: [white]%s\n",
|
fmt.Fprintf(header, "[#00ffff]Cluster :[white] %s [#666666]([%s]%s[-]%s[#666666]) [#00ffff]Latest: [white]%s\n",
|
||||||
clusterStats.ClusterName,
|
clusterStats.ClusterName,
|
||||||
statusColor,
|
statusColor,
|
||||||
strings.ToUpper(clusterStats.Status),
|
strings.ToUpper(clusterStats.Status),
|
||||||
strings.Repeat(" ", padding),
|
strings.Repeat(" ", padding),
|
||||||
latestVer)
|
latestVer)
|
||||||
fmt.Fprintf(header, "[#00ffff]Nodes:[white] %d Total, [green]%d[white] Successful, [#ff5555]%d[white] Failed\n",
|
fmt.Fprintf(header, "[#00ffff]Nodes :[white] %d Total, [green]%d[white] Successful, [#ff5555]%d[white] Failed\n",
|
||||||
clusterStats.Nodes.Total,
|
clusterStats.Nodes.Total,
|
||||||
clusterStats.Nodes.Successful,
|
clusterStats.Nodes.Successful,
|
||||||
clusterStats.Nodes.Failed)
|
clusterStats.Nodes.Failed)
|
||||||
@ -755,7 +755,7 @@ func main() {
|
|||||||
// Update nodes panel with dynamic width
|
// Update nodes panel with dynamic width
|
||||||
nodesPanel.Clear()
|
nodesPanel.Clear()
|
||||||
fmt.Fprintf(nodesPanel, "[::b][#00ffff][[#ff5555]2[#00ffff]] Nodes Information[::-]\n\n")
|
fmt.Fprintf(nodesPanel, "[::b][#00ffff][[#ff5555]2[#00ffff]] Nodes Information[::-]\n\n")
|
||||||
fmt.Fprint(nodesPanel, getNodesPanelHeader(maxNodeNameLen))
|
fmt.Fprint(nodesPanel, getNodesPanelHeader(maxNodeNameLen, maxTransportLen))
|
||||||
|
|
||||||
// Create a sorted slice of node IDs based on node names
|
// Create a sorted slice of node IDs based on node names
|
||||||
var nodeIDs []string
|
var nodeIDs []string
|
||||||
@ -812,10 +812,29 @@ func main() {
|
|||||||
nodeLoads[node.Name] = node.Load1m
|
nodeLoads[node.Name] = node.Load1m
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprintf(nodesPanel, "[#5555ff]%-*s [white] [#444444]│[white] %s [#444444]│[white] [white]%-20s[white] [#444444]│[white] [%s]%-7s[white] [#444444]│[white] [%s]%3d%% [#444444](%d)[white] [#444444]│[white] %4s [#444444]│[white] %4s / %4s [%s]%3d%%[white] [#444444]│[white] %4s / %4s [%s]%3d%%[white] [#444444]│[white] %4s / %4s [%s]%3d%%[white] [#444444]│[white] %s [#bd93f9]%s[white] [#444444](%s)[white]\n",
|
// In the update() function, add this request before processing nodes:
|
||||||
|
var threadPoolStats []ThreadPoolStats
|
||||||
|
if err := makeRequest("/_cat/thread_pool/generic?format=json&h=node_name,name,active,queue,rejected,completed", &threadPoolStats); err != nil {
|
||||||
|
nodesPanel.SetText(fmt.Sprintf("[red]Error getting thread pool stats: %v", err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a map for quick lookup of thread pool stats by node name
|
||||||
|
threadPoolMap := make(map[string]ThreadPoolStats)
|
||||||
|
for _, stat := range threadPoolStats {
|
||||||
|
threadPoolMap[stat.NodeName] = stat
|
||||||
|
}
|
||||||
|
|
||||||
|
active, _ := strconv.Atoi(threadPoolMap[nodeInfo.Name].Active)
|
||||||
|
queue, _ := strconv.Atoi(threadPoolMap[nodeInfo.Name].Queue)
|
||||||
|
rejected, _ := strconv.Atoi(threadPoolMap[nodeInfo.Name].Rejected)
|
||||||
|
completed, _ := strconv.Atoi(threadPoolMap[nodeInfo.Name].Completed)
|
||||||
|
|
||||||
|
fmt.Fprintf(nodesPanel, "[#5555ff]%-*s [white] [#444444]│[white] %s [#444444]│[white] [white]%-*s[white] [#444444]│[white] [%s]%-7s[white] [#444444]│[white] [%s]%3d%% [#444444](%d)[white] [#444444]│[white] %4s [#444444]│[white] %4s / %4s [%s]%3d%%[white] [#444444]│[white] %4s / %4s [%s]%3d%%[white] [#444444]│[white] %4s / %4s [%s]%3d%%[white] [#444444]│[white] %6s [#444444]│[white] %5s [#444444]│[white] %8s [#444444]│[white] %9s [#444444]│[white] %s [#bd93f9]%s[white] [#444444](%s)[white]\n",
|
||||||
maxNodeNameLen,
|
maxNodeNameLen,
|
||||||
nodeInfo.Name,
|
nodeInfo.Name,
|
||||||
formatNodeRoles(nodeInfo.Roles),
|
formatNodeRoles(nodeInfo.Roles),
|
||||||
|
maxTransportLen,
|
||||||
nodeInfo.TransportAddress,
|
nodeInfo.TransportAddress,
|
||||||
versionColor,
|
versionColor,
|
||||||
nodeInfo.Version,
|
nodeInfo.Version,
|
||||||
@ -835,6 +854,10 @@ func main() {
|
|||||||
formatResourceSize(diskTotal),
|
formatResourceSize(diskTotal),
|
||||||
getPercentageColor(diskPercent),
|
getPercentageColor(diskPercent),
|
||||||
int(diskPercent),
|
int(diskPercent),
|
||||||
|
formatNumber(active),
|
||||||
|
formatNumber(queue),
|
||||||
|
formatNumber(rejected),
|
||||||
|
formatNumber(completed),
|
||||||
nodeInfo.OS.PrettyName,
|
nodeInfo.OS.PrettyName,
|
||||||
nodeInfo.OS.Version,
|
nodeInfo.OS.Version,
|
||||||
nodeInfo.OS.Arch)
|
nodeInfo.OS.Arch)
|
||||||
@ -1187,15 +1210,19 @@ func getTotalNetworkRX(stats NodesStats) int64 {
|
|||||||
return total
|
return total
|
||||||
}
|
}
|
||||||
|
|
||||||
func getMaxLengths(nodesInfo NodesInfo, indicesStats IndexStats) (int, int) {
|
func getMaxLengths(nodesInfo NodesInfo, indicesStats IndexStats) (int, int, int) {
|
||||||
maxNodeNameLen := 0
|
maxNodeNameLen := 0
|
||||||
maxIndexNameLen := 0
|
maxIndexNameLen := 0
|
||||||
|
maxTransportLen := 0
|
||||||
|
|
||||||
// Get max node name length
|
// Get max node name and transport address length
|
||||||
for _, nodeInfo := range nodesInfo.Nodes {
|
for _, nodeInfo := range nodesInfo.Nodes {
|
||||||
if len(nodeInfo.Name) > maxNodeNameLen {
|
if len(nodeInfo.Name) > maxNodeNameLen {
|
||||||
maxNodeNameLen = len(nodeInfo.Name)
|
maxNodeNameLen = len(nodeInfo.Name)
|
||||||
}
|
}
|
||||||
|
if len(nodeInfo.TransportAddress) > maxTransportLen {
|
||||||
|
maxTransportLen = len(nodeInfo.TransportAddress)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get max index name length only for visible indices
|
// Get max index name length only for visible indices
|
||||||
@ -1211,22 +1238,28 @@ func getMaxLengths(nodesInfo NodesInfo, indicesStats IndexStats) (int, int) {
|
|||||||
// Add padding
|
// Add padding
|
||||||
maxNodeNameLen += 2
|
maxNodeNameLen += 2
|
||||||
maxIndexNameLen += 1 // Single space before separator
|
maxIndexNameLen += 1 // Single space before separator
|
||||||
|
maxTransportLen += 2 // Add some padding for transport address
|
||||||
|
|
||||||
return maxNodeNameLen, maxIndexNameLen
|
return maxNodeNameLen, maxIndexNameLen, maxTransportLen
|
||||||
}
|
}
|
||||||
|
|
||||||
func getNodesPanelHeader(maxNodeNameLen int) string {
|
func getNodesPanelHeader(maxNodeNameLen, maxTransportLen int) string {
|
||||||
return fmt.Sprintf("[::b]%-*s [#444444]│[#00ffff] %-13s [#444444]│[#00ffff] %-20s [#444444]│[#00ffff] %-7s [#444444]│[#00ffff] %4s [#444444]│[#00ffff] %4s [#444444]│[#00ffff] %-16s [#444444]│[#00ffff] %-16s [#444444]│[#00ffff] %-16s [#444444]│[#00ffff] %-25s[white]\n",
|
return fmt.Sprintf("[::b]%-*s [#444444]│[#00ffff] %-13s [#444444]│[#00ffff] %-*s [#444444]│[#00ffff] %-7s [#444444]│[#00ffff] %4s [#444444]│[#00ffff] %4s [#444444]│[#00ffff] %-16s [#444444]│[#00ffff] %-16s [#444444]│[#00ffff] %-16s [#444444]│[#00ffff] %6s [#444444]│[#00ffff] %5s [#444444]│[#00ffff] %8s [#444444]│[#00ffff] %9s [#444444]│[#00ffff] %-25s[white]\n",
|
||||||
maxNodeNameLen,
|
maxNodeNameLen,
|
||||||
"Node Name",
|
"Node Name",
|
||||||
"Roles",
|
"Roles",
|
||||||
|
maxTransportLen,
|
||||||
"Transport Address",
|
"Transport Address",
|
||||||
"Version",
|
"Version",
|
||||||
"CPU",
|
"CPU",
|
||||||
"Load",
|
"Load",
|
||||||
"Memory",
|
"Memory",
|
||||||
"Heap",
|
"Heap",
|
||||||
"Disk ",
|
"Disk",
|
||||||
|
"Active",
|
||||||
|
"Queue",
|
||||||
|
"Rejected",
|
||||||
|
"Completed",
|
||||||
"OS")
|
"OS")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1250,3 +1283,13 @@ func isDataStream(name string, dataStreams DataStreamResponse) bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add this with the other type definitions near the top of the file
|
||||||
|
type ThreadPoolStats struct {
|
||||||
|
NodeName string `json:"node_name"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Active string `json:"active"`
|
||||||
|
Queue string `json:"queue"`
|
||||||
|
Rejected string `json:"rejected"`
|
||||||
|
Completed string `json:"completed"`
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user