@@ -155,6 +155,8 @@ class TJsonNodes : public TViewerPipeClient {
155155 TString Database;
156156 ui32 MissingDisks = 0 ;
157157 float DiskSpaceUsage = 0 ; // the highest
158+ float CpuUsage = 0 ; // total, normalized
159+ float LoadAverage = 0 ; // normalized
158160 bool Problems = false ;
159161 bool Connected = false ;
160162 bool Disconnected = false ;
@@ -252,6 +254,22 @@ class TJsonNodes : public TViewerPipeClient {
252254 }
253255 }
254256
257+ void CalcCpuUsage () {
258+ float usage = 0 ;
259+ int threads = 0 ;
260+ for (const auto & pool : SystemState.GetPoolStats ()) {
261+ usage += pool.GetUsage () * pool.GetThreads ();
262+ threads += pool.GetThreads ();
263+ }
264+ CpuUsage = usage / threads;
265+ }
266+
267+ void CalcLoadAverage () {
268+ if (SystemState.GetNumberOfCpus () && SystemState.LoadAverageSize () > 0 ) {
269+ LoadAverage = SystemState.GetLoadAverage (0 ) / SystemState.GetNumberOfCpus ();
270+ }
271+ }
272+
255273 void DisconnectNode () {
256274 Problems = true ;
257275 Disconnected = true ;
@@ -434,6 +452,14 @@ class TJsonNodes : public TViewerPipeClient {
434452 return {};
435453 }
436454 }
455+
456+ void MergeFrom (const NKikimrWhiteboard::TSystemStateInfo& systemState) {
457+ SystemState.MergeFrom (systemState);
458+ Cleanup ();
459+ CalcDatabase ();
460+ CalcCpuUsage ();
461+ CalcLoadAverage ();
462+ }
437463 };
438464
439465 struct TNodeGroup {
@@ -494,6 +520,10 @@ class TJsonNodes : public TViewerPipeClient {
494520 { ENodeFields::Uptime, TFieldsType ().set (+ENodeFields::SystemState) },
495521 { ENodeFields::Version, TFieldsType ().set (+ENodeFields::SystemState) },
496522 { ENodeFields::NodeName, TFieldsType ().set (+ENodeFields::SystemState) },
523+ { ENodeFields::CPU, TFieldsType ().set (+ENodeFields::SystemState) },
524+ { ENodeFields::Memory, TFieldsType ().set (+ENodeFields::SystemState) },
525+ { ENodeFields::LoadAverage, TFieldsType ().set (+ENodeFields::SystemState) },
526+ { ENodeFields::Database, TFieldsType ().set (+ENodeFields::SystemState) },
497527 { ENodeFields::Missing, TFieldsType ().set (+ENodeFields::PDisks) },
498528 };
499529
@@ -996,43 +1026,69 @@ class TJsonNodes : public TViewerPipeClient {
9961026 switch (SortBy) {
9971027 case ENodeFields::NodeId:
9981028 SortCollection (NodeView, [](const TNode* node) { return node->GetNodeId (); }, ReverseSort);
1029+ NeedSort = false ;
9991030 break ;
10001031 case ENodeFields::HostName:
10011032 SortCollection (NodeView, [](const TNode* node) { return node->GetHostName (); }, ReverseSort);
1033+ NeedSort = false ;
10021034 break ;
10031035 case ENodeFields::NodeName:
10041036 SortCollection (NodeView, [](const TNode* node) { return node->GetNodeName (); }, ReverseSort);
1037+ NeedSort = false ;
10051038 break ;
10061039 case ENodeFields::DC:
10071040 SortCollection (NodeView, [](const TNode* node) { return node->NodeInfo .Location .GetDataCenterId (); }, ReverseSort);
1041+ NeedSort = false ;
10081042 break ;
10091043 case ENodeFields::Rack:
10101044 SortCollection (NodeView, [](const TNode* node) { return node->NodeInfo .Location .GetRackId (); }, ReverseSort);
1045+ NeedSort = false ;
10111046 break ;
10121047 case ENodeFields::Version:
10131048 SortCollection (NodeView, [](const TNode* node) { return node->SystemState .GetVersion (); }, ReverseSort);
1049+ NeedSort = false ;
10141050 break ;
10151051 case ENodeFields::Uptime:
10161052 SortCollection (NodeView, [](const TNode* node) { return node->SystemState .GetStartTime (); }, ReverseSort);
1053+ NeedSort = false ;
10171054 break ;
10181055 case ENodeFields::Memory:
1056+ SortCollection (NodeView, [](const TNode* node) { return node->SystemState .GetMemoryUsed (); }, ReverseSort);
1057+ NeedSort = false ;
1058+ break ;
10191059 case ENodeFields::CPU:
1060+ SortCollection (NodeView, [](const TNode* node) { return node->CpuUsage ; }, ReverseSort);
1061+ NeedSort = false ;
1062+ break ;
10201063 case ENodeFields::LoadAverage:
1064+ SortCollection (NodeView, [](const TNode* node) { return node->LoadAverage ; }, ReverseSort);
1065+ NeedSort = false ;
1066+ break ;
10211067 case ENodeFields::Missing:
1068+ SortCollection (NodeView, [](const TNode* node) { return node->MissingDisks ; }, ReverseSort);
1069+ NeedSort = false ;
1070+ break ;
10221071 case ENodeFields::DiskSpaceUsage:
1072+ SortCollection (NodeView, [](const TNode* node) { return node->DiskSpaceUsage ; }, ReverseSort);
1073+ NeedSort = false ;
1074+ break ;
1075+ case ENodeFields::Database:
1076+ SortCollection (NodeView, [](const TNode* node) { return node->Database ; }, ReverseSort);
1077+ NeedSort = false ;
1078+ break ;
10231079 case ENodeFields::NodeInfo:
10241080 case ENodeFields::SystemState:
10251081 case ENodeFields::PDisks:
10261082 case ENodeFields::VDisks:
10271083 case ENodeFields::Tablets:
10281084 case ENodeFields::SubDomainKey:
1029- case ENodeFields::Database:
10301085 case ENodeFields::DisconnectTime:
10311086 case ENodeFields::COUNT:
10321087 break ;
10331088 }
1034- NeedSort = false ;
1035- InvalidateNodes ();
1089+ if (!NeedSort) {
1090+ InvalidateNodes ();
1091+ }
10361092 }
10371093 }
10381094
@@ -1637,9 +1693,7 @@ class TJsonNodes : public TViewerPipeClient {
16371693 TNodeId nodeId = systemInfo.GetNodeId ();
16381694 TNode* node = FindNode (nodeId);
16391695 if (node) {
1640- node->SystemState .MergeFrom (systemInfo);
1641- node->Cleanup ();
1642- node->CalcDatabase ();
1696+ node->MergeFrom (systemInfo);
16431697 if (Database && node->Database ) {
16441698 if (node->Database != Database && (!SharedDatabase || node->Database != SharedDatabase)) {
16451699 removeNodes.insert (nodeId);
@@ -1655,9 +1709,7 @@ class TJsonNodes : public TViewerPipeClient {
16551709 if (systemState.SystemStateInfoSize () > 0 ) {
16561710 TNode* node = FindNode (nodeId);
16571711 if (node) {
1658- node->SystemState .MergeFrom (systemState.GetSystemStateInfo (0 ));
1659- node->Cleanup ();
1660- node->CalcDatabase ();
1712+ node->MergeFrom (systemState.GetSystemStateInfo (0 ));
16611713 if (Database && node->Database ) {
16621714 if (node->Database != Database && (!SharedDatabase || node->Database != SharedDatabase)) {
16631715 removeNodes.insert (nodeId);
@@ -2260,6 +2312,12 @@ class TJsonNodes : public TViewerPipeClient {
22602312 * `Rack`
22612313 * `Version`
22622314 * `Uptime`
2315+ * `Memory`
2316+ * `CPU`
2317+ * `LoadAverage`
2318+ * `Missing`
2319+ * `DiskSpaceUsage`
2320+ * `Database`
22632321 required: false
22642322 type: string
22652323 - name: group
0 commit comments