@@ -143,6 +143,7 @@ class TSelfCheckRequest : public TActorBootstrapped<TSelfCheckRequest> {
143143 OverloadState,
144144 SyncState,
145145 Uptime,
146+ QuotaUsage,
146147 };
147148
148149 enum ETimeoutTag {
@@ -241,6 +242,7 @@ class TSelfCheckRequest : public TActorBootstrapped<TSelfCheckRequest> {
241242 ui64 StorageQuota = 0 ;
242243 ui64 StorageUsage = 0 ;
243244 TMaybeServerlessComputeResourcesMode ServerlessComputeResourcesMode;
245+ TString Path;
244246 };
245247
246248 struct TGroupState {
@@ -1060,6 +1062,7 @@ class TSelfCheckRequest : public TActorBootstrapped<TSelfCheckRequest> {
10601062 if (ev->Get ()->GetRecord ().status () == NKikimrScheme::StatusSuccess) {
10611063 TString path = ev->Get ()->GetRecord ().path ();
10621064 TDatabaseState& state (DatabaseState[path]);
1065+ state.Path = path;
10631066 for (const auto & storagePool : ev->Get ()->GetRecord ().pathdescription ().domaindescription ().storagepools ()) {
10641067 TString storagePoolName = storagePool.name ();
10651068 state.StoragePoolNames .emplace (storagePoolName);
@@ -1447,7 +1450,7 @@ class TSelfCheckRequest : public TActorBootstrapped<TSelfCheckRequest> {
14471450 }
14481451 }
14491452
1450- void FillComputeNodeStatus (TDatabaseState& databaseState,TNodeId nodeId, Ydb::Monitoring::ComputeNodeStatus& computeNodeStatus, TSelfCheckContext context) {
1453+ void FillComputeNodeStatus (TDatabaseState& databaseState, TNodeId nodeId, Ydb::Monitoring::ComputeNodeStatus& computeNodeStatus, TSelfCheckContext context) {
14511454 FillNodeInfo (nodeId, context.Location .mutable_compute ()->mutable_node ());
14521455
14531456 TSelfCheckContext rrContext (&context, " NODE_UPTIME" );
@@ -1494,6 +1497,39 @@ class TSelfCheckRequest : public TActorBootstrapped<TSelfCheckRequest> {
14941497 computeNodeStatus.set_overall (context.GetOverallStatus ());
14951498 }
14961499
1500+ void FillComputeDatabaseStatus (TDatabaseState& databaseState, Ydb::Monitoring::ComputeStatus& computeStatus, TSelfCheckContext context) {
1501+ auto itDescribe = DescribeByPath.find (databaseState.Path );
1502+ if (itDescribe != DescribeByPath.end ()) {
1503+ const auto & domain (itDescribe->second ->GetRecord ().GetPathDescription ().GetDomainDescription ());
1504+ if (domain.GetPathsLimit () > 0 ) {
1505+ float usage = (float )domain.GetPathsInside () / domain.GetPathsLimit ();
1506+ computeStatus.set_paths_quota_usage (usage);
1507+ if (static_cast <i64 >(domain.GetPathsLimit ()) - static_cast <i64 >(domain.GetPathsInside ()) <= 1 ) {
1508+ context.ReportStatus (Ydb::Monitoring::StatusFlag::RED, " Paths quota exhausted" , ETags::QuotaUsage);
1509+ } else if (usage >= 0.99 ) {
1510+ context.ReportStatus (Ydb::Monitoring::StatusFlag::ORANGE, " Paths quota usage is over than 99%" , ETags::QuotaUsage);
1511+ } else if (usage >= 0.90 ) {
1512+ context.ReportStatus (Ydb::Monitoring::StatusFlag::YELLOW, " Paths quota usage is over than 90%" , ETags::QuotaUsage);
1513+ } else {
1514+ context.ReportStatus (Ydb::Monitoring::StatusFlag::GREEN);
1515+ }
1516+ }
1517+ if (domain.GetShardsLimit () > 0 ) {
1518+ float usage = (float )domain.GetShardsInside () / domain.GetShardsLimit ();
1519+ computeStatus.set_shards_quota_usage (usage);
1520+ if (static_cast <i64 >(domain.GetShardsLimit ()) - static_cast <i64 >(domain.GetShardsInside ()) <= 1 ) {
1521+ context.ReportStatus (Ydb::Monitoring::StatusFlag::RED, " Shards quota exhausted" , ETags::QuotaUsage);
1522+ } else if (usage >= 0.99 ) {
1523+ context.ReportStatus (Ydb::Monitoring::StatusFlag::ORANGE, " Shards quota usage is over than 99%" , ETags::QuotaUsage);
1524+ } else if (usage >= 0.90 ) {
1525+ context.ReportStatus (Ydb::Monitoring::StatusFlag::YELLOW, " Shards quota usage is over than 90%" , ETags::QuotaUsage);
1526+ } else {
1527+ context.ReportStatus (Ydb::Monitoring::StatusFlag::GREEN);
1528+ }
1529+ }
1530+ }
1531+ }
1532+
14971533 void FillCompute (TDatabaseState& databaseState, Ydb::Monitoring::ComputeStatus& computeStatus, TSelfCheckContext context) {
14981534 TVector<TNodeId>* computeNodeIds = &databaseState.ComputeNodeIds ;
14991535 if (databaseState.ResourcePathId
@@ -1520,8 +1556,10 @@ class TSelfCheckRequest : public TActorBootstrapped<TSelfCheckRequest> {
15201556 auto & computeNode = *computeStatus.add_nodes ();
15211557 FillComputeNodeStatus (databaseState, nodeId, computeNode, {&context, " COMPUTE_NODE" });
15221558 }
1559+ FillComputeDatabaseStatus (databaseState, computeStatus, {&context, " COMPUTE_QUOTA" });
15231560 context.ReportWithMaxChildStatus (" Some nodes are restarting too often" , ETags::ComputeState, {ETags::Uptime});
15241561 context.ReportWithMaxChildStatus (" Compute is overloaded" , ETags::ComputeState, {ETags::OverloadState});
1562+ context.ReportWithMaxChildStatus (" Compute quota usage" , ETags::ComputeState, {ETags::QuotaUsage});
15251563 Ydb::Monitoring::StatusFlag::Status tabletsStatus = Ydb::Monitoring::StatusFlag::GREEN;
15261564 computeNodeIds->push_back (0 ); // for tablets without node
15271565 for (TNodeId nodeId : *computeNodeIds) {
0 commit comments