summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandrew-rykov <[email protected]>2023-07-11 15:00:26 +0300
committerandrew-rykov <[email protected]>2023-07-11 15:00:26 +0300
commit64294550656395357c20ecd69f1a7f1855958914 (patch)
treec6b404a7920d45a23dacab992998c2a0ae44c9fa
parent79cd05f3fe8758f8609729dde5aec3d31eb3f6f6 (diff)
add filters nodes handler
-rw-r--r--ydb/core/viewer/json_nodes.h40
1 files changed, 39 insertions, 1 deletions
diff --git a/ydb/core/viewer/json_nodes.h b/ydb/core/viewer/json_nodes.h
index b9ce001ebad..52282771795 100644
--- a/ydb/core/viewer/json_nodes.h
+++ b/ydb/core/viewer/json_nodes.h
@@ -45,6 +45,9 @@ class TJsonNodes : public TViewerPipeClient<TJsonNodes> {
std::vector<TNodeId> NodeIds;
std::optional<ui32> Offset;
std::optional<ui32> Limit;
+ ui32 UptimeSeconds = 0;
+ bool ProblemNodesOnly = false;
+ TString Filter;
enum class EWith {
Everything,
@@ -102,6 +105,9 @@ public:
JsonSettings.UI64AsString = !FromStringWithDefault<bool>(params.Get("ui64"), false);
InitConfig(params);
Timeout = FromStringWithDefault<ui32>(params.Get("timeout"), 10000);
+ UptimeSeconds = FromStringWithDefault<ui32>(params.Get("uptime"), 0);
+ ProblemNodesOnly = FromStringWithDefault<bool>(params.Get("problems_only"), ProblemNodesOnly);
+ Filter = params.Get("filter");
FilterTenant = params.Get("tenant");
FilterStoragePool = params.Get("pool");
SplitIds(params.Get("node_id"), ',', FilterNodeIds);
@@ -504,6 +510,33 @@ public:
return 0;
}
+ bool CheckNodeFilters(TNodeId nodeId) {
+ auto itSysInfo = SysInfo.find(nodeId);
+ if (itSysInfo != SysInfo.end()) {
+ if (itSysInfo->second.SystemStateInfoSize() == 1) {
+ const NKikimrWhiteboard::TSystemStateInfo& sysInfo = itSysInfo->second.GetSystemStateInfo(0);
+ if (UptimeSeconds > 0 && sysInfo.HasStartTime() && itSysInfo->second.HasResponseTime()
+ && itSysInfo->second.GetResponseTime() - sysInfo.GetStartTime() > UptimeSeconds * 1000) {
+ return false;
+ }
+ if (ProblemNodesOnly && sysInfo.HasSystemState()
+ && GetViewerFlag(sysInfo.GetSystemState()) == NKikimrViewer::EFlag::Green) {
+ return false;
+ }
+ if (Filter) {
+ if (sysInfo.HasHost() && sysInfo.GetHost().Contains(Filter)) {
+ return true;
+ }
+ if (std::to_string(nodeId).contains(Filter)) {
+ return true;
+ }
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
void ReplyAndPassAway() {
NKikimrViewer::TNodesInfo result;
if (Storage && BaseConfig) {
@@ -532,6 +565,8 @@ public:
}
for (TNodeId nodeId : NodeIds) {
+ if (!CheckNodeFilters(nodeId))
+ continue;
if (Storage) {
if (With == EWith::MissingDisks) {
auto itPDiskState = PDiskInfo.find(nodeId);
@@ -691,7 +726,10 @@ struct TJsonRequestParameters<TJsonNodes> {
{"name":"sort","in":"query","description":"sort by (NodeId,Host,DC,Version,Uptime,Memory,CPU,LoadAverage)","required":false,"type":"string"},
{"name":"offset","in":"query","description":"skip N nodes","required":false,"type":"integer"},
{"name":"limit","in":"query","description":"limit to N nodes","required":false,"type":"integer"},
- {"name":"timeout","in":"query","description":"timeout in ms","required":false,"type":"integer"}])___";
+ {"name":"timeout","in":"query","description":"timeout in ms","required":false,"type":"integer"},
+ {"name":"uptime","in":"query","description":"return only nodes with less uptime in sec.","required":false,"type":"integer"},
+ {"name":"problems_only","in":"query","description":"return only problem nodes","required":false,"type":"boolean"},
+ {"name":"filter","in":"query","description":"filter nodes by id or host","required":false,"type":"string"}])___";
}
};