Skip to content

Commit

Permalink
Viewer updates stable-24-3 v2 (#10332)
Browse files Browse the repository at this point in the history
  • Loading branch information
adameat authored Oct 11, 2024
1 parent f1b886c commit d81aef4
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 33 deletions.
13 changes: 11 additions & 2 deletions ydb/core/viewer/json_pipe_req.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -601,7 +601,16 @@ void TViewerPipeClient::InitConfig(const TCgiParameters& params) {
}
Direct = FromStringWithDefault<bool>(params.Get("direct"), Direct);
JsonSettings.EnumAsNumbers = !FromStringWithDefault<bool>(params.Get("enums"), true);
JsonSettings.UI64AsString = !FromStringWithDefault<bool>(params.Get("ui64"), true);
JsonSettings.UI64AsString = !FromStringWithDefault<bool>(params.Get("ui64"), false);
if (FromStringWithDefault<bool>(params.Get("enums"), true)) {
Proto2JsonConfig.EnumMode = TProto2JsonConfig::EnumValueMode::EnumName;
}
if (!FromStringWithDefault<bool>(params.Get("ui64"), false)) {
Proto2JsonConfig.StringifyNumbers = TProto2JsonConfig::EStringifyNumbersMode::StringifyInt64Always;
}
Proto2JsonConfig.MapAsObject = true;
Proto2JsonConfig.ConvertAny = true;
Proto2JsonConfig.WriteNanAsString = true;
Timeout = TDuration::MilliSeconds(FromStringWithDefault<ui32>(params.Get("timeout"), Timeout.MilliSeconds()));
}

