diff --git a/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor.h b/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor.h index 54d7d8a5cda..b9e0175e8cc 100644 --- a/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor.h +++ b/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor.h @@ -262,6 +262,7 @@ class TDiskRegistryActor final void RenderDisksToNotify(IOutputStream& out) const; void RenderUserNotifications(IOutputStream& out) const; void RenderPlacementGroupList(IOutputStream& out, ui32 limit) const; + void RenderPlacementGroupTable(IOutputStream& out, bool showRecent) const; void RenderRacks(IOutputStream& out, ui32 limit) const; void RenderPoolRacks(IOutputStream& out, const TString& poolName) const; void RenderAgentList(TInstant now, IOutputStream& out, ui32 limit) const; diff --git a/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_monitoring.cpp b/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_monitoring.cpp index 92e7b7f257f..ae567c36ce3 100644 --- a/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_monitoring.cpp +++ b/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_monitoring.cpp @@ -125,6 +125,20 @@ void GenerateVolumeActionsJS(IOutputStream& out) )html"; } +void OnShowRecentPGCheckboxClickedActionsJS(IOutputStream& out) +{ + out << R"html( + + )html"; +} + void DumpSize(IOutputStream& out, size_t size) { if (size) { @@ -1514,16 +1528,44 @@ void TDiskRegistryActor::RenderPlacementGroupList( return; } - auto brokenGroups = State->GatherBrokenGroupsInfo( - Now(), - Config->GetPlacementGroupAlertPeriod()); - HTML(out) { TAG(TH3) { out << "PlacementGroups"; DumpSize(out, State->GetPlacementGroups()); } + OnShowRecentPGCheckboxClickedActionsJS(out); + DIV() { + TAG_ATTRS( + TInput, + {{"type", "checkbox"}, + {"id", "showRecentPGCheckbox"}, + {"onclick", "onShowRecentPGCheckboxClicked()"}}) + {} + LABEL() { + auto period = Config->GetPlacementGroupAlertPeriod(); + out << "Treat only recently broken partitions as broken" + << " (period=" << period.ToString() << ")"; + } + } + TAG_ATTRS(TDiv, {{"id", "TotalPGTable"}}) { + RenderPlacementGroupTable(out, false); + } + TAG_ATTRS(TDiv, {{"id", "RecentPGTable"}, {"hidden", "true"}}) { + RenderPlacementGroupTable(out, true); + } + } +} + +void TDiskRegistryActor::RenderPlacementGroupTable( + IOutputStream& out, + bool showRecent) const +{ + auto brokenGroups = State->GatherBrokenGroupsInfo( + Now(), + Config->GetPlacementGroupAlertPeriod()); + + HTML(out) { TABLE_SORTABLE_CLASS("table table-bordered") { TABLEHEAD() { TABLER() { @@ -1542,9 +1584,12 @@ void TDiskRegistryActor::RenderPlacementGroupList( strategy == NProto::PLACEMENT_STRATEGY_PARTITION; auto brokenGroupInfo = brokenGroups.FindPtr(groupId); - const size_t brokenPartitionsCount = brokenGroupInfo + size_t brokenPartitionsCount = 0; + if (brokenGroupInfo) { + brokenPartitionsCount = showRecent ? brokenGroupInfo->Recently.GetBrokenPartitionCount() - : 0; + : brokenGroupInfo->Total.GetBrokenPartitionCount(); + } TABLED() { const auto* color = brokenPartitionsCount == 0 @@ -1617,7 +1662,7 @@ void TDiskRegistryActor::RenderPlacementGroupList( } const auto brokenDisks = brokenGroupInfo - ? brokenGroupInfo->Recently.GetBrokenDisks() + ? brokenGroupInfo->Total.GetBrokenDisks() : THashSet(); const auto sortedDisks = diff --git a/library/cpp/monlib/service/pages/templates.cpp b/library/cpp/monlib/service/pages/templates.cpp index ece12bea710..6a6aff37d13 100644 --- a/library/cpp/monlib/service/pages/templates.cpp +++ b/library/cpp/monlib/service/pages/templates.cpp @@ -31,5 +31,6 @@ namespace NMonitoring { extern const char DListTag[] = "dl"; extern const char DTermTag[] = "dt"; extern const char DDescTag[] = "dd"; + extern const char InputTag[] = "input"; } diff --git a/library/cpp/monlib/service/pages/templates.h b/library/cpp/monlib/service/pages/templates.h index ab1d91c54e8..8e36972d993 100644 --- a/library/cpp/monlib/service/pages/templates.h +++ b/library/cpp/monlib/service/pages/templates.h @@ -228,6 +228,7 @@ namespace NMonitoring { extern const char DListTag[3]; extern const char DTermTag[3]; extern const char DDescTag[3]; + extern const char InputTag[6]; typedef TTag THtml; typedef TTag THead; @@ -259,4 +260,5 @@ namespace NMonitoring { typedef TTag DLIST; typedef TTag DTERM; typedef TTag DDESC; + typedef TTag TInput; }