aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorinnokentii <innokentii@yandex-team.com>2022-10-19 19:21:23 +0300
committerinnokentii <innokentii@yandex-team.com>2022-10-19 19:21:23 +0300
commitc2bf3aaf5d396e08058bb39abc182fc4e3576023 (patch)
tree1f64d7674e3cc1cc4507b5b378b07b9c9ac35318
parent16e16e844ee6f6e366e91674271e329151b6535a (diff)
downloadydb-c2bf3aaf5d396e08058bb39abc182fc4e3576023.tar.gz
Add basic sentinel introspection
add basic sentinel introspection
-rw-r--r--ydb/core/cms/CMakeLists.txt6
-rw-r--r--ydb/core/cms/cms.cpp12
-rw-r--r--ydb/core/cms/cms.h12
-rw-r--r--ydb/core/cms/cms_impl.h2
-rw-r--r--ydb/core/cms/http.cpp2
-rw-r--r--ydb/core/cms/json_proxy_sentinel.h27
-rw-r--r--ydb/core/cms/sentinel.cpp26
-rw-r--r--ydb/core/cms/sentinel.h8
-rw-r--r--ydb/core/cms/sentinel_impl.h11
-rw-r--r--ydb/core/cms/ui/cms.js1
-rw-r--r--ydb/core/cms/ui/index.html15
-rw-r--r--ydb/core/cms/ui/sentinel_state.js41
-rw-r--r--ydb/core/protos/cms.proto23
-rw-r--r--ydb/core/protos/counters_cms.proto1
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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+ 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"}];
}
-