diff --git a/ydb/core/viewer/json_handlers_viewer.cpp b/ydb/core/viewer/json_handlers_viewer.cpp index 407dbf014f65..fc3a7da1cdf5 100644 --- a/ydb/core/viewer/json_handlers_viewer.cpp +++ b/ydb/core/viewer/json_handlers_viewer.cpp @@ -280,12 +280,12 @@ void InitViewerHealthCheckJsonHandler(TJsonHandlers& handlers) { } void InitViewerNodesJsonHandler(TJsonHandlers& handlers) { - handlers.AddHandler("/viewer/nodes", new TJsonHandler(TJsonNodes::GetSwagger()), 19); + handlers.AddHandler("/viewer/nodes", new TJsonHandler(TJsonNodes::GetSwagger()), 20); } void InitViewerGroupsJsonHandler(TJsonHandlers& jsonHandlers) { - jsonHandlers.AddHandler("/viewer/groups", new TJsonHandler(TStorageGroups::GetSwagger()), 9); - jsonHandlers.AddHandler("/storage/groups", new TJsonHandler(TStorageGroups::GetSwagger()), 9); + jsonHandlers.AddHandler("/viewer/groups", new TJsonHandler(TStorageGroups::GetSwagger()), 10); + jsonHandlers.AddHandler("/storage/groups", new TJsonHandler(TStorageGroups::GetSwagger()), 10); } void InitViewerACLJsonHandler(TJsonHandlers &jsonHandlers) { diff --git a/ydb/core/viewer/pdisk_info.h b/ydb/core/viewer/pdisk_info.h index aa814e4e39e6..70c701e86e0d 100644 --- a/ydb/core/viewer/pdisk_info.h +++ b/ydb/core/viewer/pdisk_info.h @@ -6,6 +6,7 @@ namespace NKikimr::NViewer { using namespace NActors; +using namespace NNodeWhiteboard; class TPDiskInfo : public TViewerPipeClient { enum EEv { @@ -85,14 +86,18 @@ class TPDiskInfo : public TViewerPipeClient { void SendWhiteboardRequests() { TActorId whiteboardServiceId = NNodeWhiteboard::MakeNodeWhiteboardServiceId(NodeId); + auto pdiskRequest = new NNodeWhiteboard::TEvWhiteboard::TEvPDiskStateRequest(); + pdiskRequest->Record.AddFieldsRequired(-1); WhiteboardPDisk = TBase::MakeRequest( whiteboardServiceId, - new NNodeWhiteboard::TEvWhiteboard::TEvPDiskStateRequest, + pdiskRequest, IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession, // we only need it once because we are sending to the same node NodeId); + auto vdiskRequest = new NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateRequest(); + vdiskRequest->Record.AddFieldsRequired(-1); WhiteboardVDisk = TBase::MakeRequest( whiteboardServiceId, - new NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateRequest, + vdiskRequest, 0, NodeId); } diff --git a/ydb/core/viewer/protos/viewer.proto b/ydb/core/viewer/protos/viewer.proto index 6b002554933a..d7befb052fa5 100644 --- a/ydb/core/viewer/protos/viewer.proto +++ b/ydb/core/viewer/protos/viewer.proto @@ -484,6 +484,11 @@ message TStorageGroupInfo { optional uint64 LatencyPutUserData = 21; optional uint64 LatencyGetFast = 22; string PileName = 23; + optional double MaxPDiskUsage = 24; + optional double MaxVDiskSlotUsage = 25; + optional double MaxVDiskRawUsage = 26; + optional double MaxNormalizedOccupancy = 27; + optional string CapacityAlert = 28; repeated TStorageVDisk VDisks = 30; } @@ -574,6 +579,11 @@ message TNodeInfo { optional uint64 PingTimeMinUs = 41; optional uint64 PingTimeMaxUs = 42; optional uint64 ReversePingTimeUs = 43; // Avg + optional double MaxPDiskUsage = 44; + optional double MaxVDiskSlotUsage = 45; + optional double MaxVDiskRawUsage = 46; + optional string CapacityAlert = 47; // the highest across VDisks on this node + optional double MaxNormalizedOccupancy = 48; NKikimrWhiteboard.TSystemStateInfo SystemState = 50; repeated NKikimrWhiteboard.TPDiskStateInfo PDisks = 51; repeated NKikimrWhiteboard.TVDiskStateInfo VDisks = 52; @@ -913,4 +923,3 @@ message TTopicDataResponse { repeated TMessage Messages = 3; bool Truncated = 4; } - diff --git a/ydb/core/viewer/tests/canondata/result.json b/ydb/core/viewer/tests/canondata/result.json index bdd148516cf5..9a6acd479a8a 100644 --- a/ydb/core/viewer/tests/canondata/result.json +++ b/ydb/core/viewer/tests/canondata/result.json @@ -575,8 +575,8 @@ "text": "

403 Forbidden

" }, "cluster_nodes_monitoring": { - "FieldsAvailable": "10000000000000000000110100000011", - "FieldsRequired": "00000000000000000000000000000001", + "FieldsAvailable": "0000010000000000000000000110100000011", + "FieldsRequired": "0000000000000000000000000000000000001", "FoundNodes": "3", "Nodes": [ { @@ -592,8 +592,8 @@ "TotalNodes": "3" }, "cluster_nodes_root": { - "FieldsAvailable": "10000000000000000000110100000011", - "FieldsRequired": "00000000000000000000000000000001", + "FieldsAvailable": "0000010000000000000000000110100000011", + "FieldsRequired": "0000000000000000000000000000000000001", "FoundNodes": "3", "Nodes": [ { @@ -609,8 +609,8 @@ "TotalNodes": "3" }, "cluster_nodes_viewer": { - "FieldsAvailable": "10000000000000000000110100000011", - "FieldsRequired": "00000000000000000000000000000001", + "FieldsAvailable": "0000010000000000000000000110100000011", + "FieldsRequired": "0000000000000000000000000000000000001", "FoundNodes": "3", "Nodes": [ { @@ -626,8 +626,8 @@ "TotalNodes": "3" }, "database_nodes_database": { - "FieldsAvailable": "10000000010000000000110100000011", - "FieldsRequired": "00000000000000000000000000000001", + "FieldsAvailable": "0000010000000010000000000110100000011", + "FieldsRequired": "0000000000000000000000000000000000001", "FoundNodes": "1", "Nodes": [ { @@ -637,8 +637,8 @@ "TotalNodes": "1" }, "database_nodes_monitoring": { - "FieldsAvailable": "10000000010000000000110100000011", - "FieldsRequired": "00000000000000000000000000000001", + "FieldsAvailable": "0000010000000010000000000110100000011", + "FieldsRequired": "0000000000000000000000000000000000001", "FoundNodes": "1", "Nodes": [ { @@ -648,8 +648,8 @@ "TotalNodes": "1" }, "database_nodes_root": { - "FieldsAvailable": "10000000010000000000110100000011", - "FieldsRequired": "00000000000000000000000000000001", + "FieldsAvailable": "0000010000000010000000000110100000011", + "FieldsRequired": "0000000000000000000000000000000000001", "FoundNodes": "1", "Nodes": [ { @@ -659,8 +659,8 @@ "TotalNodes": "1" }, "database_nodes_viewer": { - "FieldsAvailable": "10000000010000000000110100000011", - "FieldsRequired": "00000000000000000000000000000001", + "FieldsAvailable": "0000010000000010000000000110100000011", + "FieldsRequired": "0000000000000000000000000000000000001", "FoundNodes": "1", "Nodes": [ { @@ -722,8 +722,8 @@ "text": "Access denied" }, "storage_nodes_database": { - "FieldsAvailable": "10000000110011000000110100000011", - "FieldsRequired": "00000000000000000000000000000011", + "FieldsAvailable": "0000010000000110011000000110100000011", + "FieldsRequired": "0000000000000000000000000000000000011", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", @@ -735,8 +735,8 @@ "TotalNodes": "1" }, "storage_nodes_monitoring": { - "FieldsAvailable": "10000000110011000000110100000011", - "FieldsRequired": "00000000000000000000000000000011", + "FieldsAvailable": "0000010000000110011000000110100000011", + "FieldsRequired": "0000000000000000000000000000000000011", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", @@ -748,8 +748,8 @@ "TotalNodes": "1" }, "storage_nodes_root": { - "FieldsAvailable": "10000000110011000000110100000011", - "FieldsRequired": "00000000000000000000000000000011", + "FieldsAvailable": "0000010000000110011000000110100000011", + "FieldsRequired": "0000000000000000000000000000000000011", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", @@ -761,8 +761,8 @@ "TotalNodes": "1" }, "storage_nodes_viewer": { - "FieldsAvailable": "10000000110011000000110100000011", - "FieldsRequired": "00000000000000000000000000000011", + "FieldsAvailable": "0000010000000110011000000110100000011", + "FieldsRequired": "0000000000000000000000000000000000011", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", @@ -775,13 +775,14 @@ } }, "test.TestViewer.test_storage_groups": { - "FieldsAvailable": "0111111111111111111111", - "FieldsRequired": "1111111111111111111111", + "FieldsAvailable": "111110111111111111111111111", + "FieldsRequired": "111111111111111111111111111", "FoundGroups": 5, "StorageGroups": [ { "AllocationUnits": "0", "Available": "not-zero-number-text", + "CapacityAlert": "GREEN", "DiskSpace": "Green", "DiskSpaceUsage": "not-zero-number", "ErasureSpecies": "none", @@ -791,6 +792,10 @@ "LatencyPutTabletLog": "accepted-value", "LatencyPutUserData": "accepted-value", "Limit": "not-zero-number-text", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "MissingDisks": "0", "Overall": "Green", "PoolName": "static", @@ -826,6 +831,7 @@ "LogUsedSize": "not-zero-number-text", "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -839,6 +845,7 @@ "Whiteboard": { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -847,6 +854,7 @@ "IncarnationGuid": "not-zero-number-text", "InstanceGuid": "not-zero-number-text", "Kind": "0", + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "SatisfactionRank": { @@ -865,7 +873,9 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 0, + "VDiskSlotUsage": 0, "VDiskState": "OK" } } @@ -874,6 +884,7 @@ { "AllocationUnits": "0", "Available": "not-zero-number-text", + "CapacityAlert": "GREEN", "DiskSpace": "Green", "DiskSpaceUsage": "not-zero-number", "ErasureSpecies": "none", @@ -884,6 +895,10 @@ "LatencyPutTabletLog": "accepted-value", "LatencyPutUserData": "accepted-value", "Limit": "not-zero-number-text", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "MediaType": "ROT,Kind:0", "MissingDisks": "0", "Overall": "Green", @@ -920,6 +935,7 @@ "LogUsedSize": "not-zero-number-text", "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -933,6 +949,7 @@ "Whiteboard": { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -941,6 +958,7 @@ "IncarnationGuid": "not-zero-number-text", "InstanceGuid": "not-zero-number-text", "Kind": "0", + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "SatisfactionRank": { @@ -959,7 +977,9 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1000, + "VDiskSlotUsage": 0, "VDiskState": "OK" } } @@ -968,6 +988,7 @@ { "AllocationUnits": "0", "Available": "not-zero-number-text", + "CapacityAlert": "GREEN", "DiskSpace": "Green", "DiskSpaceUsage": "not-zero-number", "ErasureSpecies": "none", @@ -978,6 +999,10 @@ "LatencyPutTabletLog": "accepted-value", "LatencyPutUserData": "accepted-value", "Limit": "not-zero-number-text", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "MediaType": "ROT,Kind:0", "MissingDisks": "0", "Overall": "Green", @@ -1014,6 +1039,7 @@ "LogUsedSize": "not-zero-number-text", "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -1027,6 +1053,7 @@ "Whiteboard": { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -1035,6 +1062,7 @@ "IncarnationGuid": "not-zero-number-text", "InstanceGuid": "not-zero-number-text", "Kind": "0", + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "SatisfactionRank": { @@ -1053,7 +1081,9 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1001, + "VDiskSlotUsage": 0, "VDiskState": "OK" } } @@ -1062,6 +1092,7 @@ { "AllocationUnits": "32", "Available": "not-zero-number-text", + "CapacityAlert": "GREEN", "DiskSpace": "Green", "DiskSpaceUsage": "not-zero-number", "ErasureSpecies": "none", @@ -1072,6 +1103,10 @@ "LatencyPutTabletLog": "accepted-value", "LatencyPutUserData": "accepted-value", "Limit": "not-zero-number-text", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "MediaType": "ROT", "MissingDisks": "0", "Overall": "Green", @@ -1108,6 +1143,7 @@ "LogUsedSize": "not-zero-number-text", "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -1121,6 +1157,7 @@ "Whiteboard": { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -1129,6 +1166,7 @@ "IncarnationGuid": "not-zero-number-text", "InstanceGuid": "not-zero-number-text", "Kind": "0", + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "SatisfactionRank": { @@ -1147,7 +1185,9 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1002, + "VDiskSlotUsage": 0, "VDiskState": "OK" } } @@ -1156,6 +1196,7 @@ { "AllocationUnits": "52", "Available": "not-zero-number-text", + "CapacityAlert": "GREEN", "DiskSpace": "Green", "DiskSpaceUsage": "not-zero-number", "ErasureSpecies": "none", @@ -1166,6 +1207,10 @@ "LatencyPutTabletLog": "accepted-value", "LatencyPutUserData": "accepted-value", "Limit": "not-zero-number-text", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "MediaType": "ROT", "MissingDisks": "0", "Overall": "Green", @@ -1202,6 +1247,7 @@ "LogUsedSize": "not-zero-number-text", "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -1215,6 +1261,7 @@ "Whiteboard": { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -1223,6 +1270,7 @@ "IncarnationGuid": "not-zero-number-text", "InstanceGuid": "not-zero-number-text", "Kind": "0", + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "SatisfactionRank": { @@ -1241,7 +1289,9 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1003, + "VDiskSlotUsage": 0, "VDiskState": "OK" } } @@ -3936,6 +3986,106 @@ "Status": "StatusSuccess" } }, + "test.TestViewer.test_viewer_groups_group_by_capacity_alert": [ + { + "FieldsAvailable": "111110111111011111011110001", + "FieldsRequired": "100000000010000000000000001", + "FoundGroups": 5, + "StorageGroupGroups": [ + { + "Available": "not-zero-number-text", + "DiskSpaceUsage": "not-zero-number", + "GroupCount": "5", + "GroupName": "GREEN", + "LatencyGetFast": "accepted-value", + "LatencyPutTabletLog": "accepted-value", + "LatencyPutUserData": "accepted-value", + "Limit": "not-zero-number-text", + "Usage": "number", + "Used": "0" + } + ], + "TotalGroups": 5 + }, + { + "FieldsAvailable": "111110111111011111011110001", + "FieldsRequired": "100000000010000000000000001", + "FoundGroups": 5, + "StorageGroups": [ + { + "CapacityAlert": "GREEN", + "GroupId": "0" + }, + { + "CapacityAlert": "GREEN", + "GroupId": "2181038080" + }, + { + "CapacityAlert": "GREEN", + "GroupId": "2181038081" + }, + { + "CapacityAlert": "GREEN", + "GroupId": "2181038082" + }, + { + "CapacityAlert": "GREEN", + "GroupId": "2181038083" + } + ], + "TotalGroups": 5 + } + ], + "test.TestViewer.test_viewer_groups_group_by_pool_name": [ + { + "FieldsAvailable": "000000100000000000100011111", + "FieldsRequired": "000000000000000000000000011", + "FoundGroups": 5, + "StorageGroupGroups": [ + { + "GroupCount": "1", + "GroupName": "/Root/dedicated_db:hdd", + "LatencyGetFast": "accepted-value", + "LatencyPutTabletLog": "accepted-value", + "LatencyPutUserData": "accepted-value" + }, + { + "GroupCount": "1", + "GroupName": "/Root/shared_db:hdd", + "LatencyGetFast": "accepted-value", + "LatencyPutTabletLog": "accepted-value", + "LatencyPutUserData": "accepted-value" + }, + { + "GroupCount": "2", + "GroupName": "dynamic_storage_pool:1", + "LatencyGetFast": "accepted-value", + "LatencyPutTabletLog": "accepted-value", + "LatencyPutUserData": "accepted-value" + }, + { + "GroupCount": "1", + "GroupName": "static", + "LatencyGetFast": "accepted-value", + "LatencyPutTabletLog": "accepted-value", + "LatencyPutUserData": "accepted-value" + } + ], + "TotalGroups": 5 + }, + { + "FieldsAvailable": "000000100000000000100011111", + "FieldsRequired": "000000000000000000000000011", + "FoundGroups": 1, + "StorageGroups": [ + { + "GroupId": "0", + "PoolName": "static" + } + ], + "TotalGroups": 5 + } + ], "test.TestViewer.test_viewer_healthcheck": { "/Root": { "location": { @@ -4097,8 +4247,8 @@ }, "test.TestViewer.test_viewer_nodes": { "/Root": { - "FieldsAvailable": "10000000010000110111111100000111", - "FieldsRequired": "00000000000000000000000000000101", + "FieldsAvailable": "0000010000000010000110111111100000111", + "FieldsRequired": "0000000000000000000000000000000000101", "FoundNodes": "1", "Nodes": [ { @@ -4175,8 +4325,8 @@ "TotalNodes": "1" }, "/Root/dedicated_db": { - "FieldsAvailable": "10000000010000110111111100000111", - "FieldsRequired": "00000000000000000000000000000101", + "FieldsAvailable": "0000010000000010000110111111100000111", + "FieldsRequired": "0000000000000000000000000000000000101", "FoundNodes": "1", "Nodes": [ { @@ -4251,8 +4401,8 @@ "TotalNodes": "1" }, "/Root/serverless_db": { - "FieldsAvailable": "10000000010000110111111100000111", - "FieldsRequired": "00000000000000000000000000000101", + "FieldsAvailable": "0000010000000010000110111111100000111", + "FieldsRequired": "0000000000000000000000000000000000101", "FoundNodes": "1", "Nodes": [ { @@ -4330,8 +4480,8 @@ "TotalNodes": "1" }, "/Root/shared_db": { - "FieldsAvailable": "10000000010000110111111100000111", - "FieldsRequired": "00000000000000000000000000000101", + "FieldsAvailable": "0000010000000010000110111111100000111", + "FieldsRequired": "0000000000000000000000000000000000101", "FoundNodes": "1", "Nodes": [ { @@ -4406,8 +4556,8 @@ "TotalNodes": "1" }, "no-database": { - "FieldsAvailable": "10000000010100110111111100000111", - "FieldsRequired": "00000000000100000000000000000101", + "FieldsAvailable": "0000010000000010100110111111100000111", + "FieldsRequired": "0000000000000000100000000000000000101", "FoundNodes": "3", "Nodes": [ { @@ -4622,13 +4772,14 @@ }, "test.TestViewer.test_viewer_nodes_all": { "/Root": { - "FieldsAvailable": "11111111110111111111111111111111", - "FieldsRequired": "11111111111111111111111111111111", + "FieldsAvailable": "1111111111111110111111111111111111111", + "FieldsRequired": "1111111111111111111111111111111111111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", "Nodes": [ { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -4637,6 +4788,10 @@ "CpuUsage": "not-zero-number", "Database": "/Root", "DiskSpaceUsage": "not-zero-number", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -4654,6 +4809,7 @@ "NodeId": 1, "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -4815,6 +4971,7 @@ { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -4824,6 +4981,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -4844,12 +5002,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 0, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -4859,6 +5020,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -4879,12 +5041,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1000, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -4894,6 +5059,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -4914,12 +5080,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1001, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -4929,6 +5098,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -4949,12 +5119,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1002, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -4964,6 +5137,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -4984,7 +5158,9 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1003, + "VDiskSlotUsage": 0, "VDiskState": "OK" } ] @@ -4993,13 +5169,14 @@ "TotalNodes": "1" }, "/Root/dedicated_db": { - "FieldsAvailable": "11111111110111111111111111111111", - "FieldsRequired": "11111111111111111111111111111111", + "FieldsAvailable": "1111111111111110111111111111111111111", + "FieldsRequired": "1111111111111111111111111111111111111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", "Nodes": [ { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -5007,6 +5184,10 @@ "Connections": "not-zero-number", "CpuUsage": "not-zero-number", "Database": "/Root/dedicated_db", + "MaxNormalizedOccupancy": 0, + "MaxPDiskUsage": 0, + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -5200,13 +5381,14 @@ "TotalNodes": "1" }, "/Root/serverless_db": { - "FieldsAvailable": "11111111110111111111111111111111", - "FieldsRequired": "11111111111111111111111111111111", + "FieldsAvailable": "1111111111111110111111111111111111111", + "FieldsRequired": "1111111111111111111111111111111111111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", "Nodes": [ { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -5214,6 +5396,10 @@ "Connections": "not-zero-number", "CpuUsage": "not-zero-number", "Database": "/Root/shared_db", + "MaxNormalizedOccupancy": 0, + "MaxPDiskUsage": 0, + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -5397,13 +5583,14 @@ "TotalNodes": "1" }, "/Root/shared_db": { - "FieldsAvailable": "11111111110111111111111111111111", - "FieldsRequired": "11111111111111111111111111111111", + "FieldsAvailable": "1111111111111110111111111111111111111", + "FieldsRequired": "1111111111111111111111111111111111111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", "Nodes": [ { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -5411,6 +5598,10 @@ "Connections": "not-zero-number", "CpuUsage": "not-zero-number", "Database": "/Root/shared_db", + "MaxNormalizedOccupancy": 0, + "MaxPDiskUsage": 0, + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -5604,13 +5795,14 @@ "TotalNodes": "1" }, "no-database": { - "FieldsAvailable": "11111111110111111111111111111111", - "FieldsRequired": "11111111111111111111111111111111", + "FieldsAvailable": "1111111111111110111111111111111111111", + "FieldsRequired": "1111111111111111111111111111111111111", "FoundNodes": "3", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", "Nodes": [ { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -5618,6 +5810,10 @@ "Connections": "not-zero-number", "CpuUsage": "not-zero-number", "DiskSpaceUsage": "not-zero-number", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -5635,6 +5831,7 @@ "NodeId": 1, "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -5848,6 +6045,7 @@ { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -5857,6 +6055,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -5877,12 +6076,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 0, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -5892,6 +6094,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -5912,12 +6115,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1000, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -5927,6 +6133,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -5947,12 +6154,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1001, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -5962,6 +6172,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -5982,12 +6193,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1002, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -5997,6 +6211,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -6017,12 +6232,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1003, + "VDiskSlotUsage": 0, "VDiskState": "OK" } ] }, { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -6030,6 +6248,10 @@ "Connections": "not-zero-number", "CpuUsage": "not-zero-number", "Database": "/Root/shared_db", + "MaxNormalizedOccupancy": 0, + "MaxPDiskUsage": 0, + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -6220,6 +6442,7 @@ "UptimeSeconds": "number" }, { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -6227,6 +6450,10 @@ "Connections": "not-zero-number", "CpuUsage": "not-zero-number", "Database": "/Root/dedicated_db", + "MaxNormalizedOccupancy": 0, + "MaxPDiskUsage": 0, + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -6420,10 +6647,243 @@ "TotalNodes": "3" } }, + "test.TestViewer.test_viewer_nodes_group": [ + { + "FieldsAvailable": "1111010000000110100110111111100010111", + "FieldsRequired": "1000000000000000100000000000000010101", + "FoundNodes": "3", + "MaximumSlotsPerDisk": "5", + "NodeGroups": [ + { + "GroupName": "GREEN", + "NodeCount": "3" + } + ], + "TotalNodes": "3" + }, + { + "FieldsAvailable": "1111010000000110100110111111100010111", + "FieldsRequired": "1000000000000000100000000000000010101", + "FoundNodes": "3", + "MaximumSlotsPerDisk": "5", + "Nodes": [ + { + "CapacityAlert": "GREEN", + "NodeId": 1, + "SystemState": { + "ChangeTime": "not-zero-number-text", + "CoresTotal": "not-zero-number", + "CoresUsed": "not-zero-number", + "Endpoints": [ + { + "Address": "text", + "Name": "grpc" + }, + { + "Address": "text", + "Name": "http-mon" + }, + { + "Address": "text", + "Name": "ic" + } + ], + "Host": "text", + "LoadAverage": "not-empty-array", + "Location": { + "DataCenter": "1", + "Rack": "1", + "Unit": "1" + }, + "MaxDiskUsage": "not-zero-number", + "MemoryLimit": "not-zero-number-text", + "NodeId": 1, + "NumberOfCpus": "not-zero-number", + "PoolStats": [ + { + "Limit": "not-zero-number", + "Name": "System", + "Threads": 2, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "User", + "Threads": 3, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "Batch", + "Threads": 2, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "IO", + "Threads": 1, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "IC", + "Threads": 1, + "Usage": "number" + } + ], + "RealNumberOfCpus": "not-zero-number", + "Roles": "not-empty-array", + "StartTime": "not-zero-number-text", + "SystemState": "Green", + "TotalSessions": "number" + } + }, + { + "CapacityAlert": "GREEN", + "NodeId": 50001, + "SystemState": { + "ChangeTime": "not-zero-number-text", + "CoresTotal": "not-zero-number", + "CoresUsed": "not-zero-number", + "Endpoints": [ + { + "Address": "text", + "Name": "grpc" + }, + { + "Address": "text", + "Name": "http-mon" + }, + { + "Address": "text", + "Name": "ic" + } + ], + "Host": "text", + "LoadAverage": "not-empty-array", + "Location": {}, + "MemoryLimit": "not-zero-number-text", + "NodeId": 50001, + "NumberOfCpus": "not-zero-number", + "PoolStats": [ + { + "Limit": "not-zero-number", + "Name": "System", + "Threads": 2, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "User", + "Threads": 3, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "Batch", + "Threads": 2, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "IO", + "Threads": 1, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "IC", + "Threads": 1, + "Usage": "number" + } + ], + "RealNumberOfCpus": "not-zero-number", + "Roles": "not-empty-array", + "StartTime": "not-zero-number-text", + "SystemState": "Green", + "Tenants": [ + "/Root/shared_db" + ], + "TotalSessions": "number" + } + }, + { + "CapacityAlert": "GREEN", + "NodeId": 50000, + "SystemState": { + "ChangeTime": "not-zero-number-text", + "CoresTotal": "not-zero-number", + "CoresUsed": "not-zero-number", + "Endpoints": [ + { + "Address": "text", + "Name": "grpc" + }, + { + "Address": "text", + "Name": "http-mon" + }, + { + "Address": "text", + "Name": "ic" + } + ], + "Host": "text", + "LoadAverage": "not-empty-array", + "Location": {}, + "MemoryLimit": "not-zero-number-text", + "NodeId": 50000, + "NumberOfCpus": "not-zero-number", + "PoolStats": [ + { + "Limit": "not-zero-number", + "Name": "System", + "Threads": 2, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "User", + "Threads": 3, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "Batch", + "Threads": 2, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "IO", + "Threads": 1, + "Usage": "number" + }, + { + "Limit": "not-zero-number", + "Name": "IC", + "Threads": 1, + "Usage": "number" + } + ], + "RealNumberOfCpus": "not-zero-number", + "Roles": "not-empty-array", + "StartTime": "not-zero-number-text", + "SystemState": "Green", + "Tenants": [ + "/Root/dedicated_db" + ], + "TotalSessions": "number" + } + } + ], + "TotalNodes": "3" + } + ], "test.TestViewer.test_viewer_nodes_issue_14992": { "response_group": { - "FieldsAvailable": "10000000110111110111111100000111", - "FieldsRequired": "00000000001100000010000000000101", + "FieldsAvailable": "0000010000000110111110111111100000111", + "FieldsRequired": "0000000000000001100000010000000000101", "FoundNodes": "3", "MaximumDisksPerNode": "1", "Nodes": [ @@ -6640,8 +7100,8 @@ "TotalNodes": "3" }, "response_group_by": { - "FieldsAvailable": "10000000110111110111111100000111", - "FieldsRequired": "00000000001100000010000000000101", + "FieldsAvailable": "0000010000000110111110111111100000111", + "FieldsRequired": "0000000000000001100000010000000000101", "FoundNodes": "3", "MaximumDisksPerNode": "1", "NodeGroups": [ @@ -7612,8 +8072,8 @@ }, "test.TestViewer.test_viewer_storage_nodes": { "/Root": { - "FieldsAvailable": "10000000110011110111111100000111", - "FieldsRequired": "00000000000000000000000000000111", + "FieldsAvailable": "0000010000000110011110111111100000111", + "FieldsRequired": "0000000000000000000000000000000000111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", @@ -7692,8 +8152,8 @@ "TotalNodes": "1" }, "/Root/dedicated_db": { - "FieldsAvailable": "10000000110011110111111100000111", - "FieldsRequired": "00000000000000000000000000000111", + "FieldsAvailable": "0000010000000110011110111111100000111", + "FieldsRequired": "0000000000000000000000000000000000111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", @@ -7772,8 +8232,8 @@ "TotalNodes": "1" }, "/Root/serverless_db": { - "FieldsAvailable": "10000000110011110111111100000111", - "FieldsRequired": "00000000000000000000000000000111", + "FieldsAvailable": "0000010000000110011110111111100000111", + "FieldsRequired": "0000000000000000000000000000000000111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", @@ -7855,8 +8315,8 @@ "TotalNodes": "1" }, "/Root/shared_db": { - "FieldsAvailable": "10000000110011110111111100000111", - "FieldsRequired": "00000000000000000000000000000111", + "FieldsAvailable": "0000010000000110011110111111100000111", + "FieldsRequired": "0000000000000000000000000000000000111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", @@ -7935,8 +8395,8 @@ "TotalNodes": "1" }, "no-database": { - "FieldsAvailable": "10000000110111110111111100000111", - "FieldsRequired": "00000000000100000000000000000111", + "FieldsAvailable": "0000010000000110111110111111100000111", + "FieldsRequired": "0000000000000000100000000000000000111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "Nodes": [ @@ -8016,13 +8476,14 @@ }, "test.TestViewer.test_viewer_storage_nodes_all": { "/Root": { - "FieldsAvailable": "11111111110111111111111111111111", - "FieldsRequired": "11111111111111111111111111111111", + "FieldsAvailable": "1111111111111110111111111111111111111", + "FieldsRequired": "1111111111111111111111111111111111111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", "Nodes": [ { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -8031,6 +8492,10 @@ "CpuUsage": "not-zero-number", "Database": "/Root", "DiskSpaceUsage": "not-zero-number", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -8048,6 +8513,7 @@ "NodeId": 1, "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -8209,6 +8675,7 @@ { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8218,6 +8685,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -8238,12 +8706,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 0, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8253,6 +8724,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -8273,12 +8745,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1000, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8288,6 +8763,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -8308,12 +8784,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1001, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8323,6 +8802,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -8343,12 +8823,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1002, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8358,6 +8841,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -8378,7 +8862,9 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1003, + "VDiskSlotUsage": 0, "VDiskState": "OK" } ] @@ -8387,13 +8873,14 @@ "TotalNodes": "1" }, "/Root/dedicated_db": { - "FieldsAvailable": "11111111110111111111111111111111", - "FieldsRequired": "11111111111111111111111111111111", + "FieldsAvailable": "1111111111111110111111111111111111111", + "FieldsRequired": "1111111111111111111111111111111111111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", "Nodes": [ { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -8401,6 +8888,10 @@ "Connections": "not-zero-number", "CpuUsage": "not-zero-number", "DiskSpaceUsage": "not-zero-number", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -8418,6 +8909,7 @@ "NodeId": 1, "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -8579,6 +9071,7 @@ { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8588,6 +9081,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -8608,12 +9102,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 0, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8623,6 +9120,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -8643,12 +9141,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1000, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8658,6 +9159,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -8678,12 +9180,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1001, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8693,6 +9198,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -8713,12 +9219,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1002, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8728,6 +9237,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -8748,7 +9258,9 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1003, + "VDiskSlotUsage": 0, "VDiskState": "OK" } ] @@ -8757,13 +9269,14 @@ "TotalNodes": "1" }, "/Root/serverless_db": { - "FieldsAvailable": "11111111110111111111111111111111", - "FieldsRequired": "11111111111111111111111111111111", + "FieldsAvailable": "1111111111111110111111111111111111111", + "FieldsRequired": "1111111111111111111111111111111111111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", "Nodes": [ { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -8771,6 +9284,10 @@ "Connections": "not-zero-number", "CpuUsage": "not-zero-number", "DiskSpaceUsage": "not-zero-number", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -8788,6 +9305,7 @@ "NodeId": 1, "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -8949,6 +9467,7 @@ { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8958,6 +9477,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -8978,12 +9498,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 0, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -8993,6 +9516,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9013,12 +9537,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1000, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9028,6 +9555,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9048,12 +9576,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1001, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9063,6 +9594,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9083,12 +9615,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1002, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9098,6 +9633,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9118,7 +9654,9 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1003, + "VDiskSlotUsage": 0, "VDiskState": "OK" } ] @@ -9127,13 +9665,14 @@ "TotalNodes": "1" }, "/Root/shared_db": { - "FieldsAvailable": "11111111110111111111111111111111", - "FieldsRequired": "11111111111111111111111111111111", + "FieldsAvailable": "1111111111111110111111111111111111111", + "FieldsRequired": "1111111111111111111111111111111111111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", "Nodes": [ { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -9141,6 +9680,10 @@ "Connections": "not-zero-number", "CpuUsage": "not-zero-number", "DiskSpaceUsage": "not-zero-number", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -9158,6 +9701,7 @@ "NodeId": 1, "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -9319,6 +9863,7 @@ { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9328,6 +9873,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9348,12 +9894,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 0, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9363,6 +9912,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9383,12 +9933,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1000, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9398,6 +9951,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9418,12 +9972,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1001, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9433,6 +9990,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9453,12 +10011,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1002, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9468,6 +10029,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9488,7 +10050,9 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1003, + "VDiskSlotUsage": 0, "VDiskState": "OK" } ] @@ -9497,13 +10061,14 @@ "TotalNodes": "1" }, "no-database": { - "FieldsAvailable": "11111111110111111111111111111111", - "FieldsRequired": "11111111111111111111111111111111", + "FieldsAvailable": "1111111111111110111111111111111111111", + "FieldsRequired": "1111111111111111111111111111111111111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "MaximumSlotsPerDisk": "5", "Nodes": [ { + "CapacityAlert": "GREEN", "ClockSkewMaxUs": "text", "ClockSkewMinUs": "text", "ClockSkewUs": "text", @@ -9511,6 +10076,10 @@ "Connections": "not-zero-number", "CpuUsage": "not-zero-number", "DiskSpaceUsage": "not-zero-number", + "MaxNormalizedOccupancy": "not-zero-number", + "MaxPDiskUsage": "not-zero-number", + "MaxVDiskRawUsage": 0, + "MaxVDiskSlotUsage": 0, "NetworkUtilization": "number", "NetworkUtilizationMax": "number", "NetworkUtilizationMin": "number", @@ -9528,6 +10097,7 @@ "NodeId": 1, "NumActiveSlots": 5, "PDiskId": 1, + "PDiskUsage": "not-zero-number", "Path": "SectorMap:1:64", "Realtime": "Green", "SerialNumber": "", @@ -9741,6 +10311,7 @@ { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9750,6 +10321,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9770,12 +10342,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 0, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9785,6 +10360,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9805,12 +10381,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1000, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9820,6 +10399,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9840,12 +10420,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1001, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9855,6 +10438,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9875,12 +10459,15 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1002, + "VDiskSlotUsage": 0, "VDiskState": "OK" }, { "AllocatedSize": "0", "AvailableSize": "not-zero-number-text", + "CapacityAlert": "GREEN", "ChangeTime": "not-zero-number-text", "DiskSpace": "Green", "FrontQueues": "Green", @@ -9890,6 +10477,7 @@ "InstanceGuid": "not-zero-number-text", "Kind": "0", "NodeId": 1, + "NormalizedOccupancy": "not-zero-number", "PDiskId": 1, "Replicated": true, "ReplicationProgress": 1, @@ -9910,7 +10498,9 @@ "Ring": 0, "VDisk": 0 }, + "VDiskRawUsage": 0, "VDiskSlotId": 1003, + "VDiskSlotUsage": 0, "VDiskState": "OK" } ] @@ -9920,8 +10510,8 @@ } }, "test.TestViewer.test_viewer_storage_nodes_no_database": { - "FieldsAvailable": "10000000110111110111111100000111", - "FieldsRequired": "00000000000100000000000000000111", + "FieldsAvailable": "0000010000000110111110111111100000111", + "FieldsRequired": "0000000000000000100000000000000000111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "Nodes": [ @@ -9999,8 +10589,8 @@ "TotalNodes": "1" }, "test.TestViewer.test_viewer_storage_nodes_no_database_filter_node_id": { - "FieldsAvailable": "10000000110111110111111100000111", - "FieldsRequired": "00000000000100000000000000000111", + "FieldsAvailable": "0000010000000110111110111111100000111", + "FieldsRequired": "0000000000000000100000000000000000111", "FoundNodes": "1", "MaximumDisksPerNode": "1", "Nodes": [ diff --git a/ydb/core/viewer/tests/test.py b/ydb/core/viewer/tests/test.py index 6ad676e473b3..cc8ee743813a 100644 --- a/ydb/core/viewer/tests/test.py +++ b/ydb/core/viewer/tests/test.py @@ -542,6 +542,10 @@ def normalize_result(cls, result): # groups replace_with_values.update({'Available', 'Limit', + 'MaxPDiskUsage', + 'MaxVDiskSlotUsage', + 'MaxNormalizedOccupancy', + 'MaxVDiskRawUsage', }) # pdisks @@ -552,6 +556,7 @@ def normalize_result(cls, result): 'SlotSize', 'SlotCount', 'EnforcedDynamicSlotSize', + 'PDiskUsage', }) result = cls.replace_values_by_key_and_value(result, {'Status'}, {'ACTIVE', 'INACTIVE'}) @@ -565,6 +570,9 @@ def normalize_result(cls, result): 'ReadThroughput', 'StorageSize', 'StorageCount', + 'VDiskSlotUsage', + 'NormalizedOccupancy', + 'VDiskRawUsage', }) # cluster @@ -655,12 +663,48 @@ def test_viewer_storage_nodes_all(cls): }) return result + @classmethod + def test_viewer_nodes_group(cls): + return [ + cls.get_viewer_normalized("/viewer/nodes", { + 'group': 'CapacityAlert' + }), + cls.get_viewer_normalized("/viewer/nodes", { + 'filter_group_by': 'CapacityAlert', + 'filter_group': 'GREEN' + }) + ] + @classmethod def test_storage_groups(cls): return cls.normalize_result(cls.get_viewer("/viewer/groups", { 'fields_required': 'all' })) + @classmethod + def test_viewer_groups_group_by_pool_name(cls): + return [ + cls.get_viewer_normalized("/viewer/groups", { + 'group': 'PoolName' + }), + cls.get_viewer_normalized("/viewer/groups", { + 'filter_group_by': 'PoolName', + 'filter_group': 'static' + }) + ] + + @classmethod + def test_viewer_groups_group_by_capacity_alert(cls): + return [ + cls.get_viewer_normalized("/viewer/groups", { + 'group': 'CapacityAlert' + }), + cls.get_viewer_normalized("/viewer/groups", { + 'filter_group_by': 'CapacityAlert', + 'filter_group': 'GREEN' + }) + ] + @classmethod def test_viewer_sysinfo(cls): result = cls.get_viewer_normalized("/viewer/sysinfo") diff --git a/ydb/core/viewer/viewer_groups.h b/ydb/core/viewer/viewer_groups.h index 80ec44dd251a..af21d89396a8 100644 --- a/ydb/core/viewer/viewer_groups.h +++ b/ydb/core/viewer/viewer_groups.h @@ -105,6 +105,11 @@ enum class EGroupFields : ui8 { PDisk, // PDisk information Latency, PileName, + MaxPDiskUsage, + MaxVDiskSlotUsage, + MaxVDiskRawUsage, + MaxNormalizedOccupancy, + CapacityAlert, COUNT }; @@ -194,6 +199,7 @@ class TStorageGroups : public TViewerPipeClient { ui64 Category = 0; TString DecommitStatus; NKikimrViewer::EFlag DiskSpace = NKikimrViewer::EFlag::Grey; + float PDiskUsage = 0; void SetCategory(ui64 category) { Category = category; @@ -246,6 +252,10 @@ class TStorageGroups : public TViewerPipeClient { bool Donor = false; std::vector Donors; bool Present = false; + float VDiskSlotUsage = 0; + float VDiskRawUsage = 0; + float NormalizedOccupancy = 0; + NKikimrBlobStorage::TPDiskSpaceColor::E CapacityAlert = {}; TString GetVDiskId() const { return TStringBuilder() << VDiskId.GroupID.GetRawId() << '-' @@ -286,7 +296,11 @@ class TStorageGroups : public TViewerPipeClient { NKikimrViewer::EFlag DiskSpace = NKikimrViewer::EFlag::Grey; float DiskSpaceUsage = 0; // the highest TString PileName; - + float MaxPDiskUsage = 0; + float MaxVDiskSlotUsage = 0; + float MaxVDiskRawUsage = 0; + float MaxNormalizedOccupancy = 0; + NKikimrBlobStorage::TPDiskSpaceColor::E CapacityAlert = {}; std::vector VDisks; std::vector VDiskNodeIds; // filter nodes to request disk info from the whiteboard. could be duplicated. @@ -463,11 +477,13 @@ class TStorageGroups : public TViewerPipeClient { ui64 limit = 0; DiskSpace = NKikimrViewer::EFlag::Grey; DiskSpaceUsage = 0; + MaxPDiskUsage = 0; for (TVDisk& vdisk : VDisks) { auto itPDisk = pDisks.find(vdisk.VSlotId); if (itPDisk != pDisks.end()) { DiskSpace = std::max(DiskSpace, vdisk.DiskSpace); DiskSpaceUsage = std::max(DiskSpaceUsage, itPDisk->second.GetDiskSpaceUsage()); + MaxPDiskUsage = std::max(MaxPDiskUsage, itPDisk->second.PDiskUsage); ui64 slotSize = itPDisk->second.GetSlotTotalSize(); ui64 slotAvailable = slotSize > vdisk.AllocatedSize ? slotSize - vdisk.AllocatedSize : 0; if (slotAvailable < vdisk.AvailableSize || vdisk.AvailableSize == 0) { @@ -493,6 +509,20 @@ class TStorageGroups : public TViewerPipeClient { } } + void CalcCapacityMetrics() { + MaxVDiskSlotUsage = 0; + MaxNormalizedOccupancy = 0; + MaxVDiskRawUsage = 0; + CapacityAlert = NKikimrBlobStorage::TPDiskSpaceColor::GREEN; + + for (TVDisk& vdisk : VDisks) { + MaxVDiskSlotUsage = std::max(MaxVDiskSlotUsage, vdisk.VDiskSlotUsage); + MaxNormalizedOccupancy = std::max(MaxNormalizedOccupancy, vdisk.NormalizedOccupancy); + MaxVDiskRawUsage = std::max(MaxVDiskRawUsage, vdisk.VDiskRawUsage); + CapacityAlert = std::max(CapacityAlert, vdisk.CapacityAlert); + } + } + void CalcReadWrite() { ui64 read = 0; ui64 write = 0; @@ -547,6 +577,9 @@ class TStorageGroups : public TViewerPipeClient { case EGroupFields::PileName: groupName = PileName; break; + case EGroupFields::CapacityAlert: + groupName = NKikimrBlobStorage::TPDiskSpaceColor::E_Name(CapacityAlert); + break; default: break; } @@ -577,6 +610,15 @@ class TStorageGroups : public TViewerPipeClient { return MissingDisks; case EGroupFields::Latency: return PutTabletLogLatency; + case EGroupFields::MaxPDiskUsage: + return (float)MaxPDiskUsage; + case EGroupFields::MaxVDiskSlotUsage: + case EGroupFields::CapacityAlert: + return (float)MaxVDiskSlotUsage; + case EGroupFields::MaxNormalizedOccupancy: + return (float)MaxNormalizedOccupancy; + case EGroupFields::MaxVDiskRawUsage: + return (float)MaxVDiskRawUsage; default: return TString(); } @@ -657,7 +699,12 @@ class TStorageGroups : public TViewerPipeClient { const TFieldsType FieldsGroupAvailableAndDiskSpace = TFieldsType().set(+EGroupFields::Available) .set(+EGroupFields::Limit) .set(+EGroupFields::Usage) - .set(+EGroupFields::DiskSpaceUsage); + .set(+EGroupFields::DiskSpaceUsage) + .set(+EGroupFields::MaxPDiskUsage) + .set(+EGroupFields::MaxVDiskSlotUsage) + .set(+EGroupFields::MaxNormalizedOccupancy) + .set(+EGroupFields::MaxVDiskRawUsage) + .set(+EGroupFields::CapacityAlert); const TFieldsType FieldsHive = TFieldsType().set(+EGroupFields::AllocationUnits); const TFieldsType FieldsWbGroups = TFieldsType().set(+EGroupFields::GroupId) .set(+EGroupFields::Erasure) @@ -668,7 +715,12 @@ class TStorageGroups : public TViewerPipeClient { .set(+EGroupFields::VDisk) .set(+EGroupFields::PDisk) .set(+EGroupFields::Read) - .set(+EGroupFields::Write); + .set(+EGroupFields::Write) + .set(+EGroupFields::MaxPDiskUsage) + .set(+EGroupFields::MaxVDiskSlotUsage) + .set(+EGroupFields::MaxNormalizedOccupancy) + .set(+EGroupFields::MaxVDiskRawUsage) + .set(+EGroupFields::CapacityAlert); const std::unordered_map DependentFields = { { EGroupFields::DiskSpaceUsage, TFieldsType().set(+EGroupFields::PDisk) @@ -685,6 +737,11 @@ class TStorageGroups : public TViewerPipeClient { { EGroupFields::MissingDisks, TFieldsType().set(+EGroupFields::VDisk) }, { EGroupFields::State, TFieldsType().set(+EGroupFields::VDisk) }, { EGroupFields::Encryption, TFieldsType().set(+EGroupFields::VDisk) }, + { EGroupFields::MaxPDiskUsage, TFieldsType().set(+EGroupFields::NodeId) }, + { EGroupFields::MaxVDiskSlotUsage, TFieldsType().set(+EGroupFields::NodeId) }, + { EGroupFields::MaxNormalizedOccupancy, TFieldsType().set(+EGroupFields::NodeId) }, + { EGroupFields::MaxVDiskRawUsage, TFieldsType().set(+EGroupFields::NodeId) }, + { EGroupFields::CapacityAlert, TFieldsType().set(+EGroupFields::NodeId) }, }; bool FieldsNeeded(TFieldsType fields) const { @@ -754,6 +811,16 @@ class TStorageGroups : public TViewerPipeClient { result = EGroupFields::Available; } else if (field == "PileName") { result = EGroupFields::PileName; + } else if (field == "CapacityAlert") { + result = EGroupFields::CapacityAlert; + } else if (field == "MaxPDiskUsage") { + result = EGroupFields::MaxPDiskUsage; + } else if (field == "MaxVDiskSlotUsage") { + result = EGroupFields::MaxVDiskSlotUsage; + } else if (field == "MaxNormalizedOccupancy") { + result = EGroupFields::MaxNormalizedOccupancy; + } else if (field == "MaxVDiskRawUsage") { + result = EGroupFields::MaxVDiskRawUsage; } return result; } @@ -1139,6 +1206,7 @@ class TStorageGroups : public TViewerPipeClient { case EGroupFields::DiskSpaceUsage: case EGroupFields::MissingDisks: case EGroupFields::Latency: + case EGroupFields::CapacityAlert: GroupCollection(); SortCollection(GroupGroups, [](const TGroupGroup& groupGroup) { return groupGroup.SortKey; }, true); NeedGroup = false; @@ -1154,6 +1222,10 @@ class TStorageGroups : public TViewerPipeClient { case EGroupFields::Available: case EGroupFields::AllocationUnits: case EGroupFields::PDiskId: + case EGroupFields::MaxPDiskUsage: + case EGroupFields::MaxVDiskSlotUsage: + case EGroupFields::MaxNormalizedOccupancy: + case EGroupFields::MaxVDiskRawUsage: break; } } @@ -1216,6 +1288,19 @@ class TStorageGroups : public TViewerPipeClient { case EGroupFields::PileName: SortCollection(GroupView, [](const TGroup* group) { return group->GetGroupName(EGroupFields::PileName); }, ReverseSort); break; + case EGroupFields::MaxPDiskUsage: + SortCollection(GroupView, [](const TGroup* group) { return group->MaxPDiskUsage; }, ReverseSort); + break; + case EGroupFields::MaxVDiskSlotUsage: + case EGroupFields::CapacityAlert: + SortCollection(GroupView, [](const TGroup* group) { return group->MaxVDiskSlotUsage; }, ReverseSort); + break; + case EGroupFields::MaxNormalizedOccupancy: + SortCollection(GroupView, [](const TGroup* group) { return group->MaxNormalizedOccupancy; }, ReverseSort); + break; + case EGroupFields::MaxVDiskRawUsage: + SortCollection(GroupView, [](const TGroup* group) { return group->MaxVDiskRawUsage; }, ReverseSort); + break; case EGroupFields::PDiskId: case EGroupFields::NodeId: case EGroupFields::PDisk: @@ -1493,6 +1578,7 @@ class TStorageGroups : public TViewerPipeClient { if (FieldsAvailable.test(+EGroupFields::PDisk)) { for (TGroup* group : GroupView) { group->CalcAvailableAndDiskSpace(PDisks); + group->CalcCapacityMetrics(); } FieldsAvailable |= FieldsGroupAvailableAndDiskSpace; ApplyEverything(); @@ -1784,6 +1870,10 @@ class TStorageGroups : public TViewerPipeClient { vDisk.Donors.emplace_back(donor); } vDisk.Present = true; + vDisk.VDiskSlotUsage = info.GetVDiskSlotUsage(); + vDisk.NormalizedOccupancy = info.GetNormalizedOccupancy(); + vDisk.VDiskRawUsage = info.GetVDiskRawUsage(); + vDisk.CapacityAlert = info.GetCapacityAlert(); } void ProcessWhiteboardDisks() { @@ -1830,6 +1920,7 @@ class TStorageGroups : public TViewerPipeClient { pDisk.Guid = info.GetGuid(); pDisk.AvailableSize = info.GetAvailableSize(); pDisk.TotalSize = info.GetTotalSize(); + pDisk.PDiskUsage = info.GetPDiskUsage(); //pDisk.Status = info.GetStatus(); if (pDisk.EnforcedDynamicSlotSize < info.GetEnforcedDynamicSlotSize()) { pDisk.EnforcedDynamicSlotSize = info.GetEnforcedDynamicSlotSize(); @@ -1867,6 +1958,7 @@ class TStorageGroups : public TViewerPipeClient { ApplyEverything(); for (TGroup* group : GroupView) { group->CalcAvailableAndDiskSpace(PDisks); + group->CalcCapacityMetrics(); } FieldsAvailable |= FieldsGroupAvailableAndDiskSpace; ApplyEverything(); @@ -1910,11 +2002,20 @@ class TStorageGroups : public TViewerPipeClient { return; } if (VDiskStateResponse.count(nodeId) == 0) { - VDiskStateResponse.emplace(nodeId, MakeWhiteboardRequest(nodeId, new TEvWhiteboard::TEvVDiskStateRequest())); + auto vdiskRequest = new TEvWhiteboard::TEvVDiskStateRequest(); + vdiskRequest->Record.MutableFieldsRequired()->CopyFrom(GetDefaultWhiteboardFields()); + vdiskRequest->Record.AddFieldsRequired(NKikimrWhiteboard::TVDiskStateInfo::kVDiskSlotUsageFieldNumber); + vdiskRequest->Record.AddFieldsRequired(NKikimrWhiteboard::TVDiskStateInfo::kNormalizedOccupancyFieldNumber); + vdiskRequest->Record.AddFieldsRequired(NKikimrWhiteboard::TVDiskStateInfo::kVDiskRawUsageFieldNumber); + vdiskRequest->Record.AddFieldsRequired(NKikimrWhiteboard::TVDiskStateInfo::kCapacityAlertFieldNumber); + VDiskStateResponse.emplace(nodeId, MakeWhiteboardRequest(nodeId, vdiskRequest)); ++VDiskStateRequestsInFlight; } if (PDiskStateResponse.count(nodeId) == 0) { - PDiskStateResponse.emplace(nodeId, MakeWhiteboardRequest(nodeId, new TEvWhiteboard::TEvPDiskStateRequest())); + auto pdiskRequest = new TEvWhiteboard::TEvPDiskStateRequest(); + pdiskRequest->Record.MutableFieldsRequired()->CopyFrom(GetDefaultWhiteboardFields()); + pdiskRequest->Record.AddFieldsRequired(NKikimrWhiteboard::TPDiskStateInfo::kPDiskUsageFieldNumber); + PDiskStateResponse.emplace(nodeId, MakeWhiteboardRequest(nodeId, pdiskRequest)); ++PDiskStateRequestsInFlight; } } @@ -2140,9 +2241,6 @@ class TStorageGroups : public TViewerPipeClient { for (const TGroup* group : GroupView) { NKikimrViewer::TStorageGroupInfo& jsonGroup = *json.AddStorageGroups(); jsonGroup.SetGroupId(::ToString(group->GroupId)); - if (group->GroupGeneration) { - jsonGroup.SetGroupGeneration(group->GroupGeneration); - } if (FieldsAvailable.test(+EGroupFields::PoolName) && FieldsRequested.test(+EGroupFields::PoolName)) { jsonGroup.SetPoolName(group->PoolName); } @@ -2162,9 +2260,6 @@ class TStorageGroups : public TViewerPipeClient { if (FieldsAvailable.test(+EGroupFields::Encryption) && FieldsRequested.test(+EGroupFields::Encryption)) { jsonGroup.SetEncryption(group->EncryptionMode); } - if (group->Overall != NKikimrViewer::Grey) { - jsonGroup.SetOverall(group->Overall); - } if (group->DiskSpace != NKikimrViewer::Grey && FieldsRequested.test(+EGroupFields::Usage)) { jsonGroup.SetDiskSpace(group->DiskSpace); } @@ -2182,6 +2277,12 @@ class TStorageGroups : public TViewerPipeClient { } if (FieldsAvailable.test(+EGroupFields::State) && FieldsRequested.test(+EGroupFields::State)) { jsonGroup.SetState(group->State); + if (group->GroupGeneration) { + jsonGroup.SetGroupGeneration(group->GroupGeneration); + } + if (group->Overall != NKikimrViewer::Grey) { + jsonGroup.SetOverall(group->Overall); + } } if (FieldsAvailable.test(+EGroupFields::MissingDisks) && FieldsRequested.test(+EGroupFields::MissingDisks)) { jsonGroup.SetMissingDisks(group->MissingDisks); @@ -2215,9 +2316,24 @@ class TStorageGroups : public TViewerPipeClient { if (FieldsAvailable.test(+EGroupFields::PileName) && FieldsRequested.test(+EGroupFields::PileName)) { jsonGroup.SetPileName(group->PileName); } + if (FieldsAvailable.test(+EGroupFields::MaxPDiskUsage) && FieldsRequested.test(+EGroupFields::MaxPDiskUsage)) { + jsonGroup.SetMaxPDiskUsage(group->MaxPDiskUsage); + } + if (FieldsAvailable.test(+EGroupFields::MaxVDiskSlotUsage) && FieldsRequested.test(+EGroupFields::MaxVDiskSlotUsage)) { + jsonGroup.SetMaxVDiskSlotUsage(group->MaxVDiskSlotUsage); + } + if (FieldsAvailable.test(+EGroupFields::MaxNormalizedOccupancy) && FieldsRequested.test(+EGroupFields::MaxNormalizedOccupancy)) { + jsonGroup.SetMaxNormalizedOccupancy(group->MaxNormalizedOccupancy); + } + if (FieldsAvailable.test(+EGroupFields::MaxVDiskRawUsage) && FieldsRequested.test(+EGroupFields::MaxVDiskRawUsage)) { + jsonGroup.SetMaxVDiskRawUsage(group->MaxVDiskRawUsage); + } + if (FieldsAvailable.test(+EGroupFields::CapacityAlert) && FieldsRequested.test(+EGroupFields::CapacityAlert)) { + jsonGroup.SetCapacityAlert(NKikimrBlobStorage::TPDiskSpaceColor::E_Name(group->CapacityAlert)); + } } } else { - for (TGroupGroup& groupGroup : GroupGroups) { + for (TGroupGroup& groupGroup : GroupGroups) { NKikimrViewer::TStorageGroupGroup& jsonGroupGroup = *json.AddStorageGroupGroups(); jsonGroupGroup.SetGroupName(groupGroup.Name); jsonGroupGroup.SetGroupCount(groupGroup.Groups.size()); @@ -2319,6 +2435,10 @@ class TStorageGroups : public TViewerPipeClient { * `Read` * `Write` * `Latency` + * `MaxPDiskUsage` + * `MaxVDiskSlotUsage ` + * `MaxNormalizedOccupancy` + * `MaxVDiskRawUsage` required: false type: string - name: group @@ -2337,6 +2457,7 @@ class TStorageGroups : public TViewerPipeClient { * `MissingDisks` * `State` * `Latency` + * `CapacityAlert` required: false type: string - name: filter_group_by @@ -2355,6 +2476,7 @@ class TStorageGroups : public TViewerPipeClient { * `MissingDisks` * `State` * `Latency` + * `CapacityAlert` required: false type: string - name: filter_group @@ -2386,6 +2508,11 @@ class TStorageGroups : public TViewerPipeClient { * `PDisk` * `VDisk` * `Latency` + * `MaxPDiskUsage` + * `MaxVDiskSlotUsage` + * `MaxNormalizedOccupancy` + * `MaxVDiskRawUsage` + * `CapacityAlert` required: false type: string - name: offset @@ -2447,6 +2574,10 @@ class TStorageGroups : public TViewerPipeClient { storageGroupProperties["Available"]["description"] = "number of bytes available on storage for this group"; storageGroupProperties["Usage"]["description"] = "logical usage (in percent) of group space"; storageGroupProperties["DiskSpaceUsage"]["description"] = "physical usage (in percent) of physical disk space (worst disk)"; + storageGroupProperties["MaxPDiskUsage"]["description"] = "max PDisk.PDiskUsage across PDisks hosting VDisks of this group"; + storageGroupProperties["MaxVDiskSlotUsage"]["description"] = "max VDisk.VDiskSlotUsage across VDisks in this group"; + storageGroupProperties["MaxNormalizedOccupancy"]["description"] = "max VDisk.NormalizedOccupancy across VDisks in this group"; + storageGroupProperties["MaxVDiskRawUsage"]["description"] = "max VDisk.RawUsage across VDisks in this group"; return node; } }; diff --git a/ydb/core/viewer/viewer_nodes.h b/ydb/core/viewer/viewer_nodes.h index 4873583d40a7..368dab389078 100644 --- a/ydb/core/viewer/viewer_nodes.h +++ b/ydb/core/viewer/viewer_nodes.h @@ -42,6 +42,11 @@ enum class ENodeFields : ui8 { ClockSkew, PingTime, PileName, + MaxPDiskUsage, + MaxVDiskSlotUsage, + MaxVDiskRawUsage, + MaxNormalizedOccupancy, + CapacityAlert, COUNT }; @@ -202,6 +207,11 @@ class TJsonNodes : public TViewerPipeClient { TString Database; ui32 MissingDisks = 0; float DiskSpaceUsage = 0; // the highest + float MaxPDiskUsage = 0; + float MaxVDiskSlotUsage = 0; + float MaxVDiskRawUsage = 0; + float MaxNormalizedOccupancy = 0; + NKikimrBlobStorage::TPDiskSpaceColor::E CapacityAlert = NKikimrBlobStorage::TPDiskSpaceColor::GREEN; float CpuUsage = 0; // total, normalized float LoadAverage = 0; // normalized bool Problems = false; @@ -292,13 +302,32 @@ class TJsonNodes : public TViewerPipeClient { } } - void CalcDisks() { + void CalcVDisks() { + MaxVDiskSlotUsage = 0; + MaxVDiskRawUsage = 0; + MaxNormalizedOccupancy = 0; + CapacityAlert = NKikimrBlobStorage::TPDiskSpaceColor::GREEN; + + if (!VDisks.empty()) { + for (const auto& vdisk : VDisks) { + MaxVDiskSlotUsage = std::max(MaxVDiskSlotUsage, vdisk.GetVDiskSlotUsage()); + MaxVDiskRawUsage = std::max(MaxVDiskRawUsage, vdisk.GetVDiskRawUsage()); + MaxNormalizedOccupancy = std::max(MaxNormalizedOccupancy, vdisk.GetNormalizedOccupancy()); + CapacityAlert = std::max(CapacityAlert, vdisk.GetCapacityAlert()); + } + } + } + + void CalcPDisks() { MissingDisks = 0; DiskSpaceUsage = 0; + MaxPDiskUsage = 0.0; + if (!PDisks.empty()) { for (const auto& pdisk : PDisks) { float diskSpaceUsage = pdisk.GetTotalSize() ? 100.0 * (pdisk.GetTotalSize() - pdisk.GetAvailableSize()) / pdisk.GetTotalSize() : 0; DiskSpaceUsage = std::max(DiskSpaceUsage, diskSpaceUsage); + MaxPDiskUsage = std::max(MaxPDiskUsage, pdisk.GetPDiskUsage()); if (pdisk.state() == NKikimrBlobStorage::TPDiskState::Normal) { continue; } @@ -686,6 +715,9 @@ class TJsonNodes : public TViewerPipeClient { case ENodeFields::PileName: groupName = GetPileName(); break; + case ENodeFields::CapacityAlert: + groupName = NKikimrBlobStorage::TPDiskSpaceColor::E_Name(CapacityAlert); + break; default: break; } @@ -723,6 +755,8 @@ class TJsonNodes : public TViewerPipeClient { return PingTimeUs; case ENodeFields::PileName: return GetPileName(); + case ENodeFields::CapacityAlert: + return static_cast(MaxVDiskSlotUsage); default: return TString(); } @@ -790,8 +824,13 @@ class TJsonNodes : public TViewerPipeClient { .set(+ENodeFields::LoadAverage); const TFieldsType FieldsPDisks = TFieldsType().set(+ENodeFields::PDisks) .set(+ENodeFields::Missing) - .set(+ENodeFields::DiskSpaceUsage); - const TFieldsType FieldsVDisks = TFieldsType().set(+ENodeFields::VDisks); + .set(+ENodeFields::DiskSpaceUsage) + .set(+ENodeFields::MaxPDiskUsage); + const TFieldsType FieldsVDisks = TFieldsType().set(+ENodeFields::VDisks) + .set(+ENodeFields::MaxVDiskRawUsage) + .set(+ENodeFields::MaxVDiskSlotUsage) + .set(+ENodeFields::CapacityAlert) + .set(+ENodeFields::MaxNormalizedOccupancy); const TFieldsType FieldsTablets = TFieldsType().set(+ENodeFields::Tablets); const TFieldsType FieldsHiveNodeStat = TFieldsType().set(+ENodeFields::SubDomainKey) .set(+ENodeFields::DisconnectTime); @@ -827,6 +866,11 @@ class TJsonNodes : public TViewerPipeClient { { ENodeFields::NetworkUtilization, TFieldsType().set(+ENodeFields::Peers) }, { ENodeFields::PingTime, TFieldsType().set(+ENodeFields::Peers) }, { ENodeFields::ClockSkew, TFieldsType().set(+ENodeFields::Peers) }, + { ENodeFields::MaxPDiskUsage, TFieldsType().set(+ENodeFields::PDisks) }, + { ENodeFields::MaxVDiskRawUsage, TFieldsType().set(+ENodeFields::VDisks) }, + { ENodeFields::MaxVDiskSlotUsage, TFieldsType().set(+ENodeFields::VDisks) }, + { ENodeFields::CapacityAlert, TFieldsType().set(+ENodeFields::VDisks) }, + { ENodeFields::MaxNormalizedOccupancy, TFieldsType().set(+ENodeFields::VDisks) }, }; bool FieldsNeeded(TFieldsType fields) const { @@ -919,6 +963,16 @@ class TJsonNodes : public TViewerPipeClient { result = ENodeFields::ClockSkew; } else if (field == "PileName") { result = ENodeFields::PileName; + } else if (field == "MaxPDiskUsage") { + result = ENodeFields::MaxPDiskUsage; + } else if (field == "MaxVDiskRawUsage") { + result = ENodeFields::MaxVDiskRawUsage; + } else if (field == "MaxVDiskSlotUsage") { + result = ENodeFields::MaxVDiskSlotUsage; + } else if (field == "CapacityAlert") { + result = ENodeFields::CapacityAlert; + } else if (field == "MaxNormalizedOccupancy") { + result = ENodeFields::MaxNormalizedOccupancy; } return result; } @@ -1005,6 +1059,10 @@ class TJsonNodes : public TViewerPipeClient { } else if (params.Get("with") == "space") { With = EWith::SpaceProblems; FieldsRequired.set(+ENodeFields::DiskSpaceUsage); + FieldsRequired.set(+ENodeFields::MaxPDiskUsage); + FieldsRequired.set(+ENodeFields::MaxVDiskRawUsage); + FieldsRequired.set(+ENodeFields::MaxVDiskSlotUsage); + FieldsRequired.set(+ENodeFields::CapacityAlert); } if (params.Get("type") == "static") { Type = EType::Static; @@ -1460,6 +1518,7 @@ class TJsonNodes : public TViewerPipeClient { case ENodeFields::NetworkUtilization: case ENodeFields::ClockSkew: case ENodeFields::PingTime: + case ENodeFields::CapacityAlert: GroupCollection(); SortCollection(NodeGroups, [](const TNodeGroup& nodeGroup) { return nodeGroup.SortKey; }, true); NeedGroup = false; @@ -1481,6 +1540,10 @@ class TJsonNodes : public TViewerPipeClient { case ENodeFields::ReceiveThroughput: case ENodeFields::SendThroughput: case ENodeFields::ReversePeers: + case ENodeFields::MaxPDiskUsage: + case ENodeFields::MaxVDiskRawUsage: + case ENodeFields::MaxVDiskSlotUsage: + case ENodeFields::MaxNormalizedOccupancy: break; } AddEvent("Group Applied"); @@ -1587,6 +1650,23 @@ class TJsonNodes : public TViewerPipeClient { SortCollection(NodeView, [](const TNode* node) { return node->GetPileName(); }, ReverseSort); NeedSort = false; break; + case ENodeFields::MaxPDiskUsage: + SortCollection(NodeView, [](const TNode* node) { return node->MaxPDiskUsage; }, ReverseSort); + NeedSort = false; + break; + case ENodeFields::MaxVDiskRawUsage: + SortCollection(NodeView, [](const TNode* node) { return node->MaxVDiskRawUsage; }, ReverseSort); + NeedSort = false; + break; + case ENodeFields::MaxVDiskSlotUsage: + case ENodeFields::CapacityAlert: + SortCollection(NodeView, [](const TNode* node) { return node->MaxVDiskSlotUsage; }, ReverseSort); + NeedSort = false; + break; + case ENodeFields::MaxNormalizedOccupancy: + SortCollection(NodeView, [](const TNode* node) { return node->MaxNormalizedOccupancy; }, ReverseSort); + NeedSort = false; + break; case ENodeFields::NodeInfo: case ENodeFields::PDisks: case ENodeFields::VDisks: @@ -2122,6 +2202,9 @@ class TJsonNodes : public TViewerPipeClient { ++slots; MaximumSlotsPerDisk = std::max(MaximumSlotsPerDisk.value_or(0), slots); } + for (TNode* node : NodeView) { + node->CalcVDisks(); + } FieldsAvailable.set(+ENodeFields::HasDisks); } else { AddProblem("bsc-storage-slots-no-data"); @@ -2143,7 +2226,7 @@ class TJsonNodes : public TViewerPipeClient { MaximumDisksPerNode = std::max(MaximumDisksPerNode.value_or(0), disks); } for (TNode* node : NodeView) { - node->CalcDisks(); + node->CalcPDisks(); } FieldsAvailable.set(+ENodeFields::HasDisks); FieldsAvailable.set(+ENodeFields::Missing); @@ -2186,6 +2269,29 @@ class TJsonNodes : public TViewerPipeClient { } } + template<> + void InitWhiteboardRequest(NKikimrWhiteboard::TEvVDiskStateRequest* request) { + if (AllWhiteboardFields) { + request->AddFieldsRequired(-1); + } else { + request->MutableFieldsRequired()->CopyFrom(GetDefaultWhiteboardFields()); + request->AddFieldsRequired(NKikimrWhiteboard::TVDiskStateInfo::kVDiskSlotUsageFieldNumber); + request->AddFieldsRequired(NKikimrWhiteboard::TVDiskStateInfo::kNormalizedOccupancyFieldNumber); + request->AddFieldsRequired(NKikimrWhiteboard::TVDiskStateInfo::kVDiskRawUsageFieldNumber); + request->AddFieldsRequired(NKikimrWhiteboard::TVDiskStateInfo::kCapacityAlertFieldNumber); + } + } + + template<> + void InitWhiteboardRequest(NKikimrWhiteboard::TEvPDiskStateRequest* request) { + if (AllWhiteboardFields) { + request->AddFieldsRequired(-1); + } else { + request->MutableFieldsRequired()->CopyFrom(GetDefaultWhiteboardFields()); + request->AddFieldsRequired(NKikimrWhiteboard::TPDiskStateInfo::kPDiskUsageFieldNumber); + } + } + template<> void InitWhiteboardRequest(NKikimrWhiteboard::TEvSystemStateRequest* request) { if (AllWhiteboardFields) { @@ -2548,6 +2654,7 @@ class TJsonNodes : public TViewerPipeClient { TNode* node = FindNode(vDiskState.GetNodeId()); if (node) { node->VDisks.emplace_back(vDiskState); + node->CalcVDisks(); } } } @@ -2560,6 +2667,7 @@ class TJsonNodes : public TViewerPipeClient { for (const auto& protoVDiskState : vDiskState.GetVDiskStateInfo()) { node->VDisks.emplace_back(protoVDiskState); } + node->CalcVDisks(); } } } @@ -2573,7 +2681,7 @@ class TJsonNodes : public TViewerPipeClient { TNode* node = FindNode(pDiskState.GetNodeId()); if (node) { node->PDisks.emplace_back(pDiskState); - node->CalcDisks(); + node->CalcPDisks(); } } } @@ -2586,13 +2694,11 @@ class TJsonNodes : public TViewerPipeClient { for (const auto& protoPDiskState : pDiskState.GetPDiskStateInfo()) { node->PDisks.emplace_back(protoPDiskState); } - node->CalcDisks(); + node->CalcPDisks(); } } } FieldsAvailable |= FieldsPDisks; - FieldsAvailable.set(+ENodeFields::Missing); - FieldsAvailable.set(+ENodeFields::DiskSpaceUsage); } bool needCalcPeers = false; if (FieldsNeeded(FieldsPeers)) { @@ -3240,6 +3346,21 @@ class TJsonNodes : public TViewerPipeClient { if (node->DiskSpaceUsage && FieldsRequested.test(+ENodeFields::DiskSpaceUsage)) { jsonNode.SetDiskSpaceUsage(node->DiskSpaceUsage); } + if (FieldsAvailable.test(+ENodeFields::MaxPDiskUsage) && FieldsRequested.test(+ENodeFields::MaxPDiskUsage)) { + jsonNode.SetMaxPDiskUsage(node->MaxPDiskUsage); + } + if (FieldsAvailable.test(+ENodeFields::MaxVDiskSlotUsage) && FieldsRequested.test(+ENodeFields::MaxVDiskSlotUsage)) { + jsonNode.SetMaxVDiskSlotUsage(node->MaxVDiskSlotUsage); + } + if (FieldsAvailable.test(+ENodeFields::MaxVDiskRawUsage) && FieldsRequested.test(+ENodeFields::MaxVDiskRawUsage)) { + jsonNode.SetMaxVDiskRawUsage(node->MaxVDiskRawUsage); + } + if (FieldsAvailable.test(+ENodeFields::MaxNormalizedOccupancy) && FieldsRequested.test(+ENodeFields::MaxNormalizedOccupancy)) { + jsonNode.SetMaxNormalizedOccupancy(node->MaxNormalizedOccupancy); + } + if (FieldsAvailable.test(+ENodeFields::CapacityAlert) && FieldsRequested.test(+ENodeFields::CapacityAlert)) { + jsonNode.SetCapacityAlert(NKikimrBlobStorage::TPDiskSpaceColor::E_Name(node->CapacityAlert)); + } if (FieldsAvailable.test(+ENodeFields::Connections) && FieldsRequested.test(+ENodeFields::Connections)) { jsonNode.SetConnections(node->Connections); } @@ -3430,6 +3551,10 @@ class TJsonNodes : public TViewerPipeClient { * `PingTime` * `SendThroughput` * `ReceiveThroughput` + * `MaxPDiskUsage` + * `MaxVDiskSlotUsage` + * `MaxVDiskRawUsage` + * `CapacityAlert` required: false type: string - name: group @@ -3451,6 +3576,7 @@ class TJsonNodes : public TViewerPipeClient { * `NetworkUtilization` * `ClockSkew` * `PingTime` + * `CapacityAlert` required: false type: string - name: filter_group_by @@ -3472,6 +3598,7 @@ class TJsonNodes : public TViewerPipeClient { * `NetworkUtilization` * `ClockSkew` * `PingTime` + * `CapacityAlert` required: false type: string - name: filter_group @@ -3521,6 +3648,11 @@ class TJsonNodes : public TViewerPipeClient { * `PingTime` * `SendThroughput` * `ReceiveThroughput` + * `MaxPDiskUsage` + * `MaxVDiskSlotUsage` + * `MaxVDiskRawUsage` + * `CapacityAlert` + * `MaxNormalizedOccupancy` required: false type: string - name: offset