@@ -174,6 +174,8 @@ class TStorageGroups : public TViewerPipeClient {
174174 std::optional<std::size_t > Limit;
175175 ui32 SpaceUsageProblem = 90 ; // %
176176
177+ using TGroupSortKey = std::variant<TString, ui64, float , bool >;
178+
177179 struct TPDisk {
178180 ui32 PDiskId = 0 ;
179181 TNodeId NodeId = 0 ;
@@ -273,7 +275,7 @@ class TStorageGroups : public TViewerPipeClient {
273275 ui64 Available = 0 ;
274276 ui64 Read = 0 ;
275277 ui64 Write = 0 ;
276- ui32 MissingDisks = 0 ;
278+ ui64 MissingDisks = 0 ;
277279 ui64 PutTabletLogLatency = 0 ;
278280 ui64 PutUserDataLatency = 0 ;
279281 ui64 GetFastLatency = 0 ;
@@ -523,14 +525,73 @@ class TStorageGroups : public TViewerPipeClient {
523525 }
524526 return groupName;
525527 }
528+
529+ TGroupSortKey GetSortKey (EGroupFields groupBy) const {
530+ switch (groupBy) {
531+ case EGroupFields::GroupId:
532+ case EGroupFields::Erasure:
533+ case EGroupFields::PoolName:
534+ case EGroupFields::Kind:
535+ case EGroupFields::MediaType:
536+ case EGroupFields::State:
537+ return GetGroupName (groupBy);
538+ case EGroupFields::Usage:
539+ return Usage;
540+ case EGroupFields::DiskSpaceUsage:
541+ return DiskSpaceUsage;
542+ case EGroupFields::Encryption:
543+ return EncryptionMode;
544+ case EGroupFields::MissingDisks:
545+ return MissingDisks;
546+ case EGroupFields::Latency:
547+ return PutTabletLogLatency;
548+ default :
549+ return TString ();
550+ }
551+ }
526552 };
527553
528554 using TGroupData = std::vector<TGroup>;
529555 using TGroupView = std::vector<TGroup*>;
530556
531557 struct TGroupGroup {
532558 TString Name;
559+ TGroupSortKey SortKey;
533560 TGroupView Groups;
561+
562+ // stats
563+ float Usage = 0 ; // avg
564+ ui64 Used = 0 ; // sum
565+ ui64 Limit = 0 ; // sum
566+ ui64 Available = 0 ; // sum
567+ ui64 Read = 0 ; // sum
568+ ui64 Write = 0 ; // sum
569+ ui64 PutTabletLogLatency = 0 ; // max
570+ ui64 PutUserDataLatency = 0 ; // max
571+ ui64 GetFastLatency = 0 ; // max
572+ float DiskSpaceUsage = 0 ; // max
573+
574+ void CalcStats () {
575+ for (TGroup* group : Groups) {
576+ Usage += group->Usage ;
577+ Used += group->Used ;
578+ Limit += group->Limit ;
579+ Read += group->Read ;
580+ Write += group->Write ;
581+ if (Available) {
582+ Available = std::min (Available, group->Available );
583+ } else {
584+ Available = group->Available ;
585+ }
586+ PutTabletLogLatency = std::max (PutTabletLogLatency, group->PutTabletLogLatency );
587+ PutUserDataLatency = std::max (PutUserDataLatency, group->PutUserDataLatency );
588+ GetFastLatency = std::max (GetFastLatency, group->GetFastLatency );
589+ DiskSpaceUsage = std::max (DiskSpaceUsage, group->DiskSpaceUsage );
590+ }
591+ if (!Groups.empty ()) {
592+ Usage /= Groups.size ();
593+ }
594+ }
534595 };
535596
536597 TGroupData GroupData;
@@ -547,8 +608,6 @@ class TStorageGroups : public TViewerPipeClient {
547608 const TFieldsType FieldsAll = TFieldsType().set();
548609 const TFieldsType FieldsBsGroups = TFieldsType().set(+EGroupFields::GroupId)
549610 .set(+EGroupFields::Erasure)
550- .set(+EGroupFields::Used)
551- .set(+EGroupFields::Limit)
552611 .set(+EGroupFields::Latency);
553612 const TFieldsType FieldsBsPools = TFieldsType().set(+EGroupFields::PoolName)
554613 .set(+EGroupFields::Kind)
@@ -655,6 +714,8 @@ class TStorageGroups : public TViewerPipeClient {
655714 result = EGroupFields::PDiskId;
656715 } else if (field == " Latency" ) {
657716 result = EGroupFields::Latency;
717+ } else if (field == " Available" ) {
718+ result = EGroupFields::Available;
658719 }
659720 return result;
660721 }
@@ -1013,6 +1074,7 @@ class TStorageGroups : public TViewerPipeClient {
10131074 groupGroups.emplace (gb, GroupGroups.size ());
10141075 groupGroup = &GroupGroups.emplace_back ();
10151076 groupGroup->Name = gb;
1077+ groupGroup->SortKey = group->GetSortKey (GroupBy);
10161078 } else {
10171079 groupGroup = &GroupGroups[it->second ];
10181080 }
@@ -1031,15 +1093,15 @@ class TStorageGroups : public TViewerPipeClient {
10311093 case EGroupFields::MediaType:
10321094 case EGroupFields::State:
10331095 GroupCollection ();
1034- SortCollection (GroupGroups, [](const TGroupGroup& groupGroup) { return groupGroup.Name ; });
1096+ SortCollection (GroupGroups, [](const TGroupGroup& groupGroup) { return groupGroup.SortKey ; });
10351097 NeedGroup = false ;
10361098 break ;
10371099 case EGroupFields::Usage:
10381100 case EGroupFields::DiskSpaceUsage:
10391101 case EGroupFields::MissingDisks:
10401102 case EGroupFields::Latency:
10411103 GroupCollection ();
1042- SortCollection (GroupGroups, [](const TGroupGroup& groupGroup) { return groupGroup.Name ; }, true );
1104+ SortCollection (GroupGroups, [](const TGroupGroup& groupGroup) { return groupGroup.SortKey ; }, true );
10431105 NeedGroup = false ;
10441106 break ;
10451107 case EGroupFields::Read:
@@ -2072,10 +2134,37 @@ class TStorageGroups : public TViewerPipeClient {
20722134 }
20732135 }
20742136 } else {
2075- for (const TGroupGroup& groupGroup : GroupGroups) {
2137+ for (TGroupGroup& groupGroup : GroupGroups) {
20762138 NKikimrViewer::TStorageGroupGroup& jsonGroupGroup = *json.AddStorageGroupGroups ();
20772139 jsonGroupGroup.SetGroupName (groupGroup.Name );
20782140 jsonGroupGroup.SetGroupCount (groupGroup.Groups .size ());
2141+ groupGroup.CalcStats ();
2142+ if (FieldsAvailable.test (+EGroupFields::Used)) {
2143+ jsonGroupGroup.SetUsed (groupGroup.Used );
2144+ }
2145+ if (FieldsAvailable.test (+EGroupFields::Limit)) {
2146+ jsonGroupGroup.SetLimit (groupGroup.Limit );
2147+ }
2148+ if (FieldsAvailable.test (+EGroupFields::Read)) {
2149+ jsonGroupGroup.SetRead (groupGroup.Read );
2150+ }
2151+ if (FieldsAvailable.test (+EGroupFields::Write)) {
2152+ jsonGroupGroup.SetWrite (groupGroup.Write );
2153+ }
2154+ if (FieldsAvailable.test (+EGroupFields::Usage)) {
2155+ jsonGroupGroup.SetUsage (groupGroup.Usage );
2156+ }
2157+ if (FieldsAvailable.test (+EGroupFields::Available)) {
2158+ jsonGroupGroup.SetAvailable (groupGroup.Available );
2159+ }
2160+ if (FieldsAvailable.test (+EGroupFields::DiskSpaceUsage)) {
2161+ jsonGroupGroup.SetDiskSpaceUsage (groupGroup.DiskSpaceUsage );
2162+ }
2163+ if (FieldsAvailable.test (+EGroupFields::Latency)) {
2164+ jsonGroupGroup.SetLatencyPutTabletLog (groupGroup.PutTabletLogLatency );
2165+ jsonGroupGroup.SetLatencyPutUserData (groupGroup.PutUserDataLatency );
2166+ jsonGroupGroup.SetLatencyGetFast (groupGroup.GetFastLatency );
2167+ }
20792168 }
20802169 }
20812170 AddEvent (" RenderingResult" );
0 commit comments