diff --git a/ydb/core/viewer/json_tenantinfo.h b/ydb/core/viewer/json_tenantinfo.h index b852691f714b..c0c6ed928cd4 100644 --- a/ydb/core/viewer/json_tenantinfo.h +++ b/ydb/core/viewer/json_tenantinfo.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -28,6 +29,7 @@ class TJsonTenantInfo : public TViewerPipeClient { IViewer* Viewer; THashMap TenantByPath; THashMap TenantBySubDomainKey; + THashMap HcOverallByTenantPath; THashMap> NavigateResult; THashMap> HiveDomainStats; THashMap> HiveStorageStats; @@ -35,6 +37,7 @@ class TJsonTenantInfo : public TViewerPipeClient { THashSet Subscribers; THashSet WhiteboardNodesRequested; THashSet OffloadTenantsRequested; + THashSet MetadataCacheRequested; THashMap NodeIdsToTenant; // for tablet info TMap WhiteboardSystemStateResponse; THashMap> WhiteboardTabletStateResponse; @@ -165,6 +168,8 @@ class TJsonTenantInfo : public TViewerPipeClient { hFunc(TEvents::TEvUndelivered, Undelivered); hFunc(TEvInterconnect::TEvNodeDisconnected, Disconnected); hFunc(TEvTabletPipe::TEvClientConnected, TBase::Handle); + hFunc(TEvStateStorage::TEvBoardInfo, Handle); + hFunc(NHealthCheck::TEvSelfCheckResultProto, Handle); cFunc(TEvents::TSystem::Wakeup, HandleTimeout); } } @@ -179,6 +184,10 @@ class TJsonTenantInfo : public TViewerPipeClient { } RequestConsoleGetTenantStatus(path); RequestSchemeCacheNavigate(path); + + if (AppData()->FeatureFlags.GetEnableDbMetadataCache()) { + RequestStateStorageMetadataCacheEndpointsLookup(path); + } } RequestDone(); } @@ -385,6 +394,28 @@ class TJsonTenantInfo : public TViewerPipeClient { RequestDone(); } + void Handle(NHealthCheck::TEvSelfCheckResultProto::TPtr& ev) { + auto result = std::move(ev->Get()->Record); + if (result.database_status_size() == 1) { + HcOverallByTenantPath.emplace(result.database_status(0).name(), GetViewerFlag(result.database_status(0).overall())); + } + + RequestDone(); + } + + void Handle(TEvStateStorage::TEvBoardInfo::TPtr& ev) { + auto activeNode = TDatabaseMetadataCache::PickActiveNode(ev->Get()->InfoEntries); + if (activeNode != 0) { + Subscribers.insert(activeNode); + std::optional cache = MakeDatabaseMetadataCacheId(activeNode); + auto request = MakeHolder(); + if (MetadataCacheRequested.insert(ev->Get()->Path).second) { + SendRequest(*cache, request.Release(), IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession, activeNode); + } + } + RequestDone(); + } + void Handle(TEvViewer::TEvViewerResponse::TPtr& ev) { ui32 nodeId = ev.Get()->Cookie; auto tenantId = NodeIdsToTenant[nodeId]; @@ -407,6 +438,14 @@ class TJsonTenantInfo : public TViewerPipeClient { } void Undelivered(TEvents::TEvUndelivered::TPtr &ev) { + if (ev->Get()->SourceType == NHealthCheck::EvSelfCheckRequestProto) { + ui32 nodeId = ev.Get()->Cookie; + BLOG_TRACE("Undelivered for node " << nodeId << " event " << ev->Get()->SourceType); + auto tenantId = NodeIdsToTenant[nodeId]; + if (HcOverallByTenantPath.emplace(tenantId, NKikimrViewer::EFlag::Grey).second) { + RequestDone(); + } + } if (ev->Get()->SourceType == NNodeWhiteboard::TEvWhiteboard::EvSystemStateRequest) { ui32 nodeId = ev.Get()->Cookie; BLOG_TRACE("Undelivered for node " << nodeId << " event " << ev->Get()->SourceType); @@ -481,6 +520,11 @@ class TJsonTenantInfo : public TViewerPipeClient { RequestDone(); } } + if (MetadataCacheRequested.count(tenantId) > 0) { + if (HcOverallByTenantPath.emplace(tenantId, NKikimrViewer::EFlag::Grey).second) { + RequestDone(); + } + } } NKikimrViewer::TStorageUsage::EType GetStorageType(const TString& poolKind) { @@ -747,8 +791,13 @@ class TJsonTenantInfo : public TViewerPipeClient { tablet.SetCount(prTabletCount); } } - tenant.SetOverall(overall); - OverallByDomainId[tenant.GetId()] = overall; + if (HcOverallByTenantPath.count(path) > 0) { + tenant.SetOverall(HcOverallByTenantPath[path]); + OverallByDomainId[tenant.GetId()] = HcOverallByTenantPath[path]; + } else { + tenant.SetOverall(overall); + OverallByDomainId[tenant.GetId()] = overall; + } } } for (const std::pair& prTenant : TenantByPath) { diff --git a/ydb/core/viewer/viewer.cpp b/ydb/core/viewer/viewer.cpp index 690de4928a14..dc92bb4de208 100644 --- a/ydb/core/viewer/viewer.cpp +++ b/ydb/core/viewer/viewer.cpp @@ -989,6 +989,26 @@ NKikimrViewer::EFlag GetBSGroupOverallFlag( return GetBSGroupOverallState(info, vDisksIndex, pDisksIndex).Overall; } +NKikimrViewer::EFlag GetViewerFlag(Ydb::Monitoring::StatusFlag::Status flag) { + switch (flag) { + case Ydb::Monitoring::StatusFlag::GREY: + case Ydb::Monitoring::StatusFlag::UNSPECIFIED: + case Ydb::Monitoring::StatusFlag_Status_StatusFlag_Status_INT_MIN_SENTINEL_DO_NOT_USE_: + case Ydb::Monitoring::StatusFlag_Status_StatusFlag_Status_INT_MAX_SENTINEL_DO_NOT_USE_: + return NKikimrViewer::EFlag::Grey; + case Ydb::Monitoring::StatusFlag::GREEN: + return NKikimrViewer::EFlag::Green; + case Ydb::Monitoring::StatusFlag::BLUE: + return NKikimrViewer::EFlag::Green; + case Ydb::Monitoring::StatusFlag::YELLOW: + return NKikimrViewer::EFlag::Yellow; + case Ydb::Monitoring::StatusFlag::ORANGE: + return NKikimrViewer::EFlag::Orange; + case Ydb::Monitoring::StatusFlag::RED: + return NKikimrViewer::EFlag::Red; + } +} + NKikimrWhiteboard::EFlag GetWhiteboardFlag(NKikimrViewer::EFlag flag) { switch (flag) { case NKikimrViewer::EFlag::Grey: diff --git a/ydb/core/viewer/viewer.h b/ydb/core/viewer/viewer.h index 876f8400994a..ce0c13bee47c 100644 --- a/ydb/core/viewer/viewer.h +++ b/ydb/core/viewer/viewer.h @@ -9,6 +9,7 @@ #include #include #include +#include #include namespace NKikimr { @@ -272,6 +273,8 @@ NKikimrViewer::EFlag GetFlagFromUsage(double usage); NKikimrWhiteboard::EFlag GetWhiteboardFlag(NKikimrViewer::EFlag flag); NKikimrViewer::EFlag GetViewerFlag(NKikimrWhiteboard::EFlag flag); +NKikimrViewer::EFlag GetViewerFlag(Ydb::Monitoring::StatusFlag::Status flag); + } // NViewer } // NKikimr