Expand Down Expand Up @@ -661,7 +670,7 @@ TString TViewerPipeClient::GetHTTPOKJSON(const NJson::TJsonValue& response, TIns

TString TViewerPipeClient::GetHTTPOKJSON(const google::protobuf::Message& response, TInstant lastModified) {
TStringStream json;
TProtoToJson::ProtoToJson(json, response, JsonSettings);
NProtobufJson::Proto2Json(response, json, Proto2JsonConfig);
return GetHTTPOKJSON(json.Str(), lastModified);
}

Expand Down
5 changes: 4 additions & 1 deletion ydb/core/viewer/json_pipe_req.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@
#include <ydb/library/actors/core/actor_bootstrapped.h>
#include <ydb/library/actors/wilson/wilson_span.h>
#include <ydb/library/wilson_ids/wilson.h>
#include <library/cpp/protobuf/json/proto2json.h>

namespace NKikimr::NViewer {

using namespace NKikimr;
using namespace NSchemeCache;
using namespace NProtobufJson;
using NNodeWhiteboard::TNodeId;
using NNodeWhiteboard::TTabletId;

Expand All @@ -36,7 +38,7 @@ class TViewerPipeClient : public TActorBootstrapped<TViewerPipeClient> {
protected:
bool Followers = true;
bool Metrics = true;
bool WithRetry = true;
bool WithRetry = false;
TString Database;
TString SharedDatabase;
bool Direct = false;
Expand All @@ -46,6 +48,7 @@ class TViewerPipeClient : public TActorBootstrapped<TViewerPipeClient> {
IViewer* Viewer = nullptr;
NMon::TEvHttpInfo::TPtr Event;
TJsonSettings JsonSettings;
TProto2JsonConfig Proto2JsonConfig;
TDuration Timeout = TDuration::Seconds(10);

struct TPipeInfo {
Expand Down
57 changes: 40 additions & 17 deletions ydb/core/viewer/storage_groups.h
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ class TStorageGroups : public TViewerPipeClient {
TString Erasure;
TErasureType::EErasureSpecies ErasureSpecies = TErasureType::ErasureNone;
TString State;
ui32 StateSortKey = 0;
ui32 EncryptionMode = 0;
ui64 AllocationUnits = 0;
float Usage = 0;
Expand All @@ -290,11 +291,13 @@ class TStorageGroups : public TViewerPipeClient {
TString result;
result += ::ToString(failedDomains.size());
result += '(';
bool was_domains = false;
for (ui8 domains : failedDomains) {
if (!result.empty()) {
if (was_domains) {
result += ',';
}
result += ::ToString(domains);
was_domains = true;
}
result += ')';
return result;
Expand Down Expand Up @@ -377,35 +380,43 @@ class TStorageGroups : public TViewerPipeClient {
if (MissingDisks == 0) {
Overall = NKikimrViewer::EFlag::Green;
State = "ok";
StateSortKey = 0;
} else {
if (ErasureSpecies == TErasureType::ErasureNone) {
TString state;
Overall = NKikimrViewer::EFlag::Red;
if (MissingDisks == startingDisks) {
state = "starting";
StateSortKey = 10;
} else {
state = "dead";
StateSortKey = 100;
}
State = TStringBuilder() << state << ':' << MissingDisks;
} else if (ErasureSpecies == TErasureType::Erasure4Plus2Block) {
TString state;
if (MissingDisks > 2) {
Overall = NKikimrViewer::EFlag::Red;
state = "dead";
StateSortKey = 100;
} else if (MissingDisks == 2) {
Overall = NKikimrViewer::EFlag::Orange;
state = "degraded";
StateSortKey = 50 + MissingDisks;
} else if (MissingDisks == 1) {
if (MissingDisks == replicatingDisks + startingDisks) {
Overall = NKikimrViewer::EFlag::Blue;
if (replicatingDisks) {
state = "replicating";
StateSortKey = 20;
} else {
state = "starting";
StateSortKey = 10;
}
} else {
Overall = NKikimrViewer::EFlag::Yellow;
state = "degraded";
StateSortKey = 50 + MissingDisks;
}
}
State = TStringBuilder() << state << ':' << MissingDisks;
Expand All @@ -418,20 +429,25 @@ class TStorageGroups : public TViewerPipeClient {
if (failedDomainsPerRealm.size() > 2 || (failedDomainsPerRealm.size() == 2 && failedDomainsPerRealm[1] > 1)) {
Overall = NKikimrViewer::EFlag::Red;
state = "dead";
StateSortKey = 100;
} else if (failedDomainsPerRealm.size() == 2) {
Overall = NKikimrViewer::EFlag::Orange;
state = "degraded";
StateSortKey = 50 + failedDomainsPerRealm.size() * 10 + MissingDisks;
} else if (failedDomainsPerRealm.size()) {
if (MissingDisks == replicatingDisks + startingDisks) {
Overall = NKikimrViewer::EFlag::Blue;
if (replicatingDisks > startingDisks) {
state = "replicating";
StateSortKey = 20;
} else {
state = "starting";
StateSortKey = 10;
}
} else {
Overall = NKikimrViewer::EFlag::Yellow;
state = "degraded";
StateSortKey = 50 + failedDomainsPerRealm.size() * 10 + MissingDisks;
}
}
State = TStringBuilder() << state << ':' << PrintDomains(failedDomainsPerRealm);
Expand Down Expand Up @@ -533,8 +549,9 @@ class TStorageGroups : public TViewerPipeClient {
case EGroupFields::PoolName:
case EGroupFields::Kind:
case EGroupFields::MediaType:
case EGroupFields::State:
return GetGroupName(groupBy);
case EGroupFields::State:
return StateSortKey;
case EGroupFields::Usage:
return Usage;
case EGroupFields::DiskSpaceUsage:
Expand Down Expand Up @@ -1029,19 +1046,12 @@ class TStorageGroups : public TViewerPipeClient {
TVector<TString> filterWords = SplitString(Filter, " ");
TGroupView groupView;
for (TGroup* group : GroupView) {
bool match = false;
for (const TString& word : filterWords) {
if (group->PoolName.Contains(word)) {
match = true;
break;
} else if (::ToString(group->GroupId).Contains(word)) {
match = true;
if (group->PoolName.Contains(word) || ::ToString(group->GroupId).Contains(word)) {
groupView.push_back(group);
break;
}
}
if (match) {
groupView.push_back(group);
}
}
GroupView.swap(groupView);
Filter.clear();
Expand Down Expand Up @@ -1091,11 +1101,11 @@ class TStorageGroups : public TViewerPipeClient {
case EGroupFields::Kind:
case EGroupFields::Encryption:
case EGroupFields::MediaType:
case EGroupFields::State:
GroupCollection();
SortCollection(GroupGroups, [](const TGroupGroup& groupGroup) { return groupGroup.SortKey; });
NeedGroup = false;
break;
case EGroupFields::State:
case EGroupFields::Usage:
case EGroupFields::DiskSpaceUsage:
case EGroupFields::MissingDisks:
Expand Down Expand Up @@ -1169,7 +1179,7 @@ class TStorageGroups : public TViewerPipeClient {
SortCollection(GroupView, [](const TGroup* group) { return group->Write; }, ReverseSort);
break;
case EGroupFields::State:
SortCollection(GroupView, [](const TGroup* group) { return group->State; }, ReverseSort);
SortCollection(GroupView, [](const TGroup* group) { return group->StateSortKey; }, ReverseSort);
break;
case EGroupFields::Latency:
SortCollection(GroupView, [](const TGroup* group) { return group->GetLatencyForSort(); }, ReverseSort);
Expand Down Expand Up @@ -1207,8 +1217,10 @@ class TStorageGroups : public TViewerPipeClient {
ApplyLimit();
}

bool CollectedHiveData = false;

void CollectHiveData() {
if (FieldsNeeded(FieldsHive)) {
if (!CollectedHiveData) {
if (!GroupView.empty()) {
ui64 hiveId = AppData()->DomainsInfo->GetHive();
if (hiveId != TDomainsInfo::BadTabletId) {
Expand All @@ -1226,6 +1238,7 @@ class TStorageGroups : public TViewerPipeClient {
++NavigateKeySetInFlight;
}
}
CollectedHiveData = true;
}
}

Expand Down Expand Up @@ -1341,7 +1354,6 @@ class TStorageGroups : public TViewerPipeClient {
}
FieldsAvailable |= FieldsBsPools;
ApplyEverything();
CollectHiveData();
} else {
AddProblem("bsc-storage-pools-no-data");
}
Expand Down Expand Up @@ -1427,6 +1439,9 @@ class TStorageGroups : public TViewerPipeClient {
}
}
if (AreBSControllerRequestsDone()) {
if (FieldsNeeded(FieldsHive) && !CollectedHiveData) {
CollectHiveData();
}
if (FieldsAvailable.test(+EGroupFields::GroupId) && FieldsNeeded(FieldsHive) && NavigateKeySetInFlight == 0 && HiveStorageStatsInFlight == 0) {
if (GroupsByGroupId.empty()) {
RebuildGroupsByGroupId();
Expand Down Expand Up @@ -2076,8 +2091,16 @@ class TStorageGroups : public TViewerPipeClient {
if (FieldsAvailable.test(+EGroupFields::PoolName)) {
jsonGroup.SetPoolName(group->PoolName);
}
for (const TVDisk& vdisk : group->VDisks) {
RenderVDisk(*jsonGroup.AddVDisks(), vdisk);
std::vector<const TVDisk*> vdisks;
vdisks.resize(group->VDisks.size());
for (size_t idx = 0; idx < group->VDisks.size(); ++idx) {
vdisks[idx] = &group->VDisks[idx];
}
std::sort(vdisks.begin(), vdisks.end(), [](const TVDisk* a, const TVDisk* b) {
return a->VDiskId < b->VDiskId;
});
for (const TVDisk* vdisk : vdisks) {
RenderVDisk(*jsonGroup.AddVDisks(), *vdisk);
}
if (FieldsAvailable.test(+EGroupFields::Encryption)) {
jsonGroup.SetEncryption(group->EncryptionMode);
Expand Down
4 changes: 2 additions & 2 deletions ydb/core/viewer/viewer_cluster.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ class TJsonCluster : public TViewerPipeClient {
NodeBatches.emplace(nodeId, batch);
++WhiteboardStateRequestsInFlight;
}
if (batch.HasStaticNodes && TabletViewerResponse.count(nodeId) == 0) {
if (Tablets && batch.HasStaticNodes && TabletViewerResponse.count(nodeId) == 0) {
auto viewerRequest = std::make_unique<TEvViewer::TEvViewerRequest>();
InitTabletWhiteboardRequest(viewerRequest->Record.MutableTabletRequest());
viewerRequest->Record.SetTimeout(Timeout / 2);
Expand All @@ -392,7 +392,7 @@ class TJsonCluster : public TViewerPipeClient {
SystemStateResponse.emplace(nodeId, MakeWhiteboardRequest(nodeId, request));
++WhiteboardStateRequestsInFlight;
}
if (node->Static) {
if (Tablets && node->Static) {
if (TabletStateResponse.count(nodeId) == 0) {
auto request = std::make_unique<TEvWhiteboard::TEvTabletStateRequest>();
TabletStateResponse.emplace(nodeId, MakeWhiteboardRequest(nodeId, request.release()));
Expand Down
1 change: 1 addition & 0 deletions ydb/core/viewer/viewer_nodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -1030,6 +1030,7 @@ class TJsonNodes : public TViewerPipeClient {
for (const TString& word : filterWords) {
if (node->GetHostName().Contains(word) || ::ToString(node->GetNodeId()).Contains(word)) {
nodeView.push_back(node);
break;
}
}
}
Expand Down
14 changes: 3 additions & 11 deletions ydb/core/viewer/viewer_tenantinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -261,25 +261,17 @@ class TJsonTenantInfo : public TViewerPipeClient {

void SendWhiteboardSystemStateRequest(const TNodeId nodeId) {
Subscribers.insert(nodeId);
TActorId whiteboardServiceId = MakeNodeWhiteboardServiceId(nodeId);
if (SystemStateResponse.count(nodeId) == 0) {
SystemStateResponse.emplace(nodeId, MakeRequest<TEvWhiteboard::TEvSystemStateResponse>(whiteboardServiceId,
new TEvWhiteboard::TEvSystemStateRequest(),
IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession,
nodeId));
SystemStateResponse.emplace(nodeId, MakeWhiteboardRequest(nodeId, new TEvWhiteboard::TEvSystemStateRequest()));
}
}

void SendWhiteboardTabletStateRequest(const TNodeId nodeId) {
Subscribers.insert(nodeId);
TActorId whiteboardServiceId = MakeNodeWhiteboardServiceId(nodeId);
if (TabletStateResponse.count(nodeId) == 0) {
auto request = std::make_unique<NNodeWhiteboard::TEvWhiteboard::TEvTabletStateRequest>();
request->Record.SetFormat("packed5");
TabletStateResponse.emplace(nodeId, MakeRequest<TEvWhiteboard::TEvTabletStateResponse>(whiteboardServiceId,
request.release(),
IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession,
nodeId));
TabletStateResponse.emplace(nodeId, MakeWhiteboardRequest(nodeId, request.release()));
}
}

Expand Down Expand Up @@ -533,7 +525,7 @@ class TJsonTenantInfo : public TViewerPipeClient {
}

void ReplyAndPassAway() override {
Result.SetVersion(2);
Result.SetVersion(Viewer->GetCapabilityVersion("/viewer/tenantinfo"));
THashMap<TString, NKikimrViewer::EFlag> OverallByDomainId;
std::unordered_map<TNodeId, const NKikimrWhiteboard::TSystemStateInfo*> nodeSystemStateInfo;

Expand Down

0 comments on commit d81aef4

Please sign in to comment.