Skip to content

Commit 10a3f7c

Browse files
authored
add storage/groups latencies (#8320)
1 parent d1d3fd7 commit 10a3f7c

File tree

3 files changed

+70
-15
lines changed

3 files changed

+70
-15
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()), 2);
7+
jsonHandlers.AddHandler("/storage/groups", new TJsonHandler<TStorageGroups>(TStorageGroups::GetSwagger()), 3);
88
}
99

1010
void InitStorageJsonHandlers(TJsonHandlers& jsonHandlers) {

ydb/core/viewer/protos/viewer.proto

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,10 @@ message TStorageGroupInfo {
444444
uint64 Read = 17;
445445
uint64 Write = 18;
446446
float DiskSpaceUsage = 19;
447-
repeated TStorageVDisk VDisks = 20;
447+
uint64 LatencyPutTabletLog = 20;
448+
uint64 LatencyPutUserData = 21;
449+
uint64 LatencyGetFast = 22;
450+
repeated TStorageVDisk VDisks = 30;
448451
}
449452

450453
message TStorageGroupGroup {
@@ -479,8 +482,8 @@ message TStorageGroupsInfo {
479482
uint32 Version = 1;
480483
optional uint32 TotalGroups = 2;
481484
optional uint32 FoundGroups = 3;
482-
optional uint32 FieldsAvailable = 4;
483-
optional uint32 FieldsRequired = 5;
485+
optional string FieldsAvailable = 4;
486+
optional string FieldsRequired = 5;
484487
optional bool NeedFilter = 6;
485488
optional bool NeedGroup = 7;
486489
optional bool NeedSort = 8;

ydb/core/viewer/storage_groups.h

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ enum class EGroupFields : ui8 {
107107
PDiskId,
108108
VDisk, // VDisk information
109109
PDisk, // PDisk information
110+
Latency,
110111
COUNT
111112
};
112113

@@ -235,7 +236,7 @@ class TStorageGroups : public TViewerPipeClient {
235236
ui64 AllocatedSize = 0;
236237
ui64 AvailableSize = 0;
237238
TString Status;
238-
NKikimrBlobStorage::EVDiskStatus VDiskStatus = NKikimrBlobStorage::EVDiskStatus::ERROR;
239+
std::optional<NKikimrBlobStorage::EVDiskStatus> VDiskStatus;
239240
ui64 Read = 0;
240241
ui64 Write = 0;
241242
NKikimrViewer::EFlag DiskSpace = NKikimrViewer::EFlag::Grey;
@@ -317,6 +318,27 @@ class TStorageGroups : public TViewerPipeClient {
317318
return MissingDisks == 0 ? TString("0") : TStringBuilder() << "-" << MissingDisks;
318319
}
319320

321+
static int RoundUpTime(int v) {
322+
static const int roundUp[] = {1, 5, 10, 50, 100, 200, 500, 1000};
323+
auto it = std::lower_bound(std::begin(roundUp), std::end(roundUp), v);
324+
if (it == std::end(roundUp)) {
325+
return 1000;
326+
}
327+
return *it;
328+
}
329+
330+
TString GetLatencyForGroup() const {
331+
if (PutTabletLogLatency == 0) {
332+
return "-";
333+
} else if (PutTabletLogLatency < 1000) {
334+
return TStringBuilder() << RoundUpTime(PutTabletLogLatency) << "us";
335+
} else if (PutTabletLogLatency < 1000000) {
336+
return TStringBuilder() << RoundUpTime(PutTabletLogLatency / 1000) << "ms";
337+
} else {
338+
return TStringBuilder() << RoundUpTime(PutTabletLogLatency / 1000000) << "s";
339+
}
340+
}
341+
320342
// none: ok, dead:1
321343
// block-4-2: ok, replicating:1 starting:1, degraded:1, degraded:2, dead:3
322344
// mirror-3-dc: ok, degraded:1(1), degraded:1(2), degraded:1(3), degraded:2(3,1), dead:3(3,1,1)
@@ -331,18 +353,18 @@ class TStorageGroups : public TViewerPipeClient {
331353
static_assert(sizeof(TVDiskID::FailRealm) == 1, "expecting byte");
332354
std::vector<ui8> failedDomainsPerRealm;
333355
for (const TVDisk& vdisk : VDisks) {
334-
if (vdisk.VDiskStatus != NKikimrBlobStorage::EVDiskStatus::READY) {
356+
if (vdisk.VDiskStatus && *vdisk.VDiskStatus != NKikimrBlobStorage::EVDiskStatus::READY) {
335357
if (ErasureSpecies == TErasureType::ErasureMirror3dc) {
336358
if (failedDomainsPerRealm.size() <= vdisk.VDiskId.FailRealm) {
337359
failedDomainsPerRealm.resize(vdisk.VDiskId.FailRealm + 1);
338360
}
339361
failedDomainsPerRealm[vdisk.VDiskId.FailRealm]++;
340362
}
341363
++MissingDisks;
342-
if (vdisk.VDiskStatus == NKikimrBlobStorage::EVDiskStatus::INIT_PENDING) {
364+
if (*vdisk.VDiskStatus == NKikimrBlobStorage::EVDiskStatus::INIT_PENDING) {
343365
++startingDisks;
344366
}
345-
if (vdisk.VDiskStatus == NKikimrBlobStorage::EVDiskStatus::REPLICATING) {
367+
if (*vdisk.VDiskStatus == NKikimrBlobStorage::EVDiskStatus::REPLICATING) {
346368
++replicatingDisks;
347369
}
348370
}
@@ -452,6 +474,10 @@ class TStorageGroups : public TViewerPipeClient {
452474
Read = read;
453475
Write = write;
454476
}
477+
478+
ui64 GetLatencyForSort() const {
479+
return PutTabletLogLatency;
480+
}
455481
};
456482

457483
using TGroupData = std::vector<TGroup>;
@@ -478,7 +504,8 @@ class TStorageGroups : public TViewerPipeClient {
478504
.set(+EGroupFields::Erasure)
479505
.set(+EGroupFields::Usage)
480506
.set(+EGroupFields::Used)
481-
.set(+EGroupFields::Limit);
507+
.set(+EGroupFields::Limit)
508+
.set(+EGroupFields::Latency);
482509
const TFieldsType FieldsBsPools = TFieldsType().set(+EGroupFields::PoolName)
483510
.set(+EGroupFields::Kind)
484511
.set(+EGroupFields::MediaType)
@@ -569,6 +596,12 @@ class TStorageGroups : public TViewerPipeClient {
569596
result = EGroupFields::PDisk;
570597
} else if (field == "DiskSpaceUsage") {
571598
result = EGroupFields::DiskSpaceUsage;
599+
} else if (field == "NodeId") {
600+
result = EGroupFields::NodeId;
601+
} else if (field == "PDiskId") {
602+
result = EGroupFields::PDiskId;
603+
} else if (field == "Latency") {
604+
result = EGroupFields::Latency;
572605
}
573606
return result;
574607
}
@@ -931,6 +964,10 @@ class TStorageGroups : public TViewerPipeClient {
931964
GroupCollection([](const TGroup* group) { return group->State; });
932965
SortCollection(GroupGroups, [](const TGroupGroup& groupGroup) { return groupGroup.Name; });
933966
break;
967+
case EGroupFields::Latency:
968+
GroupCollection([](const TGroup* group) { return group->GetLatencyForGroup(); });
969+
SortCollection(GroupGroups, [](const TGroupGroup& groupGroup) { return groupGroup.Name; }, true);
970+
break;
934971
case EGroupFields::Read:
935972
case EGroupFields::Write:
936973
case EGroupFields::NodeId:
@@ -999,6 +1036,9 @@ class TStorageGroups : public TViewerPipeClient {
9991036
case EGroupFields::State:
10001037
SortCollection(GroupView, [](const TGroup* group) { return group->State; }, ReverseSort);
10011038
break;
1039+
case EGroupFields::Latency:
1040+
SortCollection(GroupView, [](const TGroup* group) { return group->GetLatencyForSort(); }, ReverseSort);
1041+
break;
10021042
case EGroupFields::PDiskId:
10031043
case EGroupFields::NodeId:
10041044
case EGroupFields::PDisk:
@@ -1147,7 +1187,10 @@ class TStorageGroups : public TViewerPipeClient {
11471187
vDisk.AvailableSize = info.GetAvailableSize();
11481188
//vDisk.Kind = info.GetKind();
11491189
vDisk.Status = info.GetStatusV2();
1150-
NKikimrBlobStorage::EVDiskStatus_Parse(info.GetStatusV2(), &vDisk.VDiskStatus);
1190+
NKikimrBlobStorage::EVDiskStatus vDiskStatus;
1191+
if (vDisk.Status && NKikimrBlobStorage::EVDiskStatus_Parse(vDisk.Status, &vDiskStatus)) {
1192+
vDisk.VDiskStatus = vDiskStatus;
1193+
}
11511194
}
11521195

11531196
bool AreBSControllerRequestsDone() const {
@@ -1432,7 +1475,6 @@ class TStorageGroups : public TViewerPipeClient {
14321475
for (auto& vDiskId : info->GetVDiskIds()) {
14331476
TVDisk& vDisk = group.VDisks.emplace_back();
14341477
vDisk.VDiskId = VDiskIDFromVDiskID(vDiskId);
1435-
vDisk.VDiskStatus = NKikimrBlobStorage::EVDiskStatus::ERROR;
14361478
}
14371479
if (capacity != GroupData.capacity()) {
14381480
// we expect to never do this
@@ -1493,7 +1535,9 @@ class TStorageGroups : public TViewerPipeClient {
14931535
vDisk.VDiskStatus = info.GetReplicated() ? NKikimrBlobStorage::EVDiskStatus::READY : NKikimrBlobStorage::EVDiskStatus::REPLICATING;
14941536
break;
14951537
}
1496-
vDisk.Status = NKikimrBlobStorage::EVDiskStatus_Name(vDisk.VDiskStatus);
1538+
if (vDisk.VDiskStatus) {
1539+
vDisk.Status = NKikimrBlobStorage::EVDiskStatus_Name(*vDisk.VDiskStatus);
1540+
}
14971541
vDisk.DiskSpace = static_cast<NKikimrViewer::EFlag>(info.GetDiskSpace());
14981542
vDisk.Donor = info.GetDonorMode();
14991543
for (auto& donor : info.GetDonors()) {
@@ -1829,9 +1873,9 @@ class TStorageGroups : public TViewerPipeClient {
18291873
void ReplyAndPassAway() override {
18301874
ApplyEverything();
18311875
NKikimrViewer::TStorageGroupsInfo json;
1832-
json.SetVersion(2);
1833-
json.SetFieldsAvailable(FieldsAvailable.to_ulong());
1834-
json.SetFieldsRequired(FieldsRequired.to_ulong());
1876+
json.SetVersion(Viewer->GetCapabilityVersion("/storage/groups"));
1877+
json.SetFieldsAvailable(FieldsAvailable.to_string());
1878+
json.SetFieldsRequired(FieldsRequired.to_string());
18351879
if (NeedFilter) {
18361880
json.SetNeedFilter(true);
18371881
}
@@ -1907,6 +1951,11 @@ class TStorageGroups : public TViewerPipeClient {
19071951
if (FieldsAvailable.test(+EGroupFields::Available)) {
19081952
jsonGroup.SetAvailable(group->Available);
19091953
}
1954+
if (FieldsAvailable.test(+EGroupFields::Latency)) {
1955+
jsonGroup.SetLatencyPutTabletLog(group->PutTabletLogLatency);
1956+
jsonGroup.SetLatencyPutUserData(group->PutUserDataLatency);
1957+
jsonGroup.SetLatencyGetFast(group->GetFastLatency);
1958+
}
19101959
}
19111960
} else {
19121961
for (const TGroupGroup& groupGroup : GroupGroups) {
@@ -2002,6 +2051,7 @@ class TStorageGroups : public TViewerPipeClient {
20022051
* `AllocationUnits`
20032052
* `Read`
20042053
* `Write`
2054+
* `Latency`
20052055
required: false
20062056
type: string
20072057
- name: group
@@ -2018,6 +2068,7 @@ class TStorageGroups : public TViewerPipeClient {
20182068
* `MediaType`
20192069
* `MissingDisks`
20202070
* `State`
2071+
* `Latency`
20212072
required: false
20222073
type: string
20232074
- name: fields_required
@@ -2043,6 +2094,7 @@ class TStorageGroups : public TViewerPipeClient {
20432094
* `Write`
20442095
* `PDisk`
20452096
* `VDisk`
2097+
* `Latency`
20462098
required: false
20472099
type: string
20482100
- name: offset

0 commit comments

Comments
 (0)