diff options
author | innokentii <innokentii@yandex-team.com> | 2022-10-19 19:21:23 +0300 |
---|---|---|
committer | innokentii <innokentii@yandex-team.com> | 2022-10-19 19:21:23 +0300 |
commit | c2bf3aaf5d396e08058bb39abc182fc4e3576023 (patch) | |
tree | 1f64d7674e3cc1cc4507b5b378b07b9c9ac35318 | |
parent | 16e16e844ee6f6e366e91674271e329151b6535a (diff) | |
download | ydb-c2bf3aaf5d396e08058bb39abc182fc4e3576023.tar.gz |
Add basic sentinel introspection
add basic sentinel introspection
-rw-r--r-- | ydb/core/cms/CMakeLists.txt | 6 | ||||
-rw-r--r-- | ydb/core/cms/cms.cpp | 12 | ||||
-rw-r--r-- | ydb/core/cms/cms.h | 12 | ||||
-rw-r--r-- | ydb/core/cms/cms_impl.h | 2 | ||||
-rw-r--r-- | ydb/core/cms/http.cpp | 2 | ||||
-rw-r--r-- | ydb/core/cms/json_proxy_sentinel.h | 27 | ||||
-rw-r--r-- | ydb/core/cms/sentinel.cpp | 26 | ||||
-rw-r--r-- | ydb/core/cms/sentinel.h | 8 | ||||
-rw-r--r-- | ydb/core/cms/sentinel_impl.h | 11 | ||||
-rw-r--r-- | ydb/core/cms/ui/cms.js | 1 | ||||
-rw-r--r-- | ydb/core/cms/ui/index.html | 15 | ||||
-rw-r--r-- | ydb/core/cms/ui/sentinel_state.js | 41 | ||||
-rw-r--r-- | ydb/core/protos/cms.proto | 23 | ||||
-rw-r--r-- | ydb/core/protos/counters_cms.proto | 1 |
14 files changed, 182 insertions, 5 deletions
diff --git a/ydb/core/cms/CMakeLists.txt b/ydb/core/cms/CMakeLists.txt index e30db238f6..90da238fba 100644 --- a/ydb/core/cms/CMakeLists.txt +++ b/ydb/core/cms/CMakeLists.txt @@ -93,10 +93,10 @@ target_link_libraries(ydb-core-cms.global PUBLIC tools-enum_parser-enum_serialization_runtime ) target_sources(ydb-core-cms.global PRIVATE - ${CMAKE_BINARY_DIR}/ydb/core/cms/348ccbcf47529a3467f7e0dad6f7777d.cpp + ${CMAKE_BINARY_DIR}/ydb/core/cms/bda6b2eb0fe591794e0191b6befe2972.cpp ) resources(ydb-core-cms.global - ${CMAKE_BINARY_DIR}/ydb/core/cms/348ccbcf47529a3467f7e0dad6f7777d.cpp + ${CMAKE_BINARY_DIR}/ydb/core/cms/bda6b2eb0fe591794e0191b6befe2972.cpp INPUTS ${CMAKE_SOURCE_DIR}/ydb/core/cms/ui/index.html ${CMAKE_SOURCE_DIR}/ydb/core/cms/ui/cms.css @@ -123,6 +123,7 @@ resources(ydb-core-cms.global ${CMAKE_SOURCE_DIR}/ydb/core/cms/ui/res/help.png ${CMAKE_SOURCE_DIR}/ydb/core/cms/ui/res/remove.png ${CMAKE_SOURCE_DIR}/ydb/core/cms/ui/validators.js + ${CMAKE_SOURCE_DIR}/ydb/core/cms/ui/sentinel_state.js KEYS cms/ui/index.html cms/ui/cms.css @@ -149,4 +150,5 @@ resources(ydb-core-cms.global cms/ui/res/help.png cms/ui/res/remove.png cms/ui/validators.js + cms/ui/sentinel_state.js ) diff --git a/ydb/core/cms/cms.cpp b/ydb/core/cms/cms.cpp index ceeb61bef7..37446cc70e 100644 --- a/ydb/core/cms/cms.cpp +++ b/ydb/core/cms/cms.cpp @@ -1978,6 +1978,18 @@ void TCms::Handle(TEvCms::TEvGetLogTailRequest::TPtr &ev, const TActorContext &c Execute(CreateTxGetLogTail(ev), ctx); } +void TCms::Handle(TEvCms::TEvGetSentinelStateRequest::TPtr &ev, const TActorContext &ctx) +{ + if(State->Sentinel) { + ctx.Send(ev->Forward(State->Sentinel)); + } else { + auto Response = MakeHolder<TEvCms::TEvGetSentinelStateResponse>(); + auto &rec = Response->Record; + rec.MutableStatus()->SetCode(NKikimrCms::TStatus::ERROR); + ctx.Send(ev->Sender, Response.Release()); + } +} + void TCms::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev, const TActorContext &ctx) { diff --git a/ydb/core/cms/cms.h b/ydb/core/cms/cms.h index dd02706dbb..9084538a34 100644 --- a/ydb/core/cms/cms.h +++ b/ydb/core/cms/cms.h @@ -54,6 +54,8 @@ struct TEvCms { EvResetMarkerRequest, EvGetLogTailRequest, EvGetLogTailResponse, + EvGetSentinelStateRequest, + EvGetSentinelStateResponse, EvWalleCreateTaskRequest = EvClusterStateRequest + 512, EvWalleCreateTaskResponse, @@ -303,6 +305,16 @@ struct TEvCms { NKikimrCms::TGetLogTailResponse, EvGetLogTailResponse> { }; + + struct TEvGetSentinelStateRequest : public TEventPB<TEvGetSentinelStateRequest, + NKikimrCms::TGetSentinelStateRequest, + EvGetSentinelStateRequest> { + }; + + struct TEvGetSentinelStateResponse : public TEventPB<TEvGetSentinelStateResponse, + NKikimrCms::TGetSentinelStateResponse, + EvGetSentinelStateResponse> { + }; }; IActor *CreateCms(const TActorId &tablet, TTabletStorageInfo *info); diff --git a/ydb/core/cms/cms_impl.h b/ydb/core/cms/cms_impl.h index 2a908067da..693c4fa09e 100644 --- a/ydb/core/cms/cms_impl.h +++ b/ydb/core/cms/cms_impl.h @@ -236,6 +236,7 @@ private: HFunc(TEvCms::TEvResetMarkerRequest, Handle); HFunc(TEvCms::TEvSetMarkerRequest, Handle); HFunc(TEvCms::TEvGetLogTailRequest, Handle); + HFunc(TEvCms::TEvGetSentinelStateRequest, Handle); HFunc(TEvConsole::TEvConfigNotificationRequest, Handle); HFunc(TEvConsole::TEvReplaceConfigSubscriptionsResponse, Handle); HFunc(TEvents::TEvPoisonPill, Handle); @@ -392,6 +393,7 @@ private: void Handle(TEvCms::TEvResetMarkerRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvCms::TEvSetMarkerRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvCms::TEvGetLogTailRequest::TPtr &ev, const TActorContext &ctx); + void Handle(TEvCms::TEvGetSentinelStateRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev, diff --git a/ydb/core/cms/http.cpp b/ydb/core/cms/http.cpp index 648d864b6e..c383c71b3d 100644 --- a/ydb/core/cms/http.cpp +++ b/ydb/core/cms/http.cpp @@ -7,6 +7,7 @@ #include "json_proxy_operations.h" #include "json_proxy_proto.h" #include "json_proxy_toggle_config_validator.h" +#include "json_proxy_sentinel.h" #include "base_handler.h" #include "walle.h" @@ -72,6 +73,7 @@ public: ApiHandlers["/api/json/toggleconfigvalidator"] = new TApiMethodHandler<TJsonProxyToggleConfigValidator>; ApiHandlers["/api/json/configupdates"] = new TApiMethodHandler<TJsonProxyConfigUpdates>; ApiHandlers["/api/json/proto"] = new TApiMethodHandler<TJsonProxyProto>; + ApiHandlers["/api/json/sentinel"] = new TApiMethodHandler<TJsonProxySentinel>; ApiHandlers["/api/datashard/json/getinfo"] = new TApiMethodHandler<TJsonProxyDataShard<TEvDataShard::TEvGetInfoRequest, diff --git a/ydb/core/cms/json_proxy_sentinel.h b/ydb/core/cms/json_proxy_sentinel.h new file mode 100644 index 0000000000..7520765e06 --- /dev/null +++ b/ydb/core/cms/json_proxy_sentinel.h @@ -0,0 +1,27 @@ +#pragma once + +#include "json_proxy.h" + +namespace NKikimr { +namespace NCms { + +class TJsonProxySentinel : public TJsonProxyCms<TEvCms::TEvGetSentinelStateRequest, TEvCms::TEvGetSentinelStateResponse> { +private: + +public: + TJsonProxySentinel(NMon::TEvHttpInfo::TPtr &event) + : TJsonProxyCms<TEvCms::TEvGetSentinelStateRequest, TEvCms::TEvGetSentinelStateResponse>(event) + { + } + + TAutoPtr<TRequest> PrepareRequest(const TActorContext &) override + { + TAutoPtr<TRequest> request = new TRequest; + + return request; + } +}; + + +} // NCms +} // NKikimr diff --git a/ydb/core/cms/sentinel.cpp b/ydb/core/cms/sentinel.cpp index aedc452479..7e3236686a 100644 --- a/ydb/core/cms/sentinel.cpp +++ b/ydb/core/cms/sentinel.cpp @@ -953,6 +953,31 @@ class TSentinel: public TActorBootstrapped<TSentinel> { ); } + void Handle(TEvSentinel::TEvGetSentinelStateRequest::TPtr& ev, const TActorContext &ctx) { + THolder<TEvCms::TEvGetSentinelStateResponse> Response; + Response = MakeHolder<TEvCms::TEvGetSentinelStateResponse>(); + auto &rec = Response->Record; + rec.MutableStatus()->SetCode(NKikimrCms::TStatus::OK); + + auto& sentinelConfig = *rec.MutableSentinelConfig(); + Config.Serialize(sentinelConfig); + + if (SentinelState) { + for (auto it = SentinelState->PDisks.begin(); it != SentinelState->PDisks.end(); ++it) { + auto &entry = *rec.AddPDisks(); + entry.MutableId()->SetNodeId(it->first.NodeId); + entry.MutableId()->SetDiskId(it->first.DiskId); + entry.MutableInfo()->SetState(it->second.GetState()); + entry.MutableInfo()->SetPrevState(it->second.GetPrevState()); + entry.MutableInfo()->SetStateCounter(it->second.GetStateCounter()); + entry.MutableInfo()->SetStatus(it->second.GetStatus()); + entry.MutableInfo()->SetChangingAllowed(it->second.IsChangingAllowed()); + entry.MutableInfo()->SetTouched(it->second.IsTouched()); + } + } + ctx.Send(ev->Sender, Response.Release()); + } + void Handle(TEvSentinel::TEvStatusChanged::TPtr& ev) { const TPDiskID& id = ev->Get()->Id; const bool success = ev->Get()->Success; @@ -1045,6 +1070,7 @@ public: cFunc(TEvSentinel::TEvUpdateState::EventType, UpdateState); cFunc(TEvSentinel::TEvStateUpdated::EventType, OnStateUpdated); hFunc(TEvSentinel::TEvStatusChanged, Handle); + HFunc(TEvSentinel::TEvGetSentinelStateRequest, Handle); cFunc(TEvSentinel::TEvBSCPipeDisconnected::EventType, OnPipeDisconnected); cFunc(TEvents::TEvPoisonPill::EventType, PassAway); diff --git a/ydb/core/cms/sentinel.h b/ydb/core/cms/sentinel.h index 8fef2998bd..86371a7ad5 100644 --- a/ydb/core/cms/sentinel.h +++ b/ydb/core/cms/sentinel.h @@ -22,7 +22,10 @@ struct TEvSentinel { EvBSCPipeDisconnected, - EvEnd + EvGetSentinelStateRequest, + EvGetSentinelStateResponse, + + EvEnd, }; static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)"); @@ -49,6 +52,9 @@ struct TEvSentinel { struct TEvBSCPipeDisconnected: public TEventLocal<TEvBSCPipeDisconnected, EvBSCPipeDisconnected> {}; + using TEvGetSentinelStateRequest = TEvCms::TEvGetSentinelStateRequest; + using TEvGetSentinelStateResponse = TEvCms::TEvGetSentinelStateResponse; + }; // TEvSentinel IActor* CreateSentinel(TCmsStatePtr state); diff --git a/ydb/core/cms/sentinel_impl.h b/ydb/core/cms/sentinel_impl.h index 8aa6934baf..7f721fd575 100644 --- a/ydb/core/cms/sentinel_impl.h +++ b/ydb/core/cms/sentinel_impl.h @@ -24,6 +24,15 @@ public: void AddState(EPDiskState state); EPDiskStatus Compute(EPDiskStatus current, TString& reason) const; + EPDiskState GetState() const { + return State; + } + EPDiskState GetPrevState() const { + return PrevState; + } + ui64 GetStateCounter() const { + return StateCounter; + } void Reset(); private: @@ -36,7 +45,7 @@ private: }; // TPDiskStatusComputer -class TPDiskStatus: private TPDiskStatusComputer { +class TPDiskStatus: public TPDiskStatusComputer { public: explicit TPDiskStatus(EPDiskStatus initialStatus, const ui32& defaultStateLimit, const TLimitsMap& stateLimits); diff --git a/ydb/core/cms/ui/cms.js b/ydb/core/cms/ui/cms.js index 15c17525a4..a90e9bbc44 100644 --- a/ydb/core/cms/ui/cms.js +++ b/ydb/core/cms/ui/cms.js @@ -29,6 +29,7 @@ function main() { initConfigsTab(); initValidatorsTab(); initCmsLogTab(); + initCmsSentinelTab(); } $(document).ready(main); diff --git a/ydb/core/cms/ui/index.html b/ydb/core/cms/ui/index.html index a875949309..a41cb5de4a 100644 --- a/ydb/core/cms/ui/index.html +++ b/ydb/core/cms/ui/index.html @@ -13,6 +13,7 @@ <script language="javascript" type="text/javascript" src="cms/enums.js"></script> <script language="javascript" type="text/javascript" src="cms/proto_types.js"></script> <script language="javascript" type="text/javascript" src="cms/cms_log.js"></script> + <script language="javascript" type="text/javascript" src="cms/sentinel_state.js"></script> <script language="javascript" type="text/javascript" src="cms/configs.js"></script> <script language="javascript" type="text/javascript" src="cms/config_forms.js"></script> <script language="javascript" type="text/javascript" src="cms/validators.js"></script> @@ -25,6 +26,12 @@ .narrow-line70 {line-height: 70%} .narrow-line80 {line-height: 80%} .narrow-line90 {line-height: 90%} + pre {outline: 1px solid #ccc; padding: 5px; margin: 5px; } + .string { color: green; } + .number { color: darkorange; } + .boolean { color: blue; } + .null { color: magenta; } + .key { color: red; } </style> </head> <body> @@ -45,6 +52,9 @@ <li class="nav-item"> <a class="nav-link" href="#cms-log" data-toggle="tab">CMS Log</a> </li> + <li class="nav-item"> + <a class="nav-link" href="#sentinel-state" data-toggle="tab">Sentinel state</a> + </li> </ul> <div class="tab-content" style="padding-top: 10px"> <div id="configs" class="tab-pane fade in active show"> @@ -81,6 +91,11 @@ </tbody> </table> </div> + <div id="sentinel-state" class="tab-pane fade"> + <pre id="sentinel-state-content"> + Loading... + </pre> + </div> </div> </div> </body> diff --git a/ydb/core/cms/ui/sentinel_state.js b/ydb/core/cms/ui/sentinel_state.js new file mode 100644 index 0000000000..57b56365e0 --- /dev/null +++ b/ydb/core/cms/ui/sentinel_state.js @@ -0,0 +1,41 @@ +'use strict'; + +var CmsSentinelState = { + fetchInterval: 5000, +}; + +function syntaxHighlight(json) { + if (typeof json != 'string') { + json = JSON.stringify(json, undefined, 4); + } + json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); + return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { + var cls = 'number'; + if (/^"/.test(match)) { + if (/:$/.test(match)) { + cls = 'key'; + } else { + cls = 'string'; + } + } else if (/true|false/.test(match)) { + cls = 'boolean'; + } else if (/null/.test(match)) { + cls = 'null'; + } + return '<span class="' + cls + '">' + match + '</span>'; + }); +} + +function onCmsSentinelStateLoaded(data) { + $("#sentinel-state-content").html(syntaxHighlight(data)); + setTimeout(loadCmsSentinelState, CmsSentinelState.fetchInterval); +} + +function loadCmsSentinelState() { + var url = 'cms/api/json/sentinel'; + $.get(url).done(onCmsSentinelStateLoaded); +} + +function initCmsSentinelTab() { + loadCmsSentinelState(); +} diff --git a/ydb/core/protos/cms.proto b/ydb/core/protos/cms.proto index 922e1d8007..6191f700e9 100644 --- a/ydb/core/protos/cms.proto +++ b/ydb/core/protos/cms.proto @@ -587,3 +587,26 @@ message TGetLogTailResponse { optional TStatus Status = 1; repeated TLogRecord LogRecords = 2; } + +message TGetSentinelStateRequest { +} + +message TPDiskInfo { + optional uint32 State = 1; // EPDiskState + optional uint32 PrevState = 2; // EPDiskState + optional uint64 StateCounter = 3; + optional uint32 Status = 4; // EPDiskStatus + optional bool ChangingAllowed = 5; + optional bool Touched = 6; +} + +message TPDisk { + optional TPDiskID Id = 1; + optional TPDiskInfo Info = 2; +} + +message TGetSentinelStateResponse { + optional TStatus Status = 1; + optional TCmsConfig.TSentinelConfig SentinelConfig = 2; + repeated TPDisk PDisks = 3; +} diff --git a/ydb/core/protos/counters_cms.proto b/ydb/core/protos/counters_cms.proto index b55d8ef37a..970ae802e2 100644 --- a/ydb/core/protos/counters_cms.proto +++ b/ydb/core/protos/counters_cms.proto @@ -44,4 +44,3 @@ enum ETxTypes { TXTYPE_UPDATE_CONFIG = 14 [(TxTypeOpts) = {Name: "TxUpdateConfig"}]; TXTYPE_UPDATE_DOWNTIMES = 15 [(TxTypeOpts) = {Name: "TxUpdateDowntimes"}]; } - |