Skip to content

Commit cdb8519

Browse files
authored
Merge 23f1172 into fbe6aca
2 parents fbe6aca + 23f1172 commit cdb8519

File tree

5 files changed

+138
-14
lines changed

5 files changed

+138
-14
lines changed

ydb/core/viewer/json_handlers_storage.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespace NKikimr::NViewer {
55

66
void InitStorageGroupsJsonHandler(TJsonHandlers& jsonHandlers) {
7-
jsonHandlers.AddHandler("/storage/groups", new TJsonHandler<TStorageGroups>(TStorageGroups::GetSwagger()), 5);
7+
jsonHandlers.AddHandler("/storage/groups", new TJsonHandler<TStorageGroups>(TStorageGroups::GetSwagger()), 6);
88
}
99

1010
void InitStorageJsonHandlers(TJsonHandlers& jsonHandlers) {

ydb/core/viewer/json_handlers_viewer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ void InitViewerHealthCheckJsonHandler(TJsonHandlers& handlers) {
243243
}
244244

245245
void InitViewerNodesJsonHandler(TJsonHandlers& handlers) {
246-
handlers.AddHandler("/viewer/nodes", new TJsonHandler<TJsonNodes>(TJsonNodes::GetSwagger()), 7);
246+
handlers.AddHandler("/viewer/nodes", new TJsonHandler<TJsonNodes>(TJsonNodes::GetSwagger()), 8);
247247
}
248248

249249
void InitViewerACLJsonHandler(TJsonHandlers &jsonHandlers) {

ydb/core/viewer/protos/viewer.proto

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,16 @@ message TStorageGroupInfo {
461461
message TStorageGroupGroup {
462462
string GroupName = 1;
463463
uint64 GroupCount = 2;
464+
optional uint64 Used = 13;
465+
optional uint64 Limit = 14;
466+
optional uint64 Available = 15;
467+
optional float Usage = 16;
468+
optional uint64 Read = 17;
469+
optional uint64 Write = 18;
470+
optional float DiskSpaceUsage = 19;
471+
optional uint64 LatencyPutTabletLog = 20;
472+
optional uint64 LatencyPutUserData = 21;
473+
optional uint64 LatencyGetFast = 22;
464474
}
465475

466476
message TStoragePoolInfo {

ydb/core/viewer/storage_groups.h

Lines changed: 95 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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");

ydb/core/viewer/viewer_nodes.h

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ class TJsonNodes : public TViewerPipeClient {
145145
bool OffloadMerge = true;
146146
size_t OffloadMergeAttempts = 2;
147147

148+
using TGroupSortKey = std::variant<TString, ui64, float>;
149+
148150
struct TNode {
149151
TEvInterconnect::TNodeInfo NodeInfo;
150152
NKikimrWhiteboard::TSystemStateInfo SystemState;
@@ -470,6 +472,27 @@ class TJsonNodes : public TViewerPipeClient {
470472
return groupName;
471473
}
472474

475+
TGroupSortKey GetGroupSortKey(ENodeFields groupBy, TInstant now) const {
476+
switch (groupBy) {
477+
case ENodeFields::NodeId:
478+
case ENodeFields::HostName:
479+
case ENodeFields::NodeName:
480+
case ENodeFields::Database:
481+
case ENodeFields::DC:
482+
case ENodeFields::Rack:
483+
case ENodeFields::Version:
484+
return GetGroupName(groupBy, now);
485+
case ENodeFields::DiskSpaceUsage:
486+
return DiskSpaceUsage;
487+
case ENodeFields::Missing:
488+
return MissingDisks;
489+
case ENodeFields::Uptime:
490+
return static_cast<ui64>(now.Seconds()) - (Disconnected ? SystemState.GetDisconnectTime() : SystemState.GetStartTime());
491+
default:
492+
return TString();
493+
}
494+
}
495+
473496
void MergeFrom(const NKikimrWhiteboard::TSystemStateInfo& systemState) {
474497
SystemState.MergeFrom(systemState);
475498
Cleanup();
@@ -479,11 +502,6 @@ class TJsonNodes : public TViewerPipeClient {
479502
}
480503
};
481504

482-
struct TNodeGroup {
483-
TString Name;
484-
std::vector<TNode*> Nodes;
485-
};
486-
487505
struct TNodeBatch {
488506
std::vector<TNode*> NodesToAskFor;
489507
std::vector<TNode*> NodesToAskAbout;
@@ -501,6 +519,12 @@ class TJsonNodes : public TViewerPipeClient {
501519
using TNodeData = std::vector<TNode>;
502520
using TNodeView = std::deque<TNode*>;
503521

522+
struct TNodeGroup {
523+
TString Name;
524+
TGroupSortKey SortKey;
525+
TNodeView Nodes;
526+
};
527+
504528
TNodeData NodeData;
505529
TNodeView NodeView;
506530
std::vector<TNodeGroup> NodeGroups;
@@ -1031,6 +1055,7 @@ class TJsonNodes : public TViewerPipeClient {
10311055
nodeGroups.emplace(gb, NodeGroups.size());
10321056
nodeGroup = &NodeGroups.emplace_back();
10331057
nodeGroup->Name = gb;
1058+
nodeGroup->SortKey = node->GetGroupSortKey(GroupBy, now);
10341059
} else {
10351060
nodeGroup = &NodeGroups[it->second];
10361061
}
@@ -1052,7 +1077,7 @@ class TJsonNodes : public TViewerPipeClient {
10521077
case ENodeFields::Uptime:
10531078
case ENodeFields::Version:
10541079
GroupCollection();
1055-
SortCollection(NodeGroups, [](const TNodeGroup& nodeGroup) { return nodeGroup.Name; });
1080+
SortCollection(NodeGroups, [](const TNodeGroup& nodeGroup) { return nodeGroup.SortKey; });
10561081
NeedGroup = false;
10571082
break;
10581083
case ENodeFields::NodeInfo:

0 commit comments

Comments
 (0)