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;
